diff --git a/src/handlers/main.ts b/src/handlers/main.ts index 277c6a2..a082260 100644 --- a/src/handlers/main.ts +++ b/src/handlers/main.ts @@ -3,10 +3,11 @@ import { IHandlerOutput } from "./handler.interface"; import { readability } from "./readability"; import { JSDOM } from "jsdom"; -type EngineFunction = (url: JSDOM) => Promise; +type EngineFunction = (url: Document) => Promise; export default async function handlePage( url: string, + originalUrl: string, engine?: string ): Promise { if (engine && engineList.indexOf(engine) === -1) { @@ -14,14 +15,21 @@ export default async function handlePage( } const response = await axios.get(url); - const dom = new JSDOM(response.data, { url: url }); + const document = new JSDOM(response.data, { url: url }).window.document; + const UrlParsed = new URL(originalUrl); + + [...document.getElementsByTagName("a")].forEach((link) => { + link.href = `${UrlParsed.origin}/?url=${link.href}${ + engine && `&engine=${engine}` + }`; + }); if (engine) { - return engines[engine](dom); + return engines[engine](document); } const host = new URL(url).hostname; - return fallback[host](dom) || fallback["*"](dom); + return fallback[host](document) || fallback["*"](document); } interface Engines { @@ -29,7 +37,7 @@ interface Engines { } export const engines: Engines = { - readability: readability, + readability, }; export const engineList: string[] = Object.keys(engines); diff --git a/src/handlers/readability.ts b/src/handlers/readability.ts index 42d4b6c..fc9a011 100644 --- a/src/handlers/readability.ts +++ b/src/handlers/readability.ts @@ -1,9 +1,8 @@ import { Readability } from "@mozilla/readability"; -import { JSDOM } from "jsdom"; import { IHandlerOutput } from "./handler.interface"; -export async function readability(dom: JSDOM): Promise { - const reader = new Readability(dom.window.document); +export async function readability(document: Document): Promise { + const reader = new Readability(document); const parsed = reader.parse(); if (!parsed) { diff --git a/src/routes/main-route.ts b/src/routes/main-route.ts index 2f7e617..28e2205 100644 --- a/src/routes/main-route.ts +++ b/src/routes/main-route.ts @@ -2,6 +2,7 @@ import { FastifyInstance } from "fastify"; import { GetRequest } from "../types/requests"; import handlePage from "../handlers/main"; +import { generateOriginUrl } from "../utils"; export default async function mainRoute(fastify: FastifyInstance) { fastify.get("/", async (request: GetRequest, reply) => { @@ -18,7 +19,15 @@ export default async function mainRoute(fastify: FastifyInstance) { format = "html"; } - const parsed = await handlePage(remoteUrl, engine); + const parsed = await handlePage( + remoteUrl, + generateOriginUrl( + request.protocol, + request.hostname, + request.originalUrl + ), + engine + ); if (format === "text") { return parsed.textContent; diff --git a/src/routes/parse-route.ts b/src/routes/parse-route.ts index 3f74cb6..789ec58 100644 --- a/src/routes/parse-route.ts +++ b/src/routes/parse-route.ts @@ -1,10 +1,19 @@ import { EngineRequest } from "../types/requests"; import { FastifyInstance } from "fastify"; import handlePage from "../handlers/main"; +import { generateOriginUrl } from "../utils"; export default async function parseRoute(fastify: FastifyInstance) { - fastify.get("/parse", async (req: EngineRequest) => { - const parsed = await handlePage(req.query.url, req.query.engine); + fastify.get("/parse", async (request: EngineRequest) => { + const parsed = await handlePage( + request.query.url, + generateOriginUrl( + request.protocol, + request.hostname, + request.originalUrl + ), + request.query.engine + ); return parsed; }); diff --git a/src/utils.ts b/src/utils.ts new file mode 100644 index 0000000..cdc4bea --- /dev/null +++ b/src/utils.ts @@ -0,0 +1,7 @@ +export function generateOriginUrl( + protocol: string, + host: string, + originalUrl: string +): string { + return `${protocol}://${host}${originalUrl}`; +}