<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="/rss.xsl.xml"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
    <title>Changes in SpecCompatRenderer.php</title>
    <description></description>
    <language>en</language>
    <copyright>Copyright 2025</copyright>
    <generator>Java</generator><item>
        <title>f9d3b7bd008099dc4c61ce262a02a0ed8bc94254 - Externallink: add per-scheme angle-bracket autolinks for MD syntax</title>
        <link>http://127.0.0.1:8080/history/dokuwiki/_test/tests/Parsing/Markdown/SpecCompatRenderer.php#f9d3b7bd008099dc4c61ce262a02a0ed8bc94254</link>
        <description>Externallink: add per-scheme angle-bracket autolinks for MD syntaxAdds CommonMark &#167;6.5 &lt;URL&gt; autolinks to Externallink, gated tomd/md+dw/dw+md syntax via ModeRegistry::isMdPreferred(). Per-schemepatterns share the existing conf/scheme.conf allow-list so unknownschemes fall through to literal cdata instead of being silentlydropped by the renderer. Internal whitespace inside the bracketsdisqualifies the autolink and the whole envelope is emitted ascdata to keep the bare-URL detector off the URL.LinksTest gains 5 cases covering success, internal-whitespace andleading-whitespace disqualification, unregistered scheme fallthrough,and the dw-only no-op path. SpecCompatRenderer URL encoder is updatedto match cmark-gfm&apos;s HREF_SAFE table (square brackets and a few othercharacters move from safe to encoded). skip.php loses the obsolete#356 entry and gains #605/#606/#607/#609 explaining the unregistered-scheme cases that the per-scheme regex naturally rejects.

            List of files:
            /dokuwiki/_test/tests/Parsing/Markdown/SpecCompatRenderer.php</description>
        <pubDate>Tue, 05 May 2026 14:16:44 +0000</pubDate>
        <dc:creator>Andreas Gohr &lt;andi@splitbrain.org&gt;</dc:creator>
    </item>
