From 1f334be4f8fd4defe8af6bb548b9a2527b2b5ae8 Mon Sep 17 00:00:00 2001 From: Yigong Hu Date: Sat, 25 May 2024 16:16:11 +0100 Subject: [PATCH] fix(route): Typst universe route removes duplicated packages and fix description (#15664) * fix: package list source and title * edit: remove duplicated packages and get rendered page * Revert "edit: remove duplicated packages and get rendered page" This reverts commit 711d8941c8098ffc077195587f6452349d7bf784. * fix: remove duplicated packages * fix: image links * edit: fix image path after render * fix: Incomplete URL substring sanitization * fix: coding sty;e --- lib/routes/typst/universe.ts | 42 +++++++++++++++++++++++++++++------- 1 file changed, 34 insertions(+), 8 deletions(-) diff --git a/lib/routes/typst/universe.ts b/lib/routes/typst/universe.ts index c66349f34..7e57263a0 100644 --- a/lib/routes/typst/universe.ts +++ b/lib/routes/typst/universe.ts @@ -26,6 +26,25 @@ interface Context { an: { exports: Array }; } +const GITHUBRAW_BASE = 'https://raw.githubusercontent.com'; +const PKG_GITHUB_BASE = `${GITHUBRAW_BASE}/typst/packages/main/packages/preview`; + +function fixImageSrc(src: string, env: Package) { + 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}`; + const url = new URL(src, package_base); + src = url.toString(); + } + return src; +} + export const route: Route = { path: '/universe', categories: ['program-update'], @@ -39,7 +58,7 @@ export const route: Route = { name: 'Universe', maintainers: ['HPDell'], handler: async () => { - const targetUrl = 'https://typst.app/universe/search?kind=packages%2Ctemplates&packages=last-published'; + const targetUrl = 'https://typst.app/universe/search?kind=packages%2Ctemplates&packages=last-updated'; const page = await ofetch(targetUrl); const $ = load(page); const script = $('script') @@ -58,18 +77,25 @@ export const route: Route = { displayErrors: true, }); const md = markdownit('commonmark'); - const items = context.an.exports - .sort((a, b) => b.updatedAt - a.updatedAt) - .map((item) => ({ - title: `${item.name} | ${item.description}`, + const items = context.an.exports.sort((a, b) => a.updatedAt - b.updatedAt); + const groups = new Map(items.map((it) => [it.name, it])); + const pkgs = [...groups.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: md.render(item.readme), + description: $.html(), pubDate: parseDate(item.updatedAt, 'X'), - })); + }; + }); return { title: 'Typst universe', link: targetUrl, - item: items, + item: pkgs, }; } else { return {