diff --git a/src/plugins/imageFilename/README.md b/src/plugins/imageFilename/README.md new file mode 100644 index 00000000..7929a73a --- /dev/null +++ b/src/plugins/imageFilename/README.md @@ -0,0 +1,5 @@ +# ImageFilename + +Display the file name of images & GIFs as a tooltip when hovering over them + +![](https://github.com/user-attachments/assets/44583f17-506f-4913-b85c-513eee77b645) diff --git a/src/plugins/imageFilename/index.ts b/src/plugins/imageFilename/index.ts new file mode 100644 index 00000000..08a446f8 --- /dev/null +++ b/src/plugins/imageFilename/index.ts @@ -0,0 +1,51 @@ +/* + * Vencord, a Discord client mod + * Copyright (c) 2025 Vendicated and contributors + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +import { definePluginSettings } from "@api/Settings"; +import { Devs } from "@utils/constants"; +import definePlugin, { OptionType } from "@utils/types"; + +const ImageExtensionRe = /\.(png|jpg|jpeg|gif|webp|avif)$/i; +const GifHostRegex = /^(.+?\.)?(tenor|giphy|imgur)\.com$/i; + +const settings = definePluginSettings({ + showFullUrl: { + description: "Show the full URL of the image instead of just the file name. Always enabled for GIFs because they usually have no meaningful file name", + type: OptionType.BOOLEAN, + default: false, + }, +}); + +export default definePlugin({ + name: "ImageFilename", + authors: [Devs.Ven], + description: "Display the file name of images & GIFs as a tooltip when hovering over them", + settings, + + patches: [ + { + find: ".clickableWrapper", + replacement: { + match: /\.originalLink,href:(\i)/, + replace: "$&,title:$self.getTitle($1)" + } + }, + ], + + getTitle(src: string) { + try { + const url = new URL(src); + const isGif = GifHostRegex.test(url.hostname); + if (!isGif && !ImageExtensionRe.test(url.pathname)) return undefined; + + return isGif || settings.store.showFullUrl + ? src + : url.pathname.split("/").pop(); + } catch { + return undefined; + } + } +});