@readme/markdown 15.0.2 → 15.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/components/Callout/style.scss +6 -6
- package/components/Cards/style.scss +2 -2
- package/components/Glossary/index.tsx +5 -0
- package/components/Glossary/style.scss +5 -3
- package/components/Image/style.scss +2 -2
- package/dist/main.css +2 -2
- package/dist/main.css.map +1 -1
- package/dist/main.js +103 -34
- package/dist/main.node.js +103 -34
- package/dist/main.node.js.map +1 -1
- package/dist/render-fixture.css +1 -1
- package/dist/render-fixture.css.map +1 -1
- package/dist/render-fixture.node.js +103 -34
- package/dist/render-fixture.node.js.map +1 -1
- package/package.json +1 -1
- package/styles/mixins/dark-mode.scss +13 -0
- package/styles/mixins/when-color-mode-dark.scss +48 -0
package/dist/render-fixture.css
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
.Accordion{background:rgba(var(--color-bg-page-rgb, white), 1);border:1px solid var(--color-border-default, rgba(0, 0, 0, 0.1));border-radius:5px}.Accordion-title{align-items:center;background:rgba(var(--color-bg-page-rgb, white), 1);border:0;border-radius:5px;color:var(--color-text-default, #384248);cursor:pointer;display:flex;font-size:16px;font-weight:500;padding:10px;position:relative;text-align:left;width:100%}.Accordion-title:hover{background:var(--color-bg-hover, rgba(0, 0, 0, 0.05))}.Accordion[open] .Accordion-title{border-bottom-left-radius:0;border-bottom-right-radius:0}.Accordion-title::marker{content:""}.Accordion-title::-webkit-details-marker{display:none}.Accordion-toggleIcon,.Accordion-toggleIcon_opened{color:var(--color-text-minimum, #637288);font-size:14px;margin-left:5px;margin-right:10px;transition:transform .1s}.Accordion-toggleIcon_opened,.Accordion-toggleIcon_opened_opened{transform:rotate(90deg)}.Accordion-icon{color:var(--project-color-primary, inherit);margin-right:10px}.Accordion-content{color:var(--color-text-muted, #4f5a66);padding:5px 15px 0 15px}.Accordion-content>*{margin-bottom:var(--markdown-spacing, 15px)}
|
|
2
|
-
.CardsGrid{--CardsGrid-gap: 1.5em;--CardsGrid-columns: auto-fit;--CardsGrid-cardWidth: auto;display:grid;gap:var(--CardsGrid-gap);grid-template-columns:repeat(var(--CardsGrid-columns), minmax(var(--CardsGrid-cardWidth), 1fr))}.Card{--Card-badge-bg-color: var(--yellow);--Card-badge-color: var(--yellow10);--Card-content-color: var(--color-text-minimum);--Card-gap: 0.25em;--Card-href-arrow-opacity: 0;--Card-href-arrow-transform: translateX(-5px);--Card-icon-color: var(--color-text-default);--Card-icon-opacity: 0.65;--Card-icon-opacity-hover: 0.75;--Card-line-height: 1.4;--Card-shadow: none;--Card-title-color: var(--color-text-default);background:var(--Card-bg-color);border:1px solid var(--Card-border-color);border-radius:var(--border-radius-lg);box-shadow:var(--Card-shadow);display:flex;flex-direction:var(--Card-layout);gap:var(--Card-gap);line-height:var(--Card-line-height);padding:var(--Card-padding);text-decoration:none}.Card_card{--Card-bg-color: rgba(var(--color-bg-page-inverse-rgb), 0);--Card-bg-color-hover: rgba(var(--color-bg-page-inverse-rgb), 0);--Card-border-color: var(--color-border-default);--Card-layout: column;--Card-padding: 1.5em}[data-color-mode=dark] .Card_card{--Card-bg-color: rgba(var(--color-bg-page-inverse-rgb), 0.05);--Card-bg-color-hover: rgba(var(--color-bg-page-inverse-rgb), 0.1)}@media(prefers-color-scheme: dark){
|
|
2
|
+
.CardsGrid{--CardsGrid-gap: 1.5em;--CardsGrid-columns: auto-fit;--CardsGrid-cardWidth: auto;display:grid;gap:var(--CardsGrid-gap);grid-template-columns:repeat(var(--CardsGrid-columns), minmax(var(--CardsGrid-cardWidth), 1fr))}.Card{--Card-badge-bg-color: var(--yellow);--Card-badge-color: var(--yellow10);--Card-content-color: var(--color-text-minimum);--Card-gap: 0.25em;--Card-href-arrow-opacity: 0;--Card-href-arrow-transform: translateX(-5px);--Card-icon-color: var(--color-text-default);--Card-icon-opacity: 0.65;--Card-icon-opacity-hover: 0.75;--Card-line-height: 1.4;--Card-shadow: none;--Card-title-color: var(--color-text-default);background:var(--Card-bg-color);border:1px solid var(--Card-border-color);border-radius:var(--border-radius-lg);box-shadow:var(--Card-shadow);display:flex;flex-direction:var(--Card-layout);gap:var(--Card-gap);line-height:var(--Card-line-height);padding:var(--Card-padding);text-decoration:none}.Card_card{--Card-bg-color: rgba(var(--color-bg-page-inverse-rgb), 0);--Card-bg-color-hover: rgba(var(--color-bg-page-inverse-rgb), 0);--Card-border-color: var(--color-border-default);--Card-layout: column;--Card-padding: 1.5em}.rm-ReadMe[data-color-mode=dark] .Card_card{--Card-bg-color: rgba(var(--color-bg-page-inverse-rgb), 0.05);--Card-bg-color-hover: rgba(var(--color-bg-page-inverse-rgb), 0.1)}@media(prefers-color-scheme: dark){.rm-ReadMe[data-color-mode=system] .Card_card{--Card-bg-color: rgba(var(--color-bg-page-inverse-rgb), 0.05);--Card-bg-color-hover: rgba(var(--color-bg-page-inverse-rgb), 0.1)}}.Card_tile{--Card-gap: 1em;--Card-icon-opacity: 0.5;--Card-layout: row}.Card_tile .Card-content{--Card-gap: 0}.Card[href]:not([href=""]){color:inherit;text-decoration:none}.Card[href]:not([href=""]):hover,.Card[href]:not([href=""]):active,.Card[href]:not([href=""]):focus{--Card-icon-opacity: var(--Card-icon-opacity-hover);--Card-href-arrow-opacity: 0.75;--Card-href-arrow-transform: none;background:var(--Card-bg-color-hover)}.Card-icon{color:var(--Card-icon-color);font-size:1.4em;margin-bottom:.5em;opacity:var(--Card-icon-opacity);transition:opacity var(--transition-timing) var(--transition-fast)}.Card-title{align-items:flex-start;color:var(--Card-title-color);display:flex;gap:.5em;font-weight:var(--font-weight-bold)}.Card-badge{align-items:center;background:var(--Card-badge-bg-color);border-radius:1em;color:var(--Card-badge-color);font-size:.6em;padding:0 .5em;display:inline-flex;position:relative;top:.5em}.Card-arrow{font-size:.8em;opacity:var(--Card-href-arrow-opacity);position:relative;top:.375em;transition:opacity var(--transition-timing) var(--transition-fast),transform var(--transition-timing) var(--transition-fast);transform:var(--Card-href-arrow-transform)}.Card-content{color:var(--Card-content-color);display:flex;flex-direction:column;font-size:1em;gap:var(--Card-gap)}.Card-content p:last-child{margin-bottom:0}
|
|
3
3
|
.Columns{display:grid;gap:var(--md, 20px)}@media(max-width: 414px){.Columns{grid-template-columns:1fr !important}}
|
|
4
4
|
.TabGroup-nav{border-bottom:solid var(--color-border-default, rgba(0, 0, 0, 0.1));margin-bottom:15px}.TabGroup-tab{background:none;border:0;color:var(--color-text-minimum, #637288);cursor:pointer;font-size:15px;font-weight:600;margin-right:15px;padding:0;padding-bottom:10px}.TabGroup-tab_active{background:none;border:0;border-bottom:solid var(--color-tab-active, currentcolor);color:var(--color-tab-active, currentcolor);font-size:15px;font-weight:600;margin-right:15px;margin-bottom:-2px;padding:0;padding-bottom:10px}.TabGroup-tab:hover{color:var(--color-text-muted, #4f5a66)}.TabGroup-icon{color:var(--project-color-primary, inherit);margin-right:10px}.TabGroup .TabContent{color:var(--color-text-muted, #4f5a66)}:where(.TabGroup .TabContent>*:not(:last-child)){margin-bottom:var(--markdown-spacing, 15px)}
|
|
5
5
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render-fixture.css","mappings":"AAAA,WACE,oDACA,iEACA,kBAEA,iBACE,mBACA,oDACA,SACA,kBACA,yCACA,eACA,aACA,eACA,gBACA,aACA,kBACA,gBACA,WAEA,uBACE,sDAGF,kCACE,4BACA,6BAGF,yBACE,WAGF,yCACE,aAIJ,mDAEE,yCACA,eACA,gBACA,kBACA,yBAEA,iEACE,wBAIJ,gBACE,4CACA,kBAGF,mBACE,uCACA,wBAEA,qBACE,4C;ACzDN,WACE,uBACA,8BACA,4BAEA,aACA,yBACA,gGAGF,MAGE,qCACA,oCACA,gDACA,mBACA,6BACA,8CACA,6CACA,0BACA,gCACA,wBACA,oBACA,8CAEA,gCACA,0CACA,sCACA,8BACA,aACA,kCACA,oBACA,oCACA,4BACA,qBAEA,WACE,2DACA,iEACA,iDACA,sBACA,
|
|
1
|
+
{"version":3,"file":"render-fixture.css","mappings":"AAAA,WACE,oDACA,iEACA,kBAEA,iBACE,mBACA,oDACA,SACA,kBACA,yCACA,eACA,aACA,eACA,gBACA,aACA,kBACA,gBACA,WAEA,uBACE,sDAGF,kCACE,4BACA,6BAGF,yBACE,WAGF,yCACE,aAIJ,mDAEE,yCACA,eACA,gBACA,kBACA,yBAEA,iEACE,wBAIJ,gBACE,4CACA,kBAGF,mBACE,uCACA,wBAEA,qBACE,4C;ACzDN,WACE,uBACA,8BACA,4BAEA,aACA,yBACA,gGAGF,MAGE,qCACA,oCACA,gDACA,mBACA,6BACA,8CACA,6CACA,0BACA,gCACA,wBACA,oBACA,8CAEA,gCACA,0CACA,sCACA,8BACA,aACA,kCACA,oBACA,oCACA,4BACA,qBAEA,WACE,2DACA,iEACA,iDACA,sBACA,sBCTA,4CDYE,8DACA,mECRA,mCADF,8CDQE,8DACA,oEAIJ,WACE,gBACA,yBACA,mBAEA,yBACE,cAKJ,2BACE,cACA,qBAEA,oGAGE,oDACA,gCACA,kCAEA,sCAIJ,WACE,6BACA,gBACA,mBACA,iCACA,mEAGF,YACE,uBACA,8BACA,aACA,SACA,oCAGF,YACE,mBACA,sCACA,kBACA,8BACA,eACA,eACA,oBACA,kBACA,SAGF,YACE,eACA,uCACA,kBACA,WACA,4HACE,CAEF,2CAGF,cACE,gCACA,aACA,sBACA,cACA,oBAEA,2BACE,gB;AE7HN,SACE,aACA,oBAEA,yBAJF,SAKI,sC;ACNF,cACE,oEACA,mBAGF,cACE,gBACA,SACA,yCACA,eACA,eACA,gBACA,kBACA,UACA,oBAEA,qBACE,gBACA,SACA,0DACA,4CACA,eACA,gBACA,kBACA,mBACA,UACA,oBAGF,oBACE,uCAIJ,eACE,4CACA,kBAGF,sBACE,uCAIJ,iDACE,4C","sources":["webpack://@readme/markdown/./components/Accordion/style.scss","webpack://@readme/markdown/./components/Cards/style.scss","webpack://@readme/markdown/./styles/mixins/when-color-mode-dark.scss","webpack://@readme/markdown/./components/Columns/style.scss","webpack://@readme/markdown/./components/Tabs/style.scss"],"sourcesContent":[".Accordion {\n background: rgba(var(--color-bg-page-rgb, white), 1);\n border: 1px solid var(--color-border-default, rgba(black, 0.1));\n border-radius: 5px;\n\n &-title {\n align-items: center;\n background: rgba(var(--color-bg-page-rgb, white), 1);\n border: 0;\n border-radius: 5px;\n color: var(--color-text-default, #384248);\n cursor: pointer;\n display: flex;\n font-size: 16px;\n font-weight: 500;\n padding: 10px;\n position: relative;\n text-align: left;\n width: 100%;\n\n &:hover {\n background: var(--color-bg-hover, rgba(black, 0.05));\n }\n\n .Accordion[open] & {\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n }\n\n &::marker {\n content: \"\";\n }\n\n &::-webkit-details-marker {\n display: none;\n } \n }\n\n &-toggleIcon,\n &-toggleIcon_opened {\n color: var(--color-text-minimum, #637288);\n font-size: 14px;\n margin-left: 5px;\n margin-right: 10px;\n transition: transform 0.1s;\n\n &_opened {\n transform: rotate(90deg);\n }\n }\n\n &-icon {\n color: var(--project-color-primary, inherit);\n margin-right: 10px;\n }\n\n &-content {\n color: var(--color-text-muted, #4f5a66);\n padding: 5px 15px 0 15px;\n\n > * {\n margin-bottom: var(--markdown-spacing, 15px);\n }\n }\n}\n","@import '../../styles/mixins/when-color-mode-dark.scss';\n\n$iphone-plus: 414px;\n\n.CardsGrid {\n --CardsGrid-gap: 1.5em;\n --CardsGrid-columns: auto-fit;\n --CardsGrid-cardWidth: auto;\n\n display: grid;\n gap: var(--CardsGrid-gap);\n grid-template-columns: repeat(var(--CardsGrid-columns), minmax(var(--CardsGrid-cardWidth), 1fr));\n}\n\n.Card {\n $card: &;\n\n --Card-badge-bg-color: var(--yellow);\n --Card-badge-color: var(--yellow10);\n --Card-content-color: var(--color-text-minimum);\n --Card-gap: 0.25em;\n --Card-href-arrow-opacity: 0;\n --Card-href-arrow-transform: translateX(-5px);\n --Card-icon-color: var(--color-text-default);\n --Card-icon-opacity: 0.65;\n --Card-icon-opacity-hover: 0.75;\n --Card-line-height: 1.4;\n --Card-shadow: none;\n --Card-title-color: var(--color-text-default);\n\n background: var(--Card-bg-color);\n border: 1px solid var(--Card-border-color);\n border-radius: var(--border-radius-lg);\n box-shadow: var(--Card-shadow);\n display: flex;\n flex-direction: var(--Card-layout);\n gap: var(--Card-gap);\n line-height: var(--Card-line-height);\n padding: var(--Card-padding);\n text-decoration: none;\n\n &_card {\n --Card-bg-color: rgba(var(--color-bg-page-inverse-rgb), 0);\n --Card-bg-color-hover: rgba(var(--color-bg-page-inverse-rgb), 0);\n --Card-border-color: var(--color-border-default);\n --Card-layout: column;\n --Card-padding: 1.5em;\n\n @include when-color-mode-dark('.rm-ReadMe') {\n --Card-bg-color: rgba(var(--color-bg-page-inverse-rgb), 0.05);\n --Card-bg-color-hover: rgba(var(--color-bg-page-inverse-rgb), 0.1);\n }\n }\n\n &_tile {\n --Card-gap: 1em;\n --Card-icon-opacity: 0.5;\n --Card-layout: row;\n\n #{$card}-content {\n --Card-gap: 0;\n }\n }\n\n // needs specificity to override the default link styles; while preserving logic for empty hrefs\n &[href]:not([href='']) {\n color: inherit;\n text-decoration: none;\n\n &:hover,\n &:active,\n &:focus {\n --Card-icon-opacity: var(--Card-icon-opacity-hover);\n --Card-href-arrow-opacity: 0.75;\n --Card-href-arrow-transform: none;\n\n background: var(--Card-bg-color-hover);\n }\n }\n\n &-icon {\n color: var(--Card-icon-color);\n font-size: 1.4em;\n margin-bottom: 0.5em;\n opacity: var(--Card-icon-opacity);\n transition: opacity var(--transition-timing) var(--transition-fast);\n }\n\n &-title {\n align-items: flex-start;\n color: var(--Card-title-color);\n display: flex;\n gap: 0.5em;\n font-weight: var(--font-weight-bold);\n }\n\n &-badge {\n align-items: center;\n background: var(--Card-badge-bg-color);\n border-radius: 1em;\n color: var(--Card-badge-color);\n font-size: 0.6em;\n padding: 0 0.5em;\n display: inline-flex;\n position: relative;\n top: 0.5em;\n }\n\n &-arrow {\n font-size: 0.8em;\n opacity: var(--Card-href-arrow-opacity);\n position: relative;\n top: 0.375em;\n transition:\n opacity var(--transition-timing) var(--transition-fast),\n transform var(--transition-timing) var(--transition-fast);\n transform: var(--Card-href-arrow-transform);\n }\n\n &-content {\n color: var(--Card-content-color);\n display: flex;\n flex-direction: column;\n font-size: 1em;\n gap: var(--Card-gap);\n\n p:last-child {\n margin-bottom: 0;\n }\n }\n}\n","/**\n * Dark styles keyed off `$root`'s own `data-color-mode`, not any ancestor.\n * Unlike `dark-mode` (which matches ANY ancestor carrying the attribute —\n * see the warning on that mixin), this only fires when `$root` itself\n * declares the dark/system mode. None of this package's components carry\n * `data-color-mode` on their own root, so callers must pass the selector\n * for whichever wrapper actually carries it in their consuming app — there\n * is no default.\n *\n * IMPORTANT: this package ships one precompiled `dist/main.css` — there is\n * no build step where a consumer can supply their own value for `$root`.\n * Whatever gets passed at each `@include` call site below is permanent for\n * every installer of this package. Call sites currently hardcode\n * `'.rm-ReadMe'`, readme's hub color-mode wrapper, because readme is this\n * package's only real consumer today. If that ever changes, this becomes\n * silently wrong (not an error — dark mode just never activates) for any\n * consumer without that exact class in their DOM, and `$root` should be\n * dropped in favor of each component resolving its own nearest\n * `[data-color-mode]` ancestor at mount via `Element.closest()` and\n * stamping it onto its own root, so the CSS can self-anchor with no\n * hardcoded selector at all.\n *\n * $global: wrap the root-anchor selector in :global(), for use when this\n * file is imported into a CSS-module context (mirrors `dark-mode`'s param).\n */\n@mixin when-color-mode-dark($root, $global: false) {\n @if $global {\n :global(#{$root}[data-color-mode='dark']) & {\n @content;\n }\n\n :global(#{$root}[data-color-mode='system']) & {\n @media (prefers-color-scheme: dark) {\n @content;\n }\n }\n } @else {\n #{$root}[data-color-mode='dark'] & {\n @content;\n }\n\n #{$root}[data-color-mode='system'] & {\n @media (prefers-color-scheme: dark) {\n @content;\n }\n }\n }\n}\n","$iphone-plus: 414px;\n\n.Columns {\n display: grid;\n gap: var(--md, 20px);\n\n @media (max-width: $iphone-plus) {\n grid-template-columns: 1fr !important;\n }\n}\n",".TabGroup {\n &-nav {\n border-bottom: solid var(--color-border-default, #{rgba(black, 0.1)});\n margin-bottom: 15px;\n }\n\n &-tab {\n background: none;\n border: 0;\n color: var(--color-text-minimum, #637288);\n cursor: pointer;\n font-size: 15px;\n font-weight: 600;\n margin-right: 15px;\n padding: 0;\n padding-bottom: 10px;\n\n &_active {\n background: none;\n border: 0;\n border-bottom: solid var(--color-tab-active, currentcolor);\n color: var(--color-tab-active, currentcolor);\n font-size: 15px;\n font-weight: 600;\n margin-right: 15px;\n margin-bottom: -2px;\n padding: 0;\n padding-bottom: 10px;\n }\n\n &:hover {\n color: var(--color-text-muted, #4f5a66);\n }\n }\n\n &-icon {\n color: var(--project-color-primary, inherit);\n margin-right: 10px;\n }\n\n .TabContent {\n color: var(--color-text-muted, #4f5a66);\n }\n}\n\n:where(.TabGroup .TabContent > *:not(:last-child)) {\n margin-bottom: var(--markdown-spacing, 15px);\n}\n"],"names":[],"sourceRoot":""}
|
|
@@ -92110,6 +92110,9 @@ const GlossaryContext = (0,external_react_.createContext)([]);
|
|
|
92110
92110
|
|
|
92111
92111
|
|
|
92112
92112
|
|
|
92113
|
+
/** Tippy portals to document.body by default, which would break the
|
|
92114
|
+
* `.rm-ReadMe[data-color-mode] …` descendant selectors in style.scss. */
|
|
92115
|
+
const appendToReadMeRoot = (ref) => ref.closest('.rm-ReadMe') ?? document.body;
|
|
92113
92116
|
const Glossary = ({ children, term: termProp, terms }) => {
|
|
92114
92117
|
const term = (Array.isArray(children) ? children[0] : children) || termProp;
|
|
92115
92118
|
if (!term)
|
|
@@ -92117,7 +92120,7 @@ const Glossary = ({ children, term: termProp, terms }) => {
|
|
|
92117
92120
|
const foundTerm = terms.find(i => term.toLowerCase() === i?.term?.toLowerCase());
|
|
92118
92121
|
if (!foundTerm)
|
|
92119
92122
|
return external_react_default().createElement("span", null, term);
|
|
92120
|
-
return (external_react_default().createElement(tippy_react_esm, { content: external_react_default().createElement("div", { className: "GlossaryItem-tooltip-content" },
|
|
92123
|
+
return (external_react_default().createElement(tippy_react_esm, { appendTo: appendToReadMeRoot, content: external_react_default().createElement("div", { className: "GlossaryItem-tooltip-content" },
|
|
92121
92124
|
external_react_default().createElement("strong", { className: "GlossaryItem-term" }, foundTerm.term),
|
|
92122
92125
|
" - ",
|
|
92123
92126
|
foundTerm.definition), offset: [-5, 5], placement: "bottom-start" },
|
|
@@ -97247,13 +97250,36 @@ const MARKER_PATTERNS = [
|
|
|
97247
97250
|
// Pattern for ** bold **
|
|
97248
97251
|
// Groups: 1=wordBefore, 2=marker, 3=contentWithSpaceAfter, 4=trailingSpace1, 5=contentWithSpaceBefore, 6=trailingSpace2, 7=afterChar
|
|
97249
97252
|
// trailingSpace1 is for "** text **" pattern, trailingSpace2 is for "**text **" pattern
|
|
97250
|
-
|
|
97253
|
+
//
|
|
97254
|
+
// The wordBefore and whitespace prefixes are deliberately bounded ({1,64} /
|
|
97255
|
+
// {0,8}) rather than unbounded (+ / *). An unbounded prefix makes matchAll
|
|
97256
|
+
// re-scan an arbitrarily long run from every character position, which turns
|
|
97257
|
+
// the pass O(n²) on text nodes containing huge unbroken tokens (pasted base64
|
|
97258
|
+
// payloads, minified code). Bounding the prefix caps the backtracking per
|
|
97259
|
+
// position; a prefix longer than the bound just starts the match later, and
|
|
97260
|
+
// the cut-off chars flow into the preceding text node instead — adjacent text
|
|
97261
|
+
// parts are merged before splicing, so the emitted AST is unchanged.
|
|
97262
|
+
//
|
|
97263
|
+
// The content quantifiers are bounded too ({1,500}). The underscore content
|
|
97264
|
+
// clauses can scan across `_` (needed for snake_case content), so without a
|
|
97265
|
+
// bound every `_` in a marker-dense token (base64url, snake_case identifiers)
|
|
97266
|
+
// re-scans to end-of-line looking for a closer — O(n²) again. Content already
|
|
97267
|
+
// can't cross a newline, and 500 chars covers any sentence-length emphasis
|
|
97268
|
+
// phrase; longer spans stay unnormalized rather than costing quadratic scans.
|
|
97269
|
+
const asteriskBoldRegex = /([^*\s]{1,64})?\s{0,8}(\*\*)(?:\s+((?:[^*\n]|\*(?!\*)){1,500}?)(\s*)\2|((?:[^*\n]|\*(?!\*)){1,500}?)(\s+)\2)(\S|$)?/g;
|
|
97251
97270
|
// Pattern for __ bold __
|
|
97252
|
-
const underscoreBoldRegex = /([^_\s]
|
|
97271
|
+
const underscoreBoldRegex = /([^_\s]{1,64})?\s{0,8}(__)(?:\s+((?:__(?! )|_(?!_)|[^_\n]){1,500}?)(\s*)\2|((?:__(?! )|_(?!_)|[^_\n]){1,500}?)(\s+)\2)(\S|$)?/g;
|
|
97253
97272
|
// Pattern for * italic *
|
|
97254
|
-
const asteriskItalicRegex = /([^*\s]
|
|
97273
|
+
const asteriskItalicRegex = /([^*\s]{1,64})?\s{0,8}(\*)(?!\*)(?:\s+([^*\n]{1,500}?)(\s*)\2|([^*\n]{1,500}?)(\s+)\2)(\S|$)?/g;
|
|
97255
97274
|
// Pattern for _ italic _
|
|
97256
|
-
const underscoreItalicRegex = /([^_\s]
|
|
97275
|
+
const underscoreItalicRegex = /([^_\s]{1,64})?\s{0,8}(_)(?!_)(?:\s+((?:[^_\n]|_(?! )){1,500}?)(\s*)\2|((?:[^_\n]|_(?! )){1,500}?)(\s+)\2)(\S|$)?/g;
|
|
97276
|
+
// Every loose alternation requires whitespace beside a marker — after the
|
|
97277
|
+
// opening (`** text**`) or before the closing (`**text **`) — so
|
|
97278
|
+
// marker-beside-whitespace is an exact gate for the loose families. A single
|
|
97279
|
+
// linear probe skips them entirely on marker-dense tokens whose markers are
|
|
97280
|
+
// all intraword (base64url payloads, snake_case identifiers).
|
|
97281
|
+
const asteriskBesideWhitespaceRegex = /\*\s|\s\*/;
|
|
97282
|
+
const underscoreBesideWhitespaceRegex = /_\s|\s_/;
|
|
97257
97283
|
// CommonMark ignores intraword underscores or asteriks, but we want to italicize/bold the inner part
|
|
97258
97284
|
// Pattern for intraword _word_ in words like hello_world_
|
|
97259
97285
|
const intrawordUnderscoreItalicRegex = /(\w)_(?!_)([a-zA-Z0-9]+)_(?![\w_])/g;
|
|
@@ -97263,6 +97289,23 @@ const intrawordUnderscoreBoldRegex = /(\w)__([a-zA-Z0-9]+)__(?![\w_])/g;
|
|
|
97263
97289
|
const intrawordAsteriskItalicRegex = /(\w)\*(?!\*)([a-zA-Z0-9]+)\*(?![\w*])/g;
|
|
97264
97290
|
// Pattern for intraword **word** in words like hello**world**
|
|
97265
97291
|
const intrawordAsteriskBoldRegex = /(\w)\*\*([a-zA-Z0-9]+)\*\*(?![\w*])/g;
|
|
97292
|
+
// All regex families, in match-precedence order: collected matches are
|
|
97293
|
+
// stable-sorted by match.index, so at an equal index the earlier row wins the
|
|
97294
|
+
// overlap filter — keep this order. `gate` names the per-node precondition
|
|
97295
|
+
// (see the gate record in the visitor) checked before the family's regex
|
|
97296
|
+
// runs, so a node that can't possibly match never pays for a full scan: the
|
|
97297
|
+
// intraword families need their marker character present, and the loose
|
|
97298
|
+
// families additionally need that marker beside whitespace.
|
|
97299
|
+
const REGEX_FAMILIES = [
|
|
97300
|
+
{ regex: asteriskBoldRegex, isBold: true, marker: '**', gate: 'asteriskLoose' },
|
|
97301
|
+
{ regex: underscoreBoldRegex, isBold: true, marker: '__', gate: 'underscoreLoose' },
|
|
97302
|
+
{ regex: asteriskItalicRegex, isBold: false, marker: '*', gate: 'asteriskLoose' },
|
|
97303
|
+
{ regex: underscoreItalicRegex, isBold: false, marker: '_', gate: 'underscoreLoose' },
|
|
97304
|
+
{ regex: intrawordUnderscoreItalicRegex, isBold: false, isIntraword: true, marker: '_', gate: 'underscore' },
|
|
97305
|
+
{ regex: intrawordUnderscoreBoldRegex, isBold: true, isIntraword: true, marker: '__', gate: 'underscore' },
|
|
97306
|
+
{ regex: intrawordAsteriskItalicRegex, isBold: false, isIntraword: true, marker: '*', gate: 'asterisk' },
|
|
97307
|
+
{ regex: intrawordAsteriskBoldRegex, isBold: true, isIntraword: true, marker: '**', gate: 'asterisk' },
|
|
97308
|
+
];
|
|
97266
97309
|
/**
|
|
97267
97310
|
* Finds opening emphasis marker in a text value.
|
|
97268
97311
|
* Returns marker info if found, null otherwise.
|
|
@@ -97454,6 +97497,21 @@ function isInsideInlineHtmlCode(index, parent) {
|
|
|
97454
97497
|
* malformed emphasis syntax. This plugin post-processes the AST to handle these cases.
|
|
97455
97498
|
*/
|
|
97456
97499
|
const normalize_malformed_md_syntax_normalizeEmphasisAST = () => (tree) => {
|
|
97500
|
+
// Back-scanning siblings for <code>…</code> html pairs costs O(children)
|
|
97501
|
+
// per text node — O(children²) per parent, which bites on marker-dense
|
|
97502
|
+
// paragraphs where micromark emits thousands of inline children. Most
|
|
97503
|
+
// parents have no html children at all, so cache that check per parent and
|
|
97504
|
+
// skip the back-scan entirely. The cached flag survives our splices: they
|
|
97505
|
+
// only ever swap text nodes for text/strong/emphasis, never html.
|
|
97506
|
+
const hasHtmlChild = new WeakMap();
|
|
97507
|
+
const mayBeInsideInlineHtmlCode = (index, parent) => {
|
|
97508
|
+
let flag = hasHtmlChild.get(parent);
|
|
97509
|
+
if (flag === undefined) {
|
|
97510
|
+
flag = parent.children.some(child => child.type === 'html');
|
|
97511
|
+
hasHtmlChild.set(parent, flag);
|
|
97512
|
+
}
|
|
97513
|
+
return flag && isInsideInlineHtmlCode(index, parent);
|
|
97514
|
+
};
|
|
97457
97515
|
lib_visit(tree, 'text', function visitor(node, index, parent) {
|
|
97458
97516
|
if (index === undefined || !parent)
|
|
97459
97517
|
return undefined;
|
|
@@ -97465,41 +97523,39 @@ const normalize_malformed_md_syntax_normalizeEmphasisAST = () => (tree) => {
|
|
|
97465
97523
|
// raw HTML <code>...</code> inside table cells, which the table re-parser
|
|
97466
97524
|
// parses as MDX JSX (not as an mdast `inlineCode` node).
|
|
97467
97525
|
if ((parent.type === 'mdxJsxTextElement' || parent.type === 'mdxJsxFlowElement') &&
|
|
97468
|
-
'name' in parent &&
|
|
97526
|
+
'name' in parent &&
|
|
97527
|
+
parent.name === 'code') {
|
|
97469
97528
|
return undefined;
|
|
97470
97529
|
}
|
|
97530
|
+
const text = node.value;
|
|
97531
|
+
// The regexes below can't match without their marker character, but
|
|
97532
|
+
// running them anyway costs a scan of the whole node — ruinous on huge
|
|
97533
|
+
// pasted payloads (base64 attachments, minified code). Checked before the
|
|
97534
|
+
// html-sibling scan so marker-free text never pays for that either.
|
|
97535
|
+
const hasAsterisk = text.includes('*');
|
|
97536
|
+
const hasUnderscore = text.includes('_');
|
|
97537
|
+
if (!hasAsterisk && !hasUnderscore)
|
|
97538
|
+
return undefined;
|
|
97471
97539
|
// In GFM tables, inline <code>...</code> is represented as sibling `html`
|
|
97472
97540
|
// nodes rather than as an mdxJsxTextElement, so the check above doesn't
|
|
97473
97541
|
// apply. Scan backwards through siblings to see if we are enclosed by a
|
|
97474
97542
|
// <code>…</code> inline HTML pair.
|
|
97475
|
-
if (
|
|
97543
|
+
if (mayBeInsideInlineHtmlCode(index, parent)) {
|
|
97476
97544
|
return undefined;
|
|
97477
97545
|
}
|
|
97478
|
-
const
|
|
97546
|
+
const gates = {
|
|
97547
|
+
asterisk: hasAsterisk,
|
|
97548
|
+
asteriskLoose: hasAsterisk && asteriskBesideWhitespaceRegex.test(text),
|
|
97549
|
+
underscore: hasUnderscore,
|
|
97550
|
+
underscoreLoose: hasUnderscore && underscoreBesideWhitespaceRegex.test(text),
|
|
97551
|
+
};
|
|
97479
97552
|
const allMatches = [];
|
|
97480
|
-
|
|
97481
|
-
|
|
97482
|
-
|
|
97483
|
-
|
|
97484
|
-
|
|
97485
|
-
|
|
97486
|
-
[...text.matchAll(asteriskItalicRegex)].forEach(match => {
|
|
97487
|
-
allMatches.push({ isBold: false, marker: '*', match });
|
|
97488
|
-
});
|
|
97489
|
-
[...text.matchAll(underscoreItalicRegex)].forEach(match => {
|
|
97490
|
-
allMatches.push({ isBold: false, marker: '_', match });
|
|
97491
|
-
});
|
|
97492
|
-
[...text.matchAll(intrawordUnderscoreItalicRegex)].forEach(match => {
|
|
97493
|
-
allMatches.push({ isBold: false, isIntraword: true, marker: '_', match });
|
|
97494
|
-
});
|
|
97495
|
-
[...text.matchAll(intrawordUnderscoreBoldRegex)].forEach(match => {
|
|
97496
|
-
allMatches.push({ isBold: true, isIntraword: true, marker: '__', match });
|
|
97497
|
-
});
|
|
97498
|
-
[...text.matchAll(intrawordAsteriskItalicRegex)].forEach(match => {
|
|
97499
|
-
allMatches.push({ isBold: false, isIntraword: true, marker: '*', match });
|
|
97500
|
-
});
|
|
97501
|
-
[...text.matchAll(intrawordAsteriskBoldRegex)].forEach(match => {
|
|
97502
|
-
allMatches.push({ isBold: true, isIntraword: true, marker: '**', match });
|
|
97553
|
+
REGEX_FAMILIES.forEach(({ regex, gate, ...info }) => {
|
|
97554
|
+
if (!gates[gate])
|
|
97555
|
+
return;
|
|
97556
|
+
[...text.matchAll(regex)].forEach(match => {
|
|
97557
|
+
allMatches.push({ ...info, match });
|
|
97558
|
+
});
|
|
97503
97559
|
});
|
|
97504
97560
|
if (allMatches.length === 0)
|
|
97505
97561
|
return undefined;
|
|
@@ -97596,9 +97652,22 @@ const normalize_malformed_md_syntax_normalizeEmphasisAST = () => (tree) => {
|
|
|
97596
97652
|
parts.push({ type: 'text', value: remainingText });
|
|
97597
97653
|
}
|
|
97598
97654
|
}
|
|
97599
|
-
|
|
97600
|
-
|
|
97601
|
-
|
|
97655
|
+
// Merge adjacent text parts so the emitted AST doesn't depend on where a
|
|
97656
|
+
// match happened to start (the bounded prefixes above can shift a match
|
|
97657
|
+
// start rightward, splitting what used to be a single text node).
|
|
97658
|
+
const mergedParts = parts.reduce((acc, part) => {
|
|
97659
|
+
const prev = acc[acc.length - 1];
|
|
97660
|
+
if (part.type === 'text' && prev?.type === 'text') {
|
|
97661
|
+
prev.value += part.value;
|
|
97662
|
+
}
|
|
97663
|
+
else {
|
|
97664
|
+
acc.push(part);
|
|
97665
|
+
}
|
|
97666
|
+
return acc;
|
|
97667
|
+
}, []);
|
|
97668
|
+
if (mergedParts.length > 0) {
|
|
97669
|
+
parent.children.splice(index, 1, ...mergedParts);
|
|
97670
|
+
return [lib_SKIP, index + mergedParts.length];
|
|
97602
97671
|
}
|
|
97603
97672
|
return undefined;
|
|
97604
97673
|
});
|