diff --git a/docs/en/parameter.md b/docs/en/parameter.md index 782890656e..3db033920f 100644 --- a/docs/en/parameter.md +++ b/docs/en/parameter.md @@ -80,6 +80,12 @@ Set `limit` to limit the number of articles in the feed. E.g. Dribbble Popular Top 10 [https://rsshub.app/dribbble/popular?limit=10](https://rsshub.app/dribbble/popular?limit=10) +## Sorted + +Set `sorted` to control whether to sort the output by the publish date (`pubDate`). This is useful for some feeds that pin some entries at the top. Default to `true` i.e. the output is sorted. + +E.g. NJU Undergraduate Bulletin Board + ## Fulltext Enable fulltext via `mode` parameter. diff --git a/docs/parameter.md b/docs/parameter.md index f8774d0118..7a04d4afaf 100644 --- a/docs/parameter.md +++ b/docs/parameter.md @@ -79,6 +79,12 @@ filter 支持正则表达式。由于正则部分特性可被利用于 DoS (ReDO 举例: bilibili 排行榜前 10 +## 排序结果 + +通过 `sorted` 参数控制是否对输出的条目按照发布时间进行排序,这对一些会把部分新闻等置顶的源比较有用(如信息发布网)。默认为 `true` 即进行排序。 + +举例:不重新排序南京大学本科生院教学信息网的公告通知: + ## 全文输出 可以使用 `mode` 参数来开启自动提取全文内容功能 diff --git a/lib/middleware/parameter.js b/lib/middleware/parameter.js index 87a134cf63..2ac8cc6405 100644 --- a/lib/middleware/parameter.js +++ b/lib/middleware/parameter.js @@ -54,7 +54,9 @@ module.exports = async (ctx, next) => { ctx.state.data.description && (ctx.state.data.description = entities.decodeXML(ctx.state.data.description + '')); // sort items - ctx.state.data.item = ctx.state.data.item.sort((a, b) => +new Date(b.pubDate || 0) - +new Date(a.pubDate || 0)); + if (ctx.query.sorted !== 'false') { + ctx.state.data.item = ctx.state.data.item.sort((a, b) => +new Date(b.pubDate || 0) - +new Date(a.pubDate || 0)); + } const handleItem = (item) => { item.title && (item.title = entities.decodeXML(item.title + '')); diff --git a/test/middleware/parameter.js b/test/middleware/parameter.js index 7d12d954ae..8629b3f553 100644 --- a/test/middleware/parameter.js +++ b/test/middleware/parameter.js @@ -260,6 +260,18 @@ describe('limit', () => { }); }); +describe('sorted', () => { + it('sorted', async () => { + const response = await request.get('/test/sort?sorted=false'); + expect(response.status).toBe(200); + const parsed = await parser.parseString(response.text); + expect(parsed.items[0].title).toBe('Sort Title 0'); + expect(parsed.items[1].title).toBe('Sort Title 1'); + expect(parsed.items[2].title).toBe('Sort Title 2'); + expect(parsed.items[3].title).toBe('Sort Title 3'); + }); +}); + describe('tgiv', () => { it(`tgiv`, async () => { const response = await request.get('/test/1?tgiv=test');