70 lines
2.5 KiB
TypeScript
70 lines
2.5 KiB
TypeScript
import * as fs from 'fs';
|
|
import * as path from 'path';
|
|
|
|
const MDX_DIR = path.join(process.cwd(), 'content/blog');
|
|
|
|
/**
|
|
* STRICTLY fixes Mermaid node labels.
|
|
*
|
|
* Goal:
|
|
* 1. Find all content inside [...] in Mermaid blocks.
|
|
* 2. Strip ALL outer quotes (single or double).
|
|
* 3. Sanitize the inner text:
|
|
* - Remove/Replace internal double quotes
|
|
* - Remove/Replace internal single quotes (to avoid any ambiguity)
|
|
* 4. Wrap strictly in ["..."].
|
|
*/
|
|
function fixMermaidLabels(content: string): string {
|
|
// Find Mermaid blocks
|
|
return content.replace(/(<Mermaid[^>]*>)([\s\S]*?)(<\/Mermaid>)/g, (match, open, body, close) => {
|
|
|
|
// Process the body line by line to be safe, or just regex the labels.
|
|
// Regex for labels: \[ followed by anything until \]
|
|
// Note: We assume labels don't contain nested brackets for now (Mermaid usually doesn't).
|
|
const fixedBody = body.replace(/\[([^\]]+)\]/g, (labelMatch, innerContent) => {
|
|
let text = innerContent.trim();
|
|
|
|
// Check if it looks like a quoted label
|
|
const hasOuterQuotes = /^['"]|['"]$/.test(text);
|
|
if (hasOuterQuotes) {
|
|
// Remove ALL starting/ending quotes (handling multiple if messed up)
|
|
text = text.replace(/^['"]+|['"]+$/g, '');
|
|
}
|
|
|
|
// Sanitize internal text
|
|
// Replace " with ' to avoid breaking the outer double quotes
|
|
text = text.replace(/"/g, "'");
|
|
|
|
// Verify parsing safety:
|
|
// Replace ' with space or nothing if we want to be super safe,
|
|
// but "Text with 'quotes'" SHOULD be valid in Mermaid.
|
|
// However, the previous error might have been due to MDX interference.
|
|
// Let's keep single quotes inside, but ensure outer are double.
|
|
|
|
// WAIT: The specific error was `B['Server ... 'inner' ...']`.
|
|
// If we convert to `B["Server ... 'inner' ..."]`, it should work.
|
|
|
|
return `["${text}"]`;
|
|
});
|
|
|
|
return open + fixedBody + close;
|
|
});
|
|
}
|
|
|
|
const files = fs.readdirSync(MDX_DIR).filter(f => f.endsWith('.mdx'));
|
|
let fixedCount = 0;
|
|
|
|
for (const file of files) {
|
|
const filePath = path.join(MDX_DIR, file);
|
|
const content = fs.readFileSync(filePath, 'utf8');
|
|
const fixed = fixMermaidLabels(content);
|
|
|
|
if (content !== fixed) {
|
|
fs.writeFileSync(filePath, fixed);
|
|
console.log(`✅ Fixed labels in: ${file}`);
|
|
fixedCount++;
|
|
}
|
|
}
|
|
|
|
console.log(`\nFixed ${fixedCount} files.`);
|