@intlayer/core 9.4.4 → 9.5.1
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/README.md +0 -2
- package/dist/cjs/dictionaryManipulator/qualifiedDictionary.cjs.map +1 -1
- package/dist/cjs/index.cjs +5 -8
- package/dist/cjs/interpreter/getPlural.cjs.map +1 -1
- package/dist/cjs/localization/getPrefix.cjs +6 -6
- package/dist/cjs/localization/getPrefix.cjs.map +1 -1
- package/dist/cjs/markdown/compiler.cjs +437 -209
- package/dist/cjs/markdown/compiler.cjs.map +1 -1
- package/dist/cjs/markdown/constants.cjs +32 -50
- package/dist/cjs/markdown/constants.cjs.map +1 -1
- package/dist/cjs/markdown/elementScanner.cjs +191 -0
- package/dist/cjs/markdown/elementScanner.cjs.map +1 -0
- package/dist/cjs/markdown/index.cjs +5 -8
- package/dist/cjs/markdown/parser.cjs +90 -48
- package/dist/cjs/markdown/parser.cjs.map +1 -1
- package/dist/cjs/markdown/renderer.cjs +14 -11
- package/dist/cjs/markdown/renderer.cjs.map +1 -1
- package/dist/cjs/markdown/utils.cjs +123 -34
- package/dist/cjs/markdown/utils.cjs.map +1 -1
- package/dist/cjs/utils/getCookie.cjs +1 -1
- package/dist/cjs/utils/getCookie.cjs.map +1 -1
- package/dist/esm/dictionaryManipulator/qualifiedDictionary.mjs.map +1 -1
- package/dist/esm/index.mjs +3 -3
- package/dist/esm/interpreter/getPlural.mjs.map +1 -1
- package/dist/esm/localization/getPrefix.mjs +6 -6
- package/dist/esm/localization/getPrefix.mjs.map +1 -1
- package/dist/esm/markdown/compiler.mjs +438 -211
- package/dist/esm/markdown/compiler.mjs.map +1 -1
- package/dist/esm/markdown/constants.mjs +29 -43
- package/dist/esm/markdown/constants.mjs.map +1 -1
- package/dist/esm/markdown/elementScanner.mjs +183 -0
- package/dist/esm/markdown/elementScanner.mjs.map +1 -0
- package/dist/esm/markdown/index.mjs +3 -3
- package/dist/esm/markdown/parser.mjs +90 -48
- package/dist/esm/markdown/parser.mjs.map +1 -1
- package/dist/esm/markdown/renderer.mjs +14 -11
- package/dist/esm/markdown/renderer.mjs.map +1 -1
- package/dist/esm/markdown/utils.mjs +124 -35
- package/dist/esm/markdown/utils.mjs.map +1 -1
- package/dist/esm/utils/getCookie.mjs +1 -1
- package/dist/esm/utils/getCookie.mjs.map +1 -1
- package/dist/types/dictionaryManipulator/qualifiedDictionary.d.ts +3 -3
- package/dist/types/dictionaryManipulator/qualifiedDictionary.d.ts.map +1 -1
- package/dist/types/index.d.ts +4 -4
- package/dist/types/interpreter/getPlural.d.ts +3 -3
- package/dist/types/interpreter/getPlural.d.ts.map +1 -1
- package/dist/types/localization/getPrefix.d.ts.map +1 -1
- package/dist/types/markdown/compiler.d.ts +43 -0
- package/dist/types/markdown/compiler.d.ts.map +1 -1
- package/dist/types/markdown/constants.d.ts +26 -17
- package/dist/types/markdown/constants.d.ts.map +1 -1
- package/dist/types/markdown/elementScanner.d.ts +14 -0
- package/dist/types/markdown/elementScanner.d.ts.map +1 -0
- package/dist/types/markdown/index.d.ts +4 -4
- package/dist/types/markdown/parser.d.ts +0 -5
- package/dist/types/markdown/parser.d.ts.map +1 -1
- package/dist/types/markdown/renderer.d.ts +0 -4
- package/dist/types/markdown/renderer.d.ts.map +1 -1
- package/dist/types/markdown/types.d.ts +13 -0
- package/dist/types/markdown/types.d.ts.map +1 -1
- package/dist/types/markdown/utils.d.ts +7 -2
- package/dist/types/markdown/utils.d.ts.map +1 -1
- package/package.json +7 -7
- package/dist/types/@intlayer/core/dist/types/@intlayer/core/dist/types/@intlayer/core/dist/types/dictionaryManipulator/qualifiedDynamicLoader.d.ts +0 -1
- package/dist/types/@intlayer/core/dist/types/@intlayer/core/dist/types/@intlayer/core/dist/types/interpreter/getDictionaryAsync.d.ts +0 -1
- package/dist/types/@intlayer/core/dist/types/@intlayer/core/dist/types/@intlayer/core/dist/types/interpreter/getEnumeration.d.ts +0 -1
- package/dist/types/@intlayer/core/dist/types/@intlayer/core/dist/types/@intlayer/core/dist/types/interpreter/getGender.d.ts +0 -1
- package/dist/types/@intlayer/core/dist/types/@intlayer/core/dist/types/@intlayer/core/dist/types/interpreter/getInsertion.d.ts +0 -1
- package/dist/types/@intlayer/core/dist/types/@intlayer/core/dist/types/@intlayer/core/dist/types/interpreter/getPlural.d.ts +0 -1
- package/dist/types/@intlayer/core/dist/types/@intlayer/core/dist/types/@intlayer/core/dist/types/interpreter/getSelect.d.ts +0 -1
- package/dist/types/@intlayer/core/dist/types/@intlayer/core/dist/types/@intlayer/core/dist/types/interpreter/index.d.ts +0 -7
- package/dist/types/@intlayer/core/dist/types/@intlayer/core/dist/types/@intlayer/core/dist/types/interpreter/interpolableNode.d.ts +0 -1
- package/dist/types/@intlayer/core/dist/types/@intlayer/core/dist/types/@intlayer/core/dist/types/transpiler/index.d.ts +0 -2
- package/dist/types/@intlayer/core/dist/types/@intlayer/core/dist/types/@intlayer/core/dist/types/transpiler/nesting/index.d.ts +0 -1
- package/dist/types/@intlayer/core/dist/types/@intlayer/core/dist/types/@intlayer/core/dist/types/transpiler/nesting/nesting.d.ts +0 -1
- package/dist/types/@intlayer/core/dist/types/@intlayer/core/dist/types/dictionaryManipulator/qualifiedDynamicLoader.d.ts +0 -1
- package/dist/types/@intlayer/core/dist/types/@intlayer/core/dist/types/interpreter/getDictionaryAsync.d.ts +0 -1
- package/dist/types/@intlayer/core/dist/types/@intlayer/core/dist/types/interpreter/getEnumeration.d.ts +0 -1
- package/dist/types/@intlayer/core/dist/types/@intlayer/core/dist/types/interpreter/getGender.d.ts +0 -1
- package/dist/types/@intlayer/core/dist/types/@intlayer/core/dist/types/interpreter/getInsertion.d.ts +0 -1
- package/dist/types/@intlayer/core/dist/types/@intlayer/core/dist/types/interpreter/getPlural.d.ts +0 -1
- package/dist/types/@intlayer/core/dist/types/@intlayer/core/dist/types/interpreter/getSelect.d.ts +0 -1
- package/dist/types/@intlayer/core/dist/types/@intlayer/core/dist/types/interpreter/index.d.ts +0 -7
- package/dist/types/@intlayer/core/dist/types/@intlayer/core/dist/types/interpreter/interpolableNode.d.ts +0 -1
- package/dist/types/@intlayer/core/dist/types/@intlayer/core/dist/types/intlayer/dist/types/index.d.ts +0 -6
- package/dist/types/@intlayer/core/dist/types/@intlayer/core/dist/types/transpiler/index.d.ts +0 -2
- package/dist/types/@intlayer/core/dist/types/@intlayer/core/dist/types/transpiler/nesting/index.d.ts +0 -1
- package/dist/types/@intlayer/core/dist/types/@intlayer/core/dist/types/transpiler/nesting/nesting.d.ts +0 -1
- package/dist/types/@intlayer/core/dist/types/dictionaryManipulator/plainDynamicLoader.d.ts +0 -2
- package/dist/types/@intlayer/core/dist/types/dictionaryManipulator/qualifiedDynamicLoader.d.ts +0 -2
- package/dist/types/@intlayer/core/dist/types/formatters/compact.d.ts +0 -1
- package/dist/types/@intlayer/core/dist/types/formatters/currency.d.ts +0 -1
- package/dist/types/@intlayer/core/dist/types/formatters/date.d.ts +0 -1
- package/dist/types/@intlayer/core/dist/types/formatters/index.d.ts +0 -9
- package/dist/types/@intlayer/core/dist/types/formatters/list.d.ts +0 -1
- package/dist/types/@intlayer/core/dist/types/formatters/number.d.ts +0 -1
- package/dist/types/@intlayer/core/dist/types/formatters/percentage.d.ts +0 -1
- package/dist/types/@intlayer/core/dist/types/formatters/relativeTime.d.ts +0 -1
- package/dist/types/@intlayer/core/dist/types/formatters/units.d.ts +0 -1
- package/dist/types/@intlayer/core/dist/types/interpreter/dictionaryTransformCache.d.ts +0 -4
- package/dist/types/@intlayer/core/dist/types/interpreter/getCondition.d.ts +0 -2
- package/dist/types/@intlayer/core/dist/types/interpreter/getContent/deepTransform.d.ts +0 -1
- package/dist/types/@intlayer/core/dist/types/interpreter/getContent/getContent.d.ts +0 -3
- package/dist/types/@intlayer/core/dist/types/interpreter/getContent/index.d.ts +0 -3
- package/dist/types/@intlayer/core/dist/types/interpreter/getContent/plugins.d.ts +0 -7
- package/dist/types/@intlayer/core/dist/types/interpreter/getDictionary.d.ts +0 -4
- package/dist/types/@intlayer/core/dist/types/interpreter/getDictionaryAsync.d.ts +0 -6
- package/dist/types/@intlayer/core/dist/types/interpreter/getEnumeration.d.ts +0 -2
- package/dist/types/@intlayer/core/dist/types/interpreter/getGender.d.ts +0 -2
- package/dist/types/@intlayer/core/dist/types/interpreter/getInsertion.d.ts +0 -2
- package/dist/types/@intlayer/core/dist/types/interpreter/getIntlayer.d.ts +0 -4
- package/dist/types/@intlayer/core/dist/types/interpreter/getIntlayerAsync.d.ts +0 -4
- package/dist/types/@intlayer/core/dist/types/interpreter/getNesting.d.ts +0 -6
- package/dist/types/@intlayer/core/dist/types/interpreter/getPlural.d.ts +0 -3
- package/dist/types/@intlayer/core/dist/types/interpreter/getSelect.d.ts +0 -2
- package/dist/types/@intlayer/core/dist/types/interpreter/getTranslation.d.ts +0 -1
- package/dist/types/@intlayer/core/dist/types/interpreter/index.d.ts +0 -18
- package/dist/types/@intlayer/core/dist/types/interpreter/interpolableNode.d.ts +0 -2
- package/dist/types/@intlayer/core/dist/types/intlayer/dist/types/index.d.ts +0 -6
- package/dist/types/@intlayer/core/dist/types/localization/comparePaths.d.ts +0 -1
- package/dist/types/@intlayer/core/dist/types/localization/domainUtils.d.ts +0 -2
- package/dist/types/@intlayer/core/dist/types/localization/generateSitemap.d.ts +0 -2
- package/dist/types/@intlayer/core/dist/types/localization/getBrowserLocale.d.ts +0 -1
- package/dist/types/@intlayer/core/dist/types/localization/getCanonicalPath.d.ts +0 -2
- package/dist/types/@intlayer/core/dist/types/localization/getHTMLTextDir.d.ts +0 -1
- package/dist/types/@intlayer/core/dist/types/localization/getLocale.d.ts +0 -1
- package/dist/types/@intlayer/core/dist/types/localization/getLocaleFromPath.d.ts +0 -2
- package/dist/types/@intlayer/core/dist/types/localization/getLocaleLang.d.ts +0 -1
- package/dist/types/@intlayer/core/dist/types/localization/getLocaleName.d.ts +0 -1
- package/dist/types/@intlayer/core/dist/types/localization/getLocalizedPath.d.ts +0 -2
- package/dist/types/@intlayer/core/dist/types/localization/getLocalizedUrl.d.ts +0 -2
- package/dist/types/@intlayer/core/dist/types/localization/getMultilingualUrls.d.ts +0 -2
- package/dist/types/@intlayer/core/dist/types/localization/getPathWithoutLocale.d.ts +0 -1
- package/dist/types/@intlayer/core/dist/types/localization/getPrefix.d.ts +0 -2
- package/dist/types/@intlayer/core/dist/types/localization/index.d.ts +0 -22
- package/dist/types/@intlayer/core/dist/types/localization/localeDetector.d.ts +0 -2
- package/dist/types/@intlayer/core/dist/types/localization/localeMapper.d.ts +0 -1
- package/dist/types/@intlayer/core/dist/types/localization/localeResolver.d.ts +0 -1
- package/dist/types/@intlayer/core/dist/types/localization/resolveBrowserLocale.d.ts +0 -2
- package/dist/types/@intlayer/core/dist/types/localization/rewriteMatch.d.ts +0 -1
- package/dist/types/@intlayer/core/dist/types/localization/rewriteUtils.d.ts +0 -2
- package/dist/types/@intlayer/core/dist/types/localization/validatePrefix.d.ts +0 -2
- package/dist/types/@intlayer/core/dist/types/markdown/index.d.ts +0 -2
- package/dist/types/@intlayer/core/dist/types/transpiler/condition/condition.d.ts +0 -1
- package/dist/types/@intlayer/core/dist/types/transpiler/condition/index.d.ts +0 -1
- package/dist/types/@intlayer/core/dist/types/transpiler/enumeration/enumeration.d.ts +0 -1
- package/dist/types/@intlayer/core/dist/types/transpiler/enumeration/index.d.ts +0 -1
- package/dist/types/@intlayer/core/dist/types/transpiler/file/file.d.ts +0 -1
- package/dist/types/@intlayer/core/dist/types/transpiler/file/index.d.ts +0 -1
- package/dist/types/@intlayer/core/dist/types/transpiler/gender/gender.d.ts +0 -1
- package/dist/types/@intlayer/core/dist/types/transpiler/gender/index.d.ts +0 -1
- package/dist/types/@intlayer/core/dist/types/transpiler/html/html.d.ts +0 -1
- package/dist/types/@intlayer/core/dist/types/transpiler/html/index.d.ts +0 -1
- package/dist/types/@intlayer/core/dist/types/transpiler/index.d.ts +0 -22
- package/dist/types/@intlayer/core/dist/types/transpiler/insertion/index.d.ts +0 -1
- package/dist/types/@intlayer/core/dist/types/transpiler/insertion/insertion.d.ts +0 -1
- package/dist/types/@intlayer/core/dist/types/transpiler/markdown/index.d.ts +0 -1
- package/dist/types/@intlayer/core/dist/types/transpiler/markdown/markdown.d.ts +0 -1
- package/dist/types/@intlayer/core/dist/types/transpiler/nesting/index.d.ts +0 -1
- package/dist/types/@intlayer/core/dist/types/transpiler/nesting/nesting.d.ts +0 -4
- package/dist/types/@intlayer/core/dist/types/transpiler/plural/index.d.ts +0 -1
- package/dist/types/@intlayer/core/dist/types/transpiler/plural/plural.d.ts +0 -1
- package/dist/types/@intlayer/core/dist/types/transpiler/select/index.d.ts +0 -1
- package/dist/types/@intlayer/core/dist/types/transpiler/select/select.d.ts +0 -1
- package/dist/types/@intlayer/core/dist/types/transpiler/translation/index.d.ts +0 -1
- package/dist/types/@intlayer/core/dist/types/transpiler/translation/translation.d.ts +0 -2
- package/dist/types/@intlayer/core/dist/types/utils/index.d.ts +0 -3
- package/dist/types/@intlayer/core/dist/types/utils/intl.d.ts +0 -1
- package/dist/types/@intlayer/core/dist/types/utils/isSameKeyPath.d.ts +0 -1
- package/dist/types/@intlayer/core/dist/types/utils/localeStorage.d.ts +0 -2
- package/dist/types/intlayer/dist/types/index.d.ts +0 -14
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compiler.mjs","names":["defaultSlugify","defaultSanitizer"],"sources":["../../../src/markdown/compiler.ts"],"sourcesContent":["import {\n ATTR_EXTRACTOR_R,\n ATTRIBUTE_TO_NODE_PROP_MAP,\n BLOCK_END_R,\n BLOCKQUOTE_ALERT_R,\n BLOCKQUOTE_R,\n BLOCKQUOTE_TRIM_LEFT_MULTILINE_R,\n BREAK_LINE_R,\n BREAK_THEMATIC_R,\n CODE_BLOCK_FENCED_R,\n CODE_BLOCK_R,\n CODE_INLINE_R,\n CONSECUTIVE_NEWLINE_R,\n CUSTOM_COMPONENT_OPENING_TAG_R,\n CUSTOM_COMPONENT_R,\n DO_NOT_PROCESS_HTML_ELEMENTS,\n FOOTNOTE_R,\n FOOTNOTE_REFERENCE_R,\n FRONT_MATTER_R,\n GFM_TASK_R,\n HEADING_ATX_COMPLIANT_R,\n HEADING_R,\n HEADING_SETEXT_R,\n HTML_BLOCK_ELEMENT_R,\n HTML_BLOCK_OPENING_TAG_R,\n HTML_CHAR_CODE_R,\n HTML_COMMENT_R,\n HTML_LEFT_TRIM_AMOUNT_R,\n HTML_SELF_CLOSING_ELEMENT_R,\n HTML_SELF_CLOSING_OPENING_TAG_R,\n LINK_AUTOLINK_BARE_URL_R,\n LINK_AUTOLINK_R,\n type ListType,\n NAMED_CODES_TO_UNICODE,\n NP_TABLE_R,\n ORDERED,\n ORDERED_LIST_ITEM_PREFIX_R,\n ORDERED_LIST_ITEM_R,\n ORDERED_LIST_R,\n PARAGRAPH_R,\n Priority,\n REFERENCE_IMAGE_OR_LINK,\n REFERENCE_IMAGE_R,\n REFERENCE_LINK_R,\n RuleType,\n SHORTCODE_R,\n SHOULD_RENDER_AS_BLOCK_R,\n TEXT_BOLD_R,\n TEXT_EMPHASIZED_R,\n TEXT_ESCAPED_R,\n TEXT_MARKED_R,\n TEXT_PLAIN_R,\n TEXT_STRIKETHROUGHED_R,\n TRIM_STARTING_NEWLINES,\n UNORDERED,\n UNORDERED_LIST_ITEM_PREFIX_R,\n UNORDERED_LIST_ITEM_R,\n UNORDERED_LIST_R,\n} from './constants';\nimport { parserFor } from './parser';\nimport { createRenderer, renderFor } from './renderer';\nimport type {\n CompileOptions,\n ComponentOverrides as ComponentDefinition,\n HeadingNode,\n HTMLTag,\n MarkdownContext,\n MarkdownOptions,\n MarkdownRuntime,\n OrderedListNode,\n ParseState,\n Rule,\n Rules,\n TableNode,\n UnorderedListNode,\n} from './types';\nimport {\n allowInline,\n anyScopeRegex,\n attributeValueToNodePropValue,\n blockRegex,\n captureNothing,\n cx,\n sanitizer as defaultSanitizer,\n slugify as defaultSlugify,\n get,\n inlineRegex,\n normalizeAttributeKey,\n parseBlock,\n parseCaptureInline,\n parseInline,\n parseSimpleInline,\n parseTableAlign,\n parseTableCells,\n parseTableRow,\n renderNothing,\n simpleInlineRegex,\n some,\n startsWith,\n trimEnd,\n trimLeadingWhitespaceOutsideFences,\n unescapeString,\n unquote,\n} from './utils';\n\ntype CreateElementFunction = (\n tag: any,\n props: Record<string, any> | null,\n ...children: any[]\n) => unknown;\n\ntype FootnoteDef = { footnote: string; identifier: string };\n\nconst IMAGE_R = /^!\\[(.*?)\\]\\( *((?:\\([^)]*\\)|[^() ])*) *\"?([^)\"]*)?\"?\\)/;\nconst LINK_INSIDE =\n '(?:\\\\[[^\\\\[\\\\]]*(?:\\\\[[^\\\\[\\\\]]*\\\\][^\\\\[\\\\]]*)*\\\\]|[^\\\\[\\\\]])*';\nconst LINK_HREF_AND_TITLE =\n '\\\\s*<?((?:\\\\([^)]*\\\\)|[^\\\\s\\\\\\\\]|\\\\\\\\.)*?)>?(?:\\\\s+[\\'\"]([\\\\s\\\\S]*?)[\\'\"])?\\\\s*';\nconst LINK_R = new RegExp(\n `^\\\\[(${LINK_INSIDE})\\\\]\\\\(${LINK_HREF_AND_TITLE}\\\\)`\n);\n\n/**\n * Case-insensitive `</tag>` probes, cached per tag name.\n *\n * The `htmlBlock` rule is qualified at every candidate position, and it used to\n * lowercase the whole remaining document to look its closing tag up — copying\n * the rest of the file on each probe.\n */\nconst closingTagRegexCache = new Map<string, RegExp>();\n\nconst getClosingTagRegex = (tag: string): RegExp => {\n const cached = closingTagRegexCache.get(tag);\n\n if (cached) return cached;\n\n // Tag names are restricted to `[a-z][a-z0-9:-]*` by the opening-tag probe,\n // so they need no regex escaping.\n const regex = new RegExp(`</${tag}>`, 'i');\n closingTagRegexCache.set(tag, regex);\n\n return regex;\n};\n\n/**\n * Builds a tag -> component resolver for one set of overrides.\n *\n * The case-insensitive fallback used to rescan every override key on each\n * element created; the lowercase index is now built once per document instead.\n */\nconst createTagResolver = (components: ComponentDefinition<any>) => {\n let lowercaseKeys: Map<string, string> | null = null;\n\n return (tag: any): any => {\n if (typeof tag !== 'string') return tag;\n\n const override = get(components, tag);\n\n if (override) return override;\n\n if (!lowercaseKeys) {\n lowercaseKeys = new Map();\n\n // Later keys win, matching `Array.prototype.find` on `Object.keys`\n // only when they are unique — so the first key of a given lowercase\n // form is kept, as before.\n for (const key of Object.keys(components)) {\n const lowercased = key.toLowerCase();\n\n if (!lowercaseKeys.has(lowercased)) lowercaseKeys.set(lowercased, key);\n }\n }\n\n const key = lowercaseKeys.get(tag.toLowerCase());\n\n return (key ? get(components, key) : undefined) || tag;\n };\n};\n\n/** Resolves the slugifier for a context, falling back to the built-in one. */\nconst createSlugger =\n (ctx: MarkdownContext<any>) =>\n (input: string): string =>\n ctx.slugify ? ctx.slugify(input, defaultSlugify) : defaultSlugify(input);\n\nconst createElementFactory = (\n ctx: MarkdownContext<any>,\n options: MarkdownOptions\n): CreateElementFunction => {\n const { runtime, components = {} } = ctx;\n const resolveTag = createTagResolver(components);\n const filteredTags = options.tagfilter\n ? [\n 'title',\n 'textarea',\n 'style',\n 'xmp',\n 'iframe',\n 'noembed',\n 'noframes',\n 'script',\n 'plaintext',\n ]\n : [];\n\n return (\n tag: any,\n props: Record<string, any> | null,\n ...children: any[]\n ): unknown => {\n if (typeof tag === 'string' && filteredTags.includes(tag.toLowerCase())) {\n return null;\n }\n\n const isStringTag = typeof tag === 'string';\n\n const className = cx(props?.className, props?.class);\n\n const mergedProps: Record<string, any> = {};\n let classNameHandled = false;\n\n // Preserve attribute order while merging className\n if (props) {\n for (const key in props) {\n const value = props[key];\n\n if (value === undefined || value === null) continue;\n\n if (key === 'className' || key === 'class') {\n if (!classNameHandled) {\n if (className) mergedProps.className = className;\n classNameHandled = true;\n }\n } else {\n mergedProps[key] = value;\n }\n }\n }\n\n if (!classNameHandled && className) {\n mergedProps.className = className;\n }\n\n let finalProps = mergedProps;\n\n if (runtime.normalizeProps && isStringTag)\n finalProps = runtime.normalizeProps(tag as string, mergedProps);\n const component = resolveTag(tag);\n\n return runtime.createElement(\n component,\n finalProps,\n ...(children.length === 1 ? [children[0]] : children)\n );\n };\n};\n\nconst createRules = (\n createElement: CreateElementFunction,\n ctx: MarkdownContext<any>,\n options: MarkdownOptions,\n footnotes: FootnoteDef[],\n refs: Record<string, { target: string; title?: string }>,\n attrStringToMap: (tag: HTMLTag, str: string) => Record<string, any> | null,\n containsBlockSyntax: (input: string) => boolean,\n nonParagraphBlockSyntaxes: RegExp[]\n): Rules => {\n const slug = createSlugger(ctx);\n const sanitize = ctx.sanitizer ?? defaultSanitizer;\n const namedCodesToUnicode = ctx.namedCodesToUnicode\n ? { ...NAMED_CODES_TO_UNICODE, ...ctx.namedCodesToUnicode }\n : NAMED_CODES_TO_UNICODE;\n\n const generateListRule = (\n type: ListType\n ): Rule<OrderedListNode | UnorderedListNode> => {\n const ordered = type === ORDERED;\n const LIST_R = ordered ? ORDERED_LIST_R : UNORDERED_LIST_R;\n const LIST_ITEM_R = ordered ? ORDERED_LIST_ITEM_R : UNORDERED_LIST_ITEM_R;\n const LIST_ITEM_PREFIX_R = ordered\n ? ORDERED_LIST_ITEM_PREFIX_R\n : UNORDERED_LIST_ITEM_PREFIX_R;\n\n return {\n _qualify: (source) => LIST_ITEM_PREFIX_R.test(source),\n _match: allowInline((source, state) => {\n const lineIndent = state.prevCaptureIndent;\n const isStartOfLine = lineIndent !== undefined;\n const isListAllowed = state.list ?? (!state.inline && !state.simple);\n\n if (isStartOfLine && isListAllowed) {\n const matchSource = lineIndent ? lineIndent + source : source;\n\n return LIST_R.exec(matchSource);\n }\n\n return null;\n }),\n _order: Priority.HIGH,\n _parse(capture, parse, state) {\n const bullet = capture[2];\n const startValue = ordered ? +bullet.slice(0, -1) : undefined;\n const items = capture[0]\n .replace(BLOCK_END_R, '\\n')\n .match(LIST_ITEM_R) as string[];\n\n if (!items) return { items: [], ordered, start: startValue } as any;\n\n let lastItemWasAParagraph = false;\n\n const result = items.map((item, i) => {\n const prefixCapture = LIST_ITEM_PREFIX_R.exec(item);\n const space = prefixCapture ? prefixCapture[0].length : 0;\n const spaceRegex = new RegExp(`^ {1,${space}}`, 'gm');\n const content = item\n .replace(spaceRegex, '')\n .replace(LIST_ITEM_PREFIX_R, '');\n const isLastItem = i === items.length - 1;\n const containsBlocks = content.indexOf('\\n\\n') !== -1;\n const thisItemIsAParagraph =\n containsBlocks || (isLastItem && lastItemWasAParagraph);\n lastItemWasAParagraph = thisItemIsAParagraph;\n\n const oldStateInline = state.inline;\n const oldStateList = state.list;\n state.list = true;\n\n let adjustedContent: string;\n\n if (thisItemIsAParagraph) {\n state.inline = false;\n adjustedContent = `${trimEnd(content)}\\n\\n`;\n } else {\n state.inline = true;\n adjustedContent = trimEnd(content);\n }\n\n const parsed = parse(adjustedContent, state);\n state.inline = oldStateInline;\n state.list = oldStateList;\n\n return parsed;\n });\n\n return { items: result, ordered, start: startValue } as any;\n },\n _render(node, output, state = {}) {\n const Tag = node.ordered ? 'ol' : 'ul';\n const props: Record<string, any> = { key: state.key };\n\n if (node.ordered && node.start != null) props.start = node.start;\n\n return createElement(\n Tag,\n props,\n ...node.items.map((item, i) =>\n createElement('li', { key: i }, output(item, state))\n )\n );\n },\n };\n };\n\n const matchParagraph = (\n source: string,\n state: ParseState\n ): RegExpMatchArray | null => {\n if (\n state.inline ||\n state.simple ||\n (state.inHTML &&\n source.indexOf('\\n\\n') === -1 &&\n !state.prevCaptureHasBlankLine)\n )\n return null;\n let start = 0;\n while (true) {\n const newlineIndex = source.indexOf('\\n', start);\n const line = source.slice(\n start,\n newlineIndex === -1 ? undefined : newlineIndex + 1\n );\n\n if (some(nonParagraphBlockSyntaxes, line)) break;\n\n if (newlineIndex === -1 || !line.trim()) break;\n start = newlineIndex + 1;\n }\n const match = source.slice(0, start);\n // Align with original simple-markdown behavior: capture the whole match including newlines\n\n if (match === '') return null;\n const captured = trimEnd(match);\n\n if (captured === '') return null;\n\n return [match, undefined, captured] as unknown as RegExpMatchArray;\n };\n\n const rules: Rules = {\n [RuleType.blockQuote]: {\n _qualify: ['>'],\n _match: blockRegex(BLOCKQUOTE_R),\n _order: Priority.HIGH,\n _parse(capture, parse, state) {\n const matchAlert = capture[0]\n .replace(BLOCKQUOTE_TRIM_LEFT_MULTILINE_R, '')\n .match(BLOCKQUOTE_ALERT_R);\n const alert = matchAlert?.[1];\n const content = matchAlert?.[2] ?? '';\n const hasNewline = content.indexOf('\\n') !== -1;\n const children = hasNewline\n ? parseBlock(parse, content, state)\n : parseInline(parse, content, state);\n\n return { alert, children };\n },\n _render(node, output, state = {}) {\n const props: Record<string, any> = { key: state.key };\n\n if (node.alert) {\n props.className = `markdown-alert-${slug(node.alert.toLowerCase())}`;\n node.children.unshift({\n attrs: {},\n children: [{ type: RuleType.text, text: node.alert }],\n noInnerParse: true,\n type: RuleType.htmlBlock,\n tag: 'header',\n } as any);\n }\n\n return createElement('blockquote', props, output(node.children, state));\n },\n },\n [RuleType.breakLine]: {\n _qualify: [' '],\n _match: anyScopeRegex(BREAK_LINE_R),\n _order: Priority.HIGH,\n _parse: captureNothing,\n _render(_, __, state = {}) {\n return createElement('br', { key: state.key });\n },\n },\n [RuleType.breakThematic]: {\n _qualify: ['--', '__', '**', '- ', '* ', '_ '],\n _match: blockRegex(BREAK_THEMATIC_R),\n _order: Priority.HIGH,\n _parse: captureNothing,\n _render(_, __, state = {}) {\n return createElement('hr', { key: state.key });\n },\n },\n [RuleType.codeBlock]: {\n _qualify: [' '],\n _match: blockRegex(CODE_BLOCK_R),\n _order: Priority.MAX,\n _parse(capture) {\n return {\n type: RuleType.codeBlock,\n lang: undefined,\n text: unescapeString(trimEnd(capture[0].replace(/^ {4}/gm, ''))),\n };\n },\n _render(node, _, state = {}) {\n const attrs = { ...((node as any).attrs ?? {}) } as Record<string, any>;\n const langClass = node.lang ? `lang-${node.lang}` : 'lang-plaintext';\n attrs.className = attrs.className\n ? `${attrs.className} ${langClass}`\n : langClass;\n\n return createElement(\n 'pre',\n { key: state.key },\n createElement('code', attrs, node.text)\n );\n },\n },\n [RuleType.codeFenced]: {\n _qualify: ['```', '~~~'],\n _match: blockRegex(CODE_BLOCK_FENCED_R),\n _order: Priority.MAX,\n _parse(capture) {\n return {\n attrs: attrStringToMap('code', capture[3] ?? ''),\n lang: capture[2] || undefined,\n text: capture[4],\n type: RuleType.codeBlock,\n };\n },\n },\n [RuleType.codeInline]: {\n _qualify: ['`'],\n _match: simpleInlineRegex(CODE_INLINE_R),\n _order: Priority.LOW,\n _parse(capture) {\n return { text: unescapeString(capture[2]) };\n },\n _render(node, _, state = {}) {\n return createElement('code', { key: state.key }, node.text);\n },\n },\n [RuleType.footnote]: {\n _qualify: ['[^'],\n _match: blockRegex(FOOTNOTE_R),\n _order: Priority.MAX,\n _parse(capture) {\n footnotes.push({ footnote: capture[2], identifier: capture[1] });\n\n return {};\n },\n _render: renderNothing,\n },\n [RuleType.footnoteReference]: {\n _qualify: ['[^'],\n _match: inlineRegex(FOOTNOTE_REFERENCE_R),\n _order: Priority.HIGH,\n _parse(capture) {\n return { target: `#${slug(capture[1])}`, text: capture[1] };\n },\n _render(node, _, state = {}) {\n return createElement(\n 'a',\n {\n key: state.key,\n href: sanitize(node.target, 'a', 'href') ?? undefined,\n },\n createElement('sup', { key: state.key }, node.text)\n );\n },\n },\n [RuleType.gfmTask]: {\n _qualify: ['[ ]', '[x]'],\n _match: inlineRegex(GFM_TASK_R),\n _order: Priority.HIGH,\n _parse(capture) {\n return { completed: capture[1].toLowerCase() === 'x' };\n },\n _render(node, _, state = {}) {\n return createElement('input', {\n checked: node.completed,\n key: state.key,\n readOnly: true,\n type: 'checkbox',\n });\n },\n },\n [RuleType.heading]: {\n _qualify: ['#'],\n _match: blockRegex(\n options.enforceAtxHeadings ? HEADING_ATX_COMPLIANT_R : HEADING_R\n ),\n _order: Priority.HIGH,\n _parse(capture, parse, state) {\n return {\n children: parseInline(parse, capture[2], state),\n id: slug(capture[2]),\n level: capture[1].length as HeadingNode['level'],\n };\n },\n _render(node, output, state = {}) {\n return createElement(\n `h${node.level}` as HTMLTag,\n { id: node.id, key: state.key },\n output(node.children, state)\n );\n },\n },\n [RuleType.headingSetext]: {\n _qualify: (source) => {\n const nlIndex = source.indexOf('\\n');\n\n return (\n nlIndex > 0 &&\n nlIndex < source.length - 1 &&\n (source[nlIndex + 1] === '=' || source[nlIndex + 1] === '-')\n );\n },\n _match: blockRegex(HEADING_SETEXT_R),\n _order: Priority.MAX,\n _parse(capture, parse, state) {\n return {\n children: parseInline(parse, capture[1], state),\n level: capture[2] === '=' ? 1 : 2,\n type: RuleType.heading,\n };\n },\n },\n [RuleType.htmlBlock]: {\n _qualify: (source) => {\n if (options.disableParsingRawHTML) return false;\n\n const match = HTML_BLOCK_OPENING_TAG_R.exec(source);\n if (!match) return false;\n\n return getClosingTagRegex(match[1]).test(source);\n },\n _match: anyScopeRegex(HTML_BLOCK_ELEMENT_R),\n _order: Priority.HIGH,\n _parse(capture, parse, state) {\n const m = capture[3].match(HTML_LEFT_TRIM_AMOUNT_R);\n const whitespace = m?.[1] ?? '';\n const trimmed = trimLeadingWhitespaceOutsideFences(\n capture[3],\n whitespace\n );\n const parseFunc = containsBlockSyntax(trimmed)\n ? parseBlock\n : parseInline;\n const tagName = capture[1].trim();\n const noInnerParse =\n DO_NOT_PROCESS_HTML_ELEMENTS.indexOf(tagName.toLowerCase()) !== -1;\n const tag = (noInnerParse ? tagName.toLowerCase() : tagName) as HTMLTag;\n const ast: any = {\n attrs: attrStringToMap(tag, capture[2] ?? ''),\n noInnerParse,\n tag,\n };\n state.inAnchor = state.inAnchor || tagName.toLowerCase() === 'a';\n\n if (noInnerParse) {\n ast.text = capture[3];\n } else {\n const prevInHTML = state.inHTML;\n state.inHTML = true;\n ast.children = parseFunc(parse, trimmed, state);\n state.inHTML = prevInHTML;\n }\n state.inAnchor = false;\n\n return ast;\n },\n _render(node, output, state = {}) {\n return createElement(\n node.tag,\n { key: state.key, ...(node.attrs ?? {}) },\n node.text ?? (node.children ? output(node.children, state) : '')\n );\n },\n },\n [RuleType.htmlComment]: {\n _qualify: ['<!'],\n _match: anyScopeRegex(HTML_COMMENT_R),\n _order: Priority.HIGH,\n _parse: captureNothing,\n _render: renderNothing,\n },\n [RuleType.htmlSelfClosing]: {\n _qualify: (source) => {\n if (options.disableParsingRawHTML) return false;\n\n return HTML_SELF_CLOSING_OPENING_TAG_R.test(source);\n },\n _match: anyScopeRegex(HTML_SELF_CLOSING_ELEMENT_R),\n _order: Priority.HIGH,\n _parse(capture) {\n const tag = capture[1].trim() as HTMLTag;\n\n return { attrs: attrStringToMap(tag, capture[2] || ''), tag };\n },\n _render(node, _, state = {}) {\n return createElement(node.tag, {\n key: state.key,\n ...(node.attrs ?? {}),\n });\n },\n },\n [RuleType.customComponent]: {\n _qualify: (source) => CUSTOM_COMPONENT_OPENING_TAG_R.test(source),\n _match: anyScopeRegex(CUSTOM_COMPONENT_R),\n _order: Priority.MAX,\n _parse(capture, parse, state) {\n const m = capture[3].match(HTML_LEFT_TRIM_AMOUNT_R);\n const whitespace = m?.[1] ?? '';\n const trimmed = trimLeadingWhitespaceOutsideFences(\n capture[3],\n whitespace\n );\n const parseFunc = containsBlockSyntax(trimmed)\n ? parseBlock\n : parseInline;\n const tag = capture[1].trim();\n const ast: any = {\n attrs: attrStringToMap(tag as HTMLTag, capture[2] ?? ''),\n noInnerParse: false,\n tag,\n };\n const prevInHTML = state.inHTML;\n state.inHTML = true;\n ast.children = parseFunc(parse, trimmed, state);\n state.inHTML = prevInHTML;\n\n return ast;\n },\n _render(node, output, state = {}) {\n return createElement(\n node.tag as HTMLTag,\n { key: state.key, ...(node.attrs ?? {}) },\n node.text ?? (node.children ? output(node.children, state) : '')\n );\n },\n },\n [RuleType.paragraph]: {\n _match: matchParagraph,\n _order: Priority.LOW,\n _parse: parseCaptureInline,\n _render(node, output, state = {}) {\n return createElement(\n 'p',\n { key: state.key },\n output(node.children, state)\n );\n },\n },\n [RuleType.image]: {\n _qualify: ['!['],\n _match: simpleInlineRegex(IMAGE_R),\n _order: Priority.HIGH,\n _parse(capture) {\n return {\n alt: unescapeString(capture[1]),\n target: unescapeString(capture[2]),\n title: unescapeString(capture[3]),\n };\n },\n _render(node, _, state = {}) {\n return createElement('img', {\n key: state.key,\n alt: node.alt ?? undefined,\n title: node.title ?? undefined,\n src: sanitize(node.target, 'img', 'src') ?? undefined,\n });\n },\n },\n [RuleType.link]: {\n _qualify: ['['],\n _match: inlineRegex(LINK_R),\n _order: Priority.LOW,\n _parse(capture, parse, state) {\n return {\n children: parseSimpleInline(parse, capture[1], state),\n target: unescapeString(capture[2]),\n title: unescapeString(capture[3]),\n };\n },\n _render(node, output, state = {}) {\n const sanitizedHref = sanitize(node.target, 'a', 'href');\n return createElement(\n 'a',\n {\n key: state.key,\n href: sanitizedHref ?? undefined,\n title: node.title ?? undefined,\n },\n output(node.children, state)\n );\n },\n },\n [RuleType.linkAngleBraceStyleDetector]: {\n _qualify: ['<'],\n _match: inlineRegex(LINK_AUTOLINK_R),\n _order: Priority.MAX,\n _parse(capture) {\n let target = capture[1];\n let isEmail = false;\n\n if (target.indexOf('@') !== -1 && target.indexOf('//') === -1) {\n isEmail = true;\n target = target.replace('mailto:', '');\n }\n\n return {\n children: [{ text: target, type: RuleType.text }],\n target: isEmail ? `mailto:${target}` : target,\n type: RuleType.link,\n };\n },\n },\n [RuleType.linkBareUrlDetector]: {\n _qualify: (source, state) =>\n !!(\n state.inline &&\n !state.inAnchor &&\n !options.disableAutoLink &&\n (startsWith(source, 'http://') || startsWith(source, 'https://'))\n ),\n _match: inlineRegex(LINK_AUTOLINK_BARE_URL_R),\n _order: Priority.MAX,\n _parse(capture) {\n return {\n children: [{ text: capture[1], type: RuleType.text }],\n target: capture[1],\n type: RuleType.link,\n };\n },\n },\n [RuleType.newlineCoalescer]: {\n _match: blockRegex(CONSECUTIVE_NEWLINE_R),\n _order: Priority.LOW,\n _parse: captureNothing,\n _render() {\n return '\\n';\n },\n },\n [RuleType.orderedList]: generateListRule(ORDERED),\n [RuleType.unorderedList]: generateListRule(UNORDERED),\n [RuleType.ref]: {\n _qualify: ['['],\n _match: anyScopeRegex(REFERENCE_IMAGE_OR_LINK),\n _order: Priority.MAX,\n _parse(capture) {\n refs[capture[1]] = { target: capture[2], title: capture[4] };\n\n return {};\n },\n _render: renderNothing,\n },\n [RuleType.refImage]: {\n _qualify: ['!['],\n _match: simpleInlineRegex(REFERENCE_IMAGE_R),\n _order: Priority.MAX,\n _parse(capture) {\n return {\n alt: capture[1] ? unescapeString(capture[1]) : undefined,\n ref: capture[2],\n };\n },\n _render(node, _, state = {}) {\n const ref = refs[node.ref];\n\n if (!ref) return null;\n\n return createElement('img', {\n key: state.key,\n alt: node.alt,\n src: sanitize(ref.target, 'img', 'src') ?? undefined,\n title: ref.title,\n });\n },\n },\n [RuleType.refLink]: {\n _qualify: (source) => source[0] === '[' && source.indexOf('](') === -1,\n _match: inlineRegex(REFERENCE_LINK_R),\n _order: Priority.MAX,\n _parse(capture, parse, state) {\n return {\n children: parseSimpleInline(parse, capture[1], state),\n fallbackChildren: capture[0],\n ref: capture[2],\n };\n },\n _render(node, output, state = {}) {\n const ref = refs[node.ref];\n\n if (!ref)\n return createElement(\n 'span',\n { key: state.key },\n node.fallbackChildren\n );\n\n return createElement(\n 'a',\n {\n key: state.key,\n href: sanitize(ref.target, 'a', 'href') ?? undefined,\n title: ref.title,\n },\n output(node.children, state)\n );\n },\n },\n [RuleType.table]: {\n _qualify: ['|'],\n _match: blockRegex(NP_TABLE_R),\n _order: Priority.HIGH,\n _parse(capture, parse, state) {\n state.inline = true;\n const align = capture[2] ? parseTableAlign(capture[2]) : [];\n const cells = capture[3]\n ? parseTableCells(capture[3], parse, state)\n : [];\n const header = parseTableRow(capture[1], parse, state, !!cells.length);\n state.inline = false;\n\n return cells.length\n ? { align, cells, header, type: RuleType.table }\n : { children: header.flat(), type: RuleType.paragraph };\n },\n _render(node, output, state = {}) {\n const table = node as TableNode;\n const getStyle = (i: number) =>\n table.align[i] && table.align[i] !== 'left'\n ? { textAlign: table.align[i] }\n : {};\n\n return createElement(\n 'table',\n { key: state.key },\n createElement(\n 'thead',\n null,\n createElement(\n 'tr',\n null,\n ...table.header.map((c, i) =>\n createElement(\n 'th',\n { key: i, style: getStyle(i) },\n output(c, state)\n )\n )\n )\n ),\n createElement(\n 'tbody',\n null,\n ...table.cells.map((row, i) =>\n createElement(\n 'tr',\n { key: i },\n ...row.map((c, j) =>\n createElement(\n 'td',\n { key: j, style: getStyle(j) },\n output(c, state)\n )\n )\n )\n )\n )\n );\n },\n },\n [RuleType.tableSeparator]: {\n _match: (source, state) =>\n state.inTable && source[0] === '|' ? /^\\|/.exec(source) : null,\n _order: Priority.HIGH,\n _parse() {\n return { type: RuleType.tableSeparator };\n },\n _render() {\n return ' | ';\n },\n },\n [RuleType.text]: {\n _match: allowInline((source, _state) => {\n const shortMatch = SHORTCODE_R.exec(source);\n\n if (shortMatch) return shortMatch;\n\n return TEXT_PLAIN_R.exec(source) || /^[\\s\\S]/.exec(source);\n }),\n _order: Priority.MIN,\n _parse(capture) {\n const text = capture[0];\n\n return {\n text:\n text.indexOf('&') === -1\n ? text\n : text.replace(HTML_CHAR_CODE_R, (f, i) => {\n if (i.startsWith('#x'))\n return String.fromCharCode(parseInt(i.slice(2), 16));\n if (i.startsWith('#'))\n return String.fromCharCode(parseInt(i.slice(1), 10));\n return namedCodesToUnicode[i] || f;\n }),\n };\n },\n _render(node) {\n return node.text;\n },\n },\n [RuleType.textBolded]: {\n _qualify: ['**', '__'],\n _match: simpleInlineRegex(TEXT_BOLD_R),\n _order: Priority.MED,\n _parse(capture, parse, state) {\n return { children: parse(capture[2], state) };\n },\n _render(node, output, state = {}) {\n return createElement(\n 'strong',\n { key: state.key },\n output(node.children, state)\n );\n },\n },\n [RuleType.textEmphasized]: {\n _qualify: ['*', '_'],\n _match: simpleInlineRegex(TEXT_EMPHASIZED_R),\n _order: Priority.LOW,\n _parse(capture, parse, state) {\n return { children: parse(capture[2], state) };\n },\n _render(node, output, state = {}) {\n return createElement(\n 'em',\n { key: state.key },\n output(node.children, state)\n );\n },\n },\n [RuleType.textEscaped]: {\n _qualify: ['\\\\'],\n _match: simpleInlineRegex(TEXT_ESCAPED_R),\n _order: Priority.HIGH,\n _parse(capture) {\n return { text: capture[1], type: RuleType.text };\n },\n },\n [RuleType.textMarked]: {\n _qualify: ['=='],\n _match: simpleInlineRegex(TEXT_MARKED_R),\n _order: Priority.LOW,\n _parse: parseCaptureInline,\n _render(node, output, state = {}) {\n return createElement(\n 'mark',\n { key: state.key },\n output(node.children, state)\n );\n },\n },\n [RuleType.textStrikethroughed]: {\n _qualify: ['~~'],\n _match: simpleInlineRegex(TEXT_STRIKETHROUGHED_R),\n _order: Priority.LOW,\n _parse: parseCaptureInline,\n _render(node, output, state = {}) {\n return createElement(\n 'del',\n { key: state.key },\n output(node.children, state)\n );\n },\n },\n };\n\n return rules;\n};\n\n// Removed compilerCache completely to avoid issues with props changes not invalidating cache\n// const compilerCache = new Map<string, unknown>();\n\n/** Link/image reference definitions (`[id]: target \"title\"`) collected while parsing. */\nexport type MarkdownReferences = Record<\n string,\n { target: string; title?: string }\n>;\n\nexport type ParsedMarkdown = {\n ast: any[];\n footnotes: FootnoteDef[];\n /**\n * Reference definitions gathered during parsing. They must be carried over to\n * the render stage, since `refLink` / `refImage` nodes only store the\n * reference id and resolve their target at render time.\n */\n references: MarkdownReferences;\n inline: boolean;\n};\n\n/**\n * `createElement` is only ever reached from a rule's `_render`, so a parse-only\n * caller can hand over this stub instead of building an element factory.\n */\nconst noopCreateElement: CreateElementFunction = () => null;\n\n/**\n * Builds the rule set backing one document.\n *\n * Rules close over the document's footnote and reference tables, so they cannot\n * be shared across documents — but a single document's parse and render phases\n * can share one set, which is what `compile` does.\n */\nconst createDocumentRules = (\n createElement: CreateElementFunction,\n ctx: MarkdownContext<any>,\n options: MarkdownOptions,\n footnotes: FootnoteDef[],\n refs: MarkdownReferences\n): Rules => {\n const attrStringToMap = (\n tag: HTMLTag,\n str: string\n ): Record<string, any> | null => {\n if (!str?.trim()) return null;\n\n const attributes = str.match(ATTR_EXTRACTOR_R);\n\n if (!attributes) return null;\n\n return attributes.reduce((map: any, raw) => {\n const delimiterIdx = raw.indexOf('=');\n\n if (delimiterIdx !== -1) {\n const key = normalizeAttributeKey(raw.slice(0, delimiterIdx)).trim();\n const value = unquote(raw.slice(delimiterIdx + 1).trim());\n const mappedKey = ATTRIBUTE_TO_NODE_PROP_MAP[key] ?? key;\n\n if (mappedKey === 'ref') return map;\n map[mappedKey] = attributeValueToNodePropValue(\n tag,\n key,\n value,\n ctx.sanitizer ?? defaultSanitizer\n );\n\n if (\n typeof map[mappedKey] === 'string' &&\n (HTML_BLOCK_ELEMENT_R.test(map[mappedKey]) ||\n HTML_SELF_CLOSING_ELEMENT_R.test(map[mappedKey]))\n ) {\n map[mappedKey] = parseMarkdown(\n map[mappedKey].trim(),\n ctx,\n options\n ).ast;\n }\n } else if (raw !== 'style') {\n map[ATTRIBUTE_TO_NODE_PROP_MAP[raw] ?? raw] = true;\n }\n\n return map;\n }, {});\n };\n\n const nonParagraphBlockSyntaxes = [\n BLOCKQUOTE_R,\n CODE_BLOCK_FENCED_R,\n CODE_BLOCK_R,\n options.enforceAtxHeadings ? HEADING_ATX_COMPLIANT_R : HEADING_R,\n HEADING_SETEXT_R,\n NP_TABLE_R,\n ORDERED_LIST_R,\n UNORDERED_LIST_R,\n CUSTOM_COMPONENT_R,\n ];\n\n // Built once: this list is fixed for the whole parse, and rebuilding it per\n // call put a fresh array on every block-syntax probe.\n const blockSyntaxes = (\n options.disableParsingRawHTML\n ? nonParagraphBlockSyntaxes\n : [\n ...nonParagraphBlockSyntaxes,\n PARAGRAPH_R,\n HTML_BLOCK_ELEMENT_R,\n HTML_COMMENT_R,\n HTML_SELF_CLOSING_ELEMENT_R,\n CUSTOM_COMPONENT_R,\n ]\n ) as RegExp[];\n\n const containsBlockSyntax = (input: string): boolean => {\n const cleaned = input.replace(TRIM_STARTING_NEWLINES, '');\n const slice = cleaned.length > 2048 ? cleaned.slice(0, 2048) : cleaned;\n\n if (slice.indexOf('\\n\\n') !== -1) return true;\n\n return some(blockSyntaxes, slice);\n };\n\n const baseRules = createRules(\n createElement,\n ctx,\n options,\n footnotes,\n refs,\n attrStringToMap,\n containsBlockSyntax,\n nonParagraphBlockSyntaxes\n );\n\n return options.disableParsingRawHTML\n ? Object.keys(baseRules).reduce((acc, key) => {\n if (key !== RuleType.htmlBlock && key !== RuleType.htmlSelfClosing) {\n acc[key] = baseRules[key];\n }\n\n return acc;\n }, {} as Rules)\n : baseRules;\n};\n\n/** Runs the parse phase against an already-built rule set. */\nconst parseWithRules = (\n markdown: string,\n options: MarkdownOptions,\n rules: Rules,\n footnotes: FootnoteDef[],\n refs: MarkdownReferences\n): ParsedMarkdown => {\n const parser = parserFor(rules);\n\n const result = options.preserveFrontmatter\n ? markdown\n : markdown.replace(FRONT_MATTER_R, '');\n // Stripped once and reused: both the block/inline decision and the block\n // input below need the source without its leading newlines.\n const trimmedStart = result.replace(TRIM_STARTING_NEWLINES, '');\n const inline =\n options.forceInline ||\n (!options.forceBlock &&\n SHOULD_RENDER_AS_BLOCK_R.test(trimmedStart) === false);\n\n const ast = parser(inline ? result : `${trimEnd(trimmedStart)}\\n\\n`, {\n inline,\n });\n\n if (footnotes.length > 0) {\n // Parse footnotes content as well\n for (const def of footnotes) {\n (def as any).parsedAst = parser(def.footnote, { inline: true });\n }\n }\n\n return { ast, footnotes, references: refs, inline };\n};\n\n/** Runs the render phase against an already-built rule set. */\nconst renderWithRules = (\n parsed: ParsedMarkdown,\n ctx: MarkdownContext<any>,\n options: MarkdownOptions,\n rules: Rules,\n createElement: CreateElementFunction\n): unknown => {\n const components = ctx.components ?? {};\n const slug = createSlugger(ctx);\n const footnotes = parsed.footnotes || [];\n\n const emitter = renderFor(createRenderer(rules, options.renderRule));\n\n const inline = parsed.inline;\n const arr = emitter(parsed.ast, { inline }) as unknown as any[];\n\n while (typeof arr[arr.length - 1] === 'string' && !arr[arr.length - 1].trim())\n arr.pop();\n\n const getOuterNode = () => {\n if (options.wrapper === null) return arr;\n const wrapper = options.wrapper ?? (inline ? 'span' : 'div');\n\n if (arr.length > 1 || options.forceWrapper)\n return createElement(wrapper, { key: 'outer' }, arr);\n\n if (arr.length === 1) {\n const node = arr[0];\n\n if (typeof node === 'string') {\n const spanProps: Record<string, any> = { key: 'outer' };\n\n if (!inline && components) {\n const pOverrideProps = (get(components, 'p.props', {}) ??\n {}) as Record<string, any>;\n const mergedClassName = cx(\n spanProps.className,\n pOverrideProps.className\n );\n const finalSpanProps: Record<string, any> = {\n ...spanProps,\n ...pOverrideProps,\n };\n\n if (mergedClassName) finalSpanProps.className = mergedClassName;\n\n return createElement('span', finalSpanProps, node);\n }\n\n return createElement('span', spanProps, node);\n }\n\n return node;\n }\n\n return createElement(wrapper, { key: 'outer' }, null);\n };\n\n const node = getOuterNode();\n\n const result = footnotes.length\n ? createElement(\n 'div',\n null,\n node,\n createElement(\n 'footer',\n { key: 'footer' },\n ...footnotes.map((def) =>\n createElement(\n 'div',\n { id: slug(def.identifier), key: def.identifier },\n def.identifier,\n emitter((def as any).parsedAst || def.footnote, { inline: true })\n )\n )\n )\n )\n : node;\n\n return result;\n};\n\nexport const parseMarkdown = (\n markdown: string = '',\n ctx: MarkdownContext<any>,\n options: MarkdownOptions = {}\n): ParsedMarkdown => {\n const footnotes: FootnoteDef[] = [];\n const refs: MarkdownReferences = {};\n const rules = createDocumentRules(\n noopCreateElement,\n ctx,\n options,\n footnotes,\n refs\n );\n\n return parseWithRules(markdown, options, rules, footnotes, refs);\n};\n\nexport const renderMarkdownAst = (\n parsed: ParsedMarkdown,\n ctx: MarkdownContext<any>,\n options: MarkdownOptions = {}\n): unknown => {\n const createElement = createElementFactory(ctx, options);\n const rules = createDocumentRules(\n createElement,\n ctx,\n options,\n parsed.footnotes ?? [],\n parsed.references ?? {}\n );\n\n return renderWithRules(parsed, ctx, options, rules, createElement);\n};\n\nexport const compile = (\n markdown: string = '',\n ctx: MarkdownContext<any>,\n options: MarkdownOptions = {}\n): unknown => {\n if (typeof markdown !== 'string') {\n if (process.env.NODE_ENV !== 'production') {\n console.error(\n 'intlayer: the first argument must be a string. Received',\n typeof markdown\n );\n }\n throw new Error('intlayer: the first argument must be a string');\n }\n\n // Both phases share one rule set: building it twice was the dominant cost\n // when compiling the many short strings a typical dictionary holds.\n const footnotes: FootnoteDef[] = [];\n const refs: MarkdownReferences = {};\n const createElement = createElementFactory(ctx, options);\n const rules = createDocumentRules(\n createElement,\n ctx,\n options,\n footnotes,\n refs\n );\n\n const parsed = parseWithRules(markdown, options, rules, footnotes, refs);\n\n return renderWithRules(parsed, ctx, options, rules, createElement);\n};\n\nexport const createCompiler =\n (ctx: MarkdownContext<any>) =>\n (markdown: string, options?: MarkdownOptions): unknown =>\n compile(markdown, ctx, options);\n\nexport const compileWithOptions = (\n markdown: string,\n runtime: MarkdownRuntime,\n options: CompileOptions<any> = {}\n): unknown => {\n const {\n components,\n namedCodesToUnicode,\n sanitizer,\n slugify,\n ...compilerOptions\n } = options;\n\n return compile(\n markdown,\n { runtime, components, namedCodesToUnicode, sanitizer, slugify },\n compilerOptions\n );\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"compiler.mjs","names":["defaultSlugify","defaultSanitizer"],"sources":["../../../src/markdown/compiler.ts"],"sourcesContent":["import {\n ATTR_EXTRACTOR_R,\n ATTRIBUTE_TO_NODE_PROP_MAP,\n BLOCK_END_R,\n BLOCKQUOTE_ALERT_R,\n BLOCKQUOTE_R,\n BLOCKQUOTE_TRIM_LEFT_MULTILINE_R,\n BREAK_LINE_R,\n BREAK_THEMATIC_R,\n CODE_BLOCK_FENCED_R,\n CODE_BLOCK_R,\n CODE_INLINE_R,\n CONSECUTIVE_NEWLINE_R,\n DO_NOT_PROCESS_HTML_ELEMENTS,\n FOOTNOTE_R,\n FOOTNOTE_REFERENCE_R,\n FRONT_MATTER_R,\n GFM_TASK_R,\n HEADING_ATX_COMPLIANT_R,\n HEADING_R,\n HEADING_SETEXT_R,\n HTML_CHAR_CODE_R,\n HTML_COMMENT_R,\n HTML_LEFT_TRIM_AMOUNT_R,\n LINK_AUTOLINK_BARE_URL_R,\n LINK_AUTOLINK_R,\n type ListType,\n NAMED_CODES_TO_UNICODE,\n NP_TABLE_R,\n ORDERED,\n ORDERED_LIST_ITEM_PREFIX_R,\n ORDERED_LIST_ITEM_R,\n ORDERED_LIST_R,\n PARAGRAPH_R,\n Priority,\n REFERENCE_IMAGE_OR_LINK,\n REFERENCE_IMAGE_R,\n REFERENCE_LINK_R,\n type RuleScopeValue,\n RuleType,\n SCOPE_BLOCK,\n SCOPE_BOTH,\n SCOPE_INLINE,\n SHORTCODE_R,\n SHOULD_RENDER_AS_BLOCK_R,\n TEXT_BOLD_R,\n TEXT_EMPHASIZED_R,\n TEXT_ESCAPED_R,\n TEXT_MARKED_R,\n TEXT_STRIKETHROUGHED_R,\n TRIM_STARTING_NEWLINES,\n UNORDERED,\n UNORDERED_LIST_ITEM_PREFIX_R,\n UNORDERED_LIST_ITEM_R,\n UNORDERED_LIST_R,\n} from './constants';\nimport {\n matchCustomComponent,\n matchHtmlBlockElement,\n matchSelfClosingElement,\n startsWithCustomComponent,\n startsWithElement,\n startsWithHtmlBlockElement,\n startsWithSelfClosingElement,\n} from './elementScanner';\nimport { parserFor } from './parser';\nimport { createRenderer, renderFor } from './renderer';\nimport type {\n CompileOptions,\n ComponentOverrides as ComponentDefinition,\n HeadingNode,\n HTMLTag,\n MarkdownContext,\n MarkdownOptions,\n MarkdownRuntime,\n OrderedListNode,\n ParseState,\n Rule,\n Rules,\n TableNode,\n UnorderedListNode,\n} from './types';\nimport {\n allowInline,\n anyScopeRegex,\n attributeValueToNodePropValue,\n type BlockSyntaxProbe,\n blockRegex,\n captureNothing,\n cx,\n sanitizer as defaultSanitizer,\n slugify as defaultSlugify,\n get,\n inlineRegex,\n normalizeAttributeKey,\n parseBlock,\n parseCaptureInline,\n parseInline,\n parseSimpleInline,\n parseTableAlign,\n parseTableCells,\n parseTableRow,\n renderNothing,\n simpleInlineRegex,\n some,\n startsWith,\n trimEnd,\n trimLeadingWhitespaceOutsideFences,\n unescapeString,\n unquote,\n} from './utils';\n\ntype CreateElementFunction = (\n tag: any,\n props: Record<string, any> | null,\n ...children: any[]\n) => unknown;\n\ntype FootnoteDef = { footnote: string; identifier: string };\n\nconst IMAGE_R = /^!\\[(.*?)\\]\\( *((?:\\([^)]*\\)|[^() ])*) *\"?([^)\"]*)?\"?\\)/;\nconst LINK_INSIDE =\n '(?:\\\\[[^\\\\[\\\\]]*(?:\\\\[[^\\\\[\\\\]]*\\\\][^\\\\[\\\\]]*)*\\\\]|[^\\\\[\\\\]])*';\nconst LINK_HREF_AND_TITLE =\n '\\\\s*<?((?:\\\\([^)]*\\\\)|[^\\\\s\\\\\\\\]|\\\\\\\\.)*?)>?(?:\\\\s+[\\'\"]([\\\\s\\\\S]*?)[\\'\"])?\\\\s*';\nconst LINK_R = new RegExp(\n `^\\\\[(${LINK_INSIDE})\\\\]\\\\(${LINK_HREF_AND_TITLE}\\\\)`\n);\n\n/**\n * Case-insensitive `</tag>` probes, cached per tag name.\n *\n * The `htmlBlock` rule is qualified at every candidate position, and it used to\n * lowercase the whole remaining document to look its closing tag up — copying\n * the rest of the file on each probe.\n */\n/**\n * Builds a tag -> component resolver for one set of overrides.\n *\n * The case-insensitive fallback used to rescan every override key on each\n * element created; the lowercase index is now built once per document instead.\n */\nconst createTagResolver = (components: ComponentDefinition<any>) => {\n let lowercaseKeys: Map<string, string> | null = null;\n\n // With no overrides declared — the common case — every tag resolves to\n // itself, so the whole lookup is skipped.\n if (Object.keys(components).length === 0) return (tag: any): any => tag;\n\n const resolved = new Map<string, any>();\n\n return (tag: any): any => {\n if (typeof tag !== 'string') return tag;\n\n const memoized = resolved.get(tag);\n if (memoized !== undefined) return memoized;\n\n const override = get(components, tag);\n\n if (override) {\n resolved.set(tag, override);\n return override;\n }\n\n if (!lowercaseKeys) {\n lowercaseKeys = new Map();\n\n // Later keys win, matching `Array.prototype.find` on `Object.keys`\n // only when they are unique — so the first key of a given lowercase\n // form is kept, as before.\n for (const key of Object.keys(components)) {\n const lowercased = key.toLowerCase();\n\n if (!lowercaseKeys.has(lowercased)) lowercaseKeys.set(lowercased, key);\n }\n }\n\n const key = lowercaseKeys.get(tag.toLowerCase());\n const result = (key ? get(components, key) : undefined) || tag;\n\n resolved.set(tag, result);\n\n return result;\n };\n};\n\n/** Resolves the slugifier for a context, falling back to the built-in one. */\nconst createSlugger =\n (ctx: MarkdownContext<any>) =>\n (input: string): string =>\n ctx.slugify ? ctx.slugify(input, defaultSlugify) : defaultSlugify(input);\n\nconst createElementFactory = (\n ctx: MarkdownContext<any>,\n options: MarkdownOptions\n): CreateElementFunction => {\n const { runtime, components = {} } = ctx;\n const resolveTag = createTagResolver(components);\n const filteredTags = options.tagfilter\n ? new Set([\n 'title',\n 'textarea',\n 'style',\n 'xmp',\n 'iframe',\n 'noembed',\n 'noframes',\n 'script',\n 'plaintext',\n ])\n : null;\n\n /**\n * True when `props` can be handed to the runtime untouched: no `class`\n * alias to fold into `className`, and no empty value to drop. Rules build a\n * fresh literal for every element, so reusing it is safe, and it saves an\n * object per element — the single largest allocation in the render phase.\n */\n const needsPropsRewrite = (props: Record<string, any>): boolean => {\n if ('class' in props) return true;\n for (const key in props) {\n const value = props[key];\n if (value === undefined || value === null) return true;\n }\n return false;\n };\n\n return (\n tag: any,\n props: Record<string, any> | null,\n ...children: any[]\n ): unknown => {\n const isStringTag = typeof tag === 'string';\n\n if (\n filteredTags &&\n isStringTag &&\n (filteredTags.has(tag) || filteredTags.has(tag.toLowerCase()))\n ) {\n return null;\n }\n\n let finalProps: Record<string, any>;\n\n if (!props) {\n finalProps = {};\n } else if (!needsPropsRewrite(props)) {\n finalProps = props;\n } else {\n const className = cx(props.className, props.class);\n const mergedProps: Record<string, any> = {};\n let classNameHandled = false;\n\n // Preserve attribute order while merging className\n for (const key in props) {\n const value = props[key];\n\n if (value === undefined || value === null) continue;\n\n if (key === 'className' || key === 'class') {\n if (!classNameHandled) {\n if (className) mergedProps.className = className;\n classNameHandled = true;\n }\n } else {\n mergedProps[key] = value;\n }\n }\n\n if (!classNameHandled && className) {\n mergedProps.className = className;\n }\n\n finalProps = mergedProps;\n }\n\n if (runtime.normalizeProps && isStringTag)\n finalProps = runtime.normalizeProps(tag as string, finalProps);\n\n const component = resolveTag(tag);\n return runtime.createElement(component, finalProps, ...children);\n };\n};\n\n/**\n * Footnote and reference tables belonging to the document currently being\n * parsed or rendered. Rules reach them through a ref so a rule set can outlive\n * a single document and be reused.\n */\ntype DocumentScope = {\n footnotes: FootnoteDef[];\n references: MarkdownReferences;\n};\n\ntype DocumentScopeRef = { current: DocumentScope };\n\nconst createDocumentScope = (): DocumentScope => ({\n footnotes: [],\n references: {},\n});\n\n/**\n * A cached rule set, together with the values it was built from. The signature\n * holds every input that changes the shape of the rules; anything else (the\n * markdown itself, the document scope) is free to vary between uses.\n */\ntype DocumentParser = ReturnType<typeof parserFor>;\ntype DocumentEmitter = ReturnType<typeof renderFor>;\n\ntype RuleSetCacheEntry = {\n /** The inputs this set was built from, compared field by field on lookup. */\n ctx: MarkdownContext<any>;\n options: MarkdownOptions;\n parseOnly: boolean;\n createElement: CreateElementFunction;\n scope: DocumentScopeRef;\n /**\n * Built with the rules, not per call. `parserFor` resolves precedence and\n * fills the first-character dispatch tables, and `renderFor` walks the rule\n * set — repeating either for every string was most of what compiling a\n * dictionary of short strings cost.\n */\n parse: DocumentParser;\n emit: DocumentEmitter;\n};\n\n/**\n * Small enough to scan linearly, large enough that an app mixing a few option\n * sets — say prose and a dictionary rendered with different components — keeps\n * hitting it.\n */\nconst RULE_SET_CACHE_LIMIT = 8;\n\nconst ruleSetCache: RuleSetCacheEntry[] = [];\n\n/**\n * Every input that changes how rules are built. Compared directly rather than\n * through a signature array, which would allocate on every compile.\n */\nconst builtFromSame = (\n entry: RuleSetCacheEntry,\n ctx: MarkdownContext<any>,\n options: MarkdownOptions,\n parseOnly: boolean\n): boolean =>\n entry.parseOnly === parseOnly &&\n entry.ctx.runtime === ctx.runtime &&\n entry.ctx.components === ctx.components &&\n entry.ctx.namedCodesToUnicode === ctx.namedCodesToUnicode &&\n entry.ctx.sanitizer === ctx.sanitizer &&\n entry.ctx.slugify === ctx.slugify &&\n entry.options.disableAutoLink === options.disableAutoLink &&\n entry.options.disableParsingRawHTML === options.disableParsingRawHTML &&\n entry.options.enforceAtxHeadings === options.enforceAtxHeadings &&\n entry.options.tagfilter === options.tagfilter &&\n entry.options.renderRule === options.renderRule;\n\n/**\n * Returns the rule set for these options, building it only when no cached set\n * was made from the same inputs.\n */\nexport const getRuleSet = (\n ctx: MarkdownContext<any>,\n options: MarkdownOptions,\n parseOnly: boolean\n): RuleSetCacheEntry => {\n for (let index = 0; index < ruleSetCache.length; index++) {\n const entry = ruleSetCache[index]!;\n if (!builtFromSame(entry, ctx, options, parseOnly)) continue;\n\n // Most-recently-used first, so the hot option set stays at the front.\n if (index > 0) {\n ruleSetCache.splice(index, 1);\n ruleSetCache.unshift(entry);\n }\n return entry;\n }\n\n const scope: DocumentScopeRef = { current: createDocumentScope() };\n const createElement = parseOnly\n ? noopCreateElement\n : createElementFactory(ctx, options);\n const rules = createDocumentRules(createElement, ctx, options, scope);\n const entry: RuleSetCacheEntry = {\n ctx,\n options,\n parseOnly,\n createElement,\n scope,\n parse: parserFor(rules),\n emit: renderFor(createRenderer(rules, options.renderRule)),\n };\n\n ruleSetCache.unshift(entry);\n if (ruleSetCache.length > RULE_SET_CACHE_LIMIT) ruleSetCache.pop();\n\n return entry;\n};\n\n/**\n * Runs `operation` with `scope` installed as the current document, restoring\n * whatever was there before. The save/restore keeps a nested compile — a custom\n * component that renders markdown of its own — from clobbering its caller.\n */\nconst withDocumentScope = <TResult>(\n ref: DocumentScopeRef,\n scope: DocumentScope,\n operation: () => TResult\n): TResult => {\n const previous = ref.current;\n ref.current = scope;\n try {\n return operation();\n } finally {\n ref.current = previous;\n }\n};\n\nconst createRules = (\n createElement: CreateElementFunction,\n ctx: MarkdownContext<any>,\n options: MarkdownOptions,\n scope: DocumentScopeRef,\n attrStringToMap: (tag: HTMLTag, str: string) => Record<string, any> | null,\n containsBlockSyntax: (input: string) => boolean,\n nonParagraphBlockSyntaxes: BlockSyntaxProbe[]\n): Rules => {\n const slug = createSlugger(ctx);\n const sanitize = ctx.sanitizer ?? defaultSanitizer;\n const namedCodesToUnicode = ctx.namedCodesToUnicode\n ? { ...NAMED_CODES_TO_UNICODE, ...ctx.namedCodesToUnicode }\n : NAMED_CODES_TO_UNICODE;\n\n /**\n * Raw HTML blocks and custom components differ only in how their tag is\n * spelled: both trim the captured content, decide block or inline parsing\n * from it, and render the tag with its attributes. `rawHtml` adds the two\n * things only real HTML needs — the never-parse element list, and tracking\n * whether we are inside an anchor.\n */\n const pairedElementRule = (\n match: (source: string) => RegExpMatchArray | null,\n order: number,\n rawHtml: boolean,\n scope: RuleScopeValue = SCOPE_BOTH\n ): Rule<any> => ({\n _scope: scope,\n _qualify: ['<'],\n _match: anyScopeRegex(match),\n _order: order,\n _parse(capture, parse, state) {\n const content = capture[3] ?? '';\n const whitespace = content.match(HTML_LEFT_TRIM_AMOUNT_R)?.[1] ?? '';\n const trimmed = trimLeadingWhitespaceOutsideFences(content, whitespace);\n const parseFunc = containsBlockSyntax(trimmed) ? parseBlock : parseInline;\n const tagName = (capture[1] ?? '').trim();\n const lowercased = tagName.toLowerCase();\n const noInnerParse =\n rawHtml && DO_NOT_PROCESS_HTML_ELEMENTS.indexOf(lowercased) !== -1;\n const tag = (noInnerParse ? lowercased : tagName) as HTMLTag;\n const ast: any = {\n attrs: attrStringToMap(tag, capture[2] ?? ''),\n noInnerParse,\n tag,\n };\n\n if (rawHtml) state.inAnchor = state.inAnchor || lowercased === 'a';\n\n if (noInnerParse) {\n ast.text = content;\n } else {\n const prevInHTML = state.inHTML;\n state.inHTML = true;\n ast.children = parseFunc(parse, trimmed, state);\n state.inHTML = prevInHTML;\n }\n\n if (rawHtml) state.inAnchor = false;\n\n return ast;\n },\n _render(node, output, state = {}) {\n return createElement(\n node.tag,\n { key: state.key, ...(node.attrs ?? {}) },\n node.text ?? (node.children ? output(node.children, state) : '')\n );\n },\n });\n\n const generateListRule = (\n type: ListType\n ): Rule<OrderedListNode | UnorderedListNode> => {\n const ordered = type === ORDERED;\n const LIST_R = ordered ? ORDERED_LIST_R : UNORDERED_LIST_R;\n const LIST_ITEM_R = ordered ? ORDERED_LIST_ITEM_R : UNORDERED_LIST_ITEM_R;\n const LIST_ITEM_PREFIX_R = ordered\n ? ORDERED_LIST_ITEM_PREFIX_R\n : UNORDERED_LIST_ITEM_PREFIX_R;\n\n const firstChars = ordered\n ? [32, 9, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57]\n : [32, 9, 42, 43, 45];\n\n return {\n _scope: SCOPE_BOTH,\n _firstChars: firstChars,\n _qualify: (source, state) =>\n state.prevCaptureIndent !== undefined &&\n Boolean(state.list ?? (!state.inline && !state.simple)) &&\n LIST_ITEM_PREFIX_R.test(source),\n _match: allowInline((source, state) => {\n const lineIndent = state.prevCaptureIndent;\n const isStartOfLine = lineIndent !== undefined;\n const isListAllowed = state.list ?? (!state.inline && !state.simple);\n\n if (isStartOfLine && isListAllowed) {\n const matchSource = lineIndent ? lineIndent + source : source;\n\n const match = LIST_R.exec(matchSource);\n if (!match) return null;\n\n if (lineIndent && match[0].startsWith(lineIndent)) {\n const adjusted = [...match] as RegExpMatchArray;\n adjusted[0] = match[0].slice(lineIndent.length);\n (adjusted as any).fullMatch = match[0];\n return adjusted;\n }\n\n return match;\n }\n\n return null;\n }),\n _order: Priority.HIGH,\n _parse(capture, parse, state) {\n const bullet = capture[2] ?? '';\n const startValue = ordered ? +bullet.slice(0, -1) : undefined;\n const fullSource = (capture as any).fullMatch ?? capture[0] ?? '';\n const items = fullSource\n .replace(BLOCK_END_R, '\\n')\n .match(LIST_ITEM_R) as string[];\n\n if (!items) return { items: [], ordered, start: startValue } as any;\n\n let lastItemWasAParagraph = false;\n\n const result = items.map((item, i) => {\n const prefixCapture = LIST_ITEM_PREFIX_R.exec(item);\n const space = prefixCapture ? prefixCapture[0].length : 0;\n const spaceRegex =\n space <= 8\n ? STRIP_INDENT_REGEXES[space]!\n : new RegExp(`^ {1,${space}}`, 'gm');\n // Slicing the prefix off is the same as stripping the item's own\n // indentation and then its bullet, because the bullet run is greedy:\n // the first line never keeps a leading space either way. It saves a\n // second pass of the prefix pattern over every item.\n const content = item.slice(space).replace(spaceRegex, '');\n const isLastItem = i === items.length - 1;\n const containsBlocks = content.indexOf('\\n\\n') !== -1;\n const thisItemIsAParagraph =\n containsBlocks || (isLastItem && lastItemWasAParagraph);\n\n lastItemWasAParagraph = thisItemIsAParagraph;\n\n const oldStateInline = state.inline;\n const oldStateList = state.list;\n state.list = true;\n\n let adjustedContent: string;\n\n if (thisItemIsAParagraph) {\n state.inline = false;\n adjustedContent = `${trimEnd(content)}\\n\\n`;\n } else {\n state.inline = true;\n adjustedContent = trimEnd(content);\n }\n\n const parsed = parse(adjustedContent, state);\n state.inline = oldStateInline;\n state.list = oldStateList;\n\n return parsed;\n });\n\n return { items: result, ordered, start: startValue };\n },\n _render(node, output, state = {}) {\n return createElement(\n ordered ? 'ol' : 'ul',\n { key: state.key, start: (node as OrderedListNode).start },\n ...node.items.map((item, i) =>\n createElement('li', { key: i }, output(item, state))\n )\n );\n },\n };\n };\n\n const matchParagraph = (\n source: string,\n state: ParseState\n ): RegExpMatchArray | null => {\n if (\n state.inline ||\n state.simple ||\n (state.inHTML &&\n source.indexOf('\\n\\n') === -1 &&\n !state.prevCaptureHasBlankLine)\n )\n return null;\n let start = 0;\n const srcLen = source.length;\n while (start < srcLen) {\n const newlineIndex = source.indexOf('\\n', start);\n const lineEnd = newlineIndex === -1 ? srcLen : newlineIndex;\n\n let p = start;\n while (\n p < lineEnd &&\n (source.charCodeAt(p) === 32 || source.charCodeAt(p) === 9)\n ) {\n p++;\n }\n\n if (p >= lineEnd) {\n break;\n }\n\n if (p - start >= 4 || source.charCodeAt(start) === 9) {\n break;\n }\n\n const ch = source.charCodeAt(p);\n const isDelim =\n ch === 62 || // >\n ch === 96 || // `\n ch === 126 || // ~\n ch === 35 || // #\n ch === 124 || // |\n ch === 42 || // *\n ch === 43 || // +\n ch === 45 || // -\n ch === 61 || // =\n ch === 60 || // <\n (ch >= 48 && ch <= 57); // 0-9\n\n if (isDelim) {\n const line = source.slice(\n start,\n newlineIndex === -1 ? undefined : newlineIndex + 1\n );\n\n if (some(nonParagraphBlockSyntaxes, line)) break;\n }\n\n if (newlineIndex === -1) {\n start = srcLen;\n break;\n }\n start = newlineIndex + 1;\n }\n const match = source.slice(0, start);\n // Align with original simple-markdown behavior: capture the whole match including newlines\n\n if (match === '') return null;\n const captured = trimEnd(match);\n\n if (captured === '') return null;\n\n return [match, undefined, captured] as unknown as RegExpMatchArray;\n };\n\n const rules: Rules = {\n [RuleType.blockQuote]: {\n _scope: SCOPE_BLOCK,\n _qualify: ['>'],\n _match: blockRegex(BLOCKQUOTE_R),\n _order: Priority.HIGH,\n _parse(capture, parse, state) {\n const matchAlert = (capture[0] ?? '')\n .replace(BLOCKQUOTE_TRIM_LEFT_MULTILINE_R, '')\n .match(BLOCKQUOTE_ALERT_R);\n const alert = matchAlert?.[1];\n const content = matchAlert?.[2] ?? '';\n const hasNewline = content.indexOf('\\n') !== -1;\n const children = hasNewline\n ? parseBlock(parse, content, state)\n : parseInline(parse, content, state);\n\n return { alert, children };\n },\n _render(node, output, state = {}) {\n const props: Record<string, any> = { key: state.key };\n\n if (node.alert) {\n props.className = `markdown-alert-${slug(node.alert.toLowerCase())}`;\n node.children.unshift({\n attrs: {},\n children: [{ type: RuleType.text, text: node.alert }],\n noInnerParse: true,\n type: RuleType.htmlBlock,\n tag: 'header',\n } as any);\n }\n\n return createElement('blockquote', props, output(node.children, state));\n },\n },\n [RuleType.breakLine]: {\n _scope: SCOPE_BOTH,\n _qualify: [' '],\n _match: anyScopeRegex(BREAK_LINE_R),\n _order: Priority.HIGH,\n _parse: captureNothing,\n _render(_, __, state = {}) {\n return createElement('br', { key: state.key });\n },\n },\n [RuleType.breakThematic]: {\n _scope: SCOPE_BLOCK,\n _qualify: ['--', '__', '**', '- ', '* ', '_ '],\n _match: blockRegex(BREAK_THEMATIC_R),\n _order: Priority.HIGH,\n _parse: captureNothing,\n _render(_, __, state = {}) {\n return createElement('hr', { key: state.key });\n },\n },\n [RuleType.codeBlock]: {\n _scope: SCOPE_BLOCK,\n _qualify: [' '],\n _match: blockRegex(CODE_BLOCK_R),\n _order: Priority.MAX,\n _parse(capture) {\n return {\n type: RuleType.codeBlock,\n lang: undefined,\n text: unescapeString(\n trimEnd((capture[0] ?? '').replace(/^ {4}/gm, ''))\n ),\n };\n },\n _render(node, _, state = {}) {\n const attrs = { ...((node as any).attrs ?? {}) } as Record<string, any>;\n const langClass = node.lang ? `lang-${node.lang}` : 'lang-plaintext';\n attrs.className = attrs.className\n ? `${attrs.className} ${langClass}`\n : langClass;\n\n return createElement(\n 'pre',\n { key: state.key },\n createElement('code', attrs, node.text)\n );\n },\n },\n [RuleType.codeFenced]: {\n _scope: SCOPE_BLOCK,\n _qualify: ['```', '~~~'],\n _match: blockRegex(CODE_BLOCK_FENCED_R),\n _order: Priority.MAX,\n _parse(capture) {\n return {\n attrs: attrStringToMap('code', capture[3] ?? ''),\n lang: capture[2] || undefined,\n text: capture[4] ?? '',\n type: RuleType.codeBlock,\n };\n },\n },\n [RuleType.codeInline]: {\n _scope: SCOPE_INLINE,\n _firstChars: [96 /* ` */],\n _qualify: (source) =>\n source.charCodeAt(0) === 96 && source.indexOf('`', 1) !== -1,\n _match: simpleInlineRegex(CODE_INLINE_R),\n _order: Priority.LOW,\n _parse(capture) {\n return { text: unescapeString(capture[2] ?? '') };\n },\n _render(node, _, state = {}) {\n return createElement('code', { key: state.key }, node.text);\n },\n },\n [RuleType.footnote]: {\n _scope: SCOPE_INLINE,\n _qualify: ['[^'],\n _match: blockRegex(FOOTNOTE_R),\n _order: Priority.MAX,\n _parse(capture) {\n scope.current.footnotes.push({\n footnote: capture[2] ?? '',\n identifier: capture[1] ?? '',\n });\n\n return {};\n },\n _render: renderNothing,\n },\n [RuleType.footnoteReference]: {\n _scope: SCOPE_INLINE,\n _qualify: ['[^'],\n _match: inlineRegex(FOOTNOTE_REFERENCE_R),\n _order: Priority.HIGH,\n _parse(capture) {\n const text = capture[1] ?? '';\n return { target: `#${slug(text)}`, text };\n },\n _render(node, _, state = {}) {\n return createElement(\n 'a',\n {\n key: state.key,\n href: sanitize(node.target, 'a', 'href') ?? undefined,\n },\n createElement('sup', { key: state.key }, node.text)\n );\n },\n },\n [RuleType.gfmTask]: {\n _scope: SCOPE_INLINE,\n _qualify: ['[ ]', '[x]'],\n _match: inlineRegex(GFM_TASK_R),\n _order: Priority.HIGH,\n _parse(capture) {\n return { completed: (capture[1] ?? '').toLowerCase() === 'x' };\n },\n _render(node, _, state = {}) {\n return createElement('input', {\n checked: node.completed,\n key: state.key,\n readOnly: true,\n type: 'checkbox',\n });\n },\n },\n [RuleType.heading]: {\n _scope: SCOPE_BLOCK,\n _qualify: ['#'],\n _match: blockRegex(\n options.enforceAtxHeadings ? HEADING_ATX_COMPLIANT_R : HEADING_R\n ),\n _order: Priority.HIGH,\n _parse(capture, parse, state) {\n const text = capture[2] ?? '';\n return {\n children: parseInline(parse, text, state),\n id: slug(text),\n level: (capture[1]?.length ?? 1) as HeadingNode['level'],\n };\n },\n _render(node, output, state = {}) {\n return createElement(\n `h${node.level}` as HTMLTag,\n { id: node.id, key: state.key },\n output(node.children, state)\n );\n },\n },\n [RuleType.headingSetext]: {\n _scope: SCOPE_BLOCK,\n _qualify: (source, state) => {\n if (\n state.prevCaptureIndent === undefined ||\n state.inline ||\n state.simple\n )\n return false;\n const nlIndex = source.indexOf('\\n');\n\n return (\n nlIndex > 0 &&\n nlIndex < source.length - 1 &&\n (source[nlIndex + 1] === '=' || source[nlIndex + 1] === '-')\n );\n },\n _match: blockRegex(HEADING_SETEXT_R),\n _order: Priority.MAX,\n _parse(capture, parse, state) {\n return {\n children: parseInline(parse, capture[1] ?? '', state),\n level: capture[2] === '=' ? 1 : 2,\n type: RuleType.heading,\n };\n },\n },\n [RuleType.htmlBlock]: pairedElementRule(\n // The rule is dropped outright when raw HTML is disabled, and the scanner\n matchHtmlBlockElement,\n Priority.HIGH,\n true,\n SCOPE_BOTH\n ),\n [RuleType.htmlComment]: {\n _scope: SCOPE_BOTH,\n _qualify: ['<!'],\n _match: anyScopeRegex(HTML_COMMENT_R),\n _order: Priority.HIGH,\n _parse: captureNothing,\n _render: renderNothing,\n },\n [RuleType.htmlSelfClosing]: {\n _scope: SCOPE_BOTH,\n _qualify: ['<'],\n _match: anyScopeRegex(matchSelfClosingElement),\n _order: Priority.HIGH,\n _parse(capture) {\n const tag = (capture[1] ?? '').trim() as HTMLTag;\n\n return { attrs: attrStringToMap(tag, capture[2] || ''), tag };\n },\n _render(node, _, state = {}) {\n return createElement(node.tag, {\n key: state.key,\n ...(node.attrs ?? {}),\n });\n },\n },\n [RuleType.customComponent]: pairedElementRule(\n matchCustomComponent,\n Priority.MAX,\n false,\n SCOPE_BOTH\n ),\n [RuleType.paragraph]: {\n _scope: SCOPE_BLOCK,\n _qualify: (_source, state) => !state.inline && !state.simple,\n _match: matchParagraph,\n _order: Priority.LOW,\n _parse: parseCaptureInline,\n _render(node, output, state = {}) {\n return createElement(\n 'p',\n { key: state.key },\n output(node.children, state)\n );\n },\n },\n [RuleType.image]: {\n _scope: SCOPE_INLINE,\n _firstChars: [33 /* ! */],\n _qualify: (source) =>\n source.startsWith(' !== -1,\n _match: simpleInlineRegex(IMAGE_R),\n _order: Priority.HIGH,\n _parse(capture) {\n return {\n alt: unescapeString(capture[1] ?? ''),\n target: unescapeString(capture[2] ?? ''),\n title: capture[3] ? unescapeString(capture[3]) : undefined,\n };\n },\n _render(node, _, state = {}) {\n return createElement('img', {\n key: state.key,\n alt: node.alt ?? undefined,\n title: node.title ?? undefined,\n src: sanitize(node.target, 'img', 'src') ?? undefined,\n });\n },\n },\n [RuleType.link]: {\n _scope: SCOPE_INLINE,\n _firstChars: [91 /* [ */],\n _qualify: (source) =>\n source.charCodeAt(0) === 91 && source.indexOf('](') !== -1,\n _match: inlineRegex(LINK_R),\n _order: Priority.LOW,\n _parse(capture, parse, state) {\n return {\n children: parseSimpleInline(parse, capture[1] ?? '', state),\n target: unescapeString(capture[2] ?? ''),\n title: capture[3] ? unescapeString(capture[3]) : undefined,\n };\n },\n _render(node, output, state = {}) {\n const sanitizedHref = sanitize(node.target, 'a', 'href');\n return createElement(\n 'a',\n {\n key: state.key,\n href: sanitizedHref ?? undefined,\n title: node.title ?? undefined,\n },\n output(node.children, state)\n );\n },\n },\n [RuleType.linkAngleBraceStyleDetector]: {\n _scope: SCOPE_INLINE,\n _qualify: ['<'],\n _match: inlineRegex(LINK_AUTOLINK_R),\n _order: Priority.MAX,\n _parse(capture) {\n let target = capture[1] ?? '';\n let isEmail = false;\n\n if (target.indexOf('@') !== -1 && target.indexOf('//') === -1) {\n isEmail = true;\n target = target.replace('mailto:', '');\n }\n\n return {\n children: [{ text: target, type: RuleType.text }],\n target: isEmail ? `mailto:${target}` : target,\n type: RuleType.link,\n };\n },\n },\n [RuleType.linkBareUrlDetector]: {\n _scope: SCOPE_INLINE,\n _firstChars: [104 /* h */],\n _qualify: (source, state) =>\n Boolean(\n state.inline &&\n !state.inAnchor &&\n !options.disableAutoLink &&\n (startsWith(source, 'http://') || startsWith(source, 'https://'))\n ),\n _match: inlineRegex(LINK_AUTOLINK_BARE_URL_R),\n _order: Priority.MAX,\n _parse(capture) {\n const url = capture[1] ?? '';\n return {\n children: [{ text: url, type: RuleType.text }],\n target: url,\n type: RuleType.link,\n };\n },\n },\n [RuleType.newlineCoalescer]: {\n _scope: SCOPE_BOTH,\n _qualify: ['\\n'],\n _match: blockRegex(CONSECUTIVE_NEWLINE_R),\n _order: Priority.LOW,\n _parse: captureNothing,\n _render() {\n return '\\n';\n },\n },\n [RuleType.orderedList]: generateListRule(ORDERED),\n [RuleType.unorderedList]: generateListRule(UNORDERED),\n [RuleType.ref]: {\n _scope: SCOPE_BOTH,\n _qualify: ['['],\n _match: anyScopeRegex(REFERENCE_IMAGE_OR_LINK),\n _order: Priority.MAX,\n _parse(capture) {\n const identifier = capture[1];\n\n if (identifier !== undefined) {\n scope.current.references[identifier] = {\n target: capture[2] ?? '',\n title: capture[4],\n };\n }\n\n return {};\n },\n _render: renderNothing,\n },\n [RuleType.refImage]: {\n _scope: SCOPE_INLINE,\n _firstChars: [33 /* ! */],\n _qualify: (source) =>\n source.startsWith(' === -1,\n _match: simpleInlineRegex(REFERENCE_IMAGE_R),\n _order: Priority.MAX,\n _parse(capture) {\n return {\n alt: capture[1] ? unescapeString(capture[1]) : undefined,\n ref: capture[2] ?? '',\n };\n },\n _render(node, _, state = {}) {\n const ref = scope.current.references[node.ref];\n\n if (!ref) return null;\n\n return createElement('img', {\n key: state.key,\n alt: node.alt,\n src: sanitize(ref.target, 'img', 'src') ?? undefined,\n title: ref.title,\n });\n },\n },\n [RuleType.refLink]: {\n _scope: SCOPE_INLINE,\n _firstChars: [91 /* [ */],\n _qualify: (source) => source.indexOf('](') === -1,\n _match: inlineRegex(REFERENCE_LINK_R),\n _order: Priority.MAX,\n _parse(capture, parse, state) {\n return {\n children: parseSimpleInline(parse, capture[1] ?? '', state),\n fallbackChildren: capture[0] ?? '',\n ref: capture[2] ?? '',\n };\n },\n _render(node, output, state = {}) {\n const ref = scope.current.references[node.ref];\n\n if (!ref)\n return createElement(\n 'span',\n { key: state.key },\n node.fallbackChildren\n );\n\n return createElement(\n 'a',\n {\n key: state.key,\n href: sanitize(ref.target, 'a', 'href') ?? undefined,\n title: ref.title,\n },\n output(node.children, state)\n );\n },\n },\n [RuleType.table]: {\n _scope: SCOPE_BLOCK,\n _qualify: ['|'],\n _match: blockRegex(NP_TABLE_R),\n _order: Priority.HIGH,\n _parse(capture, parse, state) {\n state.inline = true;\n const align = capture[2] ? parseTableAlign(capture[2]) : [];\n const cells = capture[3]\n ? parseTableCells(capture[3], parse, state)\n : [];\n const header = parseTableRow(\n capture[1] ?? '',\n parse,\n state,\n !!cells.length\n );\n state.inline = false;\n\n return cells.length\n ? { align, cells, header, type: RuleType.table }\n : { children: header.flat(), type: RuleType.paragraph };\n },\n _render(node, output, state = {}) {\n const table = node as TableNode;\n const getStyle = (i: number) =>\n table.align[i] && table.align[i] !== 'left'\n ? { textAlign: table.align[i] }\n : {};\n\n return createElement(\n 'table',\n { key: state.key },\n createElement(\n 'thead',\n { key: 'thead' },\n createElement(\n 'tr',\n null,\n ...table.header.map((c, i) =>\n createElement(\n 'th',\n { key: i, style: getStyle(i) },\n output(c, state)\n )\n )\n )\n ),\n createElement(\n 'tbody',\n { key: 'tbody' },\n ...table.cells.map((row, i) =>\n createElement(\n 'tr',\n { key: i },\n ...row.map((c, j) =>\n createElement(\n 'td',\n { key: j, style: getStyle(j) },\n output(c, state)\n )\n )\n )\n )\n )\n );\n },\n },\n [RuleType.tableSeparator]: {\n _scope: SCOPE_INLINE,\n _qualify: ['|'],\n _match: (source, state) => (state.inTable ? /^\\|/.exec(source) : null),\n _order: Priority.HIGH,\n _parse() {\n return { type: RuleType.tableSeparator };\n },\n _render() {\n return ' | ';\n },\n },\n [RuleType.text]: {\n _scope: SCOPE_INLINE,\n _match: allowInline((source, _state) => {\n const len = source.length;\n if (source.charCodeAt(0) === 10 /* \\n */) {\n let j = 1;\n while (j < len && source.charCodeAt(j) === 32 /* space */) {\n j++;\n }\n if (\n j < len &&\n (source.charCodeAt(j) === 42 || // *\n source.charCodeAt(j) === 43 || // +\n source.charCodeAt(j) === 45 || // -\n (source.charCodeAt(j) >= 48 && source.charCodeAt(j) <= 57)) // 0-9\n ) {\n return [source.slice(0, j)] as unknown as RegExpMatchArray;\n }\n return ['\\n'] as unknown as RegExpMatchArray;\n }\n\n if (source.charCodeAt(0) === 58 /* : */) {\n const shortMatch = SHORTCODE_R.exec(source);\n if (shortMatch) return shortMatch;\n }\n // The first character always belongs to the run, whatever it is.\n TEXT_RUN_R.lastIndex = 1;\n TEXT_RUN_R.test(source);\n\n // Text is the most frequent capture by a wide margin, and its `_parse`\n // never re-enters the parser, so one scratch array serves every run\n // instead of allocating one per token.\n TEXT_CAPTURE[0] = source.slice(\n 0,\n trimHardBreak(source, TEXT_RUN_R.lastIndex)\n );\n\n return TEXT_CAPTURE;\n }),\n _order: Priority.MIN,\n _parse(capture) {\n const text = capture[0] ?? '';\n\n // Declaring `type` here — rather than letting the parser add it —\n // keeps every text node on one hidden class. `&` stops a run, so an\n // entity can only ever open one: testing the first character replaces\n // a scan of every character of every text node in the document.\n return {\n type: RuleType.text,\n text:\n text.charCodeAt(0) !== 38 /* & */\n ? text\n : text.replace(HTML_CHAR_CODE_R, (f, i) => {\n if (i.startsWith('#x'))\n return String.fromCharCode(parseInt(i.slice(2), 16));\n if (i.startsWith('#'))\n return String.fromCharCode(parseInt(i.slice(1), 10));\n return namedCodesToUnicode[i] || f;\n }),\n };\n },\n _render(node) {\n return node.text;\n },\n },\n [RuleType.textBolded]: {\n _scope: SCOPE_INLINE,\n _firstChars: [42 /* * */, 95 /* _ */],\n _qualify: (source) => {\n const c = source.charCodeAt(0);\n if (c === 42) {\n const next = source.charCodeAt(2);\n if (next === 32 || next === 10 || next === 9) return false;\n return source.charCodeAt(1) === 42 && source.indexOf('**', 2) !== -1;\n }\n if (c === 95) {\n const next = source.charCodeAt(2);\n if (next === 32 || next === 10 || next === 9) return false;\n return source.charCodeAt(1) === 95 && source.indexOf('__', 2) !== -1;\n }\n return false;\n },\n _match: simpleInlineRegex(TEXT_BOLD_R),\n _order: Priority.MED,\n _parse(capture, parse, state) {\n return { children: parse(capture[2] ?? '', state) };\n },\n _render(node, output, state = {}) {\n return createElement(\n 'strong',\n { key: state.key },\n output(node.children, state)\n );\n },\n },\n [RuleType.textEmphasized]: {\n _scope: SCOPE_INLINE,\n _firstChars: [42 /* * */, 95 /* _ */],\n _qualify: (source) => {\n const c = source.charCodeAt(0);\n const next = source.charCodeAt(1);\n if (next === 32 || next === 10 || next === 9) return false;\n return (\n (c === 42 && source.indexOf('*', 1) !== -1) ||\n (c === 95 && source.indexOf('_', 1) !== -1)\n );\n },\n _match: simpleInlineRegex(TEXT_EMPHASIZED_R),\n _order: Priority.LOW,\n _parse(capture, parse, state) {\n return { children: parse(capture[2] ?? '', state) };\n },\n _render(node, output, state = {}) {\n return createElement(\n 'em',\n { key: state.key },\n output(node.children, state)\n );\n },\n },\n [RuleType.textEscaped]: {\n _scope: SCOPE_INLINE,\n _qualify: ['\\\\'],\n _match: simpleInlineRegex(TEXT_ESCAPED_R),\n _order: Priority.HIGH,\n _parse(capture) {\n return { text: capture[1] ?? '', type: RuleType.text };\n },\n },\n [RuleType.textMarked]: {\n _scope: SCOPE_INLINE,\n _firstChars: [61 /* = */],\n _qualify: (source) => {\n const next = source.charCodeAt(2);\n if (next === 32 || next === 10 || next === 9) return false;\n return source.charCodeAt(1) === 61 && source.indexOf('==', 2) !== -1;\n },\n _match: simpleInlineRegex(TEXT_MARKED_R),\n _order: Priority.LOW,\n _parse(capture, parse, state) {\n return { children: parseCaptureInline(capture, parse, state).children };\n },\n _render(node, output, state = {}) {\n return createElement(\n 'mark',\n { key: state.key },\n output(node.children, state)\n );\n },\n },\n [RuleType.textStrikethroughed]: {\n _scope: SCOPE_INLINE,\n _firstChars: [126 /* ~ */],\n _qualify: (source) => {\n const next = source.charCodeAt(2);\n if (next === 32 || next === 10 || next === 9) return false;\n return source.charCodeAt(1) === 126 && source.indexOf('~~', 2) !== -1;\n },\n _match: simpleInlineRegex(TEXT_STRIKETHROUGHED_R),\n _order: Priority.LOW,\n _parse(capture, parse, state) {\n return { children: parseCaptureInline(capture, parse, state).children };\n },\n _render(node, output, state = {}) {\n return createElement(\n 'del',\n { key: state.key },\n output(node.children, state)\n );\n },\n },\n };\n\n return rules;\n};\n\n// Removed compilerCache completely to avoid issues with props changes not invalidating cache\n// const compilerCache = new Map<string, unknown>();\n\n/** Link/image reference definitions (`[id]: target \"title\"`) collected while parsing. */\nexport type MarkdownReferences = Record<\n string,\n { target: string; title?: string }\n>;\n\nexport type ParsedMarkdown = {\n ast: any[];\n footnotes: FootnoteDef[];\n /**\n * Reference definitions gathered during parsing. They must be carried over to\n * the render stage, since `refLink` / `refImage` nodes only store the\n * reference id and resolve their target at render time.\n */\n references: MarkdownReferences;\n inline: boolean;\n};\n\nconst STRIP_INDENT_REGEXES = [\n null,\n /^ {1,1}/gm,\n /^ {1,2}/gm,\n /^ {1,3}/gm,\n /^ {1,4}/gm,\n /^ {1,5}/gm,\n /^ {1,6}/gm,\n /^ {1,7}/gm,\n /^ {1,8}/gm,\n];\n\n/** Scratch capture reused by the text rule; see its `_match`. */\nconst TEXT_CAPTURE = [''] as unknown as RegExpMatchArray;\n\n/**\n * Consumes a run of plain text, stopping before the next character that could\n * open another inline rule or a bare URL. Anchored so `test` leaves the stop\n * offset in `lastIndex` without allocating a match array, and so the scan\n * itself runs in the regex engine.\n *\n * The bare-URL guard is an alternation branch rather than a per-character\n * lookahead, because a lookahead is re-evaluated at every offset while this\n * branch is only reached on an `h`. `&` stops a run purely so that an HTML\n * entity can only ever sit at offset 0 of a text node; adjacent text nodes are\n * merged by the parser, so the tree is unchanged.\n */\nconst TEXT_RUN_R = /(?:[^\\n&h!*:<=[\\\\_`~]+|h(?!ttp))*/y;\n\n/**\n * Pull a run's stop offset back before a hard line break it just swallowed.\n *\n * A run never contains a newline, so ` \\n` can only sit immediately before the\n * stop offset — which makes this O(1) check equivalent to the per-character\n * `(?! {2}\\n)` lookahead the run scanner used to carry.\n */\nconst trimHardBreak = (source: string, end: number): number =>\n end >= 3 &&\n source.charCodeAt(end) === 10 /* \\n */ &&\n source.charCodeAt(end - 1) === 32 /* space */ &&\n source.charCodeAt(end - 2) === 32\n ? end - 2\n : end;\n\nconst noopCreateElement: CreateElementFunction = (\n type,\n props,\n ...children\n) => ({\n children,\n props,\n type,\n});\n\n/**\n * Builds the rule set backing one document.\n *\n * Rules read the document's footnote and reference tables through `scope`\n * rather than closing over them, so one set serves every document sharing the\n * same options. Building this graph dominated the cost of compiling the many\n * short strings a dictionary holds; `getRuleSet` caches it.\n */\nconst createDocumentRules = (\n createElement: CreateElementFunction,\n ctx: MarkdownContext<any>,\n options: MarkdownOptions,\n scope: DocumentScopeRef\n): Rules => {\n const attrStringToMap = (\n tag: HTMLTag,\n str: string\n ): Record<string, any> | null => {\n if (!str?.trim()) return null;\n\n const attributes = str.match(ATTR_EXTRACTOR_R);\n\n if (!attributes) return null;\n\n return attributes.reduce((map: any, raw) => {\n const delimiterIdx = raw.indexOf('=');\n\n if (delimiterIdx !== -1) {\n const key = normalizeAttributeKey(raw.slice(0, delimiterIdx)).trim();\n const value = unquote(raw.slice(delimiterIdx + 1).trim());\n const mappedKey = ATTRIBUTE_TO_NODE_PROP_MAP[key] ?? key;\n\n if (mappedKey === 'ref') return map;\n map[mappedKey] = attributeValueToNodePropValue(\n tag,\n key,\n value,\n ctx.sanitizer ?? defaultSanitizer\n );\n\n if (\n typeof map[mappedKey] === 'string' &&\n startsWithElement(map[mappedKey])\n ) {\n map[mappedKey] = parseMarkdown(\n map[mappedKey].trim(),\n ctx,\n options\n ).ast;\n }\n } else if (raw !== 'style') {\n map[ATTRIBUTE_TO_NODE_PROP_MAP[raw] ?? raw] = true;\n }\n\n return map;\n }, {});\n };\n\n const nonParagraphBlockSyntaxes = [\n BLOCKQUOTE_R,\n CODE_BLOCK_FENCED_R,\n CODE_BLOCK_R,\n options.enforceAtxHeadings ? HEADING_ATX_COMPLIANT_R : HEADING_R,\n NP_TABLE_R,\n ORDERED_LIST_R,\n UNORDERED_LIST_R,\n startsWithCustomComponent,\n ];\n\n // Built once: this list is fixed for the whole parse, and rebuilding it per\n // call put a fresh array on every block-syntax probe.\n const blockSyntaxes = (\n options.disableParsingRawHTML\n ? nonParagraphBlockSyntaxes\n : [\n ...nonParagraphBlockSyntaxes,\n PARAGRAPH_R,\n startsWithHtmlBlockElement,\n HTML_COMMENT_R,\n startsWithSelfClosingElement,\n startsWithCustomComponent,\n ]\n ) as BlockSyntaxProbe[];\n\n const containsBlockSyntax = (input: string): boolean => {\n const cleaned = input.replace(TRIM_STARTING_NEWLINES, '');\n const slice = cleaned.length > 2048 ? cleaned.slice(0, 2048) : cleaned;\n\n if (slice.indexOf('\\n\\n') !== -1) return true;\n\n return some(blockSyntaxes, slice);\n };\n\n const baseRules = createRules(\n createElement,\n ctx,\n options,\n scope,\n attrStringToMap,\n containsBlockSyntax,\n nonParagraphBlockSyntaxes\n );\n\n return options.disableParsingRawHTML\n ? Object.keys(baseRules).reduce((acc, key) => {\n if (key !== RuleType.htmlBlock && key !== RuleType.htmlSelfClosing) {\n acc[key] = baseRules[key]!;\n }\n\n return acc;\n }, {} as Rules)\n : baseRules;\n};\n\n/** Runs the parse phase against an already-built rule set. */\nconst parseWithRules = (\n markdown: string,\n options: MarkdownOptions,\n parser: DocumentParser,\n footnotes: FootnoteDef[],\n refs: MarkdownReferences\n): ParsedMarkdown => {\n const result =\n !options.preserveFrontmatter && markdown.charCodeAt(0) === 45 /* - */\n ? markdown.replace(FRONT_MATTER_R, '')\n : markdown;\n // Stripped once and reused: both the block/inline decision and the block\n // input below need the source without its leading newlines.\n const trimmedStart =\n result.charCodeAt(0) === 10 /* \\n */\n ? result.replace(TRIM_STARTING_NEWLINES, '')\n : result;\n const inline =\n options.forceInline ||\n (!options.forceBlock &&\n SHOULD_RENDER_AS_BLOCK_R.test(trimmedStart) === false);\n\n const ast = parser(inline ? result : `${trimEnd(trimmedStart)}\\n\\n`, {\n inline,\n });\n\n if (footnotes.length > 0) {\n // Parse footnotes content as well\n for (const def of footnotes) {\n (def as any).parsedAst = parser(def.footnote, { inline: true });\n }\n }\n\n return { ast, footnotes, references: refs, inline };\n};\n\n/** Runs the render phase against an already-built rule set. */\nconst renderWithRules = (\n parsed: ParsedMarkdown,\n ctx: MarkdownContext<any>,\n options: MarkdownOptions,\n emitter: DocumentEmitter,\n createElement: CreateElementFunction\n): unknown => {\n const components = ctx.components ?? {};\n const slug = createSlugger(ctx);\n const footnotes = parsed.footnotes || [];\n\n const inline = parsed.inline;\n const arr = emitter(parsed.ast, { inline }) as unknown as any[];\n\n while (typeof arr[arr.length - 1] === 'string' && !arr[arr.length - 1].trim())\n arr.pop();\n\n const getOuterNode = () => {\n if (options.wrapper === null) return arr;\n const wrapper = options.wrapper ?? (inline ? 'span' : 'div');\n\n if (arr.length > 1 || options.forceWrapper)\n return createElement(wrapper, { key: 'outer' }, arr);\n\n if (arr.length === 1) {\n const node = arr[0];\n\n if (Array.isArray(node)) {\n return createElement(wrapper, { key: 'outer' }, node);\n }\n\n if (typeof node === 'string') {\n const spanProps: Record<string, any> = { key: 'outer' };\n\n if (!inline && components) {\n const pOverrideProps = (get(components, 'p.props', {}) ??\n {}) as Record<string, any>;\n const mergedClassName = cx(\n spanProps.className,\n pOverrideProps.className\n );\n const finalSpanProps: Record<string, any> = {\n ...spanProps,\n ...pOverrideProps,\n };\n\n if (mergedClassName) finalSpanProps.className = mergedClassName;\n\n return createElement('span', finalSpanProps, node);\n }\n\n return createElement('span', spanProps, node);\n }\n\n return node;\n }\n\n return createElement(wrapper, { key: 'outer' }, null);\n };\n\n const node = getOuterNode();\n\n const result = footnotes.length\n ? createElement(\n 'div',\n null,\n node,\n createElement(\n 'footer',\n { key: 'footer' },\n ...footnotes.map((def) =>\n createElement(\n 'div',\n { id: slug(def.identifier), key: def.identifier },\n def.identifier,\n emitter((def as any).parsedAst || def.footnote, { inline: true })\n )\n )\n )\n )\n : node;\n\n return result;\n};\n\nexport const parseMarkdown = (\n markdown: string = '',\n ctx: MarkdownContext<any>,\n options: MarkdownOptions = {}\n): ParsedMarkdown => {\n // Parsing never emits elements, so it gets its own cache entry built around\n // the no-op factory rather than the render one.\n const { parse, scope } = getRuleSet(ctx, options, true);\n const documentScope = createDocumentScope();\n\n return withDocumentScope(scope, documentScope, () =>\n parseWithRules(\n markdown,\n options,\n parse,\n documentScope.footnotes,\n documentScope.references\n )\n );\n};\n\nexport const renderMarkdownAst = (\n parsed: ParsedMarkdown,\n ctx: MarkdownContext<any>,\n options: MarkdownOptions = {}\n): unknown => {\n const { emit, createElement, scope } = getRuleSet(ctx, options, false);\n const documentScope: DocumentScope = {\n footnotes: parsed.footnotes ?? [],\n references: parsed.references ?? {},\n };\n\n return withDocumentScope(scope, documentScope, () =>\n renderWithRules(parsed, ctx, options, emit, createElement)\n );\n};\n\nexport const compile = (\n markdown: string = '',\n ctx: MarkdownContext<any>,\n options: MarkdownOptions = {}\n): unknown => {\n if (typeof markdown !== 'string') {\n if (process.env.NODE_ENV !== 'production') {\n console.error(\n 'intlayer: the first argument must be a string. Received',\n typeof markdown\n );\n }\n throw new Error('intlayer: the first argument must be a string');\n }\n\n // Both phases share one rule set: building it twice was the dominant cost\n // when compiling the many short strings a typical dictionary holds.\n const { parse, emit, createElement, scope } = getRuleSet(ctx, options, false);\n const documentScope = createDocumentScope();\n\n return withDocumentScope(scope, documentScope, () => {\n const parsed = parseWithRules(\n markdown,\n options,\n parse,\n documentScope.footnotes,\n documentScope.references\n );\n\n return renderWithRules(parsed, ctx, options, emit, createElement);\n });\n};\n\nexport const createCompiler =\n (ctx: MarkdownContext<any>) =>\n (markdown: string, options?: MarkdownOptions): unknown =>\n compile(markdown, ctx, options);\n\nexport const compileWithOptions = (\n markdown: string,\n runtime: MarkdownRuntime,\n options: CompileOptions<any> = {}\n): unknown => {\n const {\n components,\n namedCodesToUnicode,\n sanitizer,\n slugify,\n ...compilerOptions\n } = options;\n\n return compile(\n markdown,\n { runtime, components, namedCodesToUnicode, sanitizer, slugify },\n compilerOptions\n );\n};\n"],"mappings":"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"}
|
|
@@ -60,6 +60,21 @@ const Priority = {
|
|
|
60
60
|
MIN: 4
|
|
61
61
|
};
|
|
62
62
|
/**
|
|
63
|
+
* Parsing scope for markdown rules.
|
|
64
|
+
* Bitmask representation for fast bitwise checking and bundle minification.
|
|
65
|
+
* - BLOCK (1): evaluated only when !state.inline && !state.simple
|
|
66
|
+
* - INLINE (2): evaluated only when state.inline || state.simple
|
|
67
|
+
* - BOTH (3): evaluated in both scopes (default)
|
|
68
|
+
*/
|
|
69
|
+
const RuleScope = {
|
|
70
|
+
BLOCK: 1,
|
|
71
|
+
INLINE: 2,
|
|
72
|
+
BOTH: 3
|
|
73
|
+
};
|
|
74
|
+
const SCOPE_BLOCK = RuleScope.BLOCK;
|
|
75
|
+
const SCOPE_INLINE = RuleScope.INLINE;
|
|
76
|
+
const SCOPE_BOTH = RuleScope.BOTH;
|
|
77
|
+
/**
|
|
63
78
|
* Map of HTML attributes to their JSX prop equivalents.
|
|
64
79
|
* Some renderers use camelCase for certain attributes.
|
|
65
80
|
*/
|
|
@@ -145,10 +160,10 @@ const BLOCKQUOTE_R = /^(\s*>[\s\S]*?)(?=\n\n|$)/;
|
|
|
145
160
|
const BLOCKQUOTE_TRIM_LEFT_MULTILINE_R = /^ *> ?/gm;
|
|
146
161
|
const BLOCKQUOTE_ALERT_R = /^(?:\[!([^\]]*)\]\n)?([\s\S]*)/;
|
|
147
162
|
/** Line break patterns */
|
|
148
|
-
const BREAK_LINE_R = /^ {2,}\n/;
|
|
163
|
+
const BREAK_LINE_R = /^(?=( {2,}))\1\n/;
|
|
149
164
|
const BREAK_THEMATIC_R = /^(?:([-*_])( *\1){2,}) *(?:\n *)+\n/;
|
|
150
165
|
/** Code block patterns */
|
|
151
|
-
const CODE_BLOCK_FENCED_R = /^(?: {1,3})?(`{3,}|~{3,}) *(\S+)? *([^\n]*?)?\n([
|
|
166
|
+
const CODE_BLOCK_FENCED_R = /^(?: {1,3})?(`{3,}|~{3,}) *(\S+)? *([^\n]*?)?\n((?:[^\n]*(?:\n|$))*?)(?:\1\n?|$)/;
|
|
152
167
|
const CODE_BLOCK_R = /^(?: {4}[^\n]+\n*)+(?:\n *)+\n?/;
|
|
153
168
|
/** A single line opening or closing a fenced code block, with its indentation. */
|
|
154
169
|
const FENCE_DELIMITER_R = /^([ \t]*)(`{3,}|~{3,})/;
|
|
@@ -170,42 +185,24 @@ const HEADING_R = /^ *(#{1,6}) *([^\n]+?)(?: +#*)?(?:\n *)*(?:\n|$)/;
|
|
|
170
185
|
const HEADING_ATX_COMPLIANT_R = /^ *(#{1,6}) +([^\n]+?)(?: +#*)?(?:\n *)*(?:\n|$)/;
|
|
171
186
|
const HEADING_SETEXT_R = /^([^\n]+)\n *(=|-)\2{2,} *\n/;
|
|
172
187
|
/** HTML patterns */
|
|
173
|
-
/**
|
|
174
|
-
* Run of characters carrying no meaning inside an opening tag: neither a quote
|
|
175
|
-
* opening a value nor an angle bracket delimiting a tag.
|
|
176
|
-
*/
|
|
177
|
-
const TAG_PLAIN_RUN = `[^>"'<]*`;
|
|
178
|
-
/**
|
|
179
|
-
* Attribute list of an opening tag, written as a plain run followed by
|
|
180
|
-
* quote-or-bracket-led segments so that each character has a single way to be
|
|
181
|
-
* read. A lone quote is allowed last so a tag holding an unbalanced one still
|
|
182
|
-
* parses, as it did before quoted values were recognised.
|
|
183
|
-
*/
|
|
184
|
-
const TAG_ATTRIBUTES = `${TAG_PLAIN_RUN}(?:(?:"[^"\\n]*"|'[^'\\n]*'|<.*?>|["'])${TAG_PLAIN_RUN})*`;
|
|
185
|
-
/** Rejects the opening tag of a self-closing element, `<div class="a"/>`. */
|
|
186
|
-
const NOT_SELF_CLOSING = `(?![^>]*/>)`;
|
|
187
|
-
/**
|
|
188
|
-
* Opening tag of a nested element bearing the same name as the outer one. This
|
|
189
|
-
* one stays a plain scan up to the first `>`: it is tried at every character of
|
|
190
|
-
* the element's content, and a richer pattern here costs an order of magnitude
|
|
191
|
-
* on documents whose tag never closes.
|
|
192
|
-
*/
|
|
193
|
-
const NESTED_SAME_TAG_OPENING = `<\\1[^>]*?>`;
|
|
194
|
-
const HTML_BLOCK_ELEMENT_R = new RegExp(`^ *(?!<[a-zA-Z][^ >/]* ?/>)<([a-zA-Z][^ >/]*) ?(${NOT_SELF_CLOSING}${TAG_ATTRIBUTES})>\\n?(\\s*(?:${NESTED_SAME_TAG_OPENING}[\\s\\S]*?</\\1>|(?!<\\1\\b)[\\s\\S])*?)</\\1>(?!</\\1>)\\n*`, "i");
|
|
195
188
|
const HTML_CHAR_CODE_R = /&([a-z0-9]+|#[0-9]{1,6}|#x[0-9a-fA-F]{1,6});/gi;
|
|
196
189
|
const HTML_COMMENT_R = /^<!--[\s\S]*?(?:-->)/;
|
|
197
190
|
const HTML_CUSTOM_ATTR_R = /^(data|aria|x)-[a-z_][a-z\d_.-]*$/;
|
|
198
|
-
const HTML_SELF_CLOSING_ELEMENT_R = new RegExp(`^ *<([a-zA-Z][a-zA-Z0-9:]*)(?:\\s+(${TAG_ATTRIBUTES}))?/?>(?!</\\1>)(\\s*\\n)?`, "i");
|
|
199
|
-
/** Custom component pattern */
|
|
200
|
-
const CUSTOM_COMPONENT_R = new RegExp(`^ *<([A-Z][a-zA-Z0-9]*)(?:\\s+(${TAG_ATTRIBUTES}))?>\\n?(\\s*(?:${NESTED_SAME_TAG_OPENING}[\\s\\S]*?</\\1>|(?!<\\1\\b)[\\s\\S])*?)</\\1>(?!</\\1>)\\n*`);
|
|
201
191
|
/** Interpolation */
|
|
202
192
|
const INTERPOLATION_R = /^\{.*\}$/;
|
|
203
193
|
/** Link patterns */
|
|
204
194
|
const LINK_AUTOLINK_BARE_URL_R = /^(https?:\/\/[^\s<]+[^<.,:;"')\]\s])/;
|
|
205
195
|
const LINK_AUTOLINK_R = /^<([^ >]+[:@/][^ >]+)>/;
|
|
206
196
|
const CAPTURE_LETTER_AFTER_HYPHEN = /-([a-z])?/gi;
|
|
207
|
-
/**
|
|
208
|
-
|
|
197
|
+
/**
|
|
198
|
+
* Table patterns.
|
|
199
|
+
*
|
|
200
|
+
* The row scans spell "any character but a newline" as `[^\n]` rather than `.`:
|
|
201
|
+
* `.` is a four-range exclusion, and matching it over rows this wide costs a
|
|
202
|
+
* third more than the single-range class. It is also the more faithful reading
|
|
203
|
+
* — only `\n` ends a line here, and `\r` is normalized away before parsing.
|
|
204
|
+
*/
|
|
205
|
+
const NP_TABLE_R = /^(\|[^\n]*)\n(?: *(\|? *[-:]+ *\|[-| :]*)\n((?:[^\n]*\|[^\n]*\n)*))?\n?/;
|
|
209
206
|
const TABLE_TRIM_PIPES = /(^ *\||\| *$)/g;
|
|
210
207
|
const TABLE_CENTER_ALIGN = /^ *:-+: *$/;
|
|
211
208
|
const TABLE_LEFT_ALIGN = /^ *:-+ *$/;
|
|
@@ -216,20 +213,10 @@ const PARAGRAPH_R = /^[^\n]+(?: {2}\n|\n{2,})/;
|
|
|
216
213
|
const REFERENCE_IMAGE_OR_LINK = /^\[([^\]]*)\]:\s+<?([^\s>]+)>?\s*("([^"]*)")?/;
|
|
217
214
|
const REFERENCE_IMAGE_R = /^!\[([^\]]*)\] ?\[([^\]]*)\]/;
|
|
218
215
|
const REFERENCE_LINK_R = /^\[([^\]]*)\] ?\[([^\]]*)\]/;
|
|
219
|
-
/**
|
|
220
|
-
* Cheap prefix probes used to reject a rule before its full (and far more
|
|
221
|
-
* expensive) block regex runs. Kept as module constants so the parser's inner
|
|
222
|
-
* loop never allocates a `RegExp` per candidate position.
|
|
223
|
-
*/
|
|
224
|
-
const HTML_BLOCK_OPENING_TAG_R = /^ *<([a-z][a-z0-9:-]*)\b/i;
|
|
225
|
-
const HTML_SELF_CLOSING_OPENING_TAG_R = /^ *<([a-zA-Z][a-zA-Z0-9:]*)[\s>/]/;
|
|
226
|
-
const CUSTOM_COMPONENT_OPENING_TAG_R = /^ *<([A-Z][a-zA-Z0-9]*)/;
|
|
227
216
|
/** Block detection */
|
|
228
217
|
const SHOULD_RENDER_AS_BLOCK_R = /(\n|^[-*]\s|^#|^ {2,}|^-{2,}|^>\s)/;
|
|
229
|
-
/**
|
|
218
|
+
/** Tabs, which `normalizeWhitespace` widens to four spaces. */
|
|
230
219
|
const TAB_R = /\t/g;
|
|
231
|
-
/** Every character `normalizeWhitespace` rewrites, so it needs a single pass. */
|
|
232
|
-
const NORMALIZE_WHITESPACE_R = /\r\n?|\f|\t/g;
|
|
233
220
|
const TRIM_STARTING_NEWLINES = /^\n+/;
|
|
234
221
|
const HTML_LEFT_TRIM_AMOUNT_R = /^\n*([ \t]*)/;
|
|
235
222
|
/** List patterns */
|
|
@@ -238,7 +225,6 @@ const UNORDERED_LIST_BULLET = "(?:[*+-])";
|
|
|
238
225
|
/** Text formatting patterns */
|
|
239
226
|
const TEXT_ESCAPED_R = /^\\([^0-9A-Za-z\s])/;
|
|
240
227
|
const UNESCAPE_R = /\\([^0-9A-Za-z\s])/g;
|
|
241
|
-
const TEXT_PLAIN_R = /^[\s\S](?:(?! {2}\n|[0-9]\.|http)[^=*_~\-\n:<`\\[!])*/;
|
|
242
228
|
/** Shortcode pattern */
|
|
243
229
|
const SHORTCODE_R = /^(:[a-zA-Z0-9-_]+:)/;
|
|
244
230
|
const ORDERED = 1;
|
|
@@ -278,11 +264,11 @@ const ORDERED_LIST_ITEM_R = generateListItemRegex(1);
|
|
|
278
264
|
const UNORDERED_LIST_ITEM_R = generateListItemRegex(2);
|
|
279
265
|
const generateListRegex = (type) => {
|
|
280
266
|
const bullet = type === 1 ? ORDERED_LIST_BULLET : UNORDERED_LIST_BULLET;
|
|
281
|
-
return new RegExp("^( *)(" + bullet + ") [\\s\\S]+?(?:\\n
|
|
267
|
+
return new RegExp("^( *)(" + bullet + ") (?=[\\s\\S])(?:[^\\n]*(?:\\n|$))+?(?:\\n+(?! )(?!\\1" + bullet + " (?!" + bullet + " ))\\n*|\\s*$)");
|
|
282
268
|
};
|
|
283
269
|
const ORDERED_LIST_R = generateListRegex(1);
|
|
284
270
|
const UNORDERED_LIST_R = generateListRegex(2);
|
|
285
271
|
|
|
286
272
|
//#endregion
|
|
287
|
-
export { ATTRIBUTES_TO_SANITIZE, ATTRIBUTE_TO_NODE_PROP_MAP, ATTR_EXTRACTOR_R, BLOCKQUOTE_ALERT_R, BLOCKQUOTE_R, BLOCKQUOTE_TRIM_LEFT_MULTILINE_R, BLOCK_END_R, BREAK_LINE_R, BREAK_THEMATIC_R, CAPTURE_LETTER_AFTER_HYPHEN, CODE_BLOCK_FENCED_R, CODE_BLOCK_R, CODE_INLINE_R, CONSECUTIVE_NEWLINE_R, CR_NEWLINE_R,
|
|
273
|
+
export { ATTRIBUTES_TO_SANITIZE, ATTRIBUTE_TO_NODE_PROP_MAP, ATTR_EXTRACTOR_R, BLOCKQUOTE_ALERT_R, BLOCKQUOTE_R, BLOCKQUOTE_TRIM_LEFT_MULTILINE_R, BLOCK_END_R, BREAK_LINE_R, BREAK_THEMATIC_R, CAPTURE_LETTER_AFTER_HYPHEN, CODE_BLOCK_FENCED_R, CODE_BLOCK_R, CODE_INLINE_R, CONSECUTIVE_NEWLINE_R, CR_NEWLINE_R, DO_NOT_PROCESS_HTML_ELEMENTS, FENCE_DELIMITER_R, FOOTNOTE_R, FOOTNOTE_REFERENCE_R, FORMFEED_R, FRONT_MATTER_R, GFM_TASK_R, HEADING_ATX_COMPLIANT_R, HEADING_R, HEADING_SETEXT_R, HTML_CHAR_CODE_R, HTML_COMMENT_R, HTML_CUSTOM_ATTR_R, HTML_LEFT_TRIM_AMOUNT_R, INLINE_SKIP_R, INTERPOLATION_R, LINK_AUTOLINK_BARE_URL_R, LINK_AUTOLINK_R, LOOKAHEAD, NAMED_CODES_TO_UNICODE, NP_TABLE_R, ORDERED, ORDERED_LIST_BULLET, ORDERED_LIST_ITEM_PREFIX, ORDERED_LIST_ITEM_PREFIX_R, ORDERED_LIST_ITEM_R, ORDERED_LIST_R, PARAGRAPH_R, Priority, REFERENCE_IMAGE_OR_LINK, REFERENCE_IMAGE_R, REFERENCE_LINK_R, RuleScope, RuleType, SCOPE_BLOCK, SCOPE_BOTH, SCOPE_INLINE, SHORTCODE_R, SHOULD_RENDER_AS_BLOCK_R, TABLE_CENTER_ALIGN, TABLE_LEFT_ALIGN, TABLE_RIGHT_ALIGN, TABLE_TRIM_PIPES, TAB_R, TEXT_BOLD_R, TEXT_EMPHASIZED_R, TEXT_ESCAPED_R, TEXT_MARKED_R, TEXT_STRIKETHROUGHED_R, TRIM_STARTING_NEWLINES, UNESCAPE_R, UNORDERED, UNORDERED_LIST_BULLET, UNORDERED_LIST_ITEM_PREFIX, UNORDERED_LIST_ITEM_PREFIX_R, UNORDERED_LIST_ITEM_R, UNORDERED_LIST_R, generateListItemPrefix, generateListItemPrefixRegex, generateListItemRegex, generateListRegex };
|
|
288
274
|
//# sourceMappingURL=constants.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.mjs","names":[],"sources":["../../../src/markdown/constants.ts"],"sourcesContent":["// ============================================================================\n// RULE TYPES\n// ============================================================================\n\n/**\n * Analogous to `node.type`. Please note that the values here may change at any time,\n * so do not hard code against the value directly.\n */\nexport const RuleType = {\n blockQuote: '0',\n breakLine: '1',\n breakThematic: '2',\n codeBlock: '3',\n codeFenced: '4',\n codeInline: '5',\n footnote: '6',\n footnoteReference: '7',\n gfmTask: '8',\n heading: '9',\n headingSetext: '10',\n /** only available if not `disableHTMLParsing` */\n htmlBlock: '11',\n htmlComment: '12',\n /** only available if not `disableHTMLParsing` */\n htmlSelfClosing: '13',\n /** Custom components like <Tabs>, <TabItem> */\n customComponent: '34',\n image: '14',\n link: '15',\n /** emits a `link` 'node', does not render directly */\n linkAngleBraceStyleDetector: '16',\n /** emits a `link` 'node', does not render directly */\n linkBareUrlDetector: '17',\n newlineCoalescer: '19',\n orderedList: '20',\n paragraph: '21',\n ref: '22',\n refImage: '23',\n refLink: '24',\n table: '25',\n tableSeparator: '26',\n text: '27',\n textBolded: '28',\n textEmphasized: '29',\n textEscaped: '30',\n textMarked: '31',\n textStrikethroughed: '32',\n unorderedList: '33',\n} as const;\n\n// In test environment, use human-readable keys for easier debugging\nif (process.env.NODE_ENV === 'test') {\n Object.keys(RuleType).forEach((key) => {\n (RuleType as any)[key] = key;\n });\n}\n\nexport type RuleTypeValue = (typeof RuleType)[keyof typeof RuleType];\n\n// ============================================================================\n// PRIORITY LEVELS\n// ============================================================================\n\n/**\n * Priority levels for rule ordering.\n */\nexport const Priority = {\n /** anything that must scan the tree before everything else */\n MAX: 0,\n /** scans for block-level constructs */\n HIGH: 1,\n /** inline w/ more priority than other inline */\n MED: 2,\n /** inline elements */\n LOW: 3,\n /** bare text and stuff that is considered leftovers */\n MIN: 4,\n} as const;\n\nexport type PriorityValue = (typeof Priority)[keyof typeof Priority];\n\n// ============================================================================\n// ATTRIBUTE MAPPING\n// ============================================================================\n\n/**\n * Map of HTML attributes to their JSX prop equivalents.\n * Some renderers use camelCase for certain attributes.\n */\nexport const ATTRIBUTE_TO_NODE_PROP_MAP: Record<string, string> = [\n 'allowFullScreen',\n 'allowTransparency',\n 'autoComplete',\n 'autoFocus',\n 'autoPlay',\n 'cellPadding',\n 'cellSpacing',\n 'charSet',\n 'classId',\n 'colSpan',\n 'contentEditable',\n 'contextMenu',\n 'crossOrigin',\n 'encType',\n 'formAction',\n 'formEncType',\n 'formMethod',\n 'formNoValidate',\n 'formTarget',\n 'frameBorder',\n 'hrefLang',\n 'inputMode',\n 'keyParams',\n 'keyType',\n 'marginHeight',\n 'marginWidth',\n 'maxLength',\n 'mediaGroup',\n 'minLength',\n 'noValidate',\n 'radioGroup',\n 'readOnly',\n 'rowSpan',\n 'spellCheck',\n 'srcDoc',\n 'srcLang',\n 'srcSet',\n 'tabIndex',\n 'useMap',\n].reduce(\n (obj: Record<string, string>, x) => {\n obj[x.toLowerCase()] = x;\n return obj;\n },\n { class: 'className', for: 'htmlFor' }\n);\n\n// ============================================================================\n// NAMED CODES TO UNICODE\n// ============================================================================\n\n/**\n * Default HTML entity to unicode mappings.\n */\nexport const NAMED_CODES_TO_UNICODE: Record<string, string> = {\n amp: '\\u0026',\n apos: '\\u0027',\n gt: '\\u003e',\n lt: '\\u003c',\n nbsp: '\\u00a0',\n quot: '\\u201c',\n};\n\n// ============================================================================\n// SPECIAL ELEMENTS\n// ============================================================================\n\n/** HTML elements that should not have their content processed */\nexport const DO_NOT_PROCESS_HTML_ELEMENTS = ['style', 'script', 'pre'];\n\n/** Attributes that require URL sanitization */\nexport const ATTRIBUTES_TO_SANITIZE = [\n 'src',\n 'href',\n 'data',\n 'formAction',\n 'srcDoc',\n 'action',\n];\n\n// ============================================================================\n// REGEX PATTERNS\n// ============================================================================\n\n/** Attribute extractor regex */\nexport const ATTR_EXTRACTOR_R =\n /([-A-Z0-9_:]+)(?:\\s*=\\s*(?:(?:\"((?:\\\\.|[^\"])*)\")|(?:'((?:\\\\.|[^'])*)')|(?:\\{((?:\\\\.|{[^}]*?}|[^}])*)\\})))?/gi;\n\n/** Block end detection */\nexport const BLOCK_END_R = /\\n{2,}$/;\n\n/** Blockquote patterns */\nexport const BLOCKQUOTE_R = /^(\\s*>[\\s\\S]*?)(?=\\n\\n|$)/;\nexport const BLOCKQUOTE_TRIM_LEFT_MULTILINE_R = /^ *> ?/gm;\nexport const BLOCKQUOTE_ALERT_R = /^(?:\\[!([^\\]]*)\\]\\n)?([\\s\\S]*)/;\n\n/** Line break patterns */\nexport const BREAK_LINE_R = /^ {2,}\\n/;\nexport const BREAK_THEMATIC_R = /^(?:([-*_])( *\\1){2,}) *(?:\\n *)+\\n/;\n\n/** Code block patterns */\nexport const CODE_BLOCK_FENCED_R =\n /^(?: {1,3})?(`{3,}|~{3,}) *(\\S+)? *([^\\n]*?)?\\n([\\s\\S]*?)(?:\\1\\n?|$)/;\nexport const CODE_BLOCK_R = /^(?: {4}[^\\n]+\\n*)+(?:\\n *)+\\n?/;\n/** A single line opening or closing a fenced code block, with its indentation. */\nexport const FENCE_DELIMITER_R = /^([ \\t]*)(`{3,}|~{3,})/;\nexport const CODE_INLINE_R = /^(`+)((?:\\\\`|(?!\\1)`|[^`])+)\\1/;\n\n/** Newline patterns */\nexport const CONSECUTIVE_NEWLINE_R = /^(?:\\n *)*\\n/;\nexport const CR_NEWLINE_R = /\\r\\n?/g;\n\n/** Footnote patterns */\nexport const FOOTNOTE_R = /^\\[\\^([^\\]]+)](:(.*)((\\n+ {4,}.*)|(\\n(?!\\[\\^).+))*)/;\nexport const FOOTNOTE_REFERENCE_R = /^\\[\\^([^\\]]+)]/;\n\n/** Form feed */\nexport const FORMFEED_R = /\\f/g;\n\n/** Front matter */\nexport const FRONT_MATTER_R = /^---[ \\t]*\\n(.|\\n)*?\\n---[ \\t]*\\n/;\n\n/** GFM task */\nexport const GFM_TASK_R = /^\\s*?\\[(x|\\s)\\]/;\n\n/** Heading patterns */\nexport const HEADING_R = /^ *(#{1,6}) *([^\\n]+?)(?: +#*)?(?:\\n *)*(?:\\n|$)/;\nexport const HEADING_ATX_COMPLIANT_R =\n /^ *(#{1,6}) +([^\\n]+?)(?: +#*)?(?:\\n *)*(?:\\n|$)/;\nexport const HEADING_SETEXT_R = /^([^\\n]+)\\n *(=|-)\\2{2,} *\\n/;\n\n/** HTML patterns */\n\n/**\n * Run of characters carrying no meaning inside an opening tag: neither a quote\n * opening a value nor an angle bracket delimiting a tag.\n */\nconst TAG_PLAIN_RUN = `[^>\"'<]*`;\n\n/**\n * Quoted attribute value. It may hold an angle bracket —\n * `<Tab label='Intlayer >=9.4'>` — but not a line break, which keeps a tag that\n * turns out not to match from trying every later quote of the document as its\n * closing one.\n */\nconst TAG_QUOTED_VALUE = `\"[^\"\\\\n]*\"|'[^'\\\\n]*'`;\n\n/**\n * Attribute list of an opening tag, written as a plain run followed by\n * quote-or-bracket-led segments so that each character has a single way to be\n * read. A lone quote is allowed last so a tag holding an unbalanced one still\n * parses, as it did before quoted values were recognised.\n */\nconst TAG_ATTRIBUTES = `${TAG_PLAIN_RUN}(?:(?:${TAG_QUOTED_VALUE}|<.*?>|[\"'])${TAG_PLAIN_RUN})*`;\n\n/** Rejects the opening tag of a self-closing element, `<div class=\"a\"/>`. */\nconst NOT_SELF_CLOSING = `(?![^>]*/>)`;\n\n/**\n * Opening tag of a nested element bearing the same name as the outer one. This\n * one stays a plain scan up to the first `>`: it is tried at every character of\n * the element's content, and a richer pattern here costs an order of magnitude\n * on documents whose tag never closes.\n */\nconst NESTED_SAME_TAG_OPENING = `<\\\\1[^>]*?>`;\n\nexport const HTML_BLOCK_ELEMENT_R = new RegExp(\n `^ *(?!<[a-zA-Z][^ >/]* ?/>)<([a-zA-Z][^ >/]*) ?(${NOT_SELF_CLOSING}${TAG_ATTRIBUTES})>\\\\n?(\\\\s*(?:${NESTED_SAME_TAG_OPENING}[\\\\s\\\\S]*?</\\\\1>|(?!<\\\\1\\\\b)[\\\\s\\\\S])*?)</\\\\1>(?!</\\\\1>)\\\\n*`,\n 'i'\n);\nexport const HTML_CHAR_CODE_R =\n /&([a-z0-9]+|#[0-9]{1,6}|#x[0-9a-fA-F]{1,6});/gi;\nexport const HTML_COMMENT_R = /^<!--[\\s\\S]*?(?:-->)/;\nexport const HTML_CUSTOM_ATTR_R = /^(data|aria|x)-[a-z_][a-z\\d_.-]*$/;\nexport const HTML_SELF_CLOSING_ELEMENT_R = new RegExp(\n `^ *<([a-zA-Z][a-zA-Z0-9:]*)(?:\\\\s+(${TAG_ATTRIBUTES}))?/?>(?!</\\\\1>)(\\\\s*\\\\n)?`,\n 'i'\n);\n\n/** Custom component pattern */\nexport const CUSTOM_COMPONENT_R = new RegExp(\n `^ *<([A-Z][a-zA-Z0-9]*)(?:\\\\s+(${TAG_ATTRIBUTES}))?>\\\\n?(\\\\s*(?:${NESTED_SAME_TAG_OPENING}[\\\\s\\\\S]*?</\\\\1>|(?!<\\\\1\\\\b)[\\\\s\\\\S])*?)</\\\\1>(?!</\\\\1>)\\\\n*`\n);\n\n/** Interpolation */\nexport const INTERPOLATION_R = /^\\{.*\\}$/;\n\n/** Link patterns */\nexport const LINK_AUTOLINK_BARE_URL_R = /^(https?:\\/\\/[^\\s<]+[^<.,:;\"')\\]\\s])/;\nexport const LINK_AUTOLINK_R = /^<([^ >]+[:@/][^ >]+)>/;\nexport const CAPTURE_LETTER_AFTER_HYPHEN = /-([a-z])?/gi;\n\n/** Table patterns */\nexport const NP_TABLE_R =\n /^(\\|.*)\\n(?: *(\\|? *[-:]+ *\\|[-| :]*)\\n((?:.*\\|.*\\n)*))?\\n?/;\nexport const TABLE_TRIM_PIPES = /(^ *\\||\\| *$)/g;\nexport const TABLE_CENTER_ALIGN = /^ *:-+: *$/;\nexport const TABLE_LEFT_ALIGN = /^ *:-+ *$/;\nexport const TABLE_RIGHT_ALIGN = /^ *-+: *$/;\n\n/** Paragraph */\nexport const PARAGRAPH_R = /^[^\\n]+(?: {2}\\n|\\n{2,})/;\n\n/** Reference patterns */\nexport const REFERENCE_IMAGE_OR_LINK =\n /^\\[([^\\]]*)\\]:\\s+<?([^\\s>]+)>?\\s*(\"([^\"]*)\")?/;\nexport const REFERENCE_IMAGE_R = /^!\\[([^\\]]*)\\] ?\\[([^\\]]*)\\]/;\nexport const REFERENCE_LINK_R = /^\\[([^\\]]*)\\] ?\\[([^\\]]*)\\]/;\n\n/**\n * Cheap prefix probes used to reject a rule before its full (and far more\n * expensive) block regex runs. Kept as module constants so the parser's inner\n * loop never allocates a `RegExp` per candidate position.\n */\nexport const HTML_BLOCK_OPENING_TAG_R = /^ *<([a-z][a-z0-9:-]*)\\b/i;\nexport const HTML_SELF_CLOSING_OPENING_TAG_R =\n /^ *<([a-zA-Z][a-zA-Z0-9:]*)[\\s>/]/;\nexport const CUSTOM_COMPONENT_OPENING_TAG_R = /^ *<([A-Z][a-zA-Z0-9]*)/;\n\n/** Block detection */\nexport const SHOULD_RENDER_AS_BLOCK_R = /(\\n|^[-*]\\s|^#|^ {2,}|^-{2,}|^>\\s)/;\n\n/** Tab and whitespace */\nexport const TAB_R = /\\t/g;\n/** Every character `normalizeWhitespace` rewrites, so it needs a single pass. */\nexport const NORMALIZE_WHITESPACE_R = /\\r\\n?|\\f|\\t/g;\nexport const TRIM_STARTING_NEWLINES = /^\\n+/;\nexport const HTML_LEFT_TRIM_AMOUNT_R = /^\\n*([ \\t]*)/;\n\n/** List patterns */\nexport const ORDERED_LIST_BULLET = '(?:\\\\d+\\\\.)';\nexport const UNORDERED_LIST_BULLET = '(?:[*+-])';\n\n/** Text formatting patterns */\nexport const TEXT_ESCAPED_R = /^\\\\([^0-9A-Za-z\\s])/;\nexport const UNESCAPE_R = /\\\\([^0-9A-Za-z\\s])/g;\nexport const TEXT_PLAIN_R =\n /^[\\s\\S](?:(?! {2}\\n|[0-9]\\.|http)[^=*_~\\-\\n:<`\\\\[!])*/;\n\n/** Shortcode pattern */\nexport const SHORTCODE_R = /^(:[a-zA-Z0-9-_]+:)/;\n\n// ============================================================================\n// LIST TYPE CONSTANTS\n// ============================================================================\n\nexport type ListType = 1 | 2;\nexport const ORDERED: ListType = 1;\nexport const UNORDERED: ListType = 2;\n\n// ============================================================================\n// INLINE PATTERN HELPERS\n// ============================================================================\n\n/**\n * Ensure there's at least one more instance of the delimiter later\n * in the current sequence.\n */\nexport const LOOKAHEAD = (double: number): string =>\n `(?=[\\\\s\\\\S]+?\\\\1${double ? '\\\\1' : ''})`;\n\n/**\n * For inline formatting, this partial attempts to ignore characters that\n * may appear in nested formatting.\n */\nexport const INLINE_SKIP_R =\n '((?:\\\\[.*?\\\\][([].*?[)\\\\]]|<.*?>(?:.*?<.*?>)?|`.*?`|\\\\\\\\[^\\\\s]|[\\\\s\\\\S])+?)';\n\n/** Bold text pattern */\nexport const TEXT_BOLD_R = new RegExp(\n `^([*_])\\\\1${LOOKAHEAD(1)}${INLINE_SKIP_R}\\\\1\\\\1(?!\\\\1)`\n);\n\n/** Emphasized text pattern */\nexport const TEXT_EMPHASIZED_R = new RegExp(\n `^([*_])${LOOKAHEAD(0)}${INLINE_SKIP_R}\\\\1(?!\\\\1)`\n);\n\n/** Marked text pattern */\nexport const TEXT_MARKED_R = new RegExp(\n `^(==)${LOOKAHEAD(0)}${INLINE_SKIP_R}\\\\1`\n);\n\n/** Strikethrough text pattern */\nexport const TEXT_STRIKETHROUGHED_R = new RegExp(\n `^(~~)${LOOKAHEAD(0)}${INLINE_SKIP_R}\\\\1`\n);\n\n// ============================================================================\n// LIST REGEX GENERATORS\n// ============================================================================\n\nexport const generateListItemPrefix = (type: ListType): string => {\n return (\n '( *)(' +\n (type === ORDERED ? ORDERED_LIST_BULLET : UNORDERED_LIST_BULLET) +\n ') +'\n );\n};\n\nexport const ORDERED_LIST_ITEM_PREFIX = generateListItemPrefix(ORDERED);\nexport const UNORDERED_LIST_ITEM_PREFIX = generateListItemPrefix(UNORDERED);\n\nexport const generateListItemPrefixRegex = (type: ListType): RegExp => {\n return new RegExp(\n '^' +\n (type === ORDERED ? ORDERED_LIST_ITEM_PREFIX : UNORDERED_LIST_ITEM_PREFIX)\n );\n};\n\nexport const ORDERED_LIST_ITEM_PREFIX_R = generateListItemPrefixRegex(ORDERED);\nexport const UNORDERED_LIST_ITEM_PREFIX_R =\n generateListItemPrefixRegex(UNORDERED);\n\nexport const generateListItemRegex = (type: ListType): RegExp => {\n return new RegExp(\n '^' +\n (type === ORDERED\n ? ORDERED_LIST_ITEM_PREFIX\n : UNORDERED_LIST_ITEM_PREFIX) +\n '[^\\\\n]*(?:\\\\n' +\n '(?!\\\\1' +\n (type === ORDERED ? ORDERED_LIST_BULLET : UNORDERED_LIST_BULLET) +\n ' )[^\\\\n]*)*(\\\\n|$)',\n 'gm'\n );\n};\n\nexport const ORDERED_LIST_ITEM_R = generateListItemRegex(ORDERED);\nexport const UNORDERED_LIST_ITEM_R = generateListItemRegex(UNORDERED);\n\nexport const generateListRegex = (type: ListType): RegExp => {\n const bullet = type === ORDERED ? ORDERED_LIST_BULLET : UNORDERED_LIST_BULLET;\n\n return new RegExp(\n '^( *)(' +\n bullet +\n ') ' +\n '[\\\\s\\\\S]+?(?:\\\\n{2,}(?! )' +\n '(?!\\\\1' +\n bullet +\n ' (?!' +\n bullet +\n ' ))\\\\n*' +\n '|\\\\s*\\\\n*$)'\n );\n};\n\nexport const ORDERED_LIST_R = generateListRegex(ORDERED);\nexport const UNORDERED_LIST_R = generateListRegex(UNORDERED);\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"constants.mjs","names":[],"sources":["../../../src/markdown/constants.ts"],"sourcesContent":["// ============================================================================\n// RULE TYPES\n// ============================================================================\n\n/**\n * Analogous to `node.type`. Please note that the values here may change at any time,\n * so do not hard code against the value directly.\n */\nexport const RuleType = {\n blockQuote: '0',\n breakLine: '1',\n breakThematic: '2',\n codeBlock: '3',\n codeFenced: '4',\n codeInline: '5',\n footnote: '6',\n footnoteReference: '7',\n gfmTask: '8',\n heading: '9',\n headingSetext: '10',\n /** only available if not `disableHTMLParsing` */\n htmlBlock: '11',\n htmlComment: '12',\n /** only available if not `disableHTMLParsing` */\n htmlSelfClosing: '13',\n /** Custom components like <Tabs>, <TabItem> */\n customComponent: '34',\n image: '14',\n link: '15',\n /** emits a `link` 'node', does not render directly */\n linkAngleBraceStyleDetector: '16',\n /** emits a `link` 'node', does not render directly */\n linkBareUrlDetector: '17',\n newlineCoalescer: '19',\n orderedList: '20',\n paragraph: '21',\n ref: '22',\n refImage: '23',\n refLink: '24',\n table: '25',\n tableSeparator: '26',\n text: '27',\n textBolded: '28',\n textEmphasized: '29',\n textEscaped: '30',\n textMarked: '31',\n textStrikethroughed: '32',\n unorderedList: '33',\n} as const;\n\n// In test environment, use human-readable keys for easier debugging\nif (process.env.NODE_ENV === 'test') {\n Object.keys(RuleType).forEach((key) => {\n (RuleType as any)[key] = key;\n });\n}\n\nexport type RuleTypeValue = (typeof RuleType)[keyof typeof RuleType];\n\n// ============================================================================\n// PRIORITY LEVELS\n// ============================================================================\n\n/**\n * Priority levels for rule ordering.\n */\nexport const Priority = {\n /** anything that must scan the tree before everything else */\n MAX: 0,\n /** scans for block-level constructs */\n HIGH: 1,\n /** inline w/ more priority than other inline */\n MED: 2,\n /** inline elements */\n LOW: 3,\n /** bare text and stuff that is considered leftovers */\n MIN: 4,\n} as const;\n\nexport type PriorityValue = (typeof Priority)[keyof typeof Priority];\n\n// ============================================================================\n// RULE SCOPE CONSTANTS\n// ============================================================================\n\n/**\n * Parsing scope for markdown rules.\n * Bitmask representation for fast bitwise checking and bundle minification.\n * - BLOCK (1): evaluated only when !state.inline && !state.simple\n * - INLINE (2): evaluated only when state.inline || state.simple\n * - BOTH (3): evaluated in both scopes (default)\n */\nexport const RuleScope = {\n BLOCK: 1,\n INLINE: 2,\n BOTH: 3,\n} as const;\n\nexport const SCOPE_BLOCK = RuleScope.BLOCK;\nexport const SCOPE_INLINE = RuleScope.INLINE;\nexport const SCOPE_BOTH = RuleScope.BOTH;\n\nexport type RuleScopeValue =\n | (typeof RuleScope)[keyof typeof RuleScope]\n | 'block'\n | 'inline'\n | 'both';\n\n// ============================================================================\n// ATTRIBUTE MAPPING\n// ============================================================================\n\n/**\n * Map of HTML attributes to their JSX prop equivalents.\n * Some renderers use camelCase for certain attributes.\n */\nexport const ATTRIBUTE_TO_NODE_PROP_MAP: Record<string, string> = [\n 'allowFullScreen',\n 'allowTransparency',\n 'autoComplete',\n 'autoFocus',\n 'autoPlay',\n 'cellPadding',\n 'cellSpacing',\n 'charSet',\n 'classId',\n 'colSpan',\n 'contentEditable',\n 'contextMenu',\n 'crossOrigin',\n 'encType',\n 'formAction',\n 'formEncType',\n 'formMethod',\n 'formNoValidate',\n 'formTarget',\n 'frameBorder',\n 'hrefLang',\n 'inputMode',\n 'keyParams',\n 'keyType',\n 'marginHeight',\n 'marginWidth',\n 'maxLength',\n 'mediaGroup',\n 'minLength',\n 'noValidate',\n 'radioGroup',\n 'readOnly',\n 'rowSpan',\n 'spellCheck',\n 'srcDoc',\n 'srcLang',\n 'srcSet',\n 'tabIndex',\n 'useMap',\n].reduce(\n (obj: Record<string, string>, x) => {\n obj[x.toLowerCase()] = x;\n return obj;\n },\n { class: 'className', for: 'htmlFor' }\n);\n\n// ============================================================================\n// NAMED CODES TO UNICODE\n// ============================================================================\n\n/**\n * Default HTML entity to unicode mappings.\n */\nexport const NAMED_CODES_TO_UNICODE: Record<string, string> = {\n amp: '\\u0026',\n apos: '\\u0027',\n gt: '\\u003e',\n lt: '\\u003c',\n nbsp: '\\u00a0',\n quot: '\\u201c',\n};\n\n// ============================================================================\n// SPECIAL ELEMENTS\n// ============================================================================\n\n/** HTML elements that should not have their content processed */\nexport const DO_NOT_PROCESS_HTML_ELEMENTS = ['style', 'script', 'pre'];\n\n/** Attributes that require URL sanitization */\nexport const ATTRIBUTES_TO_SANITIZE = [\n 'src',\n 'href',\n 'data',\n 'formAction',\n 'srcDoc',\n 'action',\n];\n\n// ============================================================================\n// REGEX PATTERNS\n// ============================================================================\n\n/** Attribute extractor regex */\nexport const ATTR_EXTRACTOR_R =\n /([-A-Z0-9_:]+)(?:\\s*=\\s*(?:(?:\"((?:\\\\.|[^\"])*)\")|(?:'((?:\\\\.|[^'])*)')|(?:\\{((?:\\\\.|{[^}]*?}|[^}])*)\\})))?/gi;\n\n/** Block end detection */\nexport const BLOCK_END_R = /\\n{2,}$/;\n\n/** Blockquote patterns */\nexport const BLOCKQUOTE_R = /^(\\s*>[\\s\\S]*?)(?=\\n\\n|$)/;\nexport const BLOCKQUOTE_TRIM_LEFT_MULTILINE_R = /^ *> ?/gm;\nexport const BLOCKQUOTE_ALERT_R = /^(?:\\[!([^\\]]*)\\]\\n)?([\\s\\S]*)/;\n\n/** Line break patterns */\nexport const BREAK_LINE_R = /^(?=( {2,}))\\1\\n/;\nexport const BREAK_THEMATIC_R = /^(?:([-*_])( *\\1){2,}) *(?:\\n *)+\\n/;\n\n/** Code block patterns */\n// The body is consumed a whole line at a time rather than character by\n// character: a closing fence only ever starts a line, so the backreference is\n// tested once per line instead of once per character. The trailing `$` branch\n// inside the loop keeps an unterminated fence that ends without a newline.\nexport const CODE_BLOCK_FENCED_R =\n /^(?: {1,3})?(`{3,}|~{3,}) *(\\S+)? *([^\\n]*?)?\\n((?:[^\\n]*(?:\\n|$))*?)(?:\\1\\n?|$)/;\nexport const CODE_BLOCK_R = /^(?: {4}[^\\n]+\\n*)+(?:\\n *)+\\n?/;\n/** A single line opening or closing a fenced code block, with its indentation. */\nexport const FENCE_DELIMITER_R = /^([ \\t]*)(`{3,}|~{3,})/;\nexport const CODE_INLINE_R = /^(`+)((?:\\\\`|(?!\\1)`|[^`])+)\\1/;\n\n/** Newline patterns */\nexport const CONSECUTIVE_NEWLINE_R = /^(?:\\n *)*\\n/;\nexport const CR_NEWLINE_R = /\\r\\n?/g;\n\n/** Footnote patterns */\nexport const FOOTNOTE_R = /^\\[\\^([^\\]]+)](:(.*)((\\n+ {4,}.*)|(\\n(?!\\[\\^).+))*)/;\nexport const FOOTNOTE_REFERENCE_R = /^\\[\\^([^\\]]+)]/;\n\n/** Form feed */\nexport const FORMFEED_R = /\\f/g;\n\n/** Front matter */\nexport const FRONT_MATTER_R = /^---[ \\t]*\\n(.|\\n)*?\\n---[ \\t]*\\n/;\n\n/** GFM task */\nexport const GFM_TASK_R = /^\\s*?\\[(x|\\s)\\]/;\n\n/** Heading patterns */\nexport const HEADING_R = /^ *(#{1,6}) *([^\\n]+?)(?: +#*)?(?:\\n *)*(?:\\n|$)/;\nexport const HEADING_ATX_COMPLIANT_R =\n /^ *(#{1,6}) +([^\\n]+?)(?: +#*)?(?:\\n *)*(?:\\n|$)/;\nexport const HEADING_SETEXT_R = /^([^\\n]+)\\n *(=|-)\\2{2,} *\\n/;\n\n/** HTML patterns */\n\nexport const HTML_CHAR_CODE_R =\n /&([a-z0-9]+|#[0-9]{1,6}|#x[0-9a-fA-F]{1,6});/gi;\nexport const HTML_COMMENT_R = /^<!--[\\s\\S]*?(?:-->)/;\nexport const HTML_CUSTOM_ATTR_R = /^(data|aria|x)-[a-z_][a-z\\d_.-]*$/;\n\n/** Interpolation */\nexport const INTERPOLATION_R = /^\\{.*\\}$/;\n\n/** Link patterns */\nexport const LINK_AUTOLINK_BARE_URL_R = /^(https?:\\/\\/[^\\s<]+[^<.,:;\"')\\]\\s])/;\nexport const LINK_AUTOLINK_R = /^<([^ >]+[:@/][^ >]+)>/;\nexport const CAPTURE_LETTER_AFTER_HYPHEN = /-([a-z])?/gi;\n\n/**\n * Table patterns.\n *\n * The row scans spell \"any character but a newline\" as `[^\\n]` rather than `.`:\n * `.` is a four-range exclusion, and matching it over rows this wide costs a\n * third more than the single-range class. It is also the more faithful reading\n * — only `\\n` ends a line here, and `\\r` is normalized away before parsing.\n */\nexport const NP_TABLE_R =\n /^(\\|[^\\n]*)\\n(?: *(\\|? *[-:]+ *\\|[-| :]*)\\n((?:[^\\n]*\\|[^\\n]*\\n)*))?\\n?/;\nexport const TABLE_TRIM_PIPES = /(^ *\\||\\| *$)/g;\nexport const TABLE_CENTER_ALIGN = /^ *:-+: *$/;\nexport const TABLE_LEFT_ALIGN = /^ *:-+ *$/;\nexport const TABLE_RIGHT_ALIGN = /^ *-+: *$/;\n\n/** Paragraph */\nexport const PARAGRAPH_R = /^[^\\n]+(?: {2}\\n|\\n{2,})/;\n\n/** Reference patterns */\nexport const REFERENCE_IMAGE_OR_LINK =\n /^\\[([^\\]]*)\\]:\\s+<?([^\\s>]+)>?\\s*(\"([^\"]*)\")?/;\nexport const REFERENCE_IMAGE_R = /^!\\[([^\\]]*)\\] ?\\[([^\\]]*)\\]/;\nexport const REFERENCE_LINK_R = /^\\[([^\\]]*)\\] ?\\[([^\\]]*)\\]/;\n\n/** Block detection */\nexport const SHOULD_RENDER_AS_BLOCK_R = /(\\n|^[-*]\\s|^#|^ {2,}|^-{2,}|^>\\s)/;\n\n/** Tabs, which `normalizeWhitespace` widens to four spaces. */\nexport const TAB_R = /\\t/g;\nexport const TRIM_STARTING_NEWLINES = /^\\n+/;\nexport const HTML_LEFT_TRIM_AMOUNT_R = /^\\n*([ \\t]*)/;\n\n/** List patterns */\nexport const ORDERED_LIST_BULLET = '(?:\\\\d+\\\\.)';\nexport const UNORDERED_LIST_BULLET = '(?:[*+-])';\n\n/** Text formatting patterns */\nexport const TEXT_ESCAPED_R = /^\\\\([^0-9A-Za-z\\s])/;\nexport const UNESCAPE_R = /\\\\([^0-9A-Za-z\\s])/g;\n\n/** Shortcode pattern */\nexport const SHORTCODE_R = /^(:[a-zA-Z0-9-_]+:)/;\n\n// ============================================================================\n// LIST TYPE CONSTANTS\n// ============================================================================\n\nexport type ListType = 1 | 2;\nexport const ORDERED: ListType = 1;\nexport const UNORDERED: ListType = 2;\n\n// ============================================================================\n// INLINE PATTERN HELPERS\n// ============================================================================\n\n/**\n * Ensure there's at least one more instance of the delimiter later\n * in the current sequence.\n */\nexport const LOOKAHEAD = (double: number): string =>\n `(?=[\\\\s\\\\S]+?\\\\1${double ? '\\\\1' : ''})`;\n\n/**\n * For inline formatting, this partial attempts to ignore characters that\n * may appear in nested formatting.\n */\nexport const INLINE_SKIP_R =\n '((?:\\\\[.*?\\\\][([].*?[)\\\\]]|<.*?>(?:.*?<.*?>)?|`.*?`|\\\\\\\\[^\\\\s]|[\\\\s\\\\S])+?)';\n\n/** Bold text pattern */\nexport const TEXT_BOLD_R = new RegExp(\n `^([*_])\\\\1${LOOKAHEAD(1)}${INLINE_SKIP_R}\\\\1\\\\1(?!\\\\1)`\n);\n\n/** Emphasized text pattern */\nexport const TEXT_EMPHASIZED_R = new RegExp(\n `^([*_])${LOOKAHEAD(0)}${INLINE_SKIP_R}\\\\1(?!\\\\1)`\n);\n\n/** Marked text pattern */\nexport const TEXT_MARKED_R = new RegExp(\n `^(==)${LOOKAHEAD(0)}${INLINE_SKIP_R}\\\\1`\n);\n\n/** Strikethrough text pattern */\nexport const TEXT_STRIKETHROUGHED_R = new RegExp(\n `^(~~)${LOOKAHEAD(0)}${INLINE_SKIP_R}\\\\1`\n);\n\n// ============================================================================\n// LIST REGEX GENERATORS\n// ============================================================================\n\nexport const generateListItemPrefix = (type: ListType): string => {\n return (\n '( *)(' +\n (type === ORDERED ? ORDERED_LIST_BULLET : UNORDERED_LIST_BULLET) +\n ') +'\n );\n};\n\nexport const ORDERED_LIST_ITEM_PREFIX = generateListItemPrefix(ORDERED);\nexport const UNORDERED_LIST_ITEM_PREFIX = generateListItemPrefix(UNORDERED);\n\nexport const generateListItemPrefixRegex = (type: ListType): RegExp => {\n return new RegExp(\n '^' +\n (type === ORDERED ? ORDERED_LIST_ITEM_PREFIX : UNORDERED_LIST_ITEM_PREFIX)\n );\n};\n\nexport const ORDERED_LIST_ITEM_PREFIX_R = generateListItemPrefixRegex(ORDERED);\nexport const UNORDERED_LIST_ITEM_PREFIX_R =\n generateListItemPrefixRegex(UNORDERED);\n\nexport const generateListItemRegex = (type: ListType): RegExp => {\n return new RegExp(\n '^' +\n (type === ORDERED\n ? ORDERED_LIST_ITEM_PREFIX\n : UNORDERED_LIST_ITEM_PREFIX) +\n '[^\\\\n]*(?:\\\\n' +\n '(?!\\\\1' +\n (type === ORDERED ? ORDERED_LIST_BULLET : UNORDERED_LIST_BULLET) +\n ' )[^\\\\n]*)*(\\\\n|$)',\n 'gm'\n );\n};\n\nexport const ORDERED_LIST_ITEM_R = generateListItemRegex(ORDERED);\nexport const UNORDERED_LIST_ITEM_R = generateListItemRegex(UNORDERED);\n\nexport const generateListRegex = (type: ListType): RegExp => {\n const bullet = type === ORDERED ? ORDERED_LIST_BULLET : UNORDERED_LIST_BULLET;\n\n return new RegExp(\n '^( *)(' +\n bullet +\n ') ' +\n // The body advances a line at a time rather than a character at a time: a\n // list can only end at a line boundary, so the terminator — the expensive\n // half, with its two nested lookaheads — is tried once per line instead of\n // once per character. The step swallows the newline that used to open the\n // terminator, which is why it now reads `\\n+` and not `\\n{2,}`, and the\n // leading lookahead keeps a source with nothing left after the bullet from\n // matching through a zero-width step.\n '(?=[\\\\s\\\\S])(?:[^\\\\n]*(?:\\\\n|$))+?' +\n '(?:\\\\n+(?! )' +\n '(?!\\\\1' +\n bullet +\n ' (?!' +\n bullet +\n ' ))\\\\n*' +\n // `\\s` already covers `\\n`, so the trailing `\\n*` the pattern used to\n // carry could only ever match empty — and paying for it at every step of\n // the lazy scan cost a third of the whole match.\n '|\\\\s*$)'\n );\n};\n\nexport const ORDERED_LIST_R = generateListRegex(ORDERED);\nexport const UNORDERED_LIST_R = generateListRegex(UNORDERED);\n"],"mappings":"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"}
|