/** * 公众号草稿统一 layout:阅读原文 + 底部关注区。 * 标准定义见 wechat-draft-publication-standard.mjs 与 docs/wechat-draft-publication-standard.md */ import fs from 'node:fs'; import path from 'node:path'; import { fetch as undiciFetch } from 'undici'; import { PLATFORM_BRAND_ICON_PATH } from './mindspace-og-tags.mjs'; import { resolveMpFollowQrcodePath, uploadWechatArticleContentImage, } from './wechat-news-morning-draft.mjs'; export function renderReadOriginalLink(publicUrl) { if (!publicUrl) return ''; return [ '

', `📖 阅读原文`, '

', ].join(''); } /** @deprecated 保留别名,避免外部引用断裂 */ export const renderReadOriginalTop = renderReadOriginalLink; export function renderFollowTkMindSection({ qrcodeImageUrl = '', } = {}) { const qrcodeBlock = qrcodeImageUrl ? `TKMind 服务号二维码` : ''; return [ '
', '

欢迎关注 TKMind 智趣

', qrcodeBlock, qrcodeImageUrl ? '

长按扫描关注

' : '

关注 TKMind 服务号

', '
', ].filter(Boolean).join(''); } export function applyWechatDraftArticleLayout( content, { publicUrl = '', qrcodeImageUrl = '' } = {}, ) { const parts = [String(content ?? '').trim()]; if (publicUrl) { parts.push(renderReadOriginalLink(publicUrl)); } parts.push(renderFollowTkMindSection({ qrcodeImageUrl })); return parts.filter(Boolean).join('\n').slice(0, 20000); } export function resolveTkMindBrandIconPath(memindLibRoot = process.cwd()) { const candidates = [ path.join(memindLibRoot, 'public', PLATFORM_BRAND_ICON_PATH.replace(/^\//, '')), path.join(memindLibRoot, 'dist', PLATFORM_BRAND_ICON_PATH.replace(/^\//, '')), path.join(process.cwd(), 'public', PLATFORM_BRAND_ICON_PATH.replace(/^\//, '')), ]; return candidates.find((candidate) => fs.existsSync(candidate)) ?? null; } export async function uploadWechatDraftBrandAssets({ accessToken, wechatFetch = undiciFetch, memindLibRoot = process.cwd(), } = {}) { let qrcodeImageUrl = ''; if (!accessToken) { return { qrcodeImageUrl }; } const qrcodePath = resolveMpFollowQrcodePath(memindLibRoot); if (qrcodePath) { qrcodeImageUrl = await uploadWechatArticleContentImage( accessToken, fs.readFileSync(qrcodePath), { wechatFetch, filename: 'mp-follow-qrcode.png' }, ); } return { qrcodeImageUrl }; } export async function finalizeWechatDraftArticleForPush({ content, publicUrl = '', accessToken = null, wechatFetch = undiciFetch, memindLibRoot = process.cwd(), } = {}) { const brandAssets = await uploadWechatDraftBrandAssets({ accessToken, wechatFetch, memindLibRoot, }); return { content: applyWechatDraftArticleLayout(content, { publicUrl, ...brandAssets, }), ...brandAssets, }; }