Refactor: remove PayloadCMS, use MDX for content and TSX for design, use direct email for contact
Some checks failed
Some checks failed
This commit is contained in:
70
scripts/extract-to-mdx.js
Normal file
70
scripts/extract-to-mdx.js
Normal file
@@ -0,0 +1,70 @@
|
||||
import fs from 'fs';
|
||||
import path from 'path';
|
||||
|
||||
const rawData = fs.readFileSync('./tmp_posts.json', 'utf8');
|
||||
const data = JSON.parse(rawData);
|
||||
|
||||
function parseNode(node) {
|
||||
if (node.type === 'text') {
|
||||
let text = node.text;
|
||||
if (node.format === 1) text = `**${text}**`;
|
||||
if (node.format === 2) text = `*${text}*`;
|
||||
if (node.format === 8) text = `\`${text}\``;
|
||||
return text;
|
||||
}
|
||||
|
||||
if (node.type === 'paragraph') {
|
||||
return node.children.map(parseNode).join('') + '\n\n';
|
||||
}
|
||||
|
||||
if (node.type === 'heading') {
|
||||
const level = node.tag ? node.tag.replace('h', '') : '2';
|
||||
const hashes = '#'.repeat(parseInt(level));
|
||||
return `${hashes} ${node.children.map(parseNode).join('')}\n\n`;
|
||||
}
|
||||
|
||||
if (node.type === 'list') {
|
||||
const isOrdered = node.listType === 'number';
|
||||
return node.children.map((li, i) => {
|
||||
const prefix = isOrdered ? `${i + 1}.` : '-';
|
||||
return `${prefix} ${li.children.map(parseNode).join('')}`;
|
||||
}).join('\n') + '\n\n';
|
||||
}
|
||||
|
||||
if (node.type === 'quote') {
|
||||
return `> ${node.children.map(parseNode).join('')}\n\n`;
|
||||
}
|
||||
|
||||
if (node.type === 'link') {
|
||||
return `[${node.children.map(parseNode).join('')}](${node.fields.url})`;
|
||||
}
|
||||
|
||||
if (node.children) {
|
||||
return node.children.map(parseNode).join('');
|
||||
}
|
||||
|
||||
return '';
|
||||
}
|
||||
|
||||
const outDir = './apps/web/src/content/posts';
|
||||
fs.mkdirSync(outDir, { recursive: true });
|
||||
|
||||
for (const post of data.docs) {
|
||||
const frontmatter = `---
|
||||
title: "${post.title.replace(/"/g, '\\"')}"
|
||||
date: "${post.date}"
|
||||
description: "${post.description ? post.description.replace(/"/g, '\\"') : ''}"
|
||||
tags: [${(post.tags || []).map(t => `"${t.tag}"`).join(', ')}]
|
||||
---
|
||||
|
||||
`;
|
||||
|
||||
let markdown = frontmatter;
|
||||
if (post.content && post.content.root && post.content.root.children) {
|
||||
markdown += post.content.root.children.map(parseNode).join('');
|
||||
}
|
||||
|
||||
const filename = `${post.slug}.mdx`;
|
||||
fs.writeFileSync(path.join(outDir, filename), markdown.trim() + '\n');
|
||||
console.log(`Wrote ${filename}`);
|
||||
}
|
||||
Reference in New Issue
Block a user