From 4098346fb7dd60affdc9675dbd39780384da738b Mon Sep 17 00:00:00 2001 From: matevip Date: Tue, 12 May 2026 11:25:32 +0800 Subject: [PATCH] fix(wiki): strip file extensions when deriving transformation page slugs --- .../service/WikiTransformationExecutor.java | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/mateclaw-server/src/main/java/vip/mate/wiki/service/WikiTransformationExecutor.java b/mateclaw-server/src/main/java/vip/mate/wiki/service/WikiTransformationExecutor.java index 1ae7dff0..b2ac3f4f 100644 --- a/mateclaw-server/src/main/java/vip/mate/wiki/service/WikiTransformationExecutor.java +++ b/mateclaw-server/src/main/java/vip/mate/wiki/service/WikiTransformationExecutor.java @@ -292,12 +292,28 @@ public class WikiTransformationExecutor { return persisted; } + /** + * Common document / image extensions that we don't want leaking into the + * slug. The pattern matches a trailing dotted extension and is case- + * insensitive so both {@code foo.PDF} and {@code foo.pdf} are stripped. + */ + private static final java.util.regex.Pattern FILE_EXT_PATTERN = + java.util.regex.Pattern.compile( + "\\.(pdf|docx?|pptx?|xlsx?|csv|tsv|txt|md|markdown|rtf|odt|epub|html?|json|xml|yaml|yml|jpe?g|png|gif|bmp|tiff?|webp|svg|mp3|wav|mp4|mov|webm)$", + java.util.regex.Pattern.CASE_INSENSITIVE); + private static String buildSlug(WikiTransformationEntity template, WikiRawMaterialEntity raw) { - String rawPart = WikiPageService.toSlug(raw.getTitle()); + String trimmedTitle = stripFileExtension(raw.getTitle()); + String rawPart = WikiPageService.toSlug(trimmedTitle); if (rawPart == null || rawPart.isBlank()) rawPart = "r" + raw.getId(); return template.getName() + "-" + rawPart; } + private static String stripFileExtension(String title) { + if (title == null) return null; + return FILE_EXT_PATTERN.matcher(title.trim()).replaceFirst(""); + } + /** First non-empty line of the output, capped to ~280 chars, used as page summary. */ private static String deriveSummary(String output) { if (output == null) return "";