77// Imports
88//-----------------------------------------------------------------------------
99
10- import {
11- findOffsets ,
12- frontmatterHasTitle ,
13- stripHtmlComments ,
14- } from "../util.js" ;
10+ import { frontmatterHasTitle , stripHtmlComments } from "../util.js" ;
1511
1612//-----------------------------------------------------------------------------
1713// Type Definitions
1814//-----------------------------------------------------------------------------
1915
2016/**
21- * @import { MarkdownRuleDefinition } from "../types.js";
17+ * @import { Yaml } from "mdast";
18+ * @import { MarkdownRuleDefinition, Toml, Json } from "../types.js";
2219 * @typedef {"multipleH1" } NoMultipleH1MessageIds
2320 * @typedef {[{ frontmatterTitle?: string }] } NoMultipleH1Options
2421 * @typedef {MarkdownRuleDefinition<{ RuleOptions: NoMultipleH1Options, MessageIds: NoMultipleH1MessageIds }> } NoMultipleH1RuleDefinition
@@ -70,25 +67,14 @@ export default {
7067 } ,
7168
7269 create ( context ) {
70+ const { sourceCode } = context ;
7371 const [ { frontmatterTitle } ] = context . options ;
7472 const titlePattern =
7573 frontmatterTitle === "" ? null : new RegExp ( frontmatterTitle , "iu" ) ;
7674 let h1Count = 0 ;
7775
7876 return {
79- yaml ( node ) {
80- if ( frontmatterHasTitle ( node . value , titlePattern ) ) {
81- h1Count ++ ;
82- }
83- } ,
84-
85- toml ( node ) {
86- if ( frontmatterHasTitle ( node . value , titlePattern ) ) {
87- h1Count ++ ;
88- }
89- } ,
90-
91- json ( node ) {
77+ "yaml, toml, json" ( /** @type {Yaml | Toml | Json } */ node ) {
9278 if ( frontmatterHasTitle ( node . value , titlePattern ) ) {
9379 h1Count ++ ;
9480 }
@@ -97,45 +83,20 @@ export default {
9783 html ( node ) {
9884 const text = stripHtmlComments ( node . value ) ;
9985
86+ /** @type {RegExpExecArray } */
10087 let match ;
88+
10189 while ( ( match = h1TagPattern . exec ( text ) ) !== null ) {
10290 h1Count ++ ;
10391 if ( h1Count > 1 ) {
104- const {
105- lineOffset : startLineOffset ,
106- columnOffset : startColumnOffset ,
107- } = findOffsets ( node . value , match . index ) ;
108-
109- const {
110- lineOffset : endLineOffset ,
111- columnOffset : endColumnOffset ,
112- } = findOffsets (
113- node . value ,
114- match . index + match [ 0 ] . length ,
115- ) ;
116-
117- const nodeStartLine = node . position . start . line ;
118- const nodeStartColumn = node . position . start . column ;
119- const startLine = nodeStartLine + startLineOffset ;
120- const endLine = nodeStartLine + endLineOffset ;
121- const startColumn =
122- ( startLine === nodeStartLine
123- ? nodeStartColumn
124- : 1 ) + startColumnOffset ;
125- const endColumn =
126- ( endLine === nodeStartLine ? nodeStartColumn : 1 ) +
127- endColumnOffset ;
92+ const startOffset = // Adjust `h1TagPattern` match index to the full source code.
93+ match . index + node . position . start . offset ;
94+ const endOffset = startOffset + match [ 0 ] . length ;
12895
12996 context . report ( {
13097 loc : {
131- start : {
132- line : startLine ,
133- column : startColumn ,
134- } ,
135- end : {
136- line : endLine ,
137- column : endColumn ,
138- } ,
98+ start : sourceCode . getLocFromIndex ( startOffset ) ,
99+ end : sourceCode . getLocFromIndex ( endOffset ) ,
139100 } ,
140101 messageId : "multipleH1" ,
141102 } ) ;
0 commit comments