BabelDOC 0.5.13__tar.gz → 0.5.15__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {babeldoc-0.5.13 → babeldoc-0.5.15}/PKG-INFO +1 -1
- babeldoc-0.5.15/babeldoc/__init__.py +1 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/const.py +1 -1
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/format/pdf/document_il/midend/automatic_term_extractor.py +16 -5
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/format/pdf/document_il/midend/il_translator.py +32 -33
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/format/pdf/document_il/midend/il_translator_llm_only.py +63 -63
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/format/pdf/high_level.py +6 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/format/pdf/translation_config.py +6 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/main.py +12 -3
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/translator/translator.py +5 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/pyproject.toml +2 -2
- babeldoc-0.5.13/babeldoc/__init__.py +0 -1
- {babeldoc-0.5.13 → babeldoc-0.5.15}/.cursorignore +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/.github/ISSUE_TEMPLATE/bug_report.yaml +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/.github/ISSUE_TEMPLATE/feature_request.yaml +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/.github/PULL_REQUEST_TEMPLATE/pr_form.yml +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/.github/dependabot.yml +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/.github/labels.yml +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/.github/release-drafter.yml +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/.github/workflows/codeql.yml +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/.github/workflows/docs.yml +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/.github/workflows/labeler.yml +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/.github/workflows/lint.yml +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/.github/workflows/pr-lint.yml +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/.github/workflows/publish-to-pypi.yml +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/.github/workflows/test.yml +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/.gitignore +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/.pre-commit-config.yaml +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/LICENSE +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/README.md +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/assets/assets.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/assets/embedding_assets_metadata.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/asynchronize/__init__.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/babeldoc_exception/BabelDOCException.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/babeldoc_exception/__init__.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/docvision/README.md +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/docvision/__init__.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/docvision/base_doclayout.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/docvision/doclayout.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/docvision/rpc_doclayout.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/docvision/rpc_doclayout2.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/docvision/rpc_doclayout3.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/docvision/rpc_doclayout4.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/docvision/rpc_doclayout5.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/docvision/rpc_doclayout6.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/docvision/rpc_doclayout7.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/docvision/table_detection/rapidocr.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/format/__init__.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/format/pdf/__init__.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/format/pdf/babelpdf/base14.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/format/pdf/babelpdf/cidfont.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/format/pdf/babelpdf/encoding.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/format/pdf/babelpdf/utils.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/format/pdf/babelpdf/win_core.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/format/pdf/converter.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/format/pdf/document_il/__init__.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/format/pdf/document_il/backend/__init__.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/format/pdf/document_il/backend/pdf_creater.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/format/pdf/document_il/frontend/__init__.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/format/pdf/document_il/frontend/il_creater.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/format/pdf/document_il/il_version_1.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/format/pdf/document_il/il_version_1.rnc +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/format/pdf/document_il/il_version_1.rng +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/format/pdf/document_il/il_version_1.xsd +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/format/pdf/document_il/midend/__init__.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/format/pdf/document_il/midend/add_debug_information.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/format/pdf/document_il/midend/detect_scanned_file.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/format/pdf/document_il/midend/layout_parser.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/format/pdf/document_il/midend/paragraph_finder.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/format/pdf/document_il/midend/remove_descent.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/format/pdf/document_il/midend/styles_and_formulas.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/format/pdf/document_il/midend/table_parser.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/format/pdf/document_il/midend/typesetting.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/format/pdf/document_il/utils/__init__.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/format/pdf/document_il/utils/extract_char.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/format/pdf/document_il/utils/fontmap.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/format/pdf/document_il/utils/formular_helper.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/format/pdf/document_il/utils/layout_helper.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/format/pdf/document_il/utils/matrix_helper.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/format/pdf/document_il/utils/mupdf_helper.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/format/pdf/document_il/utils/paragraph_helper.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/format/pdf/document_il/utils/spatial_analyzer.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/format/pdf/document_il/utils/style_helper.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/format/pdf/document_il/utils/zstd_helper.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/format/pdf/document_il/xml_converter.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/format/pdf/pdfinterp.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/format/pdf/result_merger.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/format/pdf/split_manager.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/glossary.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/LICENSE +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/__init__.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/_saslprep.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/arcfour.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/ascii85.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/casting.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/ccitt.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/78-EUC-H.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/78-EUC-V.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/78-H.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/78-RKSJ-H.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/78-RKSJ-V.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/78-V.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/78ms-RKSJ-H.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/78ms-RKSJ-V.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/83pv-RKSJ-H.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/83pv-RKSJ-V.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/90ms-RKSJ-H.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/90ms-RKSJ-V.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/90msp-RKSJ-H.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/90msp-RKSJ-V.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/90pv-RKSJ-H.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/90pv-RKSJ-V.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/Add-H.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/Add-RKSJ-H.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/Add-RKSJ-V.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/Add-V.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/B5-H.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/B5-V.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/B5pc-H.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/B5pc-V.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/CNS-EUC-H.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/CNS-EUC-V.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/CNS1-H.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/CNS1-V.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/CNS2-H.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/CNS2-V.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/ETHK-B5-H.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/ETHK-B5-V.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/ETen-B5-H.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/ETen-B5-V.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/ETenms-B5-H.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/ETenms-B5-V.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/EUC-H.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/EUC-V.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/Ext-H.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/Ext-RKSJ-H.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/Ext-RKSJ-V.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/Ext-V.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/GB-EUC-H.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/GB-EUC-V.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/GB-H.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/GB-V.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/GBK-EUC-H.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/GBK-EUC-V.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/GBK2K-H.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/GBK2K-V.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/GBKp-EUC-H.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/GBKp-EUC-V.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/GBT-EUC-H.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/GBT-EUC-V.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/GBT-H.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/GBT-V.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/GBTpc-EUC-H.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/GBTpc-EUC-V.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/GBpc-EUC-H.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/GBpc-EUC-V.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/H.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/HKdla-B5-H.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/HKdla-B5-V.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/HKdlb-B5-H.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/HKdlb-B5-V.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/HKgccs-B5-H.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/HKgccs-B5-V.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/HKm314-B5-H.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/HKm314-B5-V.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/HKm471-B5-H.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/HKm471-B5-V.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/HKscs-B5-H.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/HKscs-B5-V.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/Hankaku-H.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/Hankaku-V.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/Hiragana-H.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/Hiragana-V.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/KSC-EUC-H.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/KSC-EUC-V.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/KSC-H.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/KSC-Johab-H.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/KSC-Johab-V.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/KSC-V.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/KSCms-UHC-H.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/KSCms-UHC-HW-H.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/KSCms-UHC-HW-V.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/KSCms-UHC-V.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/KSCpc-EUC-H.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/KSCpc-EUC-V.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/Katakana-H.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/Katakana-V.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/NWP-H.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/NWP-V.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/README.txt +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/RKSJ-H.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/RKSJ-V.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/Roman-H.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/Roman-V.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/UniCNS-UCS2-H.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/UniCNS-UCS2-V.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/UniCNS-UTF16-H.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/UniCNS-UTF16-V.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/UniCNS-UTF32-H.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/UniCNS-UTF32-V.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/UniCNS-UTF8-H.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/UniCNS-UTF8-V.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/UniGB-UCS2-H.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/UniGB-UCS2-V.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/UniGB-UTF16-H.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/UniGB-UTF16-V.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/UniGB-UTF32-H.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/UniGB-UTF32-V.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/UniGB-UTF8-H.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/UniGB-UTF8-V.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/UniJIS-UCS2-H.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/UniJIS-UCS2-HW-H.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/UniJIS-UCS2-HW-V.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/UniJIS-UCS2-V.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/UniJIS-UTF16-H.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/UniJIS-UTF16-V.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/UniJIS-UTF32-H.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/UniJIS-UTF32-V.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/UniJIS-UTF8-H.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/UniJIS-UTF8-V.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/UniJIS2004-UTF16-H.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/UniJIS2004-UTF16-V.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/UniJIS2004-UTF32-H.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/UniJIS2004-UTF32-V.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/UniJIS2004-UTF8-H.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/UniJIS2004-UTF8-V.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/UniJISX0213-UTF32-H.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/UniJISX0213-UTF32-V.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/UniJISX02132004-UTF32-H.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/UniJISX02132004-UTF32-V.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/UniKS-UCS2-H.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/UniKS-UCS2-V.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/UniKS-UTF16-H.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/UniKS-UTF16-V.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/UniKS-UTF32-H.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/UniKS-UTF32-V.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/UniKS-UTF8-H.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/UniKS-UTF8-V.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/V.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/WP-Symbol-H.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/WP-Symbol-V.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/to-unicode-Adobe-CNS1.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/to-unicode-Adobe-GB1.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/to-unicode-Adobe-Japan1.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmap/to-unicode-Adobe-Korea1.pickle.gz +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/cmapdb.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/converter.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/data_structures.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/encodingdb.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/fontmetrics.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/glyphlist.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/high_level.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/image.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/jbig2.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/latin_enc.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/layout.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/lzw.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/pdfcolor.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/pdfdevice.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/pdfdocument.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/pdfexceptions.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/pdffont.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/pdfinterp.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/pdfpage.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/pdfparser.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/pdftypes.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/psexceptions.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/psparser.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/py.typed +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/runlength.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/settings.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/pdfminer/utils.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/progress_monitor.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/tools/generate_font_metadata.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/tools/italic_assistance.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/tools/italic_recognize_tool.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/translator/__init__.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/translator/cache.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/utils/__init__.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/utils/atomic_integer.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/utils/priority_thread_pool_executor.py +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/docs/CODE_OF_CONDUCT.md +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/docs/CONTRIBUTING.md +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/docs/CONTRIBUTOR_REWARD.md +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/docs/ImplementationDetails/AsyncTranslate/AsyncTranslate.md +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/docs/ImplementationDetails/ILTranslator/ILTranslator.md +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/docs/ImplementationDetails/PDFCreation/PDFCreation.md +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/docs/ImplementationDetails/PDFParsing/PDFParsing.md +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/docs/ImplementationDetails/ParagraphFinding/ParagraphFinding.md +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/docs/ImplementationDetails/README.md +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/docs/ImplementationDetails/StylesAndFormulas/StylesAndFormulas.md +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/docs/ImplementationDetails/Typesetting/Typesetting.md +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/docs/README.md +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/docs/deploy.sh +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/docs/example/demo_glossary.csv +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/docs/images/babeldoc-banner.png +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/docs/images/babeldoc-big-logo-darkmode-with-transparent-background.png +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/docs/images/babeldoc-big-logo-darkmode-with-transparent-background.svg +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/docs/images/babeldoc-big-logo-with-transparent-background.png +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/docs/images/babeldoc-big-logo-with-transparent-background.svg +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/docs/images/babeldoc-big-logo.png +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/docs/images/babeldoc-contributor_reward_example.png +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/docs/images/babeldoc-preview.gif +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/docs/images/babeldoc-small-logo-with-transparent-background.png +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/docs/images/babeldoc-small-logo-with-transparent-background.svg +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/docs/images/babeldoc-small-logo.png +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/docs/index.md +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/docs/intro-to-pdf-object.md +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/docs/requirements.txt +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/docs/supported_languages.md +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/mkdocs.yml +0 -0
- {babeldoc-0.5.13 → babeldoc-0.5.15}/tests/test_translation_cache_cleanup.py +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "0.5.15"
|
|
@@ -138,18 +138,24 @@ class AutomaticTermExtractor:
|
|
|
138
138
|
except Exception:
|
|
139
139
|
return 0
|
|
140
140
|
|
|
141
|
-
def _snapshot_token_usage(self) -> tuple[int, int, int]:
|
|
141
|
+
def _snapshot_token_usage(self) -> tuple[int, int, int, int]:
|
|
142
142
|
if not self.translate_engine:
|
|
143
|
-
return 0, 0, 0
|
|
143
|
+
return 0, 0, 0, 0
|
|
144
144
|
token_counter = getattr(self.translate_engine, "token_count", None)
|
|
145
145
|
prompt_counter = getattr(self.translate_engine, "prompt_token_count", None)
|
|
146
146
|
completion_counter = getattr(
|
|
147
147
|
self.translate_engine, "completion_token_count", None
|
|
148
148
|
)
|
|
149
|
+
cache_hit_prompt_counter = getattr(
|
|
150
|
+
self.translate_engine, "cache_hit_prompt_token_count", None
|
|
151
|
+
)
|
|
149
152
|
total_tokens = token_counter.value if token_counter else 0
|
|
150
153
|
prompt_tokens = prompt_counter.value if prompt_counter else 0
|
|
151
154
|
completion_tokens = completion_counter.value if completion_counter else 0
|
|
152
|
-
|
|
155
|
+
cache_hit_prompt_tokens = (
|
|
156
|
+
cache_hit_prompt_counter.value if cache_hit_prompt_counter else 0
|
|
157
|
+
)
|
|
158
|
+
return total_tokens, prompt_tokens, completion_tokens, cache_hit_prompt_tokens
|
|
153
159
|
|
|
154
160
|
def _clean_json_output(self, llm_output: str) -> str:
|
|
155
161
|
llm_output = llm_output.strip()
|
|
@@ -327,7 +333,9 @@ class AutomaticTermExtractor:
|
|
|
327
333
|
|
|
328
334
|
def procress(self, doc_il: ILDocument):
|
|
329
335
|
logger.info(f"{self.stage_name}: Starting term extraction for document.")
|
|
330
|
-
start_total, start_prompt, start_completion =
|
|
336
|
+
start_total, start_prompt, start_completion, start_cache_hit_prompt = (
|
|
337
|
+
self._snapshot_token_usage()
|
|
338
|
+
)
|
|
331
339
|
tracker = DocumentTermExtractTracker()
|
|
332
340
|
total = sum(len(page.pdf_paragraph) for page in doc_il.page)
|
|
333
341
|
with self.translation_config.progress_monitor.stage_start(
|
|
@@ -341,11 +349,14 @@ class AutomaticTermExtractor:
|
|
|
341
349
|
self.process_page(page, executor, pbar, tracker.new_page())
|
|
342
350
|
|
|
343
351
|
self.shared_context.finalize_auto_extracted_glossary()
|
|
344
|
-
end_total, end_prompt, end_completion =
|
|
352
|
+
end_total, end_prompt, end_completion, end_cache_hit_prompt = (
|
|
353
|
+
self._snapshot_token_usage()
|
|
354
|
+
)
|
|
345
355
|
self.translation_config.record_term_extraction_usage(
|
|
346
356
|
end_total - start_total,
|
|
347
357
|
end_prompt - start_prompt,
|
|
348
358
|
end_completion - start_completion,
|
|
359
|
+
end_cache_hit_prompt - start_cache_hit_prompt,
|
|
349
360
|
)
|
|
350
361
|
|
|
351
362
|
if self.translation_config.debug:
|
|
@@ -890,6 +890,38 @@ class ILTranslator:
|
|
|
890
890
|
f"You are a professional and reliable machine translation engine responsible for translating the input text into {self.translation_config.lang_out}."
|
|
891
891
|
]
|
|
892
892
|
|
|
893
|
+
llm_input.append("When translating, please follow the following rules:")
|
|
894
|
+
|
|
895
|
+
rich_text_left_placeholder = (
|
|
896
|
+
self.translate_engine.get_rich_text_left_placeholder(1)
|
|
897
|
+
)
|
|
898
|
+
if isinstance(rich_text_left_placeholder, tuple):
|
|
899
|
+
rich_text_left_placeholder = rich_text_left_placeholder[0]
|
|
900
|
+
rich_text_right_placeholder = (
|
|
901
|
+
self.translate_engine.get_rich_text_right_placeholder(2)
|
|
902
|
+
)
|
|
903
|
+
if isinstance(rich_text_right_placeholder, tuple):
|
|
904
|
+
rich_text_right_placeholder = rich_text_right_placeholder[0]
|
|
905
|
+
|
|
906
|
+
# Create a structured prompt template for LLM translation
|
|
907
|
+
llm_input.append(
|
|
908
|
+
f'1. Do not translate style tags, such as "{rich_text_left_placeholder}xxx{rich_text_right_placeholder}"!'
|
|
909
|
+
)
|
|
910
|
+
|
|
911
|
+
formula_placeholder = self.translate_engine.get_formular_placeholder(3)
|
|
912
|
+
if isinstance(formula_placeholder, tuple):
|
|
913
|
+
formula_placeholder = formula_placeholder[0]
|
|
914
|
+
|
|
915
|
+
llm_input.append(
|
|
916
|
+
f'2. Do not translate formula placeholders, such as "{formula_placeholder}". The system will automatically replace the placeholders with the corresponding formulas.'
|
|
917
|
+
)
|
|
918
|
+
llm_input.append(
|
|
919
|
+
"3. If there is no need to translate (such as proper nouns, codes, etc.), then return the original text."
|
|
920
|
+
)
|
|
921
|
+
llm_input.append(
|
|
922
|
+
f"4. Only output the translation result in {self.translation_config.lang_out} without explanations and annotations."
|
|
923
|
+
)
|
|
924
|
+
|
|
893
925
|
llm_context_hints = []
|
|
894
926
|
|
|
895
927
|
if title_paragraph:
|
|
@@ -952,41 +984,8 @@ class ILTranslator:
|
|
|
952
984
|
for md_block in active_glossary_markdown_blocks:
|
|
953
985
|
llm_input.append(f"\n{md_block}\n")
|
|
954
986
|
|
|
955
|
-
llm_input.append("When translating, please follow the following rules:")
|
|
956
|
-
|
|
957
|
-
rich_text_left_placeholder = (
|
|
958
|
-
self.translate_engine.get_rich_text_left_placeholder(1)
|
|
959
|
-
)
|
|
960
|
-
if isinstance(rich_text_left_placeholder, tuple):
|
|
961
|
-
rich_text_left_placeholder = rich_text_left_placeholder[0]
|
|
962
|
-
rich_text_right_placeholder = (
|
|
963
|
-
self.translate_engine.get_rich_text_right_placeholder(2)
|
|
964
|
-
)
|
|
965
|
-
if isinstance(rich_text_right_placeholder, tuple):
|
|
966
|
-
rich_text_right_placeholder = rich_text_right_placeholder[0]
|
|
967
|
-
|
|
968
|
-
# Create a structured prompt template for LLM translation
|
|
969
|
-
llm_input.append(
|
|
970
|
-
f'1. Do not translate style tags, such as "{rich_text_left_placeholder}xxx{rich_text_right_placeholder}"!'
|
|
971
|
-
)
|
|
972
|
-
|
|
973
|
-
formula_placeholder = self.translate_engine.get_formular_placeholder(3)
|
|
974
|
-
if isinstance(formula_placeholder, tuple):
|
|
975
|
-
formula_placeholder = formula_placeholder[0]
|
|
976
|
-
|
|
977
|
-
llm_input.append(
|
|
978
|
-
f'2. Do not translate formula placeholders, such as "{formula_placeholder}". The system will automatically replace the placeholders with the corresponding formulas.'
|
|
979
|
-
)
|
|
980
|
-
llm_input.append(
|
|
981
|
-
"3. If there is no need to translate (such as proper nouns, codes, etc.), then return the original text."
|
|
982
|
-
)
|
|
983
|
-
llm_input.append(
|
|
984
|
-
f"4. Only output the translation result in {self.translation_config.lang_out} without explanations and annotations."
|
|
985
|
-
)
|
|
986
|
-
llm_input.append(f"5. Translate text into {self.translation_config.lang_out}.")
|
|
987
987
|
prompt_template = f"""
|
|
988
988
|
Now, please carefully read the following text to be translated and directly output your translation.\n\n{text}
|
|
989
|
-
|
|
990
989
|
"""
|
|
991
990
|
llm_input.append(prompt_template)
|
|
992
991
|
|
{babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/format/pdf/document_il/midend/il_translator_llm_only.py
RENAMED
|
@@ -643,69 +643,6 @@ class ILTranslatorLLMOnly:
|
|
|
643
643
|
"When translating, strictly follow the instructions below to ensure translation quality and preserve all formatting, tags, and placeholders:\n"
|
|
644
644
|
)
|
|
645
645
|
|
|
646
|
-
# 2. ##Contextual Hints for Better Translation
|
|
647
|
-
contextual_hints_section: list[str] = []
|
|
648
|
-
hint_idx = 1
|
|
649
|
-
if title_paragraph:
|
|
650
|
-
contextual_hints_section.append(
|
|
651
|
-
f"{hint_idx}. First title in full text: {title_paragraph.unicode}"
|
|
652
|
-
)
|
|
653
|
-
hint_idx += 1
|
|
654
|
-
|
|
655
|
-
if local_title_paragraph:
|
|
656
|
-
is_different_from_global = True
|
|
657
|
-
if title_paragraph:
|
|
658
|
-
if local_title_paragraph.debug_id == title_paragraph.debug_id:
|
|
659
|
-
is_different_from_global = False
|
|
660
|
-
|
|
661
|
-
if is_different_from_global:
|
|
662
|
-
contextual_hints_section.append(
|
|
663
|
-
f"{hint_idx}. Most similar section title: {local_title_paragraph.unicode}"
|
|
664
|
-
)
|
|
665
|
-
hint_idx += 1
|
|
666
|
-
|
|
667
|
-
# --- ADD GLOSSARY HINTS ---
|
|
668
|
-
batch_text_for_glossary_matching = "\n".join(
|
|
669
|
-
item.get("input", "") for item in json_format_input
|
|
670
|
-
)
|
|
671
|
-
|
|
672
|
-
active_glossary_markdown_blocks: list[str] = []
|
|
673
|
-
# Use cached glossaries
|
|
674
|
-
if self._cached_glossaries:
|
|
675
|
-
for glossary in self._cached_glossaries:
|
|
676
|
-
# Get active entries for the current batch_text_for_glossary_matching
|
|
677
|
-
active_entries = glossary.get_active_entries_for_text(
|
|
678
|
-
batch_text_for_glossary_matching
|
|
679
|
-
)
|
|
680
|
-
|
|
681
|
-
if active_entries:
|
|
682
|
-
current_glossary_md_entries: list[str] = []
|
|
683
|
-
for original_source, target_text in sorted(active_entries):
|
|
684
|
-
current_glossary_md_entries.append(
|
|
685
|
-
f"| {original_source} | {target_text} |"
|
|
686
|
-
)
|
|
687
|
-
|
|
688
|
-
if current_glossary_md_entries:
|
|
689
|
-
glossary_table_md = (
|
|
690
|
-
f"### Glossary: {glossary.name}\n\n"
|
|
691
|
-
"| Source Term | Target Term |\n"
|
|
692
|
-
"|-------------|-------------|\n"
|
|
693
|
-
+ "\n".join(current_glossary_md_entries)
|
|
694
|
-
)
|
|
695
|
-
active_glossary_markdown_blocks.append(glossary_table_md)
|
|
696
|
-
|
|
697
|
-
if contextual_hints_section or active_glossary_markdown_blocks:
|
|
698
|
-
llm_prompt_parts.append("\n## Contextual Hints for Better Translation")
|
|
699
|
-
llm_prompt_parts.extend(contextual_hints_section)
|
|
700
|
-
|
|
701
|
-
if active_glossary_markdown_blocks:
|
|
702
|
-
llm_prompt_parts.append(
|
|
703
|
-
f"{hint_idx}. You MUST strictly adhere to the following glossaries. auto_extracted_glossary has a lower priority; please give preference to other glossaries. If a source term from a table appears in the text, use the corresponding target term in your translation:"
|
|
704
|
-
)
|
|
705
|
-
# hint_idx += 1 # No need to increment if tables are part of this point
|
|
706
|
-
for md_block in active_glossary_markdown_blocks:
|
|
707
|
-
llm_prompt_parts.append(f"\n{md_block}\n")
|
|
708
|
-
|
|
709
646
|
# 3. ## Strict Rules:
|
|
710
647
|
llm_prompt_parts.append("\n## Strict Rules:")
|
|
711
648
|
llm_prompt_parts.append(
|
|
@@ -771,6 +708,69 @@ class ILTranslatorLLMOnly:
|
|
|
771
708
|
llm_prompt_parts.append("```")
|
|
772
709
|
llm_prompt_parts.append("</example>")
|
|
773
710
|
|
|
711
|
+
# 2. ##Contextual Hints for Better Translation
|
|
712
|
+
contextual_hints_section: list[str] = []
|
|
713
|
+
hint_idx = 1
|
|
714
|
+
if title_paragraph:
|
|
715
|
+
contextual_hints_section.append(
|
|
716
|
+
f"{hint_idx}. First title in full text: {title_paragraph.unicode}"
|
|
717
|
+
)
|
|
718
|
+
hint_idx += 1
|
|
719
|
+
|
|
720
|
+
if local_title_paragraph:
|
|
721
|
+
is_different_from_global = True
|
|
722
|
+
if title_paragraph:
|
|
723
|
+
if local_title_paragraph.debug_id == title_paragraph.debug_id:
|
|
724
|
+
is_different_from_global = False
|
|
725
|
+
|
|
726
|
+
if is_different_from_global:
|
|
727
|
+
contextual_hints_section.append(
|
|
728
|
+
f"{hint_idx}. The most recent title is: {local_title_paragraph.unicode}"
|
|
729
|
+
)
|
|
730
|
+
hint_idx += 1
|
|
731
|
+
|
|
732
|
+
# --- ADD GLOSSARY HINTS ---
|
|
733
|
+
batch_text_for_glossary_matching = "\n".join(
|
|
734
|
+
item.get("input", "") for item in json_format_input
|
|
735
|
+
)
|
|
736
|
+
|
|
737
|
+
active_glossary_markdown_blocks: list[str] = []
|
|
738
|
+
# Use cached glossaries
|
|
739
|
+
if self._cached_glossaries:
|
|
740
|
+
for glossary in self._cached_glossaries:
|
|
741
|
+
# Get active entries for the current batch_text_for_glossary_matching
|
|
742
|
+
active_entries = glossary.get_active_entries_for_text(
|
|
743
|
+
batch_text_for_glossary_matching
|
|
744
|
+
)
|
|
745
|
+
|
|
746
|
+
if active_entries:
|
|
747
|
+
current_glossary_md_entries: list[str] = []
|
|
748
|
+
for original_source, target_text in sorted(active_entries):
|
|
749
|
+
current_glossary_md_entries.append(
|
|
750
|
+
f"| {original_source} | {target_text} |"
|
|
751
|
+
)
|
|
752
|
+
|
|
753
|
+
if current_glossary_md_entries:
|
|
754
|
+
glossary_table_md = (
|
|
755
|
+
f"### Glossary: {glossary.name}\n\n"
|
|
756
|
+
"| Source Term | Target Term |\n"
|
|
757
|
+
"|-------------|-------------|\n"
|
|
758
|
+
+ "\n".join(current_glossary_md_entries)
|
|
759
|
+
)
|
|
760
|
+
active_glossary_markdown_blocks.append(glossary_table_md)
|
|
761
|
+
|
|
762
|
+
if contextual_hints_section or active_glossary_markdown_blocks:
|
|
763
|
+
llm_prompt_parts.append("\n## Contextual Hints for Better Translation")
|
|
764
|
+
llm_prompt_parts.extend(contextual_hints_section)
|
|
765
|
+
|
|
766
|
+
if active_glossary_markdown_blocks:
|
|
767
|
+
llm_prompt_parts.append(
|
|
768
|
+
f"{hint_idx}. You MUST strictly adhere to the following glossaries. please give preference to other glossaries. If a source term from a table appears in the text, use the corresponding target term in your translation:"
|
|
769
|
+
)
|
|
770
|
+
# hint_idx += 1 # No need to increment if tables are part of this point
|
|
771
|
+
for md_block in active_glossary_markdown_blocks:
|
|
772
|
+
llm_prompt_parts.append(f"\n{md_block}\n")
|
|
773
|
+
|
|
774
774
|
# 6. ## Here is the input:
|
|
775
775
|
llm_prompt_parts.append("\n## Here is the input:")
|
|
776
776
|
|
|
@@ -150,6 +150,12 @@ def add_metadata(
|
|
|
150
150
|
translated_by += f"_{translate_config.metadata_extra_data}"
|
|
151
151
|
meta["producer"] = translated_by
|
|
152
152
|
meta["creator"] = creator
|
|
153
|
+
|
|
154
|
+
for k, v in meta.items():
|
|
155
|
+
if v:
|
|
156
|
+
# 使用正则替换掉 surrogate 范围内的字符
|
|
157
|
+
meta[k] = re.sub(r"[\uD800-\uDFFF]", "", v)
|
|
158
|
+
|
|
153
159
|
pdf.set_metadata(meta)
|
|
154
160
|
safe_save(pdf, temp_path)
|
|
155
161
|
shutil.move(temp_path, path)
|
|
@@ -321,6 +321,7 @@ class TranslationConfig:
|
|
|
321
321
|
"total_tokens": 0,
|
|
322
322
|
"prompt_tokens": 0,
|
|
323
323
|
"completion_tokens": 0,
|
|
324
|
+
"cache_hit_prompt_tokens": 0,
|
|
324
325
|
}
|
|
325
326
|
|
|
326
327
|
if self.ocr_workaround:
|
|
@@ -437,6 +438,7 @@ class TranslationConfig:
|
|
|
437
438
|
total_tokens: int,
|
|
438
439
|
prompt_tokens: int,
|
|
439
440
|
completion_tokens: int,
|
|
441
|
+
cache_hit_prompt_tokens: int,
|
|
440
442
|
) -> None:
|
|
441
443
|
"""Accumulate token usage for automatic term extraction."""
|
|
442
444
|
if total_tokens > 0:
|
|
@@ -445,6 +447,10 @@ class TranslationConfig:
|
|
|
445
447
|
self.term_extraction_token_usage["prompt_tokens"] += prompt_tokens
|
|
446
448
|
if completion_tokens > 0:
|
|
447
449
|
self.term_extraction_token_usage["completion_tokens"] += completion_tokens
|
|
450
|
+
if cache_hit_prompt_tokens > 0:
|
|
451
|
+
self.term_extraction_token_usage["cache_hit_prompt_tokens"] += (
|
|
452
|
+
cache_hit_prompt_tokens
|
|
453
|
+
)
|
|
448
454
|
|
|
449
455
|
|
|
450
456
|
class TranslateResult:
|
|
@@ -26,7 +26,7 @@ from babeldoc.translator.translator import OpenAITranslator
|
|
|
26
26
|
from babeldoc.translator.translator import set_translate_rate_limiter
|
|
27
27
|
|
|
28
28
|
logger = logging.getLogger(__name__)
|
|
29
|
-
__version__ = "0.5.
|
|
29
|
+
__version__ = "0.5.15"
|
|
30
30
|
|
|
31
31
|
|
|
32
32
|
def create_parser():
|
|
@@ -636,6 +636,7 @@ async def main():
|
|
|
636
636
|
total_term_extraction_total_tokens = 0
|
|
637
637
|
total_term_extraction_prompt_tokens = 0
|
|
638
638
|
total_term_extraction_completion_tokens = 0
|
|
639
|
+
total_term_extraction_cache_hit_prompt_tokens = 0
|
|
639
640
|
|
|
640
641
|
for file in pending_files:
|
|
641
642
|
# 清理文件路径,去除两端的引号
|
|
@@ -721,21 +722,29 @@ async def main():
|
|
|
721
722
|
total_term_extraction_total_tokens += usage["total_tokens"]
|
|
722
723
|
total_term_extraction_prompt_tokens += usage["prompt_tokens"]
|
|
723
724
|
total_term_extraction_completion_tokens += usage["completion_tokens"]
|
|
725
|
+
total_term_extraction_cache_hit_prompt_tokens += usage[
|
|
726
|
+
"cache_hit_prompt_tokens"
|
|
727
|
+
]
|
|
724
728
|
logger.info(f"Total tokens: {translator.token_count.value}")
|
|
725
729
|
logger.info(f"Prompt tokens: {translator.prompt_token_count.value}")
|
|
726
730
|
logger.info(f"Completion tokens: {translator.completion_token_count.value}")
|
|
727
731
|
logger.info(
|
|
728
|
-
"
|
|
732
|
+
f"Cache hit prompt tokens: {translator.cache_hit_prompt_token_count.value}"
|
|
733
|
+
)
|
|
734
|
+
logger.info(
|
|
735
|
+
"Term extraction tokens: total=%s prompt=%s completion=%s cache_hit_prompt=%s",
|
|
729
736
|
total_term_extraction_total_tokens,
|
|
730
737
|
total_term_extraction_prompt_tokens,
|
|
731
738
|
total_term_extraction_completion_tokens,
|
|
739
|
+
total_term_extraction_cache_hit_prompt_tokens,
|
|
732
740
|
)
|
|
733
741
|
if term_extraction_translator is not translator:
|
|
734
742
|
logger.info(
|
|
735
|
-
"Term extraction translator raw tokens: total=%s prompt=%s completion=%s",
|
|
743
|
+
"Term extraction translator raw tokens: total=%s prompt=%s completion=%s cache_hit_prompt=%s",
|
|
736
744
|
term_extraction_translator.token_count.value,
|
|
737
745
|
term_extraction_translator.prompt_token_count.value,
|
|
738
746
|
term_extraction_translator.completion_token_count.value,
|
|
747
|
+
term_extraction_translator.cache_hit_prompt_token_count.value,
|
|
739
748
|
)
|
|
740
749
|
|
|
741
750
|
|
|
@@ -249,6 +249,7 @@ class OpenAITranslator(BaseTranslator):
|
|
|
249
249
|
self.token_count = AtomicInteger()
|
|
250
250
|
self.prompt_token_count = AtomicInteger()
|
|
251
251
|
self.completion_token_count = AtomicInteger()
|
|
252
|
+
self.cache_hit_prompt_token_count = AtomicInteger()
|
|
252
253
|
|
|
253
254
|
@retry(
|
|
254
255
|
retry=retry_if_exception_type(openai.RateLimitError),
|
|
@@ -338,6 +339,10 @@ class OpenAITranslator(BaseTranslator):
|
|
|
338
339
|
self.prompt_token_count.inc(response.usage.prompt_tokens)
|
|
339
340
|
if response.usage and response.usage.completion_tokens:
|
|
340
341
|
self.completion_token_count.inc(response.usage.completion_tokens)
|
|
342
|
+
if response.usage and (
|
|
343
|
+
hit_count := getattr(response.usage, "prompt_cache_hit_tokens", 0)
|
|
344
|
+
):
|
|
345
|
+
self.cache_hit_prompt_token_count.inc(hit_count)
|
|
341
346
|
except Exception as e:
|
|
342
347
|
logger.exception("Error updating token count")
|
|
343
348
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "BabelDOC"
|
|
3
|
-
version = "0.5.
|
|
3
|
+
version = "0.5.15"
|
|
4
4
|
description = "Yet Another Document Translator"
|
|
5
5
|
license = "AGPL-3.0"
|
|
6
6
|
readme = "README.md"
|
|
@@ -162,7 +162,7 @@ pythonpath = [".", "src"]
|
|
|
162
162
|
testpaths = ["tests"]
|
|
163
163
|
|
|
164
164
|
[bumpver]
|
|
165
|
-
current_version = "0.5.
|
|
165
|
+
current_version = "0.5.15"
|
|
166
166
|
version_pattern = "MAJOR.MINOR.PATCH[.PYTAGNUM]"
|
|
167
167
|
|
|
168
168
|
[bumpver.file_patterns]
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__version__ = "0.5.13"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/format/pdf/document_il/midend/add_debug_information.py
RENAMED
|
File without changes
|
{babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/format/pdf/document_il/midend/detect_scanned_file.py
RENAMED
|
File without changes
|
|
File without changes
|
{babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/format/pdf/document_il/midend/paragraph_finder.py
RENAMED
|
File without changes
|
{babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/format/pdf/document_il/midend/remove_descent.py
RENAMED
|
File without changes
|
{babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/format/pdf/document_il/midend/styles_and_formulas.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/format/pdf/document_il/utils/formular_helper.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/format/pdf/document_il/utils/paragraph_helper.py
RENAMED
|
File without changes
|
{babeldoc-0.5.13 → babeldoc-0.5.15}/babeldoc/format/pdf/document_il/utils/spatial_analyzer.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|