<item>
        <title>d379b73752b2756b087fd1c1c0e5886f260e6761 - GfmSpecTest: neutralize DW typography for spec roundtrip</title>
        <link>http://127.0.0.1:8080/history/dokuwiki/_test/tests/Parsing/Markdown/SpecCompatRenderer.php#d379b73752b2756b087fd1c1c0e5886f260e6761</link>
        <description>GfmSpecTest: neutralize DW typography for spec roundtripForce $conf[typography] = 0 in renderMarkdown() so the Quotes andMultiplyEntity modes are not loaded, override entity() inSpecCompatRenderer to emit the original match instead of the typographicglyph, and switch _xmlEntities() from ENT_QUOTES to ENT_COMPAT so `&apos;`stays literal in body text while `&quot;` is still escaped to &amp;quot;. Dropsthree skip entries (#308, #310, #353) that existed only to paper overthe same divergence and unblocks #16, #25 and #670.

            List of files:
            /dokuwiki/_test/tests/Parsing/Markdown/SpecCompatRenderer.php</description>
        <pubDate>Tue, 05 May 2026 09:11:52 +0000</pubDate>
        <dc:creator>Andreas Gohr &lt;andi@splitbrain.org&gt;</dc:creator>
    </item>
<item>
        <title>6359e7fdf570c2d76e6de8eb24d1cf4c5eb296ae - percent-encode URLs in SpecCompatRenderer to match spec output</title>
        <link>http://127.0.0.1:8080/history/dokuwiki/_test/tests/Parsing/Markdown/SpecCompatRenderer.php#6359e7fdf570c2d76e6de8eb24d1cf4c5eb296ae</link>
        <description>percent-encode URLs in SpecCompatRenderer to match spec outputCommonMark&apos;s reference renderer percent-encodes URL bytes outside theRFC 3986 unreserved/reserved set (and existing %XX sequences passthrough unchanged). DokuWiki&apos;s XHTML renderer leaves UTF-8 andbackslashes literal in href, which is fine for live wiki output butdiverges byte-for-byte from spec.Adds specEncodeUrl() to the spec-compat renderer and applies it inspecLink(). Same shape as the earlier `&#8594;`-&gt;`\t` substitution: atest-harness alignment with spec convention, no production behaviorchange.Unskips #510 (backslash in URL) and #511 (entity / percent-encoding inURL); both now match spec output with the parser-side decoding fromthe previous commit and the renderer-side encoding here.

            List of files:
            /dokuwiki/_test/tests/Parsing/Markdown/SpecCompatRenderer.php</description>
        <pubDate>Mon, 04 May 2026 13:00:51 +0000</pubDate>
        <dc:creator>Andreas Gohr &lt;andi@splitbrain.org&gt;</dc:creator>
    </item>
<item>
        <title>c4bcbc2e0c397783de26c1e3c211d82d1ac21bb4 - add GfmLinebreak for GFM hard line breaks</title>
        <link>http://127.0.0.1:8080/history/dokuwiki/_test/tests/Parsing/Markdown/SpecCompatRenderer.php#c4bcbc2e0c397783de26c1e3c211d82d1ac21bb4</link>
        <description>add GfmLinebreak for GFM hard line breaksTwo-or-more trailing spaces, or a single backslash, immediately beforea non-final newline render as a `&lt;br/&gt;`. Both delimiter forms share asingle SUBSTITION mode at sort 140, loaded under any MD-active syntax(markdown, dw+md, md+dw); pure dokuwiki is unaffected.Reuses the existing `linebreak` handler call and renderer; no newinstructions or renderer changes. SpecCompatRenderer overrideslinebreak() to emit the spec&apos;s `&lt;br /&gt;` shape. Examples 662, 663(line break inside a raw HTML tag) are skipped &#8212; raw HTML is notpassed through by default.

            List of files:
            /dokuwiki/_test/tests/Parsing/Markdown/SpecCompatRenderer.php</description>
        <pubDate>Mon, 04 May 2026 09:21:04 +0000</pubDate>
        <dc:creator>Andreas Gohr &lt;andi@splitbrain.org&gt;</dc:creator>
    </item>
<item>
        <title>309a08521b24a6fff00f318e061096f69771bbad - replace DW Quote with unified GfmQuote</title>
        <link>http://127.0.0.1:8080/history/dokuwiki/_test/tests/Parsing/Markdown/SpecCompatRenderer.php#309a08521b24a6fff00f318e061096f69771bbad</link>
        <description>replace DW Quote with unified GfmQuoteGfmQuote covers blockquote parsing for both DokuWiki and GFM dialectsin a single mode. Same quote_open/quote_close handler instructions; aDW-preferred post-pass flattens sub-parsed paragraph wrapping intolinebreak calls so existing pages keep their &lt;br/&gt;-between-linesrendering. MD-preferred keeps the &lt;p&gt;-wrapped spec shape.Block content (lists, fenced code, tables) inside `&gt;` quotes nowrenders, since the body is sub-parsed. Headers stay excluded(BASEONLY) &#8212; TOC and section-edit anchors don&apos;t compose with&lt;blockquote&gt;, same rationale as GfmListblock.Convert ModeRegistry&apos;s sub-parser cache into an acquire/release poolto support same-key re-entrancy: a list inside a quote re-entersgfm_quote during the list-item sub-parse, and the inner call needsits own parser instance even though the exclusion key matches.GfmListblock is updated to use the new acquire/release primitives.

            List of files:
            /dokuwiki/_test/tests/Parsing/Markdown/SpecCompatRenderer.php</description>
        <pubDate>Thu, 30 Apr 2026 11:58:30 +0000</pubDate>
        <dc:creator>Andreas Gohr &lt;andi@splitbrain.org&gt;</dc:creator>
    </item>
<item>
        <title>f7c6e4acc95e3c5c24a819b2149a2bf3a7668f11 - add listo_open_start sibling method for GFM start numbers</title>
        <link>http://127.0.0.1:8080/history/dokuwiki/_test/tests/Parsing/Markdown/SpecCompatRenderer.php#f7c6e4acc95e3c5c24a819b2149a2bf3a7668f11</link>
        <description>add listo_open_start sibling method for GFM start numbersReverts the listo_open signature widening from 5a2118acc and insteadadds a sibling method `listo_open_start($start = 1)` on the rendererhierarchy. The base default delegates to listo_open() so renderersthat don&apos;t override it still produce a valid (but unnumbered) list;xhtml&apos;s override emits &lt;ol start=&quot;N&quot;&gt;.The handler now emits &apos;listo_open_start&apos; only for ordered lists witha non-default first number; plain ordered lists keep emitting theunchanged &apos;listo_open&apos; instruction. This preserves the historicallisto_open / listu_open signatures (zero-arg base, $classes-onlyxhtml form from 2016) so the 17 plugin renderers found viacodesearch keep working without modification, while stillimplementing GFM&apos;s &quot;5. foo&quot; -&gt; &lt;ol start=&quot;5&quot;&gt; rule.

            List of files:
            /dokuwiki/_test/tests/Parsing/Markdown/SpecCompatRenderer.php</description>
        <pubDate>Thu, 30 Apr 2026 08:11:04 +0000</pubDate>
        <dc:creator>Andreas Gohr &lt;gohr@cosmocode.de&gt;</dc:creator>
    </item>
<item>
        <title>3dabe4e0a0d70b79a7aced8ac8a36d4b37a61024 - add GfmTable for GFM tables</title>
        <link>http://127.0.0.1:8080/history/dokuwiki/_test/tests/Parsing/Markdown/SpecCompatRenderer.php#3dabe4e0a0d70b79a7aced8ac8a36d4b37a61024</link>
        <description>add GfmTable for GFM tablesImplements the GFM pipe-table extension as a CONTAINER mode at sort 55,one below DW Table at 60. A lookahead-validated entry pattern asserts aheader line plus a `:?-+:?` delimiter row before consuming any input, sonon-table paragraphs containing pipes flow through unchanged. Cells areinline-only per spec.Handler\GfmTable rewrites the flat token stream into the canonicaltable_open / tablethead_* / tabletbody_* / table_close sequence, derivingper-column alignment from the delimiter row, padding short body rows(spec 202), truncating long ones (spec 204), and falling back to a singlecdata when the column count mismatches (spec 203).`tabletbody_open` / `tabletbody_close` are emitted for the first time;they are part of the base renderer API but DW Table never used them.Added to Block&apos;s blockOpen / blockClose lists alongside `tabletfoot_*`for symmetry. SpecCompatRenderer gains minimal table-element overridesso spec roundtrip output matches GFM&apos;s `&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;` shapewithout DW&apos;s wrapper div, row/col counter classes, or align-as-class.

            List of files:
            /dokuwiki/_test/tests/Parsing/Markdown/SpecCompatRenderer.php</description>
        <pubDate>Tue, 28 Apr 2026 12:34:24 +0000</pubDate>
        <dc:creator>Andreas Gohr &lt;andi@splitbrain.org&gt;</dc:creator>
    </item>
<item>
        <title>685560eb3044321b3bdd0be40985871ced5f1d05 - add GfmListblock for GFM lists</title>
        <link>http://127.0.0.1:8080/history/dokuwiki/_test/tests/Parsing/Markdown/SpecCompatRenderer.php#685560eb3044321b3bdd0be40985871ced5f1d05</link>
        <description>add GfmListblock for GFM listsGfmListblock captures an entire list block atomically with oneaddSpecialPattern match, then walks the captured text in handle()grouping lines into items. Each item&apos;s body is dedented to itscontent column and parsed by ModeRegistry::getSubParser() soblock content (paragraphs, fenced code, blockquotes, pluginblocks) works inside items uniformly. Sub-parsed calls are wrappedin a Nest call before they reach the outer handler, matching theFootnote pattern: the main handler&apos;s Block rewriter treats nestas opaque and the renderer base class unwraps it transparently,so multi-paragraph items don&apos;t get double-wrapped in &lt;p&gt;.Marker syntax: -, *, + (unordered) or 1-9 digits followed by. or ) (ordered). Indentation is a 2-space-multiple step startingat 0; depth = (indent / 2) + 1, odd indents round down, tabs becometwo spaces. The first ordered item&apos;s number drives the startattribute on &lt;ol&gt; via the listo_open $start parameter.GfmLists subclasses AbstractListsRewriter with the GFM markerparser; the state machine on the base class is shared with DW Lists.GfmListblock loads only when $conf[&apos;syntax&apos;] is markdown or md+dw.Under those settings the DW Listblock is suppressed because the twolist models conflict &#8212; DW&apos;s mandatory 2-space indent rule vs GFM&apos;szero-indent top-level rule, and -/*/+ markers shared. Plugins thatrelied on Listblock loading under md+dw will see it absent there.Sub-parser exclusion set: CATEGORY_BASEONLY (no Header inside listitems) and gfm_listblock itself (defensive guard against re-entryon pathological inputs; nested lists are handled by the outerpattern, not by re-entry).Tests cover marker variants, ordered start numbers, nested lists attwo and three levels, inline formatting inside items, marker-character switches keeping one list, type switches splitting thelist, fenced code inside items, multi-paragraph (loose) items, andtwo regressions on blank-line tolerance inside the captured block.SpecCompatRenderer learns to render the list call sequence, andspec.txt tests for digit/marker-width/lazy-continuation behaviorthat GfmListblock deliberately doesn&apos;t implement are documented ingfm-spec/skip.php with the per-bucket reasons (A-F).Drops two now-obsolete entries from skip.php (image escapes thatland via earlier GfmLink/GfmMedia work) and inlines the Setextexplanation that previously pointed at SPEC.md. Replaces theSPEC.md reference in GfmEmphasisTest with the inline reason.

            List of files:
            /dokuwiki/_test/tests/Parsing/Markdown/SpecCompatRenderer.php</description>
        <pubDate>Tue, 28 Apr 2026 06:23:11 +0000</pubDate>
        <dc:creator>Andreas Gohr &lt;andi@splitbrain.org&gt;</dc:creator>
    </item>
