@@ -56,23 +56,30 @@ export async function run(conf) {
56
56
/** @type {HTMLAnchorElement[] } */
57
57
const badLinks = [ ] ;
58
58
59
- const localLinkSelector =
60
- "a[data-cite=''], a:not([href]):not([data-cite]):not(.logo):not(.externalDFN)" ;
61
- document . querySelectorAll ( localLinkSelector ) . forEach ( (
62
- /** @type { HTMLAnchorElement } */ anchor
63
- ) => {
59
+ /** @type { NodeListOf<HTMLAnchorElement> } */
60
+ const localAnchors = document . querySelectorAll (
61
+ "a[data-cite=''], a:not([href]):not([data-cite]):not(.logo):not(.externalDFN)"
62
+ ) ;
63
+ for ( const anchor of localAnchors ) {
64
64
const linkTargets = getLinkTargets ( anchor ) ;
65
- const foundDfn = linkTargets . some ( target => {
66
- return findLinkTarget ( target , anchor , titleToDfns ) ;
67
- } ) ;
68
- if ( ! foundDfn && linkTargets . length !== 0 ) {
65
+ const linkTarget = linkTargets . find (
66
+ target =>
67
+ titleToDfns . has ( target . title ) &&
68
+ titleToDfns . get ( target . title ) . has ( target . for )
69
+ ) ;
70
+ if ( linkTarget ) {
71
+ const foundLocalMatch = processAnchor ( anchor , linkTarget , titleToDfns ) ;
72
+ if ( ! foundLocalMatch ) {
73
+ possibleExternalLinks . push ( anchor ) ;
74
+ }
75
+ } else {
69
76
if ( anchor . dataset . cite === "" ) {
70
77
badLinks . push ( anchor ) ;
71
78
} else {
72
79
possibleExternalLinks . push ( anchor ) ;
73
80
}
74
81
}
75
- } ) ;
82
+ }
76
83
77
84
showLinkingError ( badLinks ) ;
78
85
@@ -86,6 +93,7 @@ export async function run(conf) {
86
93
}
87
94
88
95
function mapTitleToDfns ( ) {
96
+ /** @type {CaseInsensitiveMap<Map<string, HTMLElement>> } */
89
97
const titleToDfns = new CaseInsensitiveMap ( ) ;
90
98
for ( const key of definitionMap . keys ( ) ) {
91
99
const { result, duplicates } = collectDfns ( key ) ;
@@ -128,43 +136,36 @@ function collectDfns(title) {
128
136
}
129
137
130
138
/**
131
- * @param {import("./utils.js").LinkTarget } target
132
139
* @param {HTMLAnchorElement } anchor
133
- * @param {CaseInsensitiveMap } titleToDfns
140
+ * @param {import("./utils.js").LinkTarget } target
141
+ * @param {ReturnType<typeof mapTitleToDfns> } titleToDfns
134
142
*/
135
- function findLinkTarget ( target , anchor , titleToDfns ) {
143
+ function processAnchor ( anchor , target , titleToDfns ) {
144
+ let noLocalMatch = false ;
136
145
const { linkFor } = anchor . dataset ;
137
- if (
138
- ! titleToDfns . has ( target . title ) ||
139
- ! titleToDfns . get ( target . title ) . get ( target . for )
140
- ) {
141
- return false ;
142
- }
143
146
const dfn = titleToDfns . get ( target . title ) . get ( target . for ) ;
144
147
if ( dfn . dataset . cite ) {
145
148
anchor . dataset . cite = dfn . dataset . cite ;
146
149
} else if ( linkFor && ! titleToDfns . get ( linkFor ) ) {
147
- possibleExternalLinks . push ( anchor ) ;
150
+ noLocalMatch = true ;
148
151
} else if ( dfn . classList . contains ( "externalDFN" ) ) {
149
152
// data-lt[0] serves as unique id for the dfn which this element references
150
153
const lt = dfn . dataset . lt ? dfn . dataset . lt . split ( "|" ) : [ ] ;
151
154
anchor . dataset . lt = lt [ 0 ] || dfn . textContent ;
152
- possibleExternalLinks . push ( anchor ) ;
155
+ noLocalMatch = true ;
156
+ } else if ( anchor . dataset . idl !== "partial" ) {
157
+ anchor . href = `#${ dfn . id } ` ;
158
+ anchor . classList . add ( "internalDFN" ) ;
153
159
} else {
154
- if ( anchor . dataset . idl === "partial" ) {
155
- possibleExternalLinks . push ( anchor ) ;
156
- } else {
157
- anchor . href = `#${ dfn . id } ` ;
158
- anchor . classList . add ( "internalDFN" ) ;
159
- }
160
+ noLocalMatch = true ;
160
161
}
161
162
if ( ! anchor . hasAttribute ( "data-link-type" ) ) {
162
163
anchor . dataset . linkType = "idl" in dfn . dataset ? "idl" : "dfn" ;
163
164
}
164
165
if ( isCode ( dfn ) ) {
165
166
wrapAsCode ( anchor , dfn ) ;
166
167
}
167
- return true ;
168
+ return ! noLocalMatch ;
168
169
}
169
170
170
171
/**
0 commit comments