From 91594448dfa20b05f3cdf486d28a7db7d27765b8 Mon Sep 17 00:00:00 2001 From: imnyang Date: Mon, 15 Dec 2025 10:41:08 +0900 Subject: [PATCH] Add Turndown integration for HTML to Markdown conversion and update dependencies --- bun.lock | 8 ++++++++ package.json | 6 ++++-- src/lib/rss.ts | 9 +++++++-- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/bun.lock b/bun.lock index 228ec88..165f35c 100644 --- a/bun.lock +++ b/bun.lock @@ -7,9 +7,11 @@ "dependencies": { "discord.js": "^14.25.1", "rss-parser": "^3.13.0", + "turndown": "^7.2.2", }, "devDependencies": { "@types/bun": "latest", + "@types/turndown": "^5.0.6", }, "peerDependencies": { "typescript": "^5", @@ -29,6 +31,8 @@ "@discordjs/ws": ["@discordjs/ws@1.2.3", "", { "dependencies": { "@discordjs/collection": "^2.1.0", "@discordjs/rest": "^2.5.1", "@discordjs/util": "^1.1.0", "@sapphire/async-queue": "^1.5.2", "@types/ws": "^8.5.10", "@vladfrangu/async_event_emitter": "^2.2.4", "discord-api-types": "^0.38.1", "tslib": "^2.6.2", "ws": "^8.17.0" } }, "sha512-wPlQDxEmlDg5IxhJPuxXr3Vy9AjYq5xCvFWGJyD7w7Np8ZGu+Mc+97LCoEc/+AYCo2IDpKioiH0/c/mj5ZR9Uw=="], + "@mixmark-io/domino": ["@mixmark-io/domino@2.2.0", "", {}, "sha512-Y28PR25bHXUg88kCV7nivXrP2Nj2RueZ3/l/jdx6J9f8J4nsEGcgX0Qe6lt7Pa+J79+kPiJU3LguR6O/6zrLOw=="], + "@sapphire/async-queue": ["@sapphire/async-queue@1.5.5", "", {}, "sha512-cvGzxbba6sav2zZkH8GPf2oGk9yYoD5qrNWdu9fRehifgnFZJMV+nuy2nON2roRO4yQQ+v7MK/Pktl/HgfsUXg=="], "@sapphire/shapeshift": ["@sapphire/shapeshift@4.0.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "lodash": "^4.17.21" } }, "sha512-d9dUmWVA7MMiKobL3VpLF8P2aeanRTu6ypG2OIaEv/ZHH/SUQ2iHOVyi5wAPjQ+HmnMuL0whK9ez8I/raWbtIg=="], @@ -39,6 +43,8 @@ "@types/node": ["@types/node@24.10.2", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-WOhQTZ4G8xZ1tjJTvKOpyEVSGgOTvJAfDK3FNFgELyaTpzhdgHVHeqW8V+UJvzF5BT+/B54T/1S2K6gd9c7bbA=="], + "@types/turndown": ["@types/turndown@5.0.6", "", {}, "sha512-ru00MoyeeouE5BX4gRL+6m/BsDfbRayOskWqUvh7CLGW+UXxHQItqALa38kKnOiZPqJrtzJUgAC2+F0rL1S4Pg=="], + "@types/ws": ["@types/ws@8.18.1", "", { "dependencies": { "@types/node": "*" } }, "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg=="], "@vladfrangu/async_event_emitter": ["@vladfrangu/async_event_emitter@2.4.7", "", {}, "sha512-Xfe6rpCTxSxfbswi/W/Pz7zp1WWSNn4A0eW4mLkQUewCrXXtMj31lCg+iQyTkh/CkusZSq9eDflu7tjEDXUY6g=="], @@ -67,6 +73,8 @@ "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + "turndown": ["turndown@7.2.2", "", { "dependencies": { "@mixmark-io/domino": "^2.2.0" } }, "sha512-1F7db8BiExOKxjSMU2b7if62D/XOyQyZbPKq/nUwopfgnHlqXHqQ0lvfUTeUIr1lZJzOPFn43dODyMSIfvWRKQ=="], + "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], "undici": ["undici@6.21.3", "", {}, "sha512-gBLkYIlEnSp8pFbT64yFgGE6UIB9tAkhukC23PmMDCe5Nd+cRqKxSjw5y54MK2AZMgZfJWMaNE4nYUHgi1XEOw=="], diff --git a/package.json b/package.json index ee36b34..7c99910 100644 --- a/package.json +++ b/package.json @@ -11,13 +11,15 @@ "lint:fix": "biome format ." }, "devDependencies": { - "@types/bun": "latest" + "@types/bun": "latest", + "@types/turndown": "^5.0.6" }, "peerDependencies": { "typescript": "^5" }, "dependencies": { "discord.js": "^14.25.1", - "rss-parser": "^3.13.0" + "rss-parser": "^3.13.0", + "turndown": "^7.2.2" } } \ No newline at end of file diff --git a/src/lib/rss.ts b/src/lib/rss.ts index c776fda..de89e40 100644 --- a/src/lib/rss.ts +++ b/src/lib/rss.ts @@ -1,5 +1,6 @@ import { ForumChannel, ThreadAutoArchiveDuration, Client } from "discord.js"; import type Parser from "rss-parser"; +import TurndownService from "turndown"; import { parser } from "./config"; import { processedItems, saveCurrentState } from "./storage"; import type { RssSource } from "../type/types"; @@ -117,13 +118,17 @@ async function postToForum( function buildContent(config: RssSource, item: Parser.Item): string { const parts: string[] = []; + const turndownService = new TurndownService(); if (item.link) { parts.push(`# ${config.emoji} | [${item.title}](<${item.link}>)`); } - if (item.contentSnippet) { - parts.push(`\n${item.content}\n`); + if (item.content) { + const markdown = turndownService.turndown(item.content); + parts.push(`\n${markdown.trim()}\n`); + } else if (item.contentSnippet) { + parts.push(`\n${item.contentSnippet}\n`); } if (item.pubDate) {