feat(baoyu-post-to-wechat): internalize markdown conversion with modular renderer and color support

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Jim Liu 宝玉
2026-03-01 00:01:05 -06:00
parent 226d501e9e
commit 8787cbe85b
90 changed files with 3273 additions and 847 deletions
@@ -112,7 +112,7 @@ function parseFrontmatter(content: string): { frontmatter: Record<string, string
return { frontmatter, body: match[2]! };
}
export async function convertMarkdown(markdownPath: string, options?: { title?: string; theme?: string }): Promise<ParsedResult> {
export async function convertMarkdown(markdownPath: string, options?: { title?: string; theme?: string; color?: string }): Promise<ParsedResult> {
const baseDir = path.dirname(markdownPath);
const content = fs.readFileSync(markdownPath, 'utf-8');
const theme = options?.theme ?? 'default';
@@ -183,9 +183,12 @@ export async function convertMarkdown(markdownPath: string, options?: { title?:
const __dirname = path.dirname(__filename);
const renderScript = path.join(__dirname, 'md', 'render.ts');
console.error(`[md-to-wechat] Rendering markdown with theme: ${theme}`);
const renderArgs = ['-y', 'bun', renderScript, tempMdPath, '--theme', theme];
if (options?.color) renderArgs.push('--color', options.color);
const result = spawnSync('npx', ['-y', 'bun', renderScript, tempMdPath, '--theme', theme], {
console.error(`[md-to-wechat] Rendering markdown with theme: ${theme}${options?.color ? `, color: ${options.color}` : ''}`);
const result = spawnSync('npx', renderArgs, {
stdio: ['inherit', 'pipe', 'pipe'],
cwd: baseDir,
});
@@ -227,7 +230,8 @@ Usage:
Options:
--title <title> Override title
--theme <name> Theme name (default, grace, simple)
--theme <name> Theme name (default, grace, simple, modern)
--color <name|hex> Primary color (blue, green, vermilion, etc. or hex)
--help Show this help
Output JSON format:
@@ -246,6 +250,7 @@ Output JSON format:
Example:
npx -y bun md-to-wechat.ts article.md
npx -y bun md-to-wechat.ts article.md --theme grace
npx -y bun md-to-wechat.ts article.md --theme modern --color blue
`);
process.exit(0);
}
@@ -259,6 +264,7 @@ async function main(): Promise<void> {
let markdownPath: string | undefined;
let title: string | undefined;
let theme: string | undefined;
let color: string | undefined;
for (let i = 0; i < args.length; i++) {
const arg = args[i]!;
@@ -266,6 +272,8 @@ async function main(): Promise<void> {
title = args[++i];
} else if (arg === '--theme' && args[i + 1]) {
theme = args[++i];
} else if (arg === '--color' && args[i + 1]) {
color = args[++i];
} else if (!arg.startsWith('-')) {
markdownPath = arg;
}
@@ -281,7 +289,7 @@ async function main(): Promise<void> {
process.exit(1);
}
const result = await convertMarkdown(markdownPath, { title, theme });
const result = await convertMarkdown(markdownPath, { title, theme, color });
console.log(JSON.stringify(result, null, 2));
}