import * as cheerio from 'cheerio';
import { getMetadataCache } from '~/store/v2/metadata';
import { renderComments } from '~/utils/comment';
import type { ArticleMetadata } from '~/utils/download/types';
const ITEM_SHOW_TYPE = {
图片分享: 8,
文本分享: 10,
普通图文: 0,
};
/**
* 根据解析的 cgiDataNew 对象进行渲染
* @param cgiData
* @param comments 是否渲染留言数据,默认是
*/
export async function renderHTMLFromCgiDataNew(cgiData: any, comments = true) {
const title = extractTitle(cgiData);
const meta = renderMetaInfo(cgiData);
const contentHTML = extractContentHTML(cgiData);
const bottomBarHTML = await renderBottomBar(cgiData);
// 渲染留言
let commentHTML = '';
if (comments) {
commentHTML = await renderComments(cgiData.link);
}
return `
${title}
${meta}
原文地址: ${cgiData.link}
${contentHTML}
${commentHTML}
${bottomBarHTML}
`;
}
/**
* 提取标题字段(title)
* @param cgiData
*/
function extractTitle(cgiData: any): string {
let title = '';
switch (cgiData.item_show_type) {
case ITEM_SHOW_TYPE.图片分享:
case ITEM_SHOW_TYPE.普通图文:
title = cgiData.title;
break;
case ITEM_SHOW_TYPE.文本分享:
if (cgiData.text_page_info.is_user_title === 1) {
title = cgiData.title;
} else {
title = '(无标题)';
}
break;
default:
title = '(unknown)';
break;
}
return title;
}
/**
* 提取内容html
* @param cgiData
*/
function extractContentHTML(cgiData: any): string {
// 未购买的付费文章:content_noencode 只包含占位元素,需展示付费预览信息
if (cgiData.is_pay_subscribe === 1 && isPayPreviewPlaceholder(cgiData.content_noencode)) {
return renderContent_paySubscribe(cgiData);
}
let contentHTML = '';
switch (cgiData.item_show_type) {
case ITEM_SHOW_TYPE.图片分享:
contentHTML = renderContent_8(cgiData);
break;
case ITEM_SHOW_TYPE.文本分享:
contentHTML = renderContent_10(cgiData);
break;
case ITEM_SHOW_TYPE.普通图文:
contentHTML = renderContent_0(cgiData);
break;
default:
contentHTML = '(unknown)';
break;
}
return contentHTML;
}
/**
* 判断 content_noencode 是否为未购买付费文章的占位内容
*/
function isPayPreviewPlaceholder(contentNoencode: string | undefined): boolean {
if (!contentNoencode) return true;
const trimmed = contentNoencode.trim();
return !trimmed || trimmed.includes('mp-pay-preview-filter');
}
/**
* 渲染【付费订阅】类文章的内容部分
* @param cgiData
*/
function renderContent_paySubscribe(cgiData: any): string {
const payInfo = cgiData.pay_subscribe_info || {};
const desc = (payInfo.desc || '').replace(/\r?\n/g, '