""" Costanti di modulo condivise tra i moduli di trasformazione. Tutte le regex compilate e le mappe statiche vivono qui. """ import re # ─── Keyword sets ───────────────────────────────────────────────────────────── _TOC_KEYWORDS = frozenset([ "indice", "index", "contents", "table of contents", "sommario", "inhaltsverzeichnis", "inhalt", "indice generale", "indice analitico", "indice dei contenuti", "elenco dei capitoli", "argomenti", "table des matières", "tabla de contenidos", "содержание", ]) _ORDINALS_IT = { "PRIMO": "I", "SECONDO": "II", "TERZO": "III", "QUARTO": "IV", "QUINTO": "V", "SESTO": "VI", "SETTIMO": "VII", "OTTAVO": "VIII", "NONO": "IX", "DECIMO": "X", } _ORDINALS_EN = { "ONE": "1", "TWO": "2", "THREE": "3", "FOUR": "4", "FIVE": "5", "SIX": "6", "SEVEN": "7", "EIGHT": "8", "NINE": "9", "TEN": "10", } # ─── PUA Symbol font map ────────────────────────────────────────────────────── _SYMBOL_PUA_MAP: dict[str, str] = { "": " ", "": "(", "": ")", "": "+", "": "−", "": ".", "": "/", "": "0", "": "1", "": "2", "": "3", "": "4", "": "5", "": "6", "": "7", "": "8", "": "9", "": ":", "": ";", "": "<", "": "=", "": ">", "": "≅", "": "Α", "": "Β", "": "Χ", "": "Δ", "": "Ε", "": "Φ", "": "Γ", "": "Η", "": "Ι", "": "ϑ", "": "Κ", "": "Λ", "": "Μ", "": "Ν", "": "Ο", "": "Π", "": "Θ", "": "Ρ", "": "Σ", "": "Τ", "": "Υ", "": "ς", "": "Ω", "": "Ξ", "": "Ψ", "": "Ζ", "": "[", "": "∴", "": "]", "": "⊥", "": "α", "": "β", "": "χ", "": "δ", "": "ε", "": "φ", "": "γ", "": "η", "": "ι", "": "ϕ", "": "κ", "": "λ", "": "μ", "": "ν", "": "ο", "": "π", "": "θ", "": "ρ", "": "σ", "": "τ", "": "υ", "": "ϖ", "": "ω", "": "ξ", "": "ψ", "": "ζ", "": "{", "": "|", "": "}", "": "~", "": "±", "": "•", "": "√", "": "≤", "": "≥", "": "∝", "": "×", "": "÷", "": "×", "": "≠", "": "≠", "": "≥", "": "′", "": "*", "": ",", "": "≤", "": "•", "": "•", "": "→", "": "÷", "": "", "": "→", "": "", "": "", "": "", "": "", # TeX Computer Modern bracket/delimiter pieces (U+F8EB–F8FE) → stringa vuota "": "", # TeX large paren left "": "", # TeX large paren extension "": "", # TeX large paren right "": "", # TeX large paren right ext "": "", # TeX large bracket left "": "", # TeX large bracket ext "": "", # TeX brace top-left "": "", # TeX brace mid "": "", # TeX brace mid-right "": "", # TeX brace extension "": "", # TeX brace right "": "", # TeX bracket right large "": "", # TeX bracket right ext "": "", # TeX bracket right close "": "", # TeX integral large "": "", # TeX integral extension "": "", # TeX integral top "": "", # TeX radical top "": "", # TeX radical extension "": "", # TeX arrowhead } _SYMBOL_PUA_RE = re.compile( "[" + "".join(re.escape(k) for k in _SYMBOL_PUA_MAP) + "]" ) # ─── Regex compilate condivise ──────────────────────────────────────────────── _SUPERSCRIPT_RE = re.compile(r'[¹²³⁰⁴-⁹]+') _FOOTNOTE_BODY_RE = re.compile( r'^([¹²³⁰⁴-⁹]+\s+|\[\d{1,3}\]\s+)' ) _NUMBERED_HDR_RE = re.compile( r"^(#{1,6})\s+(\d+(?:\.\d+)*)\.\s+(.+)$", re.MULTILINE, ) _BIB_MARKERS_RE = re.compile( r'\b(pp?\.|vol\.|n\.\s*\d|ed\.|edn\.|ISBN|DOI|arXiv)\b' r'|\b(19|20)\d{2}\b' r'|\b(ibid\.?|ibidem|op\.\s*cit\.?|cit\.|cfr\.|ivi[,;\s])\b', re.IGNORECASE, ) # Pattern autore accademico: iniziale maiuscola + cognome TUTTO-MAIUSCOLO (es. "A. SMITH") _FOOTNOTE_AUTHOR_RE = re.compile(r'(?\s*$") _STANDALONE_NUM_RE = re.compile(r"(?m)^(?:- )?\d{1,3}$") _UNDERSCORE_SEP_RE = re.compile(r"(?m)^_{4,}\s*$")