87 lines
2.6 KiB
TypeScript
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();
|