<?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 GfmCode.php</title>
    <description></description>
    <language>en</language>
    <copyright>Copyright 2025</copyright>
    <generator>Java</generator><item>
        <title>47a02a102092be9e1e6f1ddaf158bdfffdb13d4f - Parsing: make parse syntax a per-parse value, drop ModeInterface</title>
        <link>http://127.0.0.1:8080/history/dokuwiki/inc/Parsing/ParserMode/GfmCode.php#47a02a102092be9e1e6f1ddaf158bdfffdb13d4f</link>
        <description>Parsing: make parse syntax a per-parse value, drop ModeInterfaceThe active parse&apos;s syntax flavour is a per-parse question, not process-global state: within a single request a plugin can render bundledDokuWiki-syntax text inside an otherwise-Markdown page. Yet ModeRegistrywas a singleton that read $conf[&apos;syntax&apos;] and the $PARSER_MODES global,and every mode reached it through ModeRegistry::getInstance() &#8212; so theflavour lived in shared mutable state that two parses in one requestwould fight over.Make the registry a short-lived value instead:- ModeRegistry is constructed once per parse with an explicit $syntax  and injected into Parser, Handler and every mode. getSyntax() /  isDwPreferred() / isMdPreferred() consult $this-&gt;syntax; the  DOKU_UNITTEST-gated mode-list cache hack is gone (each registry is  fresh, nothing to invalidate).- p_get_instructions() is now the single place in the pipeline where  $conf[&apos;syntax&apos;] is read; from there the flavour travels as a  parameter. No code under inc/Parsing/ reads $conf[&apos;syntax&apos;] directly  anymore &#8212; the five syntax-reading modes (Preformatted, GfmHr,  GfmEscape, Externallink, GfmQuote) route through $this-&gt;registry.Keep the two concepts apart, as documented in the ModeRegistry andAbstractMode docblocks: the user&apos;s configured *preference* stays in$conf[&apos;syntax&apos;] for UI code (toolbar, settings), while the activeparse&apos;s syntax is a parameter carried by the registry.$PARSER_MODES is demoted to a deprecated, read-only mirror, publishedduring loadPluginModes() &#8212; third-party syntax plugins (columnlist,alphalist2, phpwikify, skipentity) and the bundled info plugin read theglobal directly, often from their constructors, so the taxonomy muststay visible there. No core code reads the mirror.Fold ModeInterface into AbstractMode while here: getSort()/handle() areabstract, the connect callbacks carry defaults, and the public $Lexer&quot;FIXME should be done by setter&quot; becomes setLexer()/getLexer() injectedby Parser::addMode() alongside the registry. Nested-content resolutionmoves to the allowedCategories()/filterAllowedModes() hooks, resolvedonce when the registry is attached.Tests build their own parser/registry through ParserTestBase::setSyntax()instead of mutating $conf and calling the removed ModeRegistry::reset().

            List of files:
            /dokuwiki/inc/Parsing/ParserMode/GfmCode.php</description>
        <pubDate>Thu, 04 Jun 2026 12:27:59 +0000</pubDate>
        <dc:creator>Andreas Gohr &lt;gohr@cosmocode.de&gt;</dc:creator>
    </item>
<item>
        <title>eb15e634e1400f6c4d78f5fb40179ca25f41574d - extract Helpers\HtmlEntity, wire into GfmCode and GfmLink URL slot</title>
        <link>http://127.0.0.1:8080/history/dokuwiki/inc/Parsing/ParserMode/GfmCode.php#eb15e634e1400f6c4d78f5fb40179ca25f41574d</link>
        <description>extract Helpers\HtmlEntity, wire into GfmCode and GfmLink URL slotNumeric and named HTML entity decoding moves out of GfmHtmlEntity intoa pure helper, so capture-by-regex modes can apply the same decodepost-extraction (the inline lexer never reaches their bodies). Mirrorsthe Helpers\Escape pattern.Wired up in two slots:  - GfmCode info string: f&amp;ouml;&amp;ouml; now decodes to f&#246;&#246; in the    language class. Clears spec example #330.  - GfmLink URL: GfmLink::extractUrl() decodes entities. URL pattern    extends from `[^)\n]+` to `(?:\\.|[^)\n])+` so an escaped \) no    longer terminates the URL early; the existing post-classify    Escape::unescapeBackslashes call strips the backslashes after    Link::classify has done its work. Clears #504, #506, #508.Skip #328 with a self-contained title-slot reason: the URL side nowdecodes correctly, but the title attribute is still discarded(DokuWiki link instructions have no title slot).

            List of files:
            /dokuwiki/inc/Parsing/ParserMode/GfmCode.php</description>
        <pubDate>Mon, 04 May 2026 13:00:28 +0000</pubDate>
        <dc:creator>Andreas Gohr &lt;andi@splitbrain.org&gt;</dc:creator>
    </item>
<item>
        <title>74031e463764923581b9204cebc0fc3f34ce881f - add GfmEscape for GFM backslash escapes</title>
        <link>http://127.0.0.1:8080/history/dokuwiki/inc/Parsing/ParserMode/GfmCode.php#74031e463764923581b9204cebc0fc3f34ce881f</link>
        <description>add GfmEscape for GFM backslash escapesImplements GFM &#167;6.1 backslash-escape handling. GfmEscape is a sort-5inline mode in CATEGORY_SUBSTITION that claims `\X` for any escapableASCII punctuation char before competing delimiters can match. Theshared character class lives on Helpers\Escape so the lexer patternand the post-hoc unescape stay in lockstep.Whole-span captures (GfmCode info string, GfmLink label/URL) bypassthe lexer; those modes call Escape::unescapeBackslashes() on therelevant slot. GfmLink skips the unescape when the URL classifies asa windowssharelink so the leading \\host survives intact.GfmTable cells get a separate per-cell `\|` to `|` pass in therewriter to honour the tables-extension rule that pipes alwaysunescape, even inside code spans where standard &#167;6.1 escapes don&apos;tfire.

            List of files:
            /dokuwiki/inc/Parsing/ParserMode/GfmCode.php</description>
        <pubDate>Tue, 28 Apr 2026 17:08:30 +0000</pubDate>
        <dc:creator>Andreas Gohr &lt;andi@splitbrain.org&gt;</dc:creator>
    </item>
<item>
        <title>1e28e406b358f79221c515b2a56520d5dbbfb6c8 - split Parsing\Helpers into per-domain Link / Media / Code classes</title>
        <link>http://127.0.0.1:8080/history/dokuwiki/inc/Parsing/ParserMode/GfmCode.php#1e28e406b358f79221c515b2a56520d5dbbfb6c8</link>
        <description>split Parsing\Helpers into per-domain Link / Media / Code classes

            List of files:
            /dokuwiki/inc/Parsing/ParserMode/GfmCode.php</description>
        <pubDate>Thu, 23 Apr 2026 14:37:53 +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/inc/Parsing/ParserMode/GfmCode.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/inc/Parsing/ParserMode/GfmCode.php</description>
        <pubDate>Thu, 23 Apr 2026 14:01:03 +0000</pubDate>
        <dc:creator>Andreas Gohr &lt;andi@splitbrain.org&gt;</dc:creator>
    </item>
</channel>
</rss>
