diff --git a/src/lib/htmlUtils.ts b/src/lib/htmlUtils.ts index b39a28f..9e4a3b6 100644 --- a/src/lib/htmlUtils.ts +++ b/src/lib/htmlUtils.ts @@ -17,9 +17,10 @@ const HTML_PATTERNS = { /** * Placeholder patterns for temporary replacement + * Using a format that's less likely to be modified by translation services */ -const PLACEHOLDER_PREFIX = "__DEEPLX_PRESERVE_"; -const PLACEHOLDER_SUFFIX = "__"; +const PLACEHOLDER_PREFIX = "ĦĐŁXĦ"; +const PLACEHOLDER_SUFFIX = "ĦĐŁXĦ"; /** * Storage for preserved content during translation @@ -39,7 +40,10 @@ function createPlaceholder( content: string, preserved: PreservedContent ): string { - const placeholder = `${PLACEHOLDER_PREFIX}${preserved.counter}${PLACEHOLDER_SUFFIX}`; + // Use a more unique format that's less likely to be translated + const placeholder = `${PLACEHOLDER_PREFIX}${preserved.counter + .toString() + .padStart(3, "0")}${PLACEHOLDER_SUFFIX}`; preserved.placeholders.set(placeholder, content); preserved.counter++; return placeholder; @@ -93,12 +97,14 @@ export function restoreHtmlContent( ): string { let restoredText = translatedText; - // Restore all preserved content + // Restore all preserved content - handle case-insensitive matching for (const [placeholder, originalContent] of preserved.placeholders) { - restoredText = restoredText.replace( - new RegExp(placeholder, "g"), - originalContent + // Create case-insensitive regex to handle lowercase conversion + const regex = new RegExp( + placeholder.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), + "gi" ); + restoredText = restoredText.replace(regex, originalContent); } // Additional cleanup: fix any remaining Chinese colons that might have been introduced diff --git a/tests/lib/htmlUtils.test.ts b/tests/lib/htmlUtils.test.ts index 0a2a083..3a8eb1d 100644 --- a/tests/lib/htmlUtils.test.ts +++ b/tests/lib/htmlUtils.test.ts @@ -36,7 +36,7 @@ describe("HTML Utils", () => { expect(processedText).not.toContain(""); // Should contain placeholders - expect(processedText).toContain("__DEEPLX_PRESERVE_"); + expect(processedText).toContain("ĦĐŁXĦ"); // Restore should bring back original content const restoredText = restoreHtmlContent(processedText, preserved); @@ -49,7 +49,7 @@ describe("HTML Utils", () => { // The processed text should not contain colons expect(processedText).not.toContain(":"); - expect(processedText).toContain("__DEEPLX_PRESERVE_"); + expect(processedText).toContain("ĦĐŁXĦ"); // Restore should bring back original colon const restoredText = restoreHtmlContent(processedText, preserved); @@ -66,7 +66,7 @@ describe("HTML Utils", () => { expect(processedText).not.toContain(":"); // Should contain placeholders - expect(processedText).toContain("__DEEPLX_PRESERVE_"); + expect(processedText).toContain("ĦĐŁXĦ"); // Restore should bring back all original content const restoredText = restoreHtmlContent(processedText, preserved); @@ -92,6 +92,21 @@ describe("HTML Utils", () => { expect(restoredText).toContain("Hello: 世界:extra"); expect(restoredText).not.toContain(":"); }); + + it("should handle placeholders being converted to lowercase", () => { + const originalText = "A B "; + const { processedText, preserved } = preserveHtmlContent(originalText); + + // Simulate what happens when placeholders get converted to lowercase + const lowercasePlaceholders = processedText.toLowerCase(); + + const restoredText = restoreHtmlContent(lowercasePlaceholders, preserved); + + // Should restore the original HTML tags correctly + expect(restoredText).toBe("a b "); + expect(restoredText).toContain(""); + expect(restoredText).toContain(""); + }); }); describe("sanitizeHtmlContent", () => {