<item>
        <title>b1c59bed2e3645a1f5f11438cdbe7d1596f4a3a4 - add GfmCode / GfmFile for fenced code blocks</title>
        <link>http://127.0.0.1:8080/history/dokuwiki/_test/tests/Parsing/Markdown/SpecCompatRenderer.php#b1c59bed2e3645a1f5f11438cdbe7d1596f4a3a4</link>
        <description>add GfmCode / GfmFile for fenced code blocksGfmCode (backticks) emits the `code` handler instruction; GfmFile(tildes) emits `file`. Column-0 fences only, no length pairingbetween opener and closer, and unclosed fences stay literal &#8212;matching DokuWiki&apos;s `&lt;code&gt;` tag convention. The info string acceptsDW&apos;s full attribute vocabulary (language, filename, [options])through a new shared `Helpers::parseCodeAttributes` that `Code`also uses, with `html` aliased to `html4strict` and `-` meaning &quot;nolanguage&quot;.Preformatted&apos;s indent threshold is now preference-gated: 2 spacesin DW-preferred settings, 4 spaces in MD-preferred, matching GFM&apos;sindented code block rule. A single tab is a trigger in both.

            List of files:
            /dokuwiki/_test/tests/Parsing/Markdown/SpecCompatRenderer.php</description>
        <pubDate>Thu, 23 Apr 2026 14:01:03 +0000</pubDate>
        <dc:creator>Andreas Gohr &lt;andi@splitbrain.org&gt;</dc:creator>
    </item>
