rsshub
Version:
Make RSS Great Again!
71 lines (69 loc) • 2.8 kB
JavaScript
import "./esm-shims-CzJ_djXG.mjs";
import "./config-C37vj7VH.mjs";
import "./dist-BInvbO1W.mjs";
import "./logger-Czu8UMNd.mjs";
import { t as ofetch_default } from "./ofetch-BIyrKU3Y.mjs";
import { t as parseDate } from "./parse-date-BrP7mxXf.mjs";
import { load } from "cheerio";
import markdownit from "markdown-it";
import vm from "node:vm";
//#region lib/routes/typst/universe.ts
const GITHUBRAW_BASE = "https://raw.githubusercontent.com";
const PKG_GITHUB_BASE = `${GITHUBRAW_BASE}/typst/packages/main/packages/preview`;
function fixImageSrc(src, env) {
if (src.includes("://")) {
if (src.startsWith("https://typst.app/universe/package")) src = src.replaceAll("https://typst.app/universe/package", `${PKG_GITHUB_BASE}/${env.name}/${env.version}`);
else if (src.startsWith("https://github.com/") && src.match(/\.(jpeg|jpg|gif|png|bmp|webp)$/gi)?.length) src = src.replace("https://github.com/", `${GITHUBRAW_BASE}/`);
} else {
const suffix = src.startsWith("/") ? "" : "/";
const package_base = `${PKG_GITHUB_BASE}/${env.name}/${env.version}${suffix}`;
src = new URL(src, package_base).toString();
}
return src;
}
const route = {
path: "/universe",
categories: ["program-update"],
example: "/typst/universe",
radar: [{
source: ["typst.app/universe"],
target: "/universe"
}],
name: "Universe",
maintainers: ["HPDell"],
handler: async () => {
const targetUrl = "https://typst.app/universe/search?kind=packages%2Ctemplates&packages=last-updated";
let packages = (await ofetch_default(`https://typst.app${load(await ofetch_default(targetUrl))("script").toArray().map((item) => item.attribs.src).find((item) => item && item.startsWith("/scripts/universe-search"))}`, { parseResponse: (txt) => txt })).match(/(an.exports=[\S\s]+);var ([$A-Z_a-z][\w$]*)=new Intl.Collator/)?.[1];
if (packages) {
packages = packages.slice(0, -2);
const context = { an: { exports: [] } };
vm.createContext(context);
vm.runInContext(packages, context, { displayErrors: true });
const md = markdownit("commonmark");
const items = context.an.exports.toSorted((a, b) => a.updatedAt - b.updatedAt);
return {
title: "Typst universe",
link: targetUrl,
item: [...new Map(items.map((it) => [it.name, it])).values()].map((item) => {
const $ = load(md.render(item.readme));
$("img").each((i, el) => {
const src = el.attribs.src;
el.attribs.src = fixImageSrc(src, item);
});
return {
title: `${item.name} (${item.version}) | ${item.description}`,
link: `https://typst.app/universe/package/${item.name}`,
description: $.html(),
pubDate: parseDate(item.updatedAt, "X")
};
})
};
} else return {
title: "Typst universe",
link: targetUrl,
item: []
};
}
};
//#endregion
export { route };