MATIAS Nicolas
hf version
52f789b
Raw
History Blame Contribute Delete
2.67 kB
"""LaTeX formatting helpers for ITU document generation.
Provides functions to escape text for LaTeX, generate hyperlinks,
and format table rows matching the existing template structure.
"""
import os
URL = "https://www.itu.int"
# Characters that need escaping in LaTeX text
_LATEX_SPECIAL = {
'&': r'\&',
'%': r'\%',
'$': r'\$',
'#': r'\#',
'_': r'\_',
'{': r'\{',
'}': r'\}',
'~': r'\textasciitilde{}',
'^': r'\textasciicircum{}',
}
def escape_latex(text):
"""Escape special LaTeX characters in plain text.
Does NOT escape backslash (to allow embedded LaTeX commands when needed).
"""
if not text:
return ""
result = []
for ch in str(text):
result.append(_LATEX_SPECIAL.get(ch, ch))
return ''.join(result)
def make_href(url, text):
"""Generate a LaTeX \\href{url}{text} hyperlink.
Escapes special LaTeX characters in URLs so they work correctly
inside \\newcommand definitions (where %, &, # are interpreted
before \\href can process them).
"""
safe_url = url.replace('%', '\\%').replace('&', '\\&').replace('#', '\\#')
return f"\\href{{{safe_url}}}{{{escape_latex(text)}}}"
def td_href(table_row, prefix="TD", suffix=""):
"""Generate a hyperlink for a temporary document reference.
Args:
table_row: TableRow object with number.link and number.value
prefix: 'TD', 'C', etc.
suffix: Optional suffix like '/1' for WP number
Returns:
LaTeX href string, e.g. \\href{url}{TD123R1/1}
"""
display = f"{prefix}{table_row.number.value}{table_row.lastRev}"
if suffix:
display += suffix
return make_href(URL + table_row.number.link, display)
def write_result(output_dir, filename, content):
"""Write a LaTeX snippet to the results directory.
Args:
output_dir: Path to the results/ directory
filename: Name of the .tex file to write
content: LaTeX content string
"""
os.makedirs(output_dir, exist_ok=True)
filepath = os.path.join(output_dir, filename)
with open(filepath, "w", encoding="utf-8") as f:
f.write(content)
print(f" Generated {filepath}")
def table_row_str(cells):
"""Format a list of cell values as a LaTeX longtable row.
Returns: 'cell1 & cell2 & ... \\\\\n\\hline\n'
"""
return " & ".join(str(c) for c in cells) + " \\\\\n\\hline\n"
def seqsplit_text(text):
"""Wrap text in \\seqsplit{} to allow breaking anywhere.
Use for long identifiers like work item names (X.suppl1.cattle_auth).
"""
if not text:
return ""
return f"\\seqsplit{{{escape_latex(text)}}}"