<?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 GfmEmphasisStrongUnderscoreTest.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/_test/tests/Parsing/ParserMode/GfmEmphasisStrongUnderscoreTest.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/_test/tests/Parsing/ParserMode/GfmEmphasisStrongUnderscoreTest.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>13a62f810fbd091d15ab734b467eaec0a6bf829a - rename syntax flavors &apos;dokuwiki&apos; / &apos;markdown&apos; to &apos;dw&apos; / &apos;md&apos;</title>
        <link>http://127.0.0.1:8080/history/dokuwiki/_test/tests/Parsing/ParserMode/GfmEmphasisStrongUnderscoreTest.php#13a62f810fbd091d15ab734b467eaec0a6bf829a</link>
        <description>rename syntax flavors &apos;dokuwiki&apos; / &apos;markdown&apos; to &apos;dw&apos; / &apos;md&apos;Symmetry with the existing &apos;dw+md&apos; / &apos;md+dw&apos; setting values.

            List of files:
            /dokuwiki/_test/tests/Parsing/ParserMode/GfmEmphasisStrongUnderscoreTest.php</description>
        <pubDate>Mon, 04 May 2026 10:18:11 +0000</pubDate>
        <dc:creator>Andreas Gohr &lt;andi@splitbrain.org&gt;</dc:creator>
    </item>
<item>
        <title>0244be5c08829b6ca187d7158bca94e7c2fd7be3 - add GfmDeleted mode for GFM strikethrough (`~~text~~`)</title>
        <link>http://127.0.0.1:8080/history/dokuwiki/_test/tests/Parsing/ParserMode/GfmEmphasisStrongUnderscoreTest.php#0244be5c08829b6ca187d7158bca94e7c2fd7be3</link>
        <description>add GfmDeleted mode for GFM strikethrough (`~~text~~`)Shares the deleted_open/deleted_close instructions with DW&apos;s &lt;del&gt; mode.Entry/exit anchors `(?&lt;!~)` / `(?!~)` reject runs of three or more tildesso fenced-code markers remain untouched. Also trim redundant class-leveldocblocks on sibling Gfm test files.

            List of files:
            /dokuwiki/_test/tests/Parsing/ParserMode/GfmEmphasisStrongUnderscoreTest.php</description>
        <pubDate>Tue, 21 Apr 2026 13:52:10 +0000</pubDate>
        <dc:creator>Andreas Gohr &lt;gohr@cosmocode.de&gt;</dc:creator>
    </item>
<item>
        <title>2bb62bca317961d66fa2908b40f183af01402a91 - add GFM em-wrapping-strong modes for `***foo***` / `___foo___`</title>
        <link>http://127.0.0.1:8080/history/dokuwiki/_test/tests/Parsing/ParserMode/GfmEmphasisStrongUnderscoreTest.php#2bb62bca317961d66fa2908b40f183af01402a91</link>
        <description>add GFM em-wrapping-strong modes for `***foo***` / `___foo___`Two new inline formatting modes that render triple-delimiter runs asem wrapping strong:  GfmEmphasisStrong            `***text***`  &#8594; &lt;em&gt;&lt;strong&gt;text&lt;/strong&gt;&lt;/em&gt;  GfmEmphasisStrongUnderscore  `___text___`  &#8594; same (MD-preferred only)Only the exact 3+3 symmetric case is handled. The other long-run andasymmetric variants (4+4, 5+5, `***foo**`, etc.) require CommonMark&apos;sstack-based delimiter-pairing algorithm with its flanking andmultiple-of-3 rules, which is explicitly out of scope; those examplesstay skipped in gfm-spec/skip.php.Implementation notes:* Patterns enforce exact 3+3 via `(?&lt;!\*)` / `(?&lt;!_)` lookbehinds  (preventing entry at the second `*` of a `****...` run) and  `(?!\*)` / `(?!_)` lookaheads after the closing triple (rejecting  `***foo****` etc.). Combined with the existing non-whitespace  adjacency lookaheads, all asymmetric cases cleanly fall through to  other modes or stay literal.* GfmEmphasisStrong overrides handle() to emit two instructions on  entry (emphasis_open + strong_open) and two on exit (strong_close  + emphasis_close). GfmEmphasisStrongUnderscore inherits that  handler &#8212; only delimiters and word-boundary rules differ.* Sort 65 &#8212; below Strong (70) and GfmEmphasis (80) so the em+strong  modes win the lexer race for `***`/`___` runs. Underscore variant  is MD-preferred-only, matching the existing gating of  GfmEmphasisUnderscore and GfmStrongUnderscore.Per-mode unit tests cover basic matching, single-char bodies,whitespace flanking rejection, paragraph-boundary rejection,longer-run rejection, asymmetric rejection, multibyte intrawordprotection, and sort values. ModeRegistryTest&apos;s gating data providerpicks up the two new rules.Net effect on GfmSpecTest: example #476 (`***foo***`) now passes;473/474/475/477 remain skipped as documented in skip.php.

            List of files:
            /dokuwiki/_test/tests/Parsing/ParserMode/GfmEmphasisStrongUnderscoreTest.php</description>
        <pubDate>Mon, 20 Apr 2026 18:59:51 +0000</pubDate>
        <dc:creator>Andreas Gohr &lt;gohr@cosmocode.de&gt;</dc:creator>
    </item>
</channel>
</rss>
