diff --git a/linters/remark-lint-no-html-comments.js b/linters/remark-lint-no-html-comments.js index 928720d..f9e6668 100644 --- a/linters/remark-lint-no-html-comments.js +++ b/linters/remark-lint-no-html-comments.js @@ -1,41 +1,53 @@ -import { visit } from 'unist-util-visit' - const remarkLintNoHtmlComments = (severity = 'warning') => { return (tree, file) => { - // Handle both array format [severity] and direct severity string const actualSeverity = Array.isArray(severity) ? severity[0] : severity - // Visit all HTML nodes to find HTML comments - visit(tree, 'html', (node) => { - const content = node.value + const content = file.toString() + const lines = content.split('\n') + let inCodeBlock = false + let inFrontmatter = false - // Check for HTML comments - const htmlCommentRegex = //g - let commentMatch + for (let i = 0; i < lines.length; i++) { + const lineNumber = i + 1 + const line = lines[i] + const trimmed = line.trim() - while ((commentMatch = htmlCommentRegex.exec(content)) !== null) { - const [fullComment] = commentMatch + // Skip YAML frontmatter + if (i === 0 && trimmed === '---') { + inFrontmatter = true + continue + } + if (inFrontmatter) { + if (trimmed === '---') inFrontmatter = false + continue + } - const position = { - start: { - line: node.position.start.line, - column: node.position.start.column + commentMatch.index + 1 - }, - end: { - line: node.position.start.line, - column: node.position.start.column + commentMatch.index + fullComment.length - } - } + // Skip fenced code blocks + if (trimmed.startsWith('```') || trimmed.startsWith('~~~')) { + inCodeBlock = !inCodeBlock + continue + } + if (inCodeBlock) continue - const message = 'HTML comments are not allowed. Use markdown comments instead or remove the comment.' + // Strip inline code spans to avoid false positives inside backticks + const stripped = line.replace(/`[^`]*`/g, (m) => ' '.repeat(m.length)) + const htmlCommentRegex = //g + let match + while ((match = htmlCommentRegex.exec(stripped)) !== null) { + const position = { + start: { line: lineNumber, column: match.index + 1 }, + end: { line: lineNumber, column: match.index + match[0].length + 1 } + } + const message = + 'HTML comments are not allowed. Use markdown comments instead or remove the comment.' if (actualSeverity === 'error') { file.fail(message, position, 'remark-lint:no-html-comments') } else { file.message(message, position, 'remark-lint:no-html-comments') } } - }) + } } }