Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
116 changes: 62 additions & 54 deletions lib/helpers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -510,80 +510,88 @@
return { uniqueCitations, originalDocToUniqueDoc };
}

function toSuperscript(num: number, superscriptMap: string): string {
return String(num)
.split('')
.map((digit) => superscriptMap[Number(digit)])
.join('');
}

function buildLinkLine(
displayNum: number,
citation: { url: string; title: string; filepath: string },
superscriptMap: string,
): string {
const linkLabel = toSuperscript(displayNum, superscriptMap);
try {
const parsedUrl = JSON.parse(citation.url).join('\\n');
return ` • ${linkLabel} [${citation.title}](${citation.filepath})\\n- ${parsedUrl}\\n\\n`;
} catch {
try {
new URL(citation.url);
return ` • ${linkLabel} [${citation.title}](${citation.filepath})\\n- ${citation.url}\\n\\n`;
} catch {
try {
new URL(citation.filepath);
return ` • ${linkLabel} [${citation.title}](${citation.filepath})`;
} catch {
return '';
}
}
}
}

export function replaceDocs(
content: string,
context: { citations?: { url: string; title: string; filepath: string }[] },
): string {
if (!context?.citations) return content.replaceAll('\n', '\\n').replaceAll('"', '\"');

Check failure on line 548 in lib/helpers.ts

View workflow job for this annotation

GitHub Actions / lint / check

Unnecessary escape character: \"

const { uniqueCitations, originalDocToUniqueDoc } = getUniqueCitationsAndMapping(context.citations);

let replacedContent = content;

originalDocToUniqueDoc.forEach((uniqueDocIndex, originalDocNum) => {
const uniqueDocNum = uniqueDocIndex + 1;

if (uniqueDocNum !== originalDocNum) {
const originalKey = `[doc${originalDocNum}]`;
const uniqueKey = `[doc${uniqueDocNum}]`;

if (replacedContent.includes(originalKey)) {
replacedContent = replacedContent.replaceAll(originalKey, uniqueKey);
}
const appearanceOrder: number[] = [];
const seenUnique = new Set<number>();
const docRefRegex = /\[doc(\d+)\]/g;
let match: RegExpExecArray | null;
while ((match = docRefRegex.exec(content)) !== null) {
const originalDocNum = Number(match[1]);
const uniqueIndex = originalDocToUniqueDoc.get(originalDocNum);
if (uniqueIndex === undefined) continue;
if (!seenUnique.has(uniqueIndex)) {
seenUnique.add(uniqueIndex);
appearanceOrder.push(uniqueIndex);
}
}

const uniqueIndexToDisplayNum = new Map<number, number>();
appearanceOrder.forEach((uniqueIndex, i) => {
uniqueIndexToDisplayNum.set(uniqueIndex, i + 1);
});

const links: string[] = [];
const superscriptMap = '⁰¹²³⁴⁵⁶⁷⁸⁹';
let replacedContent = content;

uniqueCitations.forEach((uniqueItem, uniqueIndex) => {
const uniqueDocNum = uniqueIndex + 1;
const docKey = `[doc${uniqueDocNum}]`;

originalDocToUniqueDoc.forEach((uniqueIndex, originalDocNum) => {
const displayNum = uniqueIndexToDisplayNum.get(uniqueIndex);
if (displayNum === undefined) return;
const docKey = `[doc${originalDocNum}]`;
const linkLabel = toSuperscript(displayNum, superscriptMap);
if (replacedContent.includes(docKey)) {
try {
const parsedUrl = JSON.parse(uniqueItem.citation.url).join('\\n');
let linkLabel = String(uniqueDocNum)
.split('')
.map((digit) => superscriptMap[Number(digit)])
.join('');
replacedContent = replacedContent.replaceAll(docKey, `⁽${linkLabel}⁾`);
links.push(
` • ${linkLabel} [${uniqueItem.citation.title}](${uniqueItem.citation.filepath})\\n- ${parsedUrl}\\n\\n`,
);
} catch (error) {
console.error('Error parsing URL as JSON array:', error);
try {
new URL(uniqueItem.citation.url);
let linkLabel = String(uniqueDocNum)
.split('')
.map((digit) => superscriptMap[Number(digit)])
.join('');
replacedContent = replacedContent.replaceAll(docKey, `⁽${linkLabel}⁾`);
links.push(
` • ${linkLabel} [${uniqueItem.citation.title}](${uniqueItem.citation.filepath})\\n- ${uniqueItem.citation.url}\\n\\n`,
);
} catch (error) {
console.error('Error parsing URL as JSON array:', error);
try {
new URL(uniqueItem.citation.filepath);
let linkLabel = String(uniqueDocNum)
.split('')
.map((digit) => superscriptMap[Number(digit)])
.join('');
replacedContent = replacedContent.replaceAll(docKey, `⁽${linkLabel}⁾`);
links.push(` • ${linkLabel} [${uniqueItem.citation.title}](${uniqueItem.citation.filepath})`);
} catch {
replacedContent = replacedContent.replaceAll(docKey, '');
}
}
}
replacedContent = replacedContent.replaceAll(docKey, `⁽${linkLabel}⁾`);
}
});

const links: string[] = [];
for (let i = 0; i < appearanceOrder.length; i++) {
const uniqueIndex = appearanceOrder[i];
const displayNum = i + 1;
const line = buildLinkLine(displayNum, uniqueCitations[uniqueIndex].citation, superscriptMap);
if (line) links.push(line);
}

replacedContent = replacedContent
.replaceAll('\n', '\\n')
.replaceAll('"', '\"')

Check failure on line 594 in lib/helpers.ts

View workflow job for this annotation

GitHub Actions / lint / check

Unnecessary escape character: \"
.replaceAll(/([)\\/\p{L}\p{N}])⁽/gu, '$1 ⁽')
.replaceAll(/(⁽[⁰¹²³⁴⁵⁶⁷⁸⁹]+⁾)\1+/g, '$1');

Expand Down
Loading