Files
mintel.me/apps/web/scripts/fix-graph-quotes.ts

87 lines
2.6 KiB
TypeScript

import * as fs from 'fs';
import * as path from 'path';
const MDX_DIR = path.join(process.cwd(), 'content/blog');
/**
* Fix escaped double quotes in Mermaid graph props.
*
* The graph prop contains \" which is invalid in MDX attribute syntax.
* Replace \" with ' (single quote) - Mermaid supports both.
*
* Also fix \\n to just \n (single backslash) - the MDX parser
* will treat \n as literal characters, and the Mermaid component
* will unescape them.
*/
function fixGraphQuotes(content: string): string {
// Match graph="..." prop (the entire value including escaped content)
// This is tricky because the value can contain escaped quotes
// We need to match from graph=" to the closing " that ends the prop value
// Strategy: Find graph=" then scan forward, tracking escape sequences
const graphPropStart = 'graph="';
let result = '';
let i = 0;
while (i < content.length) {
const idx = content.indexOf(graphPropStart, i);
if (idx === -1) {
result += content.slice(i);
break;
}
// Copy everything up to and including graph="
result += content.slice(i, idx + graphPropStart.length);
// Now scan the value, replacing \" with '
let j = idx + graphPropStart.length;
let graphValue = '';
while (j < content.length) {
if (content[j] === '\\' && content[j + 1] === '"') {
// Replace \" with '
graphValue += "'";
j += 2;
} else if (content[j] === '\\' && content[j + 1] === '\\') {
// Keep \\ as is
graphValue += '\\\\';
j += 2;
} else if (content[j] === '"') {
// End of attribute value
break;
} else {
graphValue += content[j];
j++;
}
}
result += graphValue;
i = j; // Continue from the closing quote (will be added in next iteration)
}
return result;
}
function processFiles() {
const files = fs.readdirSync(MDX_DIR).filter(f => f.endsWith('.mdx'));
let fixCount = 0;
for (const file of files) {
const filePath = path.join(MDX_DIR, file);
const content = fs.readFileSync(filePath, 'utf8');
const fixed = fixGraphQuotes(content);
if (content !== fixed) {
fs.writeFileSync(filePath, fixed);
fixCount++;
console.log(`✅ Fixed quotes: ${file}`);
} else {
console.log(`- ${file} (no changes needed)`);
}
}
console.log(`\nTotal fixed: ${fixCount}`);
}
processFiles();