rsshub
Version:
Make RSS Great Again!
105 lines (102 loc) • 4.78 kB
JavaScript
import { t as ofetch_default } from "./ofetch-DKl_Ma9g.mjs";
import { t as parseDate } from "./parse-date-r5WDWHno.mjs";
import { t as cache_default } from "./cache-SV6W5EPy.mjs";
import { t as timezone } from "./timezone-CA9Huotp.mjs";
import { Fragment, jsx, jsxs } from "hono/jsx/jsx-runtime";
import { load } from "cheerio";
import { renderToString } from "hono/jsx/dom/server";
import "rfc4648";
//#region lib/routes/zaobao/zaobao.tsx
function zaobao({ imageDataArray, articleBody }) {
return /* @__PURE__ */ jsxs(Fragment, { children: [imageDataArray.map((imageData) => imageData.type === "normalHTML" ? /* @__PURE__ */ jsx("div", { dangerouslySetInnerHTML: { __html: imageData.html } }) : imageData.type === "data" && /* @__PURE__ */ jsxs("figure", { children: [/* @__PURE__ */ jsx("img", { src: imageData.src }), /* @__PURE__ */ jsx("figcaption", { children: imageData.title })] })), articleBody && /* @__PURE__ */ jsx("div", { dangerouslySetInnerHTML: { __html: articleBody } })] });
}
var zaobao_default = zaobao;
//#endregion
//#region lib/routes/zaobao/util.tsx
const baseUrl = "https://www.zaobao.com";
const logo = "https://www.zaobao.com.sg/favicon.ico";
/**
* 通用解析页面类似 https://www.zaobao.com/realtime/china 的网站
*
* @param {string} sectionUrl 形如 /realtime/china 的字符串
* @returns 新闻标题以及新闻列表
*/
const parseList = async (sectionUrl) => {
const pageResponse = await ofetch_default.raw(baseUrl + sectionUrl);
const $ = load(pageResponse._data);
let data = $(".card-listing .card .content-header a");
if (data.length === 0) data = $("[data-testid=\"article-list\"] article div div a.article-link");
const origin = new URL(pageResponse.url).origin;
return {
title: $("meta[property=\"og:title\"]").attr("content"),
resultList: await Promise.all(data.toArray().map((item) => {
const $item = $(item);
const link = baseUrl + $item.attr("href");
return cache_default.tryGet(link, async () => {
if ($item.attr("href")?.includes("https://")) return {
title: pageResponse.url.startsWith("https://www.zaobao.com.sg/") ? $item.text().trim() : $item.attr("title")?.trim(),
link: $item.attr("href"),
pubDate: timezone($item.next().text().trim().includes(":") ? parseDate($item.next().text().trim(), "HH:mm") : parseDate($item.next().text().trim(), "MM月DD日"), 8)
};
const response = await ofetch_default.raw(new URL($item.attr("href"), origin).href);
let $1 = load(response._data);
let title, pubDate, category, images;
const jsonText = $1("head script[type=\"application/ld+json\"]").text().replaceAll(/[\u0000-\u001F\u007F-\u009F]/g, "");
const ldJson = JSON.parse(jsonText);
const isSingapore = response.url.startsWith("https://www.zaobao.com.sg/");
if (isSingapore) {
const article = JSON.parse(JSON.parse(`"${$1("script:contains(\"__staticRouterHydrationData\")").text().match(/__staticRouterHydrationData = JSON.parse\("(.*)"\);/)?.[1]}"`)).loaderData["0-0"].context.payload.article;
title = article.headline;
pubDate = parseDate(article.create_time, "X");
category = article.tags.map((t) => t.name);
$1 = load(article.body_cn, null, false);
images = article.images;
} else {
title = ldJson.headline;
pubDate = parseDate(ldJson.datePublished);
category = ldJson.keywords?.split(",");
}
$1(".bff-google-ad, .bff-recommend-article").remove();
$1("button.cursor-pointer").remove();
$1(".bff-inline-image-expand-icon").remove();
$1("img[alt=\"expend icon\"]").remove();
let articleBodyNode;
if (isSingapore) articleBodyNode = $1;
else {
$1("astro-island, .further-reading, .read-on-app-cover").remove();
articleBodyNode = $1(".article-body");
}
const articleBody = articleBodyNode.html();
const description = renderToString(/* @__PURE__ */ jsx(zaobao_default, {
imageDataArray: processImageData(isSingapore, images, $1),
articleBody
}));
return {
title,
description,
pubDate,
link,
category
};
});
}))
};
};
const processImageData = (isSg, images, $1) => {
if (isSg && images) return images.map((img) => ({
type: "data",
html: "",
src: img.url.replaceAll(/\/\/.*\.com\/s3fs-public/g, "//static.zaobao.com/s3fs-public").replaceAll("s3/files", "s3fs-public").split("?")[0],
title: img.caption
}));
const hkImg = $1("[data-testid=\"article-banner\"] img");
if (hkImg.length) return [{
type: "data",
html: hkImg.prop("outerHTML"),
src: hkImg.attr("src").replaceAll(/\/\/.*\.com\/s3fs-public/g, "//static.zaobao.com/s3fs-public").replaceAll("s3/files", "s3fs-public").split("?")[0],
title: hkImg.attr("title")
}];
return [];
};
//#endregion
export { parseList as n, logo as t };