Import documentation: docs/superpowers/specs/2026-07-13-persian-rtl-reliability-design.md
Import the existing local project snapshot. This commit organizes existing files; it does not represent newly developed functionality.
This commit is contained in:
@@ -0,0 +1,93 @@
|
||||
# Persian RTL Reliability Improvement Design
|
||||
|
||||
## Goal
|
||||
|
||||
Improve the Manifest V3 extension so it reliably fixes Persian text direction on dynamic AI chat sites and ordinary websites without rewriting text, changing digits, or disturbing intentionally styled content.
|
||||
|
||||
## Scope
|
||||
|
||||
- Detect Persian text only. Arabic-only and Hebrew text do not trigger changes.
|
||||
- Never change text content, punctuation, or `1234567890` digits.
|
||||
- Work automatically on all supported websites and frames.
|
||||
- Optimize mutation handling for streaming AI responses.
|
||||
- Apply Vazirmatn only when Persian text has no author-specified font.
|
||||
- Simplify and improve the popup, tests, documentation, and encoding integrity.
|
||||
|
||||
## Direction Policy
|
||||
|
||||
The extension uses an adaptive-conservative policy:
|
||||
|
||||
1. Identify Persian-specific letters and marks.
|
||||
2. Inspect meaningful letters and the first strong script in the nearest suitable text block.
|
||||
3. Preserve a sensible explicit `dir` supplied by the site.
|
||||
4. Apply `dir="rtl"` only to clearly Persian blocks.
|
||||
5. Apply `dir="auto"` to uncertain mixed-language blocks.
|
||||
6. Avoid changing large layout containers when a smaller semantic text block is available.
|
||||
|
||||
Every attribute change records its original state and is reversible without reloading the page.
|
||||
|
||||
## Font Policy
|
||||
|
||||
- Any author-specified `font-family` counts as styled, including Arial, generic families, system UI fonts, inherited fonts, inline styles, and web fonts.
|
||||
- Vazirmatn is applied only when no author rule on the element or its ancestors supplies a font family and the element is therefore using the browser default.
|
||||
- English-only elements are untouched.
|
||||
- Existing font weight and style are preserved through bundled regular, medium, and bold faces.
|
||||
- Disabling the feature restores the original inline state.
|
||||
|
||||
The popup exposes one clear font option: **Use Vazirmatn for unstyled Persian text**.
|
||||
|
||||
## Architecture
|
||||
|
||||
The content script is split into focused internal modules or sections:
|
||||
|
||||
- settings and lifecycle
|
||||
- Persian detection and direction classification
|
||||
- author-font detection
|
||||
- DOM target selection and reversible mutations
|
||||
- input handling
|
||||
- mutation batching and shadow-root discovery
|
||||
|
||||
Streaming mutations are coalesced by affected text container. The extension processes changed regions rather than rescanning the complete document for every token.
|
||||
|
||||
## Popup
|
||||
|
||||
The popup shows:
|
||||
|
||||
- the current hostname and active/inactive status
|
||||
- Enable on this site
|
||||
- Conservative Persian RTL correction
|
||||
- Use Vazirmatn for unstyled Persian text
|
||||
- Smart input direction
|
||||
- Master switch
|
||||
|
||||
Dependent controls have accessible disabled states. Switches support keyboard focus, visible focus rings, and status text that does not rely only on color.
|
||||
|
||||
## Error Handling
|
||||
|
||||
- Unsupported/internal browser pages display an unavailable state instead of behaving like an empty hostname.
|
||||
- Storage and tab-query failures fall back safely and expose a concise popup status.
|
||||
- DOM and stylesheet access failures are isolated per element so one unusual page cannot stop processing.
|
||||
- The content script remains idempotent and does not observe its own attribute writes.
|
||||
|
||||
## Verification
|
||||
|
||||
Automated tests cover:
|
||||
|
||||
- real UTF-8 Persian fixtures and an encoding-integrity assertion
|
||||
- Persian-only, Arabic-only, English-only, and mixed text
|
||||
- Latin digits inside Persian text remaining byte-identical
|
||||
- explicit RTL/LTR/auto direction preservation and correction
|
||||
- author fonts from inline, stylesheet, inherited, generic, and custom declarations
|
||||
- browser-default text receiving Vazirmatn
|
||||
- streaming text mutations and batched processing
|
||||
- inputs, code blocks, SVG/MathML, open shadow roots, and reversible teardown
|
||||
- per-site and master settings
|
||||
|
||||
The demo page uses correctly encoded Persian fixtures and includes streaming-chat scenarios.
|
||||
|
||||
## Non-goals
|
||||
|
||||
- Transliteration, translation, numeral conversion, or text rewriting
|
||||
- Hebrew or Arabic-only correction
|
||||
- Fragile site-specific selectors for individual AI products
|
||||
- Closed shadow-root support, which browser extensions cannot access
|
||||
Reference in New Issue
Block a user