<item>
        <title>3440a8c07d59952439e180d2c33a32262fd3a84c - add GfmMedia and extend GfmLink with image-as-label form</title>
        <link>http://127.0.0.1:8080/history/dokuwiki/_test/tests/Parsing/Markdown/SpecCompatRenderer.php#3440a8c07d59952439e180d2c33a32262fd3a84c</link>
        <description>add GfmMedia and extend GfmLink with image-as-label form- New GfmMedia parses `![alt](url)` with the full DokuWiki media-parameter  vocabulary in the URL slot (?100x200, ?right, ?nolink, ?recache, &#8230;).  Adds `?left`/`?right`/`?center` align keywords shared with DW `{{&#8230;}}`  &#8212; gives pure-Markdown users a way to align inline images.- GfmLink now also matches `[![alt](img)](target)` &#8212; the GFM equivalent  of `[[target|{{img}}]]`. Detection is post-entry, mirroring  Internallink&apos;s `^{{&#8230;}}$` check; one mode covers the whole family.- LinkDispatch trait replaced by Helpers::classifyLink and  Helpers::parseMediaParameters &#8212; two pure static methods, shared by  DW and GFM counterparts.- Entry patterns for GfmLink / GfmMedia simplified (permissive URL slot,  handle-time parsing), following DW&apos;s Internallink style.- GfmSpecTest drives a test-only SpecCompatRenderer that emits bare  &lt;img&gt; / &lt;a&gt; instead of DW&apos;s wiki-wrapped HTML, recovering 13 spec  tests that previously failed/skipped only because of renderer shape.

            List of files:
            /dokuwiki/_test/tests/Parsing/Markdown/SpecCompatRenderer.php</description>
        <pubDate>Wed, 22 Apr 2026 14:28:30 +0000</pubDate>
        <dc:creator>Andreas Gohr &lt;gohr@cosmocode.de&gt;</dc:creator>
    </item>
</channel>
</rss>
