// Edge cases: math, special chars, Markdown HTML — non-destructive model. "use strict"; const { JSDOM } = require("jsdom"); const fs = require("fs"); const path = require("path"); const src = fs.readFileSync(path.join(__dirname, "../src/content.js"), "utf8"); let passed = 0, failed = 0; function assert(label, cond, got) { if (cond) { console.log("PASS " + label); passed++; } else { console.log("FAIL " + label + (got !== undefined ? " — got: " + JSON.stringify(String(got).slice(0, 80)) : "")); failed++; } } function makeDOM(bodyHTML, settings) { settings = Object.assign({ enabled: true, fixDirection: true, useFont: true, fixInputs: true, disabledSites: [] }, settings || {}); const dom = new JSDOM("" + bodyHTML + "", { url: "https://example.com/", runScripts: "dangerously" }); const win = dom.window; win.chrome = { runtime: { getURL: (p) => "chrome-extension://test/" + p, lastError: null }, storage: { local: { get: (d, cb) => cb(settings), set: () => {} }, onChanged: { addListener: () => {} } } }; const s = win.document.createElement("script"); s.textContent = src; win.document.head.appendChild(s); return dom; } console.log("=== Math Characters ==="); { const dom = makeDOM("

The formula is ∑(n=0..∞) = π × r² ± ε

"); const p = dom.window.document.getElementById("t"); assert("math-only: no dir", !p.hasAttribute("dir"), p.getAttribute("dir")); assert("math-only: no font change", !p.style.fontFamily); assert("math-only: text unchanged", p.textContent === "The formula is ∑(n=0..∞) = π × r² ± ε"); } { const dom = makeDOM("

مساحت دایره برابر است با π × r²

"); const p = dom.window.document.getElementById("t"); assert("persian+math: dir=rtl", p.getAttribute("dir") === "rtl", p.getAttribute("dir")); assert("persian+math: Vazirmatn applied", p.style.fontFamily.toLowerCase().includes("vazirmatn")); assert("persian+math: π preserved in text", p.textContent.includes("π")); } console.log("\n=== Special Characters ==="); { const dom = makeDOM("

Copyright © 2024 → All rights reserved ™

"); const p = dom.window.document.getElementById("t"); assert("special-only: no dir", !p.hasAttribute("dir")); assert("special-only: no font change", !p.style.fontFamily); } { const dom = makeDOM("

محصول جدید ما → قیمت: ۱۲۰ تومان ©

"); const p = dom.window.document.getElementById("t"); assert("persian+special: dir=rtl", p.getAttribute("dir") === "rtl", p.getAttribute("dir")); assert("persian+special: © and → preserved", p.textContent.includes("©") && p.textContent.includes("→")); } console.log("\n=== ZWNJ (Persian word joiner) ==="); { const ZWNJ = "‌"; const dom = makeDOM("

می" + ZWNJ + "خواهم برگردم

"); const p = dom.window.document.getElementById("t"); // No wrapping → ZWNJ can never split a word now. Text is byte-identical. assert("ZWNJ: text byte-identical (no splitting possible)", p.textContent === "می" + ZWNJ + "خواهم برگردم"); assert("ZWNJ: dir=rtl", p.getAttribute("dir") === "rtl"); } console.log("\n=== Markdown-rendered HTML ==="); { const dom = makeDOM("
const سلام = 'hello'; // فارسی
"); const code = dom.window.document.getElementById("t"); assert("MD code block: no dir", !code.hasAttribute("dir")); assert("MD code block: no font change", !code.style.fontFamily); } { const dom = makeDOM("

Use تابع() to call it. این متن فارسی است.

"); const p = dom.window.document.getElementById("t"); const code = dom.window.document.getElementById("c"); assert("inline code: code element no font change", !code.style.fontFamily); assert("inline code: English-leading mixed block dir=auto", p.getAttribute("dir") === "auto", p.getAttribute("dir")); } { const dom = makeDOM("

متن فارسی پررنگ and English text here

"); const strong = dom.window.document.getElementById("t"); const p = strong.parentElement; assert("MD bold: font applied to (text's parent)", strong.style.fontFamily.toLowerCase().includes("vazirmatn"), strong.style.fontFamily); assert("MD bold: dir on block

", p.hasAttribute("dir"), p.getAttribute("dir")); } { const dom = makeDOM("

راهنمای استفاده

"); const h1 = dom.window.document.getElementById("t"); assert("MD heading: dir=rtl", h1.getAttribute("dir") === "rtl", h1.getAttribute("dir")); assert("MD heading: Vazirmatn applied", h1.style.fontFamily.toLowerCase().includes("vazirmatn")); } { const dom = makeDOM("

این یک نقل‌قول فارسی است

"); const p = dom.window.document.getElementById("t"); assert("MD blockquote: dir=rtl", p.getAttribute("dir") === "rtl", p.getAttribute("dir")); } { const dom = makeDOM('متن فارسی'); const svgText = dom.window.document.getElementById("t"); if (svgText) assert("SVG text: no dir (skipped)", !svgText.hasAttribute("dir")); else assert("SVG element found", false, "null"); } { const dom = makeDOM('متغیر'); const mi = dom.window.document.getElementById("t"); if (mi) assert("MathML mi: no dir (skipped)", !mi.hasAttribute("dir")); else assert("MathML element found (jsdom may lack support)", true); } console.log("\n" + passed + "/" + (passed + failed) + " passed" + (failed ? " — " + failed + " FAILED" : "")); process.exit(failed ? 1 : 0);