diff --git a/docker/Dockerfile b/docker/Dockerfile index 50689ff..90f1e44 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -12,11 +12,9 @@ RUN yarn build FROM node:18-bookworm AS runner - -COPY --from=builder /app/dist ./ - WORKDIR /app/dist +COPY --from=builder /app/dist ./ COPY ./docker/wait-for-it.sh . EXPOSE 80 diff --git a/src/service/template/index.ts b/src/service/template/index.ts index 4771bf8..ed211f8 100644 --- a/src/service/template/index.ts +++ b/src/service/template/index.ts @@ -9,7 +9,7 @@ import path from "path"; import hb from "handlebars"; import strip from "strip-markdown"; import { VFileCompatible } from "vfile"; -import transformMDLinks from "../../utils/transformMDLinks"; +import { transformMDLinks } from "../../utils/links"; const removeFrontmatter = () => (tree) => { tree.children = tree.children.filter((item) => item.type !== "yaml"); diff --git a/src/service/vk/handlers/PostNewHandler.ts b/src/service/vk/handlers/PostNewHandler.ts index b8a6095..a5f5daa 100644 --- a/src/service/vk/handlers/PostNewHandler.ts +++ b/src/service/vk/handlers/PostNewHandler.ts @@ -11,7 +11,7 @@ import { User, } from "typegram"; import { keys } from "lodash"; -import { extractURLs } from "../../../utils/extract"; +import { extractURLs } from "../../../utils/links"; import logger from "../../logger"; import Composer from "telegraf"; import { Template } from "../../template"; diff --git a/src/utils/__tests__/extractURLs.test.ts b/src/utils/__tests__/extractURLs.test.ts index ffabfda..ebf2b4a 100644 --- a/src/utils/__tests__/extractURLs.test.ts +++ b/src/utils/__tests__/extractURLs.test.ts @@ -1,4 +1,4 @@ -import { extractURLs } from "../extract"; +import { extractURLs } from "../links"; describe("extractURLs", () => { it("extracts simple urls", () => { diff --git a/src/utils/__tests__/transformMDLinks.test.ts b/src/utils/__tests__/transformMDLinks.test.ts new file mode 100644 index 0000000..c46e4dd --- /dev/null +++ b/src/utils/__tests__/transformMDLinks.test.ts @@ -0,0 +1,23 @@ +import { transformMDLinks } from "../links"; + +describe("transformMDLinks", () => { + it("extracts simple urls", () => { + const result = transformMDLinks( + "Trying out links https://map.vault48.org/test 123" + ); + + expect(result).toBe( + "Trying out links [https://map.vault48…](https://map.vault48.org/test) 123" + ); + }); + + it("works with that weird new VK urls", () => { + const result = transformMDLinks( + "Trying out links [#alias|12345678901234567890123|https://map.vault48.org/test_abc_def_ghi] 123" + ); + + expect(result).toBe( + "Trying out links [1234567890123456789…](https://map.vault48.org/test_abc_def_ghi) 123" + ); + }); +}); diff --git a/src/utils/extract.ts b/src/utils/extract.ts deleted file mode 100644 index 70e6279..0000000 --- a/src/utils/extract.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { URL } from "url"; - -const urlRe = /(https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s\]]{2,}|www\.[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s\]]{2,}|https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9]+\.[^\s\]]{2,}|www\.[a-zA-Z0-9]+\.[^\s\]]{2,})/gim; - -export const extractURLs = (text: string): URL[] => { - const matches = text.match(urlRe) || []; - - return matches - .map((m) => { - try { - return new URL(m); - } catch (e) { - return; - } - }) - .filter((el) => el) as URL[]; -}; diff --git a/src/utils/links.ts b/src/utils/links.ts new file mode 100644 index 0000000..8bd2429 --- /dev/null +++ b/src/utils/links.ts @@ -0,0 +1,41 @@ +import { URL } from "url"; + +const simpleUrlRegex = /(https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s\]]{2,}|www\.[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s\]]{2,}|https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9]+\.[^\s\]]{2,}|www\.[a-zA-Z0-9]+\.[^\s\]]{2,})/gim; +const weirdLongUrlRegex = /\[(.*)\|(.*)\|(https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s\]]{2,}|www\.[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s\]]{2,}|https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9]+\.[^\s\]]{2,}|www\.[a-zA-Z0-9]+\.[^\s\]]{2,})\]/g; + +/** Extracts URLs from text */ +export const extractURLs = (text: string): URL[] => { + const matches = text.match(simpleUrlRegex) || []; + + return matches + .map((m) => { + try { + return new URL(m); + } catch (e) { + return; + } + }) + .filter((el) => el) as URL[]; +}; + +/** Adds ... to text if its length exceeds maxLength */ +const trimTo = (val: string, maxLength: number) => + val.length > maxLength ? val.substring(0, maxLength - 1).concat("…") : val; + +/** Formatting all links in markdown output, trimming them to reasonable length */ +export const transformMDLinks = (value: string) => + value + .replace(weirdLongUrlRegex, (val, ...args) => { + if (args.length < 2) { + return val; + } + + return `[${trimTo(args[1], 20)}](${args[2]})`; + }) + .replace(simpleUrlRegex, (val) => { + if (val.endsWith(")")) { + return val; + } + + return `[${trimTo(val, 20)}](${val})`; + }); diff --git a/src/utils/transformMDLinks.ts b/src/utils/transformMDLinks.ts deleted file mode 100644 index 2b036bc..0000000 --- a/src/utils/transformMDLinks.ts +++ /dev/null @@ -1,10 +0,0 @@ -const urlRegex = /(https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|www\.[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9]+\.[^\s]{2,}|www\.[a-zA-Z0-9]+\.[^\s]{2,})/g; - -const trimTo = (val: string, maxLength: number) => - val.length > maxLength ? val.substring(0, maxLength - 1).concat("…") : val; - -/** Formatting all links in markdown output, trimming them to reasonable length */ -export default (value: string) => - value.replace(urlRegex, (val) => { - return `[${trimTo(val, 20)}](${val})`; - });