Files
Quentin 3271fee5cc init: WordFileParse docx→HTML 解析服务(含 Word EQ 域公式修复)
服务:Spring Boot 3.2 + docx4j 8.3.9,POST /api/v3/server_office_file/file/parse
      接受 .docx,返回 HTML(公式 → LaTeX,图片 → RustFS 外链)

公式支持三类来源:
- OMML(Word 2007+ 公式)      → Python omml_mathml2latex
- MathType OLE 对象            → Ruby mathtype2mathml → MathML → LaTeX
- Word EQ 域(老教辅主力)      → EqToLatexUtil(本次新增)

本次改动:
1. 新增 java-svc/.../core/EqToLatexUtil.java:
   移植自 jby backend-services office-core,EQ 语法 → LaTeX
   (\f→\dfrac、\r→\sqrt、\i→\int/\sum/\prod、\s→^{}/_{}、\b→\left\right、
     \a→array、\x→\boxed/\overline、\o\al 堆叠、圈码、化学符号、极限、连等式)
   品牌标记 JBYU* → WPU*,与采集端一致
2. CtoMathFinder:接上 EQ 分支(原为 not-ported 桩),域代码经
   EqToLatexUtil.convert 转 LaTeX 写入 eqLatexMap(WPEQNUM 占位符)
3. WordParseUtil.dealPlaceholder:EQ 的 LaTeX 同样加 \( \) 包裹
   (原先因 WPEQNUM 例外不加包裹,前端/MathJax 不渲染)

修前症状:教辅 Word 里分式/方程组/上下标整段丢失(如 {−1/3, 1} 变成 {-,1})
修后实测:46 份教辅 2908 处 EQ 域全部还原,公式总数 2954 处、零未包裹残留

安全:application.yml(含 RustFS 密钥)不入库,提供 application.yml.example;
      OssService 的 @Value 默认密钥已清空
2026-09-29 09:43:13 +08:00

66 lines
2.5 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
Operator and symbol set definitions for MathML to LaTeX conversion.
This module provides:
- Mathematical symbol sets for symbol detection
- Summation symbol mappings
- Font to LaTeX command mappings
- Large operator definitions (Unicode versions)
"""
# Mathematical symbol set for symbol detection
MATH_SYMBOLS_SET = {
"↑", "↓", "→", "←", "↔", "×", "⋅", "·", "÷", "∕", "−", # Added U+2212 MINUS SIGN
"∩", "∪", "⊂", "⊃", "⊆", "⊇", "∈", "∉", "∋", "∌",
"≤", "≥", "≠", "≈", "≅", "≡", "≢", "∼", "≃", "≄",
"≜", "≝", "≞", "≟", "≦", "≧", "≨", "≩", "≲", "≳", "≴", "≵", "≶", "≷", "≸", "≹",
"≺", "≻", "⪯", "⪰", "∝", "⊥",
"∥", "∦", "±", "∓", "∗", "∘", "∙", "√", "∞",
"∂", "∇", "∆", "∫", "∬", "∭", "∮", "∯", "∰",
"∑", "∏", "∐", "⋃", "⋂", "⋁", "⋀", "⨁", "⨂", "⨄",
"∀", "∃", "∄", "⊢", "⊣", "⊤", "⊥", "¬", "∧", "∨",
"⟨", "⟩", "⌊", "⌋", "⌈", "⌉", "⏞", "⏟", "∠", "∁"
}
# Summation symbols for specific processing
SUMMATION_SYMBOLS = {
'∑': 'sum',
'∏': 'prod',
'∫': 'integral',
'Σ': 'sum',
'Π': 'prod'
}
# Font family to LaTeX command mapping
FONT_TO_LATEX = {
'Times New Roman': 'mathrm', # Roman/upright text
'Times': 'mathrm', # Times font variant
'Cambria Math': None, # Default math font (no special formatting)
'Cambria': None, # Cambria variant
'Arial': 'mathsf', # Sans-serif
'Helvetica': 'mathsf', # Helvetica sans-serif
'Courier New': 'mathtt', # Typewriter/monospace
'Courier': 'mathtt', # Courier variant
'Computer Modern': None, # LaTeX default math font
'Latin Modern Math': None, # Modern LaTeX math font
}
# Large operators that should use \limits in display mode (LaTeX commands)
LARGE_OPERATORS = [
"\\sum", "\\prod", "\\int", "\\iint", "\\iiint", "\\oint",
"\\bigcup", "\\bigcap", "\\bigvee", "\\bigwedge",
"\\bigoplus", "\\bigotimes", "\\biguplus", "\\coprod",
"\\lim", "\\limsup", "\\liminf", "\\sup", "\\inf",
"\\max", "\\min"
]
# Unicode large operators for detection
LARGE_OPERATORS_UNICODE = [
"∑", "Σ", # Summation
"∏", "Π", # Product
"∫", # Integral
"⋃", "⋂", # Union, Intersection
"⋁", "⋀", # Logical OR, AND
"⨁", "⨂", "⨄", # Direct sum, tensor product, union
]