@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.
Files changed (123) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +371 -0
  3. package/dist/cli.d.ts +2 -0
  4. package/dist/cli.js +145 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/constants.d.ts +24 -0
  7. package/dist/constants.js +950 -0
  8. package/dist/constants.js.map +1 -0
  9. package/dist/defuddle.d.ts +136 -0
  10. package/dist/defuddle.js +1816 -0
  11. package/dist/defuddle.js.map +1 -0
  12. package/dist/elements/callouts.d.ts +6 -0
  13. package/dist/elements/callouts.js +74 -0
  14. package/dist/elements/callouts.js.map +1 -0
  15. package/dist/elements/code.d.ts +5 -0
  16. package/dist/elements/code.js +346 -0
  17. package/dist/elements/code.js.map +1 -0
  18. package/dist/elements/footnotes.d.ts +5 -0
  19. package/dist/elements/footnotes.js +619 -0
  20. package/dist/elements/footnotes.js.map +1 -0
  21. package/dist/elements/headings.d.ts +11 -0
  22. package/dist/elements/headings.js +100 -0
  23. package/dist/elements/headings.js.map +1 -0
  24. package/dist/elements/images.d.ts +8 -0
  25. package/dist/elements/images.js +877 -0
  26. package/dist/elements/images.js.map +1 -0
  27. package/dist/elements/math.base.d.ts +9 -0
  28. package/dist/elements/math.base.js +195 -0
  29. package/dist/elements/math.base.js.map +1 -0
  30. package/dist/elements/math.core.d.ts +7 -0
  31. package/dist/elements/math.core.js +52 -0
  32. package/dist/elements/math.core.js.map +1 -0
  33. package/dist/elements/math.d.ts +2 -0
  34. package/dist/elements/math.full.d.ts +8 -0
  35. package/dist/elements/math.js +7 -0
  36. package/dist/elements/math.js.map +1 -0
  37. package/dist/extractor-registry.d.ts +16 -0
  38. package/dist/extractor-registry.js +140 -0
  39. package/dist/extractor-registry.js.map +1 -0
  40. package/dist/extractors/_base.d.ts +22 -0
  41. package/dist/extractors/_base.js +27 -0
  42. package/dist/extractors/_base.js.map +1 -0
  43. package/dist/extractors/_conversation.d.ts +9 -0
  44. package/dist/extractors/_conversation.js +78 -0
  45. package/dist/extractors/_conversation.js.map +1 -0
  46. package/dist/extractors/chatgpt.d.ts +14 -0
  47. package/dist/extractors/chatgpt.js +138 -0
  48. package/dist/extractors/chatgpt.js.map +1 -0
  49. package/dist/extractors/claude.d.ts +10 -0
  50. package/dist/extractors/claude.js +91 -0
  51. package/dist/extractors/claude.js.map +1 -0
  52. package/dist/extractors/gemini.d.ts +14 -0
  53. package/dist/extractors/gemini.js +111 -0
  54. package/dist/extractors/gemini.js.map +1 -0
  55. package/dist/extractors/github.d.ts +20 -0
  56. package/dist/extractors/github.js +251 -0
  57. package/dist/extractors/github.js.map +1 -0
  58. package/dist/extractors/grok.d.ts +15 -0
  59. package/dist/extractors/grok.js +142 -0
  60. package/dist/extractors/grok.js.map +1 -0
  61. package/dist/extractors/hackernews.d.ts +21 -0
  62. package/dist/extractors/hackernews.js +155 -0
  63. package/dist/extractors/hackernews.js.map +1 -0
  64. package/dist/extractors/reddit.d.ts +22 -0
  65. package/dist/extractors/reddit.js +197 -0
  66. package/dist/extractors/reddit.js.map +1 -0
  67. package/dist/extractors/twitter.d.ts +16 -0
  68. package/dist/extractors/twitter.js +204 -0
  69. package/dist/extractors/twitter.js.map +1 -0
  70. package/dist/extractors/x-article.d.ts +24 -0
  71. package/dist/extractors/x-article.js +267 -0
  72. package/dist/extractors/x-article.js.map +1 -0
  73. package/dist/extractors/x-oembed.d.ts +20 -0
  74. package/dist/extractors/x-oembed.js +350 -0
  75. package/dist/extractors/x-oembed.js.map +1 -0
  76. package/dist/extractors/youtube.d.ts +87 -0
  77. package/dist/extractors/youtube.js +869 -0
  78. package/dist/extractors/youtube.js.map +1 -0
  79. package/dist/fetch.d.ts +18 -0
  80. package/dist/fetch.js +265 -0
  81. package/dist/fetch.js.map +1 -0
  82. package/dist/index.d.ts +3 -0
  83. package/dist/index.full.d.ts +12 -0
  84. package/dist/index.full.js +1 -0
  85. package/dist/index.js +1 -0
  86. package/dist/index.js.map +1 -0
  87. package/dist/markdown.d.ts +30 -0
  88. package/dist/markdown.js +661 -0
  89. package/dist/markdown.js.map +1 -0
  90. package/dist/metadata.d.ts +25 -0
  91. package/dist/metadata.js +426 -0
  92. package/dist/metadata.js.map +1 -0
  93. package/dist/node.d.ts +19 -0
  94. package/dist/node.js +78 -0
  95. package/dist/node.js.map +1 -0
  96. package/dist/scoring.d.ts +31 -0
  97. package/dist/scoring.js +472 -0
  98. package/dist/scoring.js.map +1 -0
  99. package/dist/standardize.d.ts +2 -0
  100. package/dist/standardize.js +1101 -0
  101. package/dist/standardize.js.map +1 -0
  102. package/dist/types/extractors.d.ts +41 -0
  103. package/dist/types/extractors.js +3 -0
  104. package/dist/types/extractors.js.map +1 -0
  105. package/dist/types.d.ts +135 -0
  106. package/dist/types.js +3 -0
  107. package/dist/types.js.map +1 -0
  108. package/dist/utils/comments.d.ts +44 -0
  109. package/dist/utils/comments.js +103 -0
  110. package/dist/utils/comments.js.map +1 -0
  111. package/dist/utils/dom.d.ts +42 -0
  112. package/dist/utils/dom.js +104 -0
  113. package/dist/utils/dom.js.map +1 -0
  114. package/dist/utils/linkedom-compat.d.ts +5 -0
  115. package/dist/utils/linkedom-compat.js +23 -0
  116. package/dist/utils/linkedom-compat.js.map +1 -0
  117. package/dist/utils/transcript.d.ts +37 -0
  118. package/dist/utils/transcript.js +61 -0
  119. package/dist/utils/transcript.js.map +1 -0
  120. package/dist/utils.d.ts +13 -0
  121. package/dist/utils.js +98 -0
  122. package/dist/utils.js.map +1 -0
  123. 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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"}