<?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 GfmQuote.php</title>
    <description></description>
    <language>en</language>
    <copyright>Copyright 2025</copyright>
    <generator>Java</generator><item>
        <title>b22130d2b9e76b1247849cd618b2bcf664ee020f - fix(parser): stop group-quantifier body patterns from exhausting memory</title>
        <link>http://127.0.0.1:8080/history/dokuwiki/inc/Parsing/ParserMode/GfmQuote.php#b22130d2b9e76b1247849cd618b2bcf664ee020f</link>
        <description>fix(parser): stop group-quantifier body patterns from exhausting memorySeveral patterns repeat a group &#8212; (?:&#8230;)* / (?:&#8230;)+ &#8212; over a body that canspan a large region. On the non-JIT PCRE engine each iteration of agroup repetition keeps its own backtracking frame, so a big body retainsone frame per byte: a linear, unbounded memory spike that can fatal arequest (and, with JIT on, trips pcre.jit_stacklimit so the lexer dumpsthe rest of the document as literal text). A repetition over a singleitem (.* , [^x]+) is optimized by PCRE and unaffected.Make each body possessive: the repeated group cannot match the delimiterthat follows it, so it always stops at the first closer and never needsto backtrack.- media {{&#8230;}}, windowssharelink, gfm_quote, gfm_link: possessive body.- email validation (used by emaillink and mail_isvalid): possessive  local-part and domain groups; a long dotted `a.a.a&#8230;` local part or  domain was a ReDoS vector. Match results are unchanged.

            List of files:
            /dokuwiki/inc/Parsing/ParserMode/GfmQuote.php</description>
        <pubDate>Wed, 08 Jul 2026 17:43:28 +0000</pubDate>
        <dc:creator>Andreas Gohr &lt;gohr@cosmocode.de&gt;</dc:creator>
    </item>
<item>
        <title>e248eb6f8b6985dbe44dd2e8e16b6407ea1562a7 - fix(parser): don&apos;t drop document content after a blank indented line</title>
        <link>http://127.0.0.1:8080/history/dokuwiki/inc/Parsing/ParserMode/GfmQuote.php#e248eb6f8b6985dbe44dd2e8e16b6407ea1562a7</link>
        <description>fix(parser): don&apos;t drop document content after a blank indented linePreformatted&apos;s exit pattern (?=\n[^ \t\n]) is a lookahead-only exit: itconsumes no byte so the boundary \n stays in the stream for a following blockmode (an &lt;hr&gt; or header after an indented code block) to anchor on.When that exit fired with nothing else consumed - a &quot;blank&quot; line that is emptyafter its indent, followed by a column-0 line - the match was zero-width at thecurrent offset and the lexer&apos;s no-advance guard aborted the whole parse,silently discarding the rest of the document. Reachable on ordinary trailingwhitespace (&quot;abc\n  \nmore&quot;) and inside footnotes.Exempt zero-width MODE_EXIT matches from the guard: popping the mode stack isreal progress and leaves the boundary byte for the parent mode to consume onthe next iteration. The stack strictly shrinks on each such exit, so thiscannot loop; the infinite-loop protection is unchanged for every otherzero-width match. Preformatted&apos;s pattern is left as-is, so &lt;hr&gt;/header after anindented code block still works, including after a blank indented line.Add regressions for the blank-line, blank-line-after-code, andboundary-preservation (hr after a blank indented line) cases.

            List of files:
            /dokuwiki/inc/Parsing/ParserMode/GfmQuote.php</description>
        <pubDate>Sun, 05 Jul 2026 15:58:46 +0000</pubDate>
        <dc:creator>Andreas Gohr &lt;andi@splitbrain.org&gt;</dc:creator>
    </item>
<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/GfmQuote.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/GfmQuote.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>dccbd514161d242fdd8495ae23b9690bc52463c9 - GfmQuote: accept ^&gt; line starts so quotes can follow tables and lists</title>
        <link>http://127.0.0.1:8080/history/dokuwiki/inc/Parsing/ParserMode/GfmQuote.php#dccbd514161d242fdd8495ae23b9690bc52463c9</link>
        <description>GfmQuote: accept ^&gt; line starts so quotes can follow tables and listsGfmTable, DW Table, and DW Listblock all consume the boundary \n ontheir way out. A pure-lookahead exit pattern at that boundary wouldtrip the lexer&apos;s no-advance safety check, because tables and listsexit right after consuming a marker token and have no leadingunmatched content for the lookahead to attach to (unlike Preformatted,whose body leaves code lines as UNMATCHED right before the boundary).Fix this on the consumer side: change the first-line anchor from \n&gt;to (?:^|\n)&gt;. With the lexer&apos;s m flag, ^ matches at offset 0 and atany position immediately following a \n in the subject, including theposition right after a \n that a preceding mode just consumed.Subsequent quote lines keep the \n&gt; anchor.Adds three handoff tests in GfmQuoteTest covering GfmTable, DW Table,and DW Listblock. Resolves GFM spec example 201.

            List of files:
            /dokuwiki/inc/Parsing/ParserMode/GfmQuote.php</description>
        <pubDate>Tue, 05 May 2026 15:18:33 +0000</pubDate>
        <dc:creator>Andreas Gohr &lt;andi@splitbrain.org&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/inc/Parsing/ParserMode/GfmQuote.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/inc/Parsing/ParserMode/GfmQuote.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>309a08521b24a6fff00f318e061096f69771bbad - replace DW Quote with unified GfmQuote</title>
        <link>http://127.0.0.1:8080/history/dokuwiki/inc/Parsing/ParserMode/GfmQuote.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/inc/Parsing/ParserMode/GfmQuote.php</description>
        <pubDate>Thu, 30 Apr 2026 11:58:30 +0000</pubDate>
        <dc:creator>Andreas Gohr &lt;andi@splitbrain.org&gt;</dc:creator>
    </item>
</channel>
</rss>
