<?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 GfmBacktickDouble.php</title>
    <description></description>
    <language>en</language>
    <copyright>Copyright 2025</copyright>
    <generator>Java</generator><item>
        <title>8ed75a23932353c18b43f67323808e9a662f532a - add GfmBacktickSingle / GfmBacktickDouble for GFM inline code spans</title>
        <link>http://127.0.0.1:8080/history/dokuwiki/inc/Parsing/ParserMode/GfmBacktickDouble.php#8ed75a23932353c18b43f67323808e9a662f532a</link>
        <description>add GfmBacktickSingle / GfmBacktickDouble for GFM inline code spansTwo new inline formatting modes covering GFM code spans in their n=1and n=2 forms:  GfmBacktickSingle   `text`    &#8594; &lt;code&gt;text&lt;/code&gt;  GfmBacktickDouble   ``text``  &#8594; &lt;code&gt;text&lt;/code&gt;Both emit monospace_open and monospace_close around an unformatted()call (the same instruction shape as DokuWiki&apos;s two-single-quote pairwrapping a nowiki span), so renderers that distinguish verbatim textfrom plain cdata &#8212; metadata, indexer, non-XHTML backends &#8212; treat thebody as literal.GfmBacktickDouble extends GfmBacktickSingle to reuse handle() and thebody-normalization helper; only the delimiter length and the bodycharacter class differ. Both share sort 165 and gate on Markdownbeing loaded.Design notes:* The lexer has no backreferences, so each length is its own mode.  Length-boundary guards (?&lt;!`)...(?!`) on every opener and closer  ensure a run of two-or-more backticks is never read as an n=1  delimiter and a run of three-or-more is never read as n=2. The two  modes never steal each other&apos;s input regardless of registration  order &#8212; sort can&apos;t reach this kind of cross-position constraint.* Edge-whitespace handling and newline normalization live in handle(),  not in the regex. On DOKU_LEXER_UNMATCHED the body is normalized:    1. CR/LF and LF become single spaces (GFM line-ending rule).    2. If the body starts and ends with a space and is not entirely       whitespace, one space is stripped from each end.  That produces the right GFM output for the tricky cases without  special-casing the entry pattern:    ` `          &#8594; &lt;code&gt; &lt;/code&gt;    (all-whitespace, no strip)    ` a`         &#8594; &lt;code&gt; a&lt;/code&gt;   (asymmetric, no strip)    ` `` `       &#8594; &lt;code&gt;``&lt;/code&gt;   (interior run-of-2 + strip)    ``foo`bar``  &#8594; &lt;code&gt;foo`bar&lt;/code&gt;* Body character classes admit exactly the runs that cannot be valid  closers for this mode&apos;s length: n=1 allows `[^`] | ``+`, n=2 allows  `[^`] | `(?!`)`. That is what lets a single-backtick span contain  a pair and a double-backtick span contain a lone backtick.* allowedModes is empty &#8212; no other inline parsing runs inside a span.Deliberately not implemented, with skip.php entries explaining why:  351 &#8212; code-span precedence over emphasis (*foo`*` expected to render        as *foo&lt;code&gt;*&lt;/code&gt;). Cross-positional: the single-pass        lexer matches leftmost-first and cannot reject an earlier        emphasis opener because a later backtick span would consume        its closer. A proper fix would need a pre-scan pass; sort        values only break ties at the same position.  353 &#8212; the trailing &quot; outside the code span gets converted to a        curly quote by DokuWiki typography, diverging from spec HTML.  354 &#8212; raw HTML tag pass-through; DokuWiki does not render raw HTML        by default.  356 &#8212; GFM angle-bracket autolink &lt;http://&#8230;&gt;: not implemented.Per-mode unit tests cover basic matching, flanking via the length-boundary guards, interior-run support in the body, edge-spacestripping, newline normalization, all-whitespace bodies, paragraph-boundary rejection, content-is-literal, and sort values.ModeRegistryTest&apos;s gating data provider picks up both modes.Net effect on GfmSpecTest: eleven previously-red code-span examplesnow pass (339, 340, 341, 342, 344, 345, 346, 347, 349, 350, 357, 359&#8212; the simple pairs, edge-space, interior-run, newline-normalization,and mismatched-run cases). Four skipped. Three remain pending outsidethe code-span scope (emphasis interactions that need GfmLink oncethat lands).

            List of files:
            /dokuwiki/inc/Parsing/ParserMode/GfmBacktickDouble.php</description>
        <pubDate>Wed, 22 Apr 2026 07:39:11 +0000</pubDate>
        <dc:creator>Andreas Gohr &lt;gohr@cosmocode.de&gt;</dc:creator>
    </item>
</channel>
</rss>
