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:
204
scripts/omml_mathml2latex/README.md
Normal file
204
scripts/omml_mathml2latex/README.md
Normal file
@@ -0,0 +1,204 @@
|
||||
# Refactor - Standalone OMML/MathML to LaTeX Converter
|
||||
|
||||
**Version:** 1.0.0
|
||||
**Status:** Production-ready standalone module
|
||||
**Size:** 836KB | 75 Python files | ~19,000 lines of code
|
||||
|
||||
## Overview
|
||||
|
||||
This is a fully standalone, production-ready OMML/MathML to LaTeX converter module that has been refactored from the original `omml_to_tex` package. It uses modern design patterns and has **zero external dependencies** on the parent package.
|
||||
|
||||
### Key Features
|
||||
|
||||
- ✅ **Fully Standalone**: No dependencies on `omml_to_tex` package
|
||||
- ✅ **Production Ready**: All necessary code copied and integrated
|
||||
- ✅ **Clean Architecture**: Uses Visitor, Strategy, and Pipeline patterns
|
||||
- ✅ **Comprehensive**: Includes all data, utils, processing, and core modules
|
||||
- ✅ **Modular**: Well-organized package structure
|
||||
|
||||
## Architecture
|
||||
|
||||
```
|
||||
refactor/
|
||||
├── __init__.py # Package entry point
|
||||
├── __main__.py # CLI entry point
|
||||
│
|
||||
├── data/ # Symbol mappings and constants (7 files)
|
||||
│ ├── symbols.py # Unicode to LaTeX mappings (200+ symbols)
|
||||
│ ├── functions.py # Mathematical functions (50+)
|
||||
│ ├── operators.py # Operator definitions
|
||||
│ ├── patterns.py # Regex patterns for processing
|
||||
│ └── units.py # Common units
|
||||
│
|
||||
├── utils/ # Utility functions (6 files)
|
||||
│ ├── xml_utils.py # XML/MathML processing
|
||||
│ ├── helpers.py # Helper functions
|
||||
│ ├── chemistry.py # Chemistry detection
|
||||
│ ├── text_processing.py # Text I/O and LaTeX formatting
|
||||
│ └── color_helpers.py # Color processing
|
||||
│
|
||||
├── core/ # Core infrastructure (6 files)
|
||||
│ ├── interfaces.py # Abstract base classes
|
||||
│ ├── context.py # Conversion context
|
||||
│ ├── pipeline.py # Pipeline orchestrator
|
||||
│ ├── xslt_transformer.py # OMML to MathML transformation
|
||||
│ └── omml_parser_core.py # OMML parser (84K lines)
|
||||
│
|
||||
├── parsers/ # Input parsers (5 files)
|
||||
│ ├── factory.py # Parser factory
|
||||
│ ├── docx_parser.py # DOCX file parsing
|
||||
│ ├── omml_parser.py # OMML parsing
|
||||
│ └── mathml_parser.py # MathML parsing
|
||||
│
|
||||
├── processing/ # Processing modules (5 files)
|
||||
│ ├── omml_extractor.py # Extract OMML from DOCX
|
||||
│ ├── docx_processor.py # DOCX processing
|
||||
│ ├── output_formatter.py # LaTeX formatting
|
||||
│ └── result.py # Result data structures
|
||||
│
|
||||
├── visitors/ # Visitor pattern (35 files)
|
||||
│ ├── mi_visitor.py # <mi> identifier handling
|
||||
│ ├── mo_visitor.py # <mo> operator handling
|
||||
│ ├── mn_visitor.py # <mn> number handling
|
||||
│ ├── mfrac_visitor.py # <mfrac> fraction handling
|
||||
│ └── ... # 30+ more element visitors
|
||||
│
|
||||
├── strategies/ # Strategy pattern (5 files)
|
||||
│ ├── math_strategy.py # Mathematical notation
|
||||
│ ├── chemistry_strategy.py # Chemical equations
|
||||
│ ├── physics_strategy.py # Physics notation
|
||||
│ └── statistics_strategy.py # Statistical notation
|
||||
│
|
||||
├── builders/ # Builder pattern (2 files)
|
||||
│ └── latex_builder.py # LaTeX construction
|
||||
│
|
||||
├── compat/ # Compatibility layer (2 files)
|
||||
│ └── legacy_adapter.py # Legacy converter adapter
|
||||
│
|
||||
└── converters/ # Converters (2 files)
|
||||
└── post_processor.py # LaTeX post-processing
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
### Command Line
|
||||
|
||||
```bash
|
||||
# Convert DOCX file
|
||||
uv run python -m refactor --docx document.docx --output equations.tex
|
||||
# Convert MathML
|
||||
uv run python -m refactor --mathml input.xml --output output.tex
|
||||
|
||||
# Convert with chemistry mode
|
||||
uv run python -m refactor --subject chemistry --docx chemistry.docx
|
||||
|
||||
# Convert OMML
|
||||
uv run python -m refactor --omml input.xml --output output.tex
|
||||
```
|
||||
|
||||
### Python API
|
||||
|
||||
```python
|
||||
from refactor.compat import LegacyMathMLToTeXConverter
|
||||
from refactor.parsers import InputParserFactory
|
||||
|
||||
# Create converter
|
||||
converter = LegacyMathMLToTeXConverter(subject_mode='chemistry')
|
||||
|
||||
# Parse input
|
||||
parser = InputParserFactory.create_parser('mathml', 'input.xml')
|
||||
mathml_equations = parser.parse()
|
||||
|
||||
# Convert to LaTeX
|
||||
for mathml in mathml_equations:
|
||||
latex = converter.convert(mathml)
|
||||
print(latex)
|
||||
```
|
||||
|
||||
## Dependencies
|
||||
|
||||
This module is **completely standalone** and only requires:
|
||||
- Python 3.7+
|
||||
- lxml (for XML processing)
|
||||
|
||||
No dependency on the parent `omml_to_tex` package!
|
||||
|
||||
## Design Patterns Used
|
||||
|
||||
1. **Visitor Pattern**: Each MathML element type has its own visitor class
|
||||
2. **Strategy Pattern**: Subject-specific formatting (math, chemistry, physics)
|
||||
3. **Pipeline Pattern**: Explicit conversion stages
|
||||
4. **Builder Pattern**: Fluent LaTeX construction
|
||||
5. **Factory Pattern**: Unified input parsing
|
||||
|
||||
## What Was Changed
|
||||
|
||||
### Copied Modules (from omml_to_tex/)
|
||||
|
||||
- ✅ `data/` - All symbol mappings and constants
|
||||
- ✅ `utils/` - XML utilities, helpers, chemistry detection
|
||||
- ✅ `processing/` - DOCX processing, OMML extraction, formatting
|
||||
- ✅ `core/` - XSLT transformer, OMML parser
|
||||
|
||||
### Updated Imports
|
||||
|
||||
All 53 files that imported from `omml_to_tex` were updated to use relative imports:
|
||||
- `from omml_to_tex.data import X` → `from ..data import X`
|
||||
- `from omml_to_tex.utils import Y` → `from ..utils import Y`
|
||||
- etc.
|
||||
|
||||
### Removed Files
|
||||
|
||||
- ❌ All test files (`tests/` directory, ~50 files)
|
||||
- ❌ All documentation files (`*.md`, ~15 files)
|
||||
- ❌ Demo and benchmark files
|
||||
- ❌ Empty `stages/` directory
|
||||
- ❌ Nested `refactor/refactor/` directory
|
||||
|
||||
## File Statistics
|
||||
|
||||
```
|
||||
Total Python files: 75
|
||||
Total lines of code: ~19,000
|
||||
Package size: 836KB
|
||||
Visitor files: 35
|
||||
Strategy files: 4
|
||||
Data modules: 5
|
||||
Utility modules: 5
|
||||
```
|
||||
|
||||
## Testing
|
||||
|
||||
The module has been verified to:
|
||||
- ✅ Import successfully as a standalone module
|
||||
- ✅ Have no dependencies on `omml_to_tex` package
|
||||
- ✅ Contain all necessary code and data
|
||||
- ✅ Use consistent relative imports throughout
|
||||
|
||||
## Production Deployment
|
||||
|
||||
To deploy this module to your system:
|
||||
|
||||
1. **Copy the entire `refactor/` directory** to your target location
|
||||
2. **Install dependencies**: `pip install lxml`
|
||||
3. **Verify installation**: `python -m refactor --help`
|
||||
4. **Test conversion**: `python -m refactor --docx your_file.docx`
|
||||
|
||||
The module is completely self-contained and ready for production use!
|
||||
|
||||
## Version History
|
||||
|
||||
**v1.0.0** (2025-10-26)
|
||||
- Initial standalone release
|
||||
- Copied all necessary modules from omml_to_tex
|
||||
- Updated all imports to use relative imports
|
||||
- Removed test and documentation files
|
||||
- Verified standalone functionality
|
||||
|
||||
## License
|
||||
|
||||
Same as parent project (omml_to_tex)
|
||||
|
||||
## Contact
|
||||
|
||||
For issues or questions, refer to the parent project documentation.
|
||||
Reference in New Issue
Block a user