diff --git a/src/lib/velum-project.ts b/src/lib/velum-project.ts index a48c019..28c1b12 100644 --- a/src/lib/velum-project.ts +++ b/src/lib/velum-project.ts @@ -244,12 +244,12 @@ export function replaceSpans( return output; } -function restorePattern(mapping: PlaceholderMapping, matchModes: ProjectRun["matchModes"]): RegExp | undefined { +function restorePattern(mapping: PlaceholderMapping, matchModes: ProjectRun["matchModes"], pathSegment = false): RegExp | undefined { const keys = Object.keys(mapping).sort((a, b) => b.length - a.length); if (!keys.length) return undefined; const parts = keys.map((key) => { const escaped = key.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); - return matchModes?.[key] === "anywhere" + return pathSegment || matchModes?.[key] === "anywhere" ? escaped : `(? { const restored = pattern ? segment.replace(pattern, (key) => mapping[key].original) : segment; if (restored.includes("/") || restored.includes("\\") || restored === "." || restored === "..") { diff --git a/tests/velum-project.test.ts b/tests/velum-project.test.ts index fbdf78c..59a533b 100644 --- a/tests/velum-project.test.ts +++ b/tests/velum-project.test.ts @@ -129,6 +129,16 @@ describe("Velum-Projektstände", () => { expect(project.restorePath("PERSON_01_Bericht.txt", { PERSON_01: { original: "Max Mustermann", type: "PERSON" }, })).toBe("Max Mustermann_Bericht.txt"); + expect(project.restorePath("Archiv/BerichtPERSON_01.docx", { + PERSON_01: { original: "Max Mustermann", type: "PERSON" }, + })).toBe("Archiv/BerichtMax Mustermann.docx"); + expect(project.restoreText("BerichtPERSON_01", { + PERSON_01: { original: "Max Mustermann", type: "PERSON" }, + })).toBe("BerichtPERSON_01"); + expect(project.restorePath("PERSON_0101.txt", { + PERSON_01: { original: "Falsch", type: "PERSON" }, + PERSON_0101: { original: "Richtig", type: "PERSON" }, + })).toBe("Richtig.txt"); expect(() => project.safeRelativePath("../geheim.txt")).toThrow(); });