diff --git a/packages/mini-markdown-ast-parser/src/core/parse/compose/blocks/html.ts b/packages/mini-markdown-ast-parser/src/core/parse/compose/blocks/html.ts index 24aaec6d4374116047c13138e7d0a08f5c579a34..115d0329e70e25d0bc53bd5aad88933a992aadda 100644 --- a/packages/mini-markdown-ast-parser/src/core/parse/compose/blocks/html.ts +++ b/packages/mini-markdown-ast-parser/src/core/parse/compose/blocks/html.ts @@ -31,6 +31,8 @@ export const parseHtml = ({ const htmlBlockStartRegex = /^\s*<([a-zA-Z][a-zA-Z0-9]*)(?![^>]*\/>)[^>]*>/; const htmlBlockEndRegex = /<\/([a-zA-Z][a-zA-Z0-9]*)>\s*$/; const selfClosingTagRegex = /^\s*<([a-zA-Z][a-zA-Z0-9]*)[^>]*\/>\s*$/; + // 添加新的单标签正则 + const voidElementRegex = /^\s*<([a-zA-Z][a-zA-Z0-9]*)[^>]*>/; // 如果在HTML块内,优先处理内容 if (currentStatus.inHtmlBlock) { @@ -63,14 +65,22 @@ export const parseHtml = ({ } // 检查是否是HTML块的开始 - if (!currentStatus.inHtmlBlock && htmlBlockStartRegex.test(trimmedLine)) { - const match = trimmedLine.match(htmlBlockStartRegex); - const tagName = match?.[1].toLowerCase(); + if ( + !currentStatus.inHtmlBlock && + (htmlBlockStartRegex.test(trimmedLine) || selfClosingTagRegex.test(trimmedLine)) + ) { + // 优先检查是否是单标签 + const voidMatch = trimmedLine.match(voidElementRegex); + const tagName = voidMatch?.[1].toLowerCase(); // 如果是单标签,直接处理并返回 if (tagName && voidElements.has(tagName)) { const dataLineAttr = ` data-line="${index + 1}"`; - const content = line.replace(/>/, `${dataLineAttr}>`); + // 处理自闭合和非自闭合两种情况 + const content = selfClosingTagRegex.test(trimmedLine) + ? line.replace("/>", `${dataLineAttr} />`) + : line.replace(/>/, `${dataLineAttr}>`); + root.children.push({ type: "html", value: content.trim(), @@ -91,7 +101,7 @@ export const parseHtml = ({ } currentStatus.inHtmlBlock = true; - currentStatus.htmlBlockTag = tagName; // 记录最外层的标签名 + currentStatus.htmlBlockTag = tagName || null; // 记录最外层的标签名 // 添加 data-line 属性 const dataLineAttr = ` data-line="${index + 1}"`; diff --git a/packages/mini-markdown-ast-parser/src/core/parse/compose/index.ts b/packages/mini-markdown-ast-parser/src/core/parse/compose/index.ts index 4a2b781cd2eadb04e6bf9c2965b6beb816aec045..1c7b7f9b5d04aced7b503584ac393a0a6cba4bff 100644 --- a/packages/mini-markdown-ast-parser/src/core/parse/compose/index.ts +++ b/packages/mini-markdown-ast-parser/src/core/parse/compose/index.ts @@ -48,7 +48,7 @@ export type ParseFnParams = { currentTable: Tokens | null; htmlContent: string; inHtmlBlock: boolean; - htmlBlockTag: string; + htmlBlockTag: string | null; }; resetCurrentStatus: () => void; };