import { renderToString } from 'hono/jsx/dom/server'; import type { Route } from '@/types'; import got from '@/utils/got'; import { parseDate } from '@/utils/parse-date'; type ReportListItem = { position: string | number; name: string; rating: string | number; change?: string | number; star?: string | number; total?: string | number; db_model?: string; }; const renderReport = ({ tiobeList, activeList, allList, dbList }: { tiobeList?: ReportListItem[]; activeList?: ReportListItem[]; allList?: ReportListItem[]; dbList?: ReportListItem[] }) => renderToString( <> {tiobeList?.length ? ( {tiobeList.map((item) => ( ))}
排名 编程语言 流行度 对比上月 年度明星语言
{item.position} {item.name} {item.rating} {item.change || '新上榜'} {item.star}
) : null} {allList?.length ? ( <>

市场份额排名

{allList.map((item) => ( ))}
排名 服务器 占比 对比上月 总数
{item.position} {item.name} {item.rating} {item.change || '新上榜'} {item.total}

) : null} {activeList?.length ? ( <>

活跃网站排名

{activeList.map((item) => ( ))}
排名 服务器 占比 对比上月 总数
{item.position} {item.name} {item.rating} {item.change || '新上榜'} {item.total}
) : null} {dbList?.length ? ( {dbList.map((item) => ( ))}
排名 数据库 分数 对比上月 类型
{item.position} {item.name} {item.rating} {item.change || '新上榜'} {item.db_model}
) : null} ); const types = { tiobe: '编程语言', netcraft: '服务器', 'db-engines': '数据库', }; export const route: Route = { path: '/ranking/:type?', example: '/hellogithub/ranking', name: '榜单报告', maintainers: ['moke8', 'nczitzk'], handler, description: `| 编程语言 | 服务器 | 数据库 | | -------- | -------- | ---------- | | tiobe | netcraft | db-engines |`, }; async function handler(ctx) { let type = ctx.req.param('type') ?? 'tiobe'; type = type === 'webserver' ? 'netcraft' : type === 'db' ? 'db-engines' : type; const rootUrl = 'https://hellogithub.com'; const currentUrl = `${rootUrl}/report/${type}`; const buildResponse = await got({ method: 'get', url: rootUrl, }); const buildId = buildResponse.data.match(/"buildId":"(.*?)",/)[1]; const apiUrl = `${rootUrl}/_next/data/${buildId}/zh/report/${type}.json`; const response = await got({ method: 'get', url: apiUrl, }); const data = response.data.pageProps; const items = [ { guid: `${type}:${data.year}${data.month}`, title: `${data.year}年${data.month}月${types[type]}排行榜`, link: currentUrl, pubDate: parseDate(`${data.year}-${data.month}`, 'YYYY-M'), description: renderReport({ tiobeList: type === 'tiobe' ? data.list : undefined, activeList: data.active_list, allList: data.all_list, dbList: type === 'db-engines' ? data.list : undefined, }), }, ]; return { title: `HelloGitHub - ${types[type]}排行榜`, link: currentUrl, item: items, }; }