UNPKG

rsshub

Version:
71 lines (69 loc) 2.8 kB
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 };