@mz1999/defuddle 0.14.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/LICENSE +21 -0
- package/README.md +371 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +145 -0
- package/dist/cli.js.map +1 -0
- package/dist/constants.d.ts +24 -0
- package/dist/constants.js +950 -0
- package/dist/constants.js.map +1 -0
- package/dist/defuddle.d.ts +136 -0
- package/dist/defuddle.js +1816 -0
- package/dist/defuddle.js.map +1 -0
- package/dist/elements/callouts.d.ts +6 -0
- package/dist/elements/callouts.js +74 -0
- package/dist/elements/callouts.js.map +1 -0
- package/dist/elements/code.d.ts +5 -0
- package/dist/elements/code.js +346 -0
- package/dist/elements/code.js.map +1 -0
- package/dist/elements/footnotes.d.ts +5 -0
- package/dist/elements/footnotes.js +619 -0
- package/dist/elements/footnotes.js.map +1 -0
- package/dist/elements/headings.d.ts +11 -0
- package/dist/elements/headings.js +100 -0
- package/dist/elements/headings.js.map +1 -0
- package/dist/elements/images.d.ts +8 -0
- package/dist/elements/images.js +877 -0
- package/dist/elements/images.js.map +1 -0
- package/dist/elements/math.base.d.ts +9 -0
- package/dist/elements/math.base.js +195 -0
- package/dist/elements/math.base.js.map +1 -0
- package/dist/elements/math.core.d.ts +7 -0
- package/dist/elements/math.core.js +52 -0
- package/dist/elements/math.core.js.map +1 -0
- package/dist/elements/math.d.ts +2 -0
- package/dist/elements/math.full.d.ts +8 -0
- package/dist/elements/math.js +7 -0
- package/dist/elements/math.js.map +1 -0
- package/dist/extractor-registry.d.ts +16 -0
- package/dist/extractor-registry.js +140 -0
- package/dist/extractor-registry.js.map +1 -0
- package/dist/extractors/_base.d.ts +22 -0
- package/dist/extractors/_base.js +27 -0
- package/dist/extractors/_base.js.map +1 -0
- package/dist/extractors/_conversation.d.ts +9 -0
- package/dist/extractors/_conversation.js +78 -0
- package/dist/extractors/_conversation.js.map +1 -0
- package/dist/extractors/chatgpt.d.ts +14 -0
- package/dist/extractors/chatgpt.js +138 -0
- package/dist/extractors/chatgpt.js.map +1 -0
- package/dist/extractors/claude.d.ts +10 -0
- package/dist/extractors/claude.js +91 -0
- package/dist/extractors/claude.js.map +1 -0
- package/dist/extractors/gemini.d.ts +14 -0
- package/dist/extractors/gemini.js +111 -0
- package/dist/extractors/gemini.js.map +1 -0
- package/dist/extractors/github.d.ts +20 -0
- package/dist/extractors/github.js +251 -0
- package/dist/extractors/github.js.map +1 -0
- package/dist/extractors/grok.d.ts +15 -0
- package/dist/extractors/grok.js +142 -0
- package/dist/extractors/grok.js.map +1 -0
- package/dist/extractors/hackernews.d.ts +21 -0
- package/dist/extractors/hackernews.js +155 -0
- package/dist/extractors/hackernews.js.map +1 -0
- package/dist/extractors/reddit.d.ts +22 -0
- package/dist/extractors/reddit.js +197 -0
- package/dist/extractors/reddit.js.map +1 -0
- package/dist/extractors/twitter.d.ts +16 -0
- package/dist/extractors/twitter.js +204 -0
- package/dist/extractors/twitter.js.map +1 -0
- package/dist/extractors/x-article.d.ts +24 -0
- package/dist/extractors/x-article.js +267 -0
- package/dist/extractors/x-article.js.map +1 -0
- package/dist/extractors/x-oembed.d.ts +20 -0
- package/dist/extractors/x-oembed.js +350 -0
- package/dist/extractors/x-oembed.js.map +1 -0
- package/dist/extractors/youtube.d.ts +87 -0
- package/dist/extractors/youtube.js +869 -0
- package/dist/extractors/youtube.js.map +1 -0
- package/dist/fetch.d.ts +18 -0
- package/dist/fetch.js +265 -0
- package/dist/fetch.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.full.d.ts +12 -0
- package/dist/index.full.js +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -0
- package/dist/markdown.d.ts +30 -0
- package/dist/markdown.js +661 -0
- package/dist/markdown.js.map +1 -0
- package/dist/metadata.d.ts +25 -0
- package/dist/metadata.js +426 -0
- package/dist/metadata.js.map +1 -0
- package/dist/node.d.ts +19 -0
- package/dist/node.js +78 -0
- package/dist/node.js.map +1 -0
- package/dist/scoring.d.ts +31 -0
- package/dist/scoring.js +472 -0
- package/dist/scoring.js.map +1 -0
- package/dist/standardize.d.ts +2 -0
- package/dist/standardize.js +1101 -0
- package/dist/standardize.js.map +1 -0
- package/dist/types/extractors.d.ts +41 -0
- package/dist/types/extractors.js +3 -0
- package/dist/types/extractors.js.map +1 -0
- package/dist/types.d.ts +135 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/comments.d.ts +44 -0
- package/dist/utils/comments.js +103 -0
- package/dist/utils/comments.js.map +1 -0
- package/dist/utils/dom.d.ts +42 -0
- package/dist/utils/dom.js +104 -0
- package/dist/utils/dom.js.map +1 -0
- package/dist/utils/linkedom-compat.d.ts +5 -0
- package/dist/utils/linkedom-compat.js +23 -0
- package/dist/utils/linkedom-compat.js.map +1 -0
- package/dist/utils/transcript.d.ts +37 -0
- package/dist/utils/transcript.js +61 -0
- package/dist/utils/transcript.js.map +1 -0
- package/dist/utils.d.ts +13 -0
- package/dist/utils.js +98 -0
- package/dist/utils.js.map +1 -0
- package/package.json +107 -0
|
@@ -0,0 +1,619 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.standardizeFootnotes = standardizeFootnotes;
|
|
4
|
+
const constants_1 = require("../constants");
|
|
5
|
+
const dom_1 = require("../utils/dom");
|
|
6
|
+
class FootnoteHandler {
|
|
7
|
+
constructor(doc) {
|
|
8
|
+
this.genericContainer = null;
|
|
9
|
+
this.doc = doc;
|
|
10
|
+
}
|
|
11
|
+
createFootnoteItem(footnoteNumber, content, refs) {
|
|
12
|
+
const doc = typeof content === 'string' ? this.doc : content.ownerDocument;
|
|
13
|
+
const newItem = doc.createElement('li');
|
|
14
|
+
newItem.className = 'footnote';
|
|
15
|
+
newItem.id = `fn:${footnoteNumber}`;
|
|
16
|
+
// Handle content
|
|
17
|
+
if (typeof content === 'string') {
|
|
18
|
+
const paragraph = doc.createElement('p');
|
|
19
|
+
paragraph.appendChild((0, dom_1.parseHTML)(doc, content));
|
|
20
|
+
newItem.appendChild(paragraph);
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
// Get all paragraphs from the content
|
|
24
|
+
const paragraphs = Array.from(content.querySelectorAll('p'));
|
|
25
|
+
if (paragraphs.length === 0) {
|
|
26
|
+
// If no paragraphs, wrap content in a paragraph
|
|
27
|
+
const paragraph = doc.createElement('p');
|
|
28
|
+
(0, dom_1.transferContent)(content, paragraph);
|
|
29
|
+
this.removeBackrefs(paragraph);
|
|
30
|
+
newItem.appendChild(paragraph);
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
// Copy existing paragraphs
|
|
34
|
+
paragraphs.forEach((p) => {
|
|
35
|
+
const newP = doc.createElement('p');
|
|
36
|
+
(0, dom_1.transferContent)(p, newP);
|
|
37
|
+
this.removeBackrefs(newP);
|
|
38
|
+
newItem.appendChild(newP);
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
// Add backlink(s) to the last paragraph
|
|
43
|
+
const lastParagraph = newItem.querySelector('p:last-of-type') || newItem;
|
|
44
|
+
refs.forEach((refId, index) => {
|
|
45
|
+
const backlink = doc.createElement('a');
|
|
46
|
+
backlink.href = `#${refId}`;
|
|
47
|
+
backlink.title = 'return to article';
|
|
48
|
+
backlink.className = 'footnote-backref';
|
|
49
|
+
backlink.textContent = '↩';
|
|
50
|
+
if (index < refs.length - 1) {
|
|
51
|
+
backlink.textContent += ' ';
|
|
52
|
+
}
|
|
53
|
+
lastParagraph.appendChild(backlink);
|
|
54
|
+
});
|
|
55
|
+
return newItem;
|
|
56
|
+
}
|
|
57
|
+
collectFootnotes(element) {
|
|
58
|
+
const footnotes = {};
|
|
59
|
+
let footnoteCount = 1;
|
|
60
|
+
const processedIds = new Set(); // Track processed IDs
|
|
61
|
+
// Collect all footnotes and their IDs from footnote lists
|
|
62
|
+
const footnoteLists = element.querySelectorAll(constants_1.FOOTNOTE_LIST_SELECTORS);
|
|
63
|
+
footnoteLists.forEach((list) => {
|
|
64
|
+
// Wikidot uses div.footnotes-footer containing div.footnote-footer children
|
|
65
|
+
if (list.matches('div.footnotes-footer')) {
|
|
66
|
+
const footnoteDivs = list.querySelectorAll('div.footnote-footer');
|
|
67
|
+
footnoteDivs.forEach((div) => {
|
|
68
|
+
const divId = div.id || '';
|
|
69
|
+
const match = divId.match(/^footnote-(\d+)$/);
|
|
70
|
+
if (match) {
|
|
71
|
+
const id = match[1];
|
|
72
|
+
if (!processedIds.has(id)) {
|
|
73
|
+
// Clone the div to avoid modifying the original DOM
|
|
74
|
+
const clone = div.cloneNode(true);
|
|
75
|
+
// Remove the back-link anchor
|
|
76
|
+
const backLink = clone.querySelector('a');
|
|
77
|
+
if (backLink)
|
|
78
|
+
backLink.remove();
|
|
79
|
+
// Get remaining text and strip leading ". "
|
|
80
|
+
let text = (0, dom_1.serializeHTML)(clone);
|
|
81
|
+
text = text.replace(/^\s*\.\s*/, '');
|
|
82
|
+
const contentDiv = element.ownerDocument.createElement('div');
|
|
83
|
+
contentDiv.appendChild((0, dom_1.parseHTML)(element.ownerDocument, text.trim()));
|
|
84
|
+
footnotes[footnoteCount] = {
|
|
85
|
+
content: contentDiv,
|
|
86
|
+
originalId: id,
|
|
87
|
+
refs: []
|
|
88
|
+
};
|
|
89
|
+
processedIds.add(id);
|
|
90
|
+
footnoteCount++;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
// Substack has individual footnote divs with no parent
|
|
97
|
+
if (list.matches('div.footnote[data-component-name="FootnoteToDOM"]')) {
|
|
98
|
+
const anchor = list.querySelector('a.footnote-number');
|
|
99
|
+
const content = list.querySelector('.footnote-content');
|
|
100
|
+
if (anchor && content) {
|
|
101
|
+
const id = anchor.id.replace('footnote-', '').toLowerCase();
|
|
102
|
+
if (id && !processedIds.has(id)) {
|
|
103
|
+
footnotes[footnoteCount] = {
|
|
104
|
+
content: content,
|
|
105
|
+
originalId: id,
|
|
106
|
+
refs: []
|
|
107
|
+
};
|
|
108
|
+
processedIds.add(id);
|
|
109
|
+
footnoteCount++;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
// Common format using OL/UL and LI elements
|
|
115
|
+
const items = list.querySelectorAll('li, div[role="listitem"]');
|
|
116
|
+
items.forEach((li) => {
|
|
117
|
+
let id = '';
|
|
118
|
+
let content = null;
|
|
119
|
+
// Handle citations with .citations class
|
|
120
|
+
const citationsDiv = li.querySelector('.citations');
|
|
121
|
+
if (citationsDiv?.id?.toLowerCase().startsWith('r')) {
|
|
122
|
+
id = citationsDiv.id.toLowerCase();
|
|
123
|
+
// Look for citation content within the citations div
|
|
124
|
+
const citationContent = citationsDiv.querySelector('.citation-content');
|
|
125
|
+
if (citationContent) {
|
|
126
|
+
content = citationContent;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
// Extract ID from various formats
|
|
131
|
+
if (li.id.toLowerCase().startsWith('bib.bib')) {
|
|
132
|
+
id = li.id.replace('bib.bib', '').toLowerCase();
|
|
133
|
+
}
|
|
134
|
+
else if (li.id.toLowerCase().startsWith('fn:')) {
|
|
135
|
+
id = li.id.replace('fn:', '').toLowerCase();
|
|
136
|
+
}
|
|
137
|
+
else if (li.id.toLowerCase().startsWith('fn')) {
|
|
138
|
+
id = li.id.replace('fn', '').toLowerCase();
|
|
139
|
+
// Nature.com
|
|
140
|
+
}
|
|
141
|
+
else if (li.hasAttribute('data-counter')) {
|
|
142
|
+
id = li.getAttribute('data-counter')?.replace(/\.$/, '')?.toLowerCase() || '';
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
const match = li.id.split('/').pop()?.match(/cite_note-(.+)/);
|
|
146
|
+
id = match ? match[1].toLowerCase() : li.id.toLowerCase();
|
|
147
|
+
}
|
|
148
|
+
content = li;
|
|
149
|
+
}
|
|
150
|
+
if (id && !processedIds.has(id)) {
|
|
151
|
+
footnotes[footnoteCount] = {
|
|
152
|
+
content: content || li,
|
|
153
|
+
originalId: id,
|
|
154
|
+
refs: []
|
|
155
|
+
};
|
|
156
|
+
processedIds.add(id);
|
|
157
|
+
footnoteCount++;
|
|
158
|
+
}
|
|
159
|
+
});
|
|
160
|
+
});
|
|
161
|
+
// Generic fallback: if no footnotes found via selectors, try ID-based detection
|
|
162
|
+
if (footnoteCount === 1) {
|
|
163
|
+
// Step 1: Find all in-text anchors linking to fragment IDs with short numeric text
|
|
164
|
+
const candidateRefs = new Map(); // fragment -> [anchor elements]
|
|
165
|
+
const allAnchors = element.querySelectorAll('a[href*="#"]');
|
|
166
|
+
allAnchors.forEach((a) => {
|
|
167
|
+
const href = a.getAttribute('href') || '';
|
|
168
|
+
const fragment = href.split('#').pop()?.toLowerCase();
|
|
169
|
+
if (!fragment)
|
|
170
|
+
return;
|
|
171
|
+
const text = a.textContent?.trim() || '';
|
|
172
|
+
if (!/^\[?\(?\d{1,4}\)?\]?$/.test(text))
|
|
173
|
+
return;
|
|
174
|
+
// Must be inside a sup or span to look like a footnote ref
|
|
175
|
+
const parent = a.parentElement;
|
|
176
|
+
if (!parent)
|
|
177
|
+
return;
|
|
178
|
+
const parentTag = parent.tagName.toLowerCase();
|
|
179
|
+
if (parentTag !== 'sup' && parentTag !== 'span' && a.tagName.toLowerCase() !== 'a')
|
|
180
|
+
return;
|
|
181
|
+
if (!candidateRefs.has(fragment)) {
|
|
182
|
+
candidateRefs.set(fragment, []);
|
|
183
|
+
}
|
|
184
|
+
candidateRefs.get(fragment).push(a);
|
|
185
|
+
});
|
|
186
|
+
if (candidateRefs.size >= 2) {
|
|
187
|
+
// Step 2: Find a container where multiple children have IDs matching our fragments
|
|
188
|
+
const fragmentSet = new Set(candidateRefs.keys());
|
|
189
|
+
const containers = element.querySelectorAll('div, section, aside, footer');
|
|
190
|
+
let bestContainer = null;
|
|
191
|
+
let bestMatchCount = 0;
|
|
192
|
+
containers.forEach((container) => {
|
|
193
|
+
// Skip containers that are the main content element itself
|
|
194
|
+
if (container === element)
|
|
195
|
+
return;
|
|
196
|
+
const children = container.querySelectorAll('p[id], li[id], div[id]');
|
|
197
|
+
let matchCount = 0;
|
|
198
|
+
children.forEach((child) => {
|
|
199
|
+
if (fragmentSet.has(child.id.toLowerCase())) {
|
|
200
|
+
matchCount++;
|
|
201
|
+
}
|
|
202
|
+
});
|
|
203
|
+
if (matchCount >= 2 && matchCount >= bestMatchCount) {
|
|
204
|
+
bestMatchCount = matchCount;
|
|
205
|
+
bestContainer = container;
|
|
206
|
+
}
|
|
207
|
+
});
|
|
208
|
+
if (bestContainer) {
|
|
209
|
+
// Step 3: Extract footnotes from the container
|
|
210
|
+
const idElements = bestContainer.querySelectorAll('p[id], li[id], div[id]');
|
|
211
|
+
const orderedElements = [];
|
|
212
|
+
idElements.forEach((el) => {
|
|
213
|
+
if (fragmentSet.has(el.id.toLowerCase())) {
|
|
214
|
+
orderedElements.push(el);
|
|
215
|
+
}
|
|
216
|
+
});
|
|
217
|
+
// Step 4: Handle multi-paragraph footnotes (group consecutive non-ID elements)
|
|
218
|
+
orderedElements.forEach((el) => {
|
|
219
|
+
const id = el.id.toLowerCase();
|
|
220
|
+
if (processedIds.has(id))
|
|
221
|
+
return;
|
|
222
|
+
const contentDiv = element.ownerDocument.createElement('div');
|
|
223
|
+
// Clone the element content
|
|
224
|
+
const clone = el.cloneNode(true);
|
|
225
|
+
// Strip leading footnote number (e.g. "1. " or "1 ")
|
|
226
|
+
const firstText = clone.childNodes[0];
|
|
227
|
+
if (firstText && firstText.nodeType === 3) {
|
|
228
|
+
firstText.textContent = firstText.textContent.replace(/^\d+\.\s*/, '');
|
|
229
|
+
}
|
|
230
|
+
contentDiv.appendChild(clone);
|
|
231
|
+
// Check for consecutive siblings without IDs (multi-paragraph footnotes)
|
|
232
|
+
let sibling = el.nextElementSibling;
|
|
233
|
+
while (sibling && !sibling.id) {
|
|
234
|
+
const sibClone = sibling.cloneNode(true);
|
|
235
|
+
contentDiv.appendChild(sibClone);
|
|
236
|
+
sibling = sibling.nextElementSibling;
|
|
237
|
+
}
|
|
238
|
+
footnotes[footnoteCount] = {
|
|
239
|
+
content: contentDiv,
|
|
240
|
+
originalId: id,
|
|
241
|
+
refs: []
|
|
242
|
+
};
|
|
243
|
+
processedIds.add(id);
|
|
244
|
+
footnoteCount++;
|
|
245
|
+
});
|
|
246
|
+
// Step 5: Store container for later removal
|
|
247
|
+
this.genericContainer = bestContainer;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
return footnotes;
|
|
252
|
+
}
|
|
253
|
+
removeBackrefs(el) {
|
|
254
|
+
el.querySelectorAll('a').forEach((a) => {
|
|
255
|
+
const text = a.textContent?.trim().replace(/\uFE0E|\uFE0F/g, '') || '';
|
|
256
|
+
if (/^[\u21A9\u21A5\u2191\u21B5\u2934\u2935\u23CE]+$/.test(text) || a.classList?.contains('footnote-backref')) {
|
|
257
|
+
a.remove();
|
|
258
|
+
}
|
|
259
|
+
});
|
|
260
|
+
// Clean up trailing text nodes that are only whitespace/punctuation
|
|
261
|
+
// (remnants from around removed backref links, e.g. " ." or " , .")
|
|
262
|
+
while (el.lastChild && el.lastChild.nodeType === 3) {
|
|
263
|
+
const text = el.lastChild.textContent;
|
|
264
|
+
if (/^[\s,.;]*$/.test(text)) {
|
|
265
|
+
el.lastChild.remove();
|
|
266
|
+
}
|
|
267
|
+
else {
|
|
268
|
+
break;
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
findOuterFootnoteContainer(el) {
|
|
273
|
+
let current = el;
|
|
274
|
+
let parent = el.parentElement;
|
|
275
|
+
// Keep going up until we find an element that's not a span or sup
|
|
276
|
+
while (parent && (parent.tagName.toLowerCase() === 'span' ||
|
|
277
|
+
parent.tagName.toLowerCase() === 'sup')) {
|
|
278
|
+
current = parent;
|
|
279
|
+
parent = parent.parentElement;
|
|
280
|
+
}
|
|
281
|
+
return current;
|
|
282
|
+
}
|
|
283
|
+
// Every footnote reference should be a sup element with an anchor inside
|
|
284
|
+
// e.g. <sup id="fnref:1"><a href="#fn:1">1</a></sup>
|
|
285
|
+
createFootnoteReference(footnoteNumber, refId) {
|
|
286
|
+
const sup = this.doc.createElement('sup');
|
|
287
|
+
sup.id = refId;
|
|
288
|
+
const link = this.doc.createElement('a');
|
|
289
|
+
link.href = `#fn:${footnoteNumber}`;
|
|
290
|
+
link.textContent = footnoteNumber;
|
|
291
|
+
sup.appendChild(link);
|
|
292
|
+
return sup;
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Handle CSS sidenote footnotes where content is embedded inline in the text.
|
|
296
|
+
* Pattern: <span class="footnote-container">
|
|
297
|
+
* <label class="footnote-number"></label>
|
|
298
|
+
* <input class="margin-toggle">
|
|
299
|
+
* <span class="footnote">Content...</span>
|
|
300
|
+
* </span>
|
|
301
|
+
*/
|
|
302
|
+
collectInlineSidenotes(element) {
|
|
303
|
+
const footnotes = {};
|
|
304
|
+
const containers = element.querySelectorAll('span.footnote-container, span.sidenote-container');
|
|
305
|
+
if (containers.length === 0)
|
|
306
|
+
return footnotes;
|
|
307
|
+
let footnoteCount = 1;
|
|
308
|
+
containers.forEach((container) => {
|
|
309
|
+
const content = container.querySelector('span.footnote, span.sidenote');
|
|
310
|
+
if (!content)
|
|
311
|
+
return;
|
|
312
|
+
// Clone content so we can manipulate it without affecting the DOM
|
|
313
|
+
const contentClone = content.cloneNode(true);
|
|
314
|
+
footnotes[footnoteCount] = {
|
|
315
|
+
content: contentClone,
|
|
316
|
+
originalId: String(footnoteCount),
|
|
317
|
+
refs: [`fnref:${footnoteCount}`]
|
|
318
|
+
};
|
|
319
|
+
// Replace the container with a standard footnote reference
|
|
320
|
+
const ref = this.createFootnoteReference(String(footnoteCount), `fnref:${footnoteCount}`);
|
|
321
|
+
container.replaceWith(ref);
|
|
322
|
+
footnoteCount++;
|
|
323
|
+
});
|
|
324
|
+
return footnotes;
|
|
325
|
+
}
|
|
326
|
+
standardizeFootnotes(element) {
|
|
327
|
+
// Handle CSS sidenote footnotes first
|
|
328
|
+
const sidenotes = this.collectInlineSidenotes(element);
|
|
329
|
+
const footnotes = this.collectFootnotes(element);
|
|
330
|
+
// Standardize inline footnotes using the collected IDs
|
|
331
|
+
const footnoteInlineReferences = element.querySelectorAll(constants_1.FOOTNOTE_INLINE_REFERENCES);
|
|
332
|
+
// Group references by their parent sup element
|
|
333
|
+
const supGroups = new Map();
|
|
334
|
+
footnoteInlineReferences.forEach((el) => {
|
|
335
|
+
if (!el || !el.parentNode)
|
|
336
|
+
return;
|
|
337
|
+
let footnoteId = '';
|
|
338
|
+
let footnoteContent = '';
|
|
339
|
+
// Extract footnote ID based on element type
|
|
340
|
+
// Wikidot: <sup class="footnoteref"><a id="footnoteref-N" href="javascript:;">N</a></sup>
|
|
341
|
+
if (el.matches('sup.footnoteref')) {
|
|
342
|
+
const link = el.querySelector('a[id^="footnoteref-"]');
|
|
343
|
+
if (link) {
|
|
344
|
+
const linkId = link.id || '';
|
|
345
|
+
const match = linkId.match(/^footnoteref-(\d+)$/);
|
|
346
|
+
if (match) {
|
|
347
|
+
footnoteId = match[1];
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
// Nature.com
|
|
351
|
+
}
|
|
352
|
+
else if (el.matches('a[id^="ref-link"]')) {
|
|
353
|
+
footnoteId = el.textContent?.trim() || '';
|
|
354
|
+
// Science.org
|
|
355
|
+
}
|
|
356
|
+
else if (el.matches('a[role="doc-biblioref"]')) {
|
|
357
|
+
const xmlRid = el.getAttribute('data-xml-rid');
|
|
358
|
+
if (xmlRid) {
|
|
359
|
+
footnoteId = xmlRid;
|
|
360
|
+
}
|
|
361
|
+
else {
|
|
362
|
+
const href = el.getAttribute('href');
|
|
363
|
+
if (href?.startsWith('#core-R')) {
|
|
364
|
+
footnoteId = href.replace('#core-', '');
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
// Substack
|
|
368
|
+
}
|
|
369
|
+
else if (el.matches('a.footnote-anchor, span.footnote-hovercard-target a')) {
|
|
370
|
+
const id = el.id?.replace('footnote-anchor-', '') || '';
|
|
371
|
+
if (id) {
|
|
372
|
+
footnoteId = id.toLowerCase();
|
|
373
|
+
}
|
|
374
|
+
// Arxiv — handle multi-citation groups (e.g. [35, 2, 5])
|
|
375
|
+
}
|
|
376
|
+
else if (el.matches('cite.ltx_cite')) {
|
|
377
|
+
const links = Array.from(el.querySelectorAll('a'));
|
|
378
|
+
if (links.length > 0) {
|
|
379
|
+
// Process all links in the citation group
|
|
380
|
+
const refs = [];
|
|
381
|
+
links.forEach((link) => {
|
|
382
|
+
const href = link.getAttribute('href');
|
|
383
|
+
if (!href)
|
|
384
|
+
return;
|
|
385
|
+
const match = href.split('/').pop()?.match(/bib\.bib(\d+)/);
|
|
386
|
+
if (!match)
|
|
387
|
+
return;
|
|
388
|
+
const citationId = match[1].toLowerCase();
|
|
389
|
+
const entry = Object.entries(footnotes).find(([_, data]) => data.originalId === citationId);
|
|
390
|
+
if (!entry)
|
|
391
|
+
return;
|
|
392
|
+
const [fnNum, fnData] = entry;
|
|
393
|
+
const refId = fnData.refs.length > 0
|
|
394
|
+
? `fnref:${fnNum}-${fnData.refs.length + 1}`
|
|
395
|
+
: `fnref:${fnNum}`;
|
|
396
|
+
fnData.refs.push(refId);
|
|
397
|
+
refs.push(this.createFootnoteReference(fnNum, refId));
|
|
398
|
+
});
|
|
399
|
+
if (refs.length > 0) {
|
|
400
|
+
const container = this.findOuterFootnoteContainer(el);
|
|
401
|
+
const fragment = el.ownerDocument.createDocumentFragment();
|
|
402
|
+
refs.forEach((ref, i) => {
|
|
403
|
+
if (i > 0) {
|
|
404
|
+
fragment.appendChild(el.ownerDocument.createTextNode(' '));
|
|
405
|
+
}
|
|
406
|
+
fragment.appendChild(ref);
|
|
407
|
+
});
|
|
408
|
+
container.replaceWith(fragment);
|
|
409
|
+
// Skip the default single-footnote handling below
|
|
410
|
+
return;
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
else if (el.matches('sup.reference')) {
|
|
415
|
+
const links = el.querySelectorAll('a');
|
|
416
|
+
Array.from(links).forEach((link) => {
|
|
417
|
+
const href = link.getAttribute('href');
|
|
418
|
+
if (href) {
|
|
419
|
+
const match = href.split('/').pop()?.match(/(?:cite_note|cite_ref)-(.+)/);
|
|
420
|
+
if (match) {
|
|
421
|
+
footnoteId = match[1].toLowerCase();
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
});
|
|
425
|
+
}
|
|
426
|
+
else if (el.matches('sup[id^="fnref:"]')) {
|
|
427
|
+
footnoteId = el.id.replace('fnref:', '').toLowerCase();
|
|
428
|
+
}
|
|
429
|
+
else if (el.matches('sup[id^="fnr"]')) {
|
|
430
|
+
footnoteId = el.id.replace('fnr', '').toLowerCase();
|
|
431
|
+
}
|
|
432
|
+
else if (el.matches('span.footnote-reference')) {
|
|
433
|
+
footnoteId = el.getAttribute('data-footnote-id') || '';
|
|
434
|
+
// LessWrong uses id="fnrefXXX" on the span
|
|
435
|
+
if (!footnoteId && el.id?.startsWith('fnref')) {
|
|
436
|
+
footnoteId = el.id.replace('fnref', '').toLowerCase();
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
else if (el.matches('span.footnote-link')) {
|
|
440
|
+
footnoteId = el.getAttribute('data-footnote-id') || '';
|
|
441
|
+
footnoteContent = el.getAttribute('data-footnote-content') || '';
|
|
442
|
+
}
|
|
443
|
+
else if (el.matches('a.citation')) {
|
|
444
|
+
footnoteId = el.textContent?.trim() || '';
|
|
445
|
+
footnoteContent = el.getAttribute('href') || '';
|
|
446
|
+
}
|
|
447
|
+
else if (el.matches('a[id^="fnref"]')) {
|
|
448
|
+
footnoteId = el.id.replace('fnref', '').toLowerCase();
|
|
449
|
+
}
|
|
450
|
+
else {
|
|
451
|
+
// Other citation types
|
|
452
|
+
const href = el.getAttribute('href');
|
|
453
|
+
if (href) {
|
|
454
|
+
const id = href.replace(/^[#]/, '');
|
|
455
|
+
footnoteId = id.toLowerCase();
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
if (footnoteId) {
|
|
459
|
+
// Find the footnote number by matching the original ID
|
|
460
|
+
const footnoteEntry = Object.entries(footnotes).find(([_, data]) => data.originalId === footnoteId.toLowerCase());
|
|
461
|
+
if (footnoteEntry) {
|
|
462
|
+
const [footnoteNumber, footnoteData] = footnoteEntry;
|
|
463
|
+
// Create footnote reference ID
|
|
464
|
+
const refId = footnoteData.refs.length > 0 ?
|
|
465
|
+
`fnref:${footnoteNumber}-${footnoteData.refs.length + 1}` :
|
|
466
|
+
`fnref:${footnoteNumber}`;
|
|
467
|
+
footnoteData.refs.push(refId);
|
|
468
|
+
// Find the outermost container (span or sup)
|
|
469
|
+
const container = this.findOuterFootnoteContainer(el);
|
|
470
|
+
// If container is a sup, group references
|
|
471
|
+
if (container.tagName.toLowerCase() === 'sup') {
|
|
472
|
+
if (!supGroups.has(container)) {
|
|
473
|
+
supGroups.set(container, []);
|
|
474
|
+
}
|
|
475
|
+
const group = supGroups.get(container);
|
|
476
|
+
group.push(this.createFootnoteReference(footnoteNumber, refId));
|
|
477
|
+
}
|
|
478
|
+
else {
|
|
479
|
+
// Replace the container directly
|
|
480
|
+
container.replaceWith(this.createFootnoteReference(footnoteNumber, refId));
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
});
|
|
485
|
+
// Fallback: match remaining unmatched footnotes
|
|
486
|
+
const unmatchedFootnotes = Object.entries(footnotes).filter(([_, data]) => data.refs.length === 0);
|
|
487
|
+
if (unmatchedFootnotes.length > 0) {
|
|
488
|
+
// Build lookup maps
|
|
489
|
+
const footnoteIdMap = new Map();
|
|
490
|
+
const footnoteNumMap = new Map();
|
|
491
|
+
unmatchedFootnotes.forEach(([num, data]) => {
|
|
492
|
+
footnoteIdMap.set(data.originalId, [num, data]);
|
|
493
|
+
footnoteNumMap.set(num, [num, data]);
|
|
494
|
+
});
|
|
495
|
+
// Pass 1: Match by fragment link (e.g. <a href="#mn37note01">1</a>)
|
|
496
|
+
const allLinks = element.querySelectorAll('a[href*="#"]');
|
|
497
|
+
allLinks.forEach((link) => {
|
|
498
|
+
if (!link.parentNode)
|
|
499
|
+
return;
|
|
500
|
+
// Skip if already inside a standardized footnote ref
|
|
501
|
+
const closestFnref = link.closest('[id^="fnref:"]');
|
|
502
|
+
if (closestFnref)
|
|
503
|
+
return;
|
|
504
|
+
// Skip if inside the footnotes section itself
|
|
505
|
+
const closestFootnotes = link.closest('#footnotes');
|
|
506
|
+
if (closestFootnotes)
|
|
507
|
+
return;
|
|
508
|
+
// Skip if inside the generic container (footnote definitions)
|
|
509
|
+
if (this.genericContainer && this.genericContainer.contains(link))
|
|
510
|
+
return;
|
|
511
|
+
const href = link.getAttribute('href') || '';
|
|
512
|
+
const fragment = href.split('#').pop()?.toLowerCase();
|
|
513
|
+
if (!fragment)
|
|
514
|
+
return;
|
|
515
|
+
const entry = footnoteIdMap.get(fragment);
|
|
516
|
+
if (!entry)
|
|
517
|
+
return;
|
|
518
|
+
// Validate it looks like a footnote marker
|
|
519
|
+
const text = link.textContent?.trim() || '';
|
|
520
|
+
if (!/^[\[\(]?\d{1,4}[\]\)]?$/.test(text))
|
|
521
|
+
return;
|
|
522
|
+
const [footnoteNumber, footnoteData] = entry;
|
|
523
|
+
const refId = footnoteData.refs.length > 0
|
|
524
|
+
? `fnref:${footnoteNumber}-${footnoteData.refs.length + 1}`
|
|
525
|
+
: `fnref:${footnoteNumber}`;
|
|
526
|
+
footnoteData.refs.push(refId);
|
|
527
|
+
const container = this.findOuterFootnoteContainer(link);
|
|
528
|
+
container.replaceWith(this.createFootnoteReference(footnoteNumber, refId));
|
|
529
|
+
});
|
|
530
|
+
// Pass 2: Match sup/span elements with numeric text (e.g. <sup class="footnote-ref">1</sup>)
|
|
531
|
+
const stillUnmatched = Object.entries(footnotes).filter(([_, data]) => data.refs.length === 0);
|
|
532
|
+
if (stillUnmatched.length > 0) {
|
|
533
|
+
const supElements = element.querySelectorAll('sup, span.footnote-ref');
|
|
534
|
+
supElements.forEach((el) => {
|
|
535
|
+
if (!el.parentNode)
|
|
536
|
+
return;
|
|
537
|
+
// Skip if already standardized
|
|
538
|
+
if (el.id?.startsWith('fnref:'))
|
|
539
|
+
return;
|
|
540
|
+
// Skip if inside the footnotes section
|
|
541
|
+
if (el.closest('#footnotes'))
|
|
542
|
+
return;
|
|
543
|
+
const text = el.textContent?.trim() || '';
|
|
544
|
+
const match = text.match(/^[\[\(]?(\d{1,4})[\]\)]?$/);
|
|
545
|
+
if (!match)
|
|
546
|
+
return;
|
|
547
|
+
const num = match[1];
|
|
548
|
+
// Match against footnote number or originalId
|
|
549
|
+
const entry = footnoteNumMap.get(num) || footnoteIdMap.get(num);
|
|
550
|
+
if (!entry)
|
|
551
|
+
return;
|
|
552
|
+
const [footnoteNumber, footnoteData] = entry;
|
|
553
|
+
if (footnoteData.refs.length > 0)
|
|
554
|
+
return; // Already matched
|
|
555
|
+
const refId = `fnref:${footnoteNumber}`;
|
|
556
|
+
footnoteData.refs.push(refId);
|
|
557
|
+
const container = this.findOuterFootnoteContainer(el);
|
|
558
|
+
container.replaceWith(this.createFootnoteReference(footnoteNumber, refId));
|
|
559
|
+
});
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
// Handle grouped references
|
|
563
|
+
supGroups.forEach((references, container) => {
|
|
564
|
+
if (references.length > 0) {
|
|
565
|
+
// Create a document fragment to hold all the references
|
|
566
|
+
const fragment = this.doc.createDocumentFragment();
|
|
567
|
+
// Add each reference as its own sup element
|
|
568
|
+
references.forEach((ref) => {
|
|
569
|
+
const link = ref.querySelector('a');
|
|
570
|
+
if (link) {
|
|
571
|
+
const sup = this.doc.createElement('sup');
|
|
572
|
+
sup.id = ref.id;
|
|
573
|
+
sup.appendChild(link.cloneNode(true));
|
|
574
|
+
fragment.appendChild(sup);
|
|
575
|
+
}
|
|
576
|
+
});
|
|
577
|
+
container.replaceWith(fragment);
|
|
578
|
+
}
|
|
579
|
+
});
|
|
580
|
+
// Create the standardized footnote list
|
|
581
|
+
const newList = this.doc.createElement('div');
|
|
582
|
+
newList.id = 'footnotes';
|
|
583
|
+
const orderedList = this.doc.createElement('ol');
|
|
584
|
+
// Merge sidenotes and regular footnotes
|
|
585
|
+
const allFootnotes = { ...sidenotes, ...footnotes };
|
|
586
|
+
// Create footnote items in order
|
|
587
|
+
Object.entries(allFootnotes).forEach(([number, data]) => {
|
|
588
|
+
const newItem = this.createFootnoteItem(parseInt(number), data.content, data.refs);
|
|
589
|
+
orderedList.appendChild(newItem);
|
|
590
|
+
});
|
|
591
|
+
// Remove original footnote lists
|
|
592
|
+
const footnoteLists = element.querySelectorAll(constants_1.FOOTNOTE_LIST_SELECTORS);
|
|
593
|
+
footnoteLists.forEach((list) => list.remove());
|
|
594
|
+
// Remove generically-detected footnote container
|
|
595
|
+
if (this.genericContainer && this.genericContainer.parentNode) {
|
|
596
|
+
this.genericContainer.remove();
|
|
597
|
+
}
|
|
598
|
+
// If we have any footnotes, add the new list to the document
|
|
599
|
+
if (orderedList.children.length > 0) {
|
|
600
|
+
newList.appendChild(orderedList);
|
|
601
|
+
element.appendChild(newList);
|
|
602
|
+
}
|
|
603
|
+
}
|
|
604
|
+
}
|
|
605
|
+
/**
|
|
606
|
+
* Standardizes footnotes in the given element
|
|
607
|
+
* @param element The element to standardize footnotes in
|
|
608
|
+
*/
|
|
609
|
+
function standardizeFootnotes(element) {
|
|
610
|
+
// Get the document from the element's ownerDocument
|
|
611
|
+
const doc = element.ownerDocument;
|
|
612
|
+
if (!doc) {
|
|
613
|
+
console.warn('standardizeFootnotes: No document available');
|
|
614
|
+
return;
|
|
615
|
+
}
|
|
616
|
+
const handler = new FootnoteHandler(doc);
|
|
617
|
+
handler.standardizeFootnotes(element);
|
|
618
|
+
}
|
|
619
|
+
//# sourceMappingURL=footnotes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"footnotes.js","sourceRoot":"","sources":["../../src/elements/footnotes.ts"],"names":[],"mappings":"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"}
|