/**
* 公众号草稿统一 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
? `
`
: '';
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,
};
}