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 默认密钥已清空
This commit is contained in:
2026-09-29 09:43:13 +08:00
commit 3271fee5cc
360 changed files with 86082 additions and 0 deletions

View File

@@ -0,0 +1,95 @@
"""
Chemistry-related data for equation formatting.
This module contains chemical elements, groups, and variables used for
detecting and formatting chemistry equations.
"""
# Multi-character chemical elements (2 chars)
# These are STRONG indicators - their presence alone triggers chemistry detection
MULTI_CHAR_ELEMENTS = {
# Period 2
'He', 'Li', 'Be', 'Ne',
# Period 3
'Na', 'Mg', 'Al', 'Si', 'Cl', 'Ar',
# Period 4
'Ca', 'Sc', 'Ti', 'Cr', 'Mn', 'Fe', 'Co', 'Ni', 'Cu', 'Zn',
'Ga', 'Ge', 'As', 'Se', 'Br', 'Kr',
# Period 5
'Rb', 'Sr', 'Zr', 'Nb', 'Mo', 'Tc', 'Ru', 'Rh', 'Pd', 'Ag', 'Cd',
'In', 'Sn', 'Sb', 'Te', 'Xe',
# Period 6
'Cs', 'Ba', 'La', 'Ce', 'Pr', 'Nd', 'Pm', 'Sm', 'Eu', 'Gd', 'Tb', 'Dy',
'Ho', 'Er', 'Tm', 'Yb', 'Lu', 'Hf', 'Ta', 'Re', 'Os', 'Ir', 'Pt',
'Au', 'Hg', 'Tl', 'Pb', 'Bi', 'Po', 'At', 'Rn',
# Period 7
'Fr', 'Ra', 'Ac', 'Th', 'Pa', 'Np', 'Pu', 'Am', 'Cm', 'Bk', 'Cf',
'Es', 'Fm', 'Md', 'No', 'Lr', 'Rf', 'Db', 'Sg', 'Bh', 'Hs', 'Mt', 'Ds',
'Rg', 'Cn', 'Nh', 'Fl', 'Mc', 'Lv', 'Ts', 'Og'
}
# Single-character chemical elements (1 char)
# These need CONTEXT - only formatted as chemistry when chemistry equation is detected
SINGLE_CHAR_ELEMENTS = {
'H', # Hydrogen
'B', # Boron
'C', # Carbon
'N', # Nitrogen
'O', # Oxygen
'F', # Fluorine
'P', # Phosphorus
'S', # Sulfur
'K', # Potassium (but also common variable)
'V', # Vanadium (but also common variable for volume)
'Y', # Yttrium
'I', # Iodine
'W', # Tungsten
'U', # Uranium
}
# All chemical elements (for formatting once chemistry is detected)
ALL_CHEMICAL_ELEMENTS = MULTI_CHAR_ELEMENTS | SINGLE_CHAR_ELEMENTS
# Chemical groups and radicals (strong indicators)
CHEMICAL_GROUPS = {
'OH', # Hydroxide
'SO', # Sulfite/Sulfate (partial)
'NO', # Nitrite/Nitrate (partial)
'CO', # Carbonyl/Carbonate (partial)
'NH', # Amine/Ammonium (partial)
'CH', # Methine/Hydrocarbon (partial)
'PO', # Phosphate (partial)
'ClO', # Chlorate (partial)
}
# Common chemistry variables (should stay italic even in chemistry equations)
# These are NOT chemical elements, they're variables used in chemistry
# NOTE: Keep this list minimal to avoid conflicts with fragmented elements
CHEMISTRY_VARIABLES = {
'c', # Concentration
# NOTE: 'n' removed - conflicts with fragmented Mn (Manganese)
# NOTE: 'M' removed - conflicts with fragmented Mn, Mg (Magnesium)
'p', # Pressure (but P is Phosphorus!)
'T', # Temperature
'm', # Mass
'R', # Gas constant
'E', # Energy (but E is also used in chemistry)
# NOTE: 'V' removed - conflicts with V (Vanadium)
# NOTE: 'K' removed - conflicts with K (Potassium)
# Generic math variables
'x', 'y', 'z',
'a', 'b', 'd', 'q',
}
# Chinese chemical conditions/terms
CHINESE_CHEMICAL_TERMS = {
'高温', # High temperature
'加热', # Heating
'催化剂', # Catalyst
'点燃', # Ignition
'电解', # Electrolysis
'控温', # Temperature control
'加压', # Pressurization
'光照', # Light
'通电', # Electrify
}