From 643656d798b4d328adaaf0f12dccc59a2c955990 Mon Sep 17 00:00:00 2001 From: fawn Date: Tue, 19 Aug 2025 17:41:02 +0300 Subject: [PATCH] new plugin ImageFilename: displays image filename tooltips on hover (#3617) Co-authored-by: Vendicated --- src/plugins/imageFilename/README.md | 5 +++ src/plugins/imageFilename/index.ts | 51 +++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 src/plugins/imageFilename/README.md create mode 100644 src/plugins/imageFilename/index.ts diff --git a/src/plugins/imageFilename/README.md b/src/plugins/imageFilename/README.md new file mode 100644 index 000000000..7929a73a5 --- /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 000000000..08a446f85 --- /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; + } + } +});