BabelDOC 0.3.56__tar.gz → 0.3.58__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.
Files changed (111) hide show
  1. {babeldoc-0.3.56 → babeldoc-0.3.58}/PKG-INFO +1 -1
  2. babeldoc-0.3.58/babeldoc/__init__.py +1 -0
  3. {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/const.py +1 -1
  4. {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/document_il/backend/pdf_creater.py +2 -2
  5. {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/document_il/midend/automatic_term_extractor.py +2 -1
  6. {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/document_il/midend/il_translator.py +12 -7
  7. {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/high_level.py +18 -22
  8. {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/main.py +1 -1
  9. {babeldoc-0.3.56 → babeldoc-0.3.58}/pyproject.toml +2 -2
  10. {babeldoc-0.3.56 → babeldoc-0.3.58}/uv.lock +398 -333
  11. babeldoc-0.3.56/babeldoc/__init__.py +0 -1
  12. {babeldoc-0.3.56 → babeldoc-0.3.58}/.cursorignore +0 -0
  13. {babeldoc-0.3.56 → babeldoc-0.3.58}/.github/ISSUE_TEMPLATE/bug_report.yaml +0 -0
  14. {babeldoc-0.3.56 → babeldoc-0.3.58}/.github/ISSUE_TEMPLATE/feature_request.yaml +0 -0
  15. {babeldoc-0.3.56 → babeldoc-0.3.58}/.github/PULL_REQUEST_TEMPLATE/pr_form.yml +0 -0
  16. {babeldoc-0.3.56 → babeldoc-0.3.58}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  17. {babeldoc-0.3.56 → babeldoc-0.3.58}/.github/dependabot.yml +0 -0
  18. {babeldoc-0.3.56 → babeldoc-0.3.58}/.github/labels.yml +0 -0
  19. {babeldoc-0.3.56 → babeldoc-0.3.58}/.github/release-drafter.yml +0 -0
  20. {babeldoc-0.3.56 → babeldoc-0.3.58}/.github/workflows/codeql.yml +0 -0
  21. {babeldoc-0.3.56 → babeldoc-0.3.58}/.github/workflows/docs.yml +0 -0
  22. {babeldoc-0.3.56 → babeldoc-0.3.58}/.github/workflows/labeler.yml +0 -0
  23. {babeldoc-0.3.56 → babeldoc-0.3.58}/.github/workflows/lint.yml +0 -0
  24. {babeldoc-0.3.56 → babeldoc-0.3.58}/.github/workflows/pr-lint.yml +0 -0
  25. {babeldoc-0.3.56 → babeldoc-0.3.58}/.github/workflows/publish-to-pypi.yml +0 -0
  26. {babeldoc-0.3.56 → babeldoc-0.3.58}/.github/workflows/test.yml +0 -0
  27. {babeldoc-0.3.56 → babeldoc-0.3.58}/.gitignore +0 -0
  28. {babeldoc-0.3.56 → babeldoc-0.3.58}/.pre-commit-config.yaml +0 -0
  29. {babeldoc-0.3.56 → babeldoc-0.3.58}/LICENSE +0 -0
  30. {babeldoc-0.3.56 → babeldoc-0.3.58}/README.md +0 -0
  31. {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/assets/assets.py +0 -0
  32. {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/assets/embedding_assets_metadata.py +0 -0
  33. {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/asynchronize/__init__.py +0 -0
  34. {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/converter.py +0 -0
  35. {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/document_il/__init__.py +0 -0
  36. {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/document_il/babeldoc_exception/BabelDOCException.py +0 -0
  37. {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/document_il/backend/__init__.py +0 -0
  38. {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/document_il/frontend/__init__.py +0 -0
  39. {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/document_il/frontend/il_creater.py +0 -0
  40. {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/document_il/il_version_1.py +0 -0
  41. {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/document_il/il_version_1.rnc +0 -0
  42. {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/document_il/il_version_1.rng +0 -0
  43. {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/document_il/il_version_1.xsd +0 -0
  44. {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/document_il/midend/__init__.py +0 -0
  45. {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/document_il/midend/add_debug_information.py +0 -0
  46. {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/document_il/midend/detect_scanned_file.py +0 -0
  47. {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/document_il/midend/il_translator_llm_only.py +0 -0
  48. {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/document_il/midend/layout_parser.py +0 -0
  49. {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/document_il/midend/paragraph_finder.py +0 -0
  50. {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/document_il/midend/remove_descent.py +0 -0
  51. {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/document_il/midend/styles_and_formulas.py +0 -0
  52. {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/document_il/midend/table_parser.py +0 -0
  53. {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/document_il/midend/typesetting.py +0 -0
  54. {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/document_il/translator/__init__.py +0 -0
  55. {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/document_il/translator/cache.py +0 -0
  56. {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/document_il/translator/translator.py +0 -0
  57. {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/document_il/utils/atomic_integer.py +0 -0
  58. {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/document_il/utils/fontmap.py +0 -0
  59. {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/document_il/utils/layout_helper.py +0 -0
  60. {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/document_il/utils/mupdf_helper.py +0 -0
  61. {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/document_il/utils/paragraph_helper.py +0 -0
  62. {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/document_il/utils/priority_thread_pool_executor.py +0 -0
  63. {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/document_il/utils/style_helper.py +0 -0
  64. {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/document_il/utils/zstd_helper.py +0 -0
  65. {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/document_il/xml_converter.py +0 -0
  66. {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/docvision/README.md +0 -0
  67. {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/docvision/__init__.py +0 -0
  68. {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/docvision/doclayout.py +0 -0
  69. {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/docvision/rpc_doclayout.py +0 -0
  70. {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/docvision/table_detection/rapidocr.py +0 -0
  71. {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/format/office/__init__.py +0 -0
  72. {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/glossary.py +0 -0
  73. {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/pdfinterp.py +0 -0
  74. {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/progress_monitor.py +0 -0
  75. {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/result_merger.py +0 -0
  76. {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/split_manager.py +0 -0
  77. {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/tools/generate_font_metadata.py +0 -0
  78. {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/tools/italic_assistance.py +0 -0
  79. {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/tools/italic_recognize_tool.py +0 -0
  80. {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/translation_config.py +0 -0
  81. {babeldoc-0.3.56 → babeldoc-0.3.58}/docs/CODE_OF_CONDUCT.md +0 -0
  82. {babeldoc-0.3.56 → babeldoc-0.3.58}/docs/CONTRIBUTING.md +0 -0
  83. {babeldoc-0.3.56 → babeldoc-0.3.58}/docs/CONTRIBUTOR_REWARD.md +0 -0
  84. {babeldoc-0.3.56 → babeldoc-0.3.58}/docs/ImplementationDetails/AsyncTranslate/AsyncTranslate.md +0 -0
  85. {babeldoc-0.3.56 → babeldoc-0.3.58}/docs/ImplementationDetails/ILTranslator/ILTranslator.md +0 -0
  86. {babeldoc-0.3.56 → babeldoc-0.3.58}/docs/ImplementationDetails/PDFCreation/PDFCreation.md +0 -0
  87. {babeldoc-0.3.56 → babeldoc-0.3.58}/docs/ImplementationDetails/PDFParsing/PDFParsing.md +0 -0
  88. {babeldoc-0.3.56 → babeldoc-0.3.58}/docs/ImplementationDetails/ParagraphFinding/ParagraphFinding.md +0 -0
  89. {babeldoc-0.3.56 → babeldoc-0.3.58}/docs/ImplementationDetails/README.md +0 -0
  90. {babeldoc-0.3.56 → babeldoc-0.3.58}/docs/ImplementationDetails/StylesAndFormulas/StylesAndFormulas.md +0 -0
  91. {babeldoc-0.3.56 → babeldoc-0.3.58}/docs/ImplementationDetails/Typesetting/Typesetting.md +0 -0
  92. {babeldoc-0.3.56 → babeldoc-0.3.58}/docs/README.md +0 -0
  93. {babeldoc-0.3.56 → babeldoc-0.3.58}/docs/deploy.sh +0 -0
  94. {babeldoc-0.3.56 → babeldoc-0.3.58}/docs/example/demo_glossary.csv +0 -0
  95. {babeldoc-0.3.56 → babeldoc-0.3.58}/docs/images/babeldoc-banner.png +0 -0
  96. {babeldoc-0.3.56 → babeldoc-0.3.58}/docs/images/babeldoc-big-logo-darkmode-with-transparent-background.png +0 -0
  97. {babeldoc-0.3.56 → babeldoc-0.3.58}/docs/images/babeldoc-big-logo-darkmode-with-transparent-background.svg +0 -0
  98. {babeldoc-0.3.56 → babeldoc-0.3.58}/docs/images/babeldoc-big-logo-with-transparent-background.png +0 -0
  99. {babeldoc-0.3.56 → babeldoc-0.3.58}/docs/images/babeldoc-big-logo-with-transparent-background.svg +0 -0
  100. {babeldoc-0.3.56 → babeldoc-0.3.58}/docs/images/babeldoc-big-logo.png +0 -0
  101. {babeldoc-0.3.56 → babeldoc-0.3.58}/docs/images/babeldoc-contributor_reward_example.png +0 -0
  102. {babeldoc-0.3.56 → babeldoc-0.3.58}/docs/images/babeldoc-preview.gif +0 -0
  103. {babeldoc-0.3.56 → babeldoc-0.3.58}/docs/images/babeldoc-small-logo-with-transparent-background.png +0 -0
  104. {babeldoc-0.3.56 → babeldoc-0.3.58}/docs/images/babeldoc-small-logo-with-transparent-background.svg +0 -0
  105. {babeldoc-0.3.56 → babeldoc-0.3.58}/docs/images/babeldoc-small-logo.png +0 -0
  106. {babeldoc-0.3.56 → babeldoc-0.3.58}/docs/index.md +0 -0
  107. {babeldoc-0.3.56 → babeldoc-0.3.58}/docs/intro-to-pdf-object.md +0 -0
  108. {babeldoc-0.3.56 → babeldoc-0.3.58}/docs/requirements.txt +0 -0
  109. {babeldoc-0.3.56 → babeldoc-0.3.58}/docs/supported_languages.md +0 -0
  110. {babeldoc-0.3.56 → babeldoc-0.3.58}/mkdocs.yml +0 -0
  111. {babeldoc-0.3.56 → babeldoc-0.3.58}/tests/test_translation_config.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: BabelDOC
3
- Version: 0.3.56
3
+ Version: 0.3.58
4
4
  Summary: Yet Another Document Translator
5
5
  Project-URL: Homepage, https://github.com/funstory-ai/BabelDOC
6
6
  Project-URL: Issues, https://github.com/funstory-ai/BabelDOC/issues
@@ -0,0 +1 @@
1
+ __version__ = "0.3.58"
@@ -3,7 +3,7 @@ import shutil
3
3
  import subprocess
4
4
  from pathlib import Path
5
5
 
6
- __version__ = "0.3.56"
6
+ __version__ = "0.3.58"
7
7
 
8
8
  CACHE_FOLDER = Path.home() / ".cache" / "babeldoc"
9
9
 
@@ -781,10 +781,10 @@ class PDFCreater:
781
781
  return False
782
782
 
783
783
  def restore_media_box(self, doc: pymupdf.Document, mediabox_data: dict) -> None:
784
- for pageno, page_box_data in mediabox_data.items():
784
+ for xref, page_box_data in mediabox_data.items():
785
785
  for name, box in page_box_data.items():
786
786
  try:
787
- doc.xref_set_key(doc[pageno].xref, name, box)
787
+ doc.xref_set_key(xref, name, box)
788
788
  except Exception:
789
789
  logger.debug(f"Error restoring media box {name} from PDF")
790
790
 
@@ -185,6 +185,7 @@ class AutomaticTermExtractor:
185
185
  total_token_count = 0
186
186
  for paragraph in page.pdf_paragraph:
187
187
  if paragraph.debug_id is None or paragraph.unicode is None:
188
+ pbar.advance(1)
188
189
  continue
189
190
  if is_cid_paragraph(paragraph):
190
191
  pbar.advance(1)
@@ -253,7 +254,7 @@ class AutomaticTermExtractor:
253
254
  )
254
255
 
255
256
  except Exception as e:
256
- logger.error(f"Error preparing LLM prompt for automatic terms extract: {e}")
257
+ logger.error(f"Error during automatic terms extract: {e}")
257
258
  return
258
259
  finally:
259
260
  pbar.advance(len(paragraphs.paragraphs))
@@ -346,7 +346,7 @@ class ILTranslator:
346
346
  placeholder, regex_pattern = placeholder
347
347
  else:
348
348
  regex_pattern = re.escape(placeholder)
349
- if placeholder in paragraph.unicode:
349
+ if re.match(regex_pattern, paragraph.unicode, re.IGNORECASE):
350
350
  return self.create_formula_placeholder(formula, formula_id + 1, paragraph)
351
351
 
352
352
  return FormulaPlaceholder(formula_id, formula, placeholder, regex_pattern)
@@ -371,9 +371,10 @@ class ILTranslator:
371
371
  right_placeholder, right_placeholder_regex_pattern = right_placeholder
372
372
  else:
373
373
  right_placeholder_regex_pattern = re.escape(right_placeholder)
374
- if (
375
- left_placeholder in paragraph.unicode
376
- or right_placeholder in paragraph.unicode
374
+ if re.match(
375
+ f"{left_placeholder_regex_pattern}|{right_placeholder_regex_pattern}",
376
+ paragraph.unicode,
377
+ re.IGNORECASE,
377
378
  ):
378
379
  return self.create_rich_text_placeholder(
379
380
  composition,
@@ -630,7 +631,8 @@ class ILTranslator:
630
631
 
631
632
  # 处理占位符
632
633
  if any(
633
- isinstance(p, FormulaPlaceholder) and matched_text == p.placeholder
634
+ isinstance(p, FormulaPlaceholder)
635
+ and re.match(f"^{p.regex_pattern}$", matched_text, re.IGNORECASE)
634
636
  for p in input_text.placeholders
635
637
  ):
636
638
  # 处理公式占位符
@@ -638,7 +640,7 @@ class ILTranslator:
638
640
  p
639
641
  for p in input_text.placeholders
640
642
  if isinstance(p, FormulaPlaceholder)
641
- and matched_text == p.placeholder
643
+ and re.match(f"^{p.regex_pattern}$", matched_text, re.IGNORECASE)
642
644
  )
643
645
  comp = PdfParagraphComposition()
644
646
  comp.pdf_formula = placeholder.formula
@@ -649,11 +651,14 @@ class ILTranslator:
649
651
  p
650
652
  for p in input_text.placeholders
651
653
  if not isinstance(p, FormulaPlaceholder)
652
- and re.match(f"^{p.left_regex_pattern}", matched_text)
654
+ and re.match(
655
+ f"^{p.left_regex_pattern}", matched_text, re.IGNORECASE
656
+ )
653
657
  )
654
658
  text = re.match(
655
659
  f"^{placeholder.left_regex_pattern}(.*){placeholder.right_regex_pattern}$",
656
660
  matched_text,
661
+ re.IGNORECASE,
657
662
  ).group(1)
658
663
 
659
664
  if isinstance(
@@ -425,6 +425,8 @@ def fix_null_xref(doc: Document) -> None:
425
425
  elif obj and "/LZWDecode" in obj:
426
426
  data = doc.xref_stream(i)
427
427
  doc.update_stream(i, data)
428
+ elif obj and "/Annots" in obj:
429
+ doc.xref_set_key(i, "Annots", "null")
428
430
  except Exception:
429
431
  doc.update_object(i, "[]")
430
432
 
@@ -625,28 +627,22 @@ def do_translate(
625
627
 
626
628
  def fix_media_box(doc: Document) -> None:
627
629
  mediabox_data = {}
628
- for page in doc:
629
- page_box_data = {}
630
- mediabox = doc.xref_get_key(page.xref, "MediaBox")
631
- if mediabox[0] == "null":
632
- mediabox = ("array", "[0 0 612 792]")
633
- doc.xref_set_key(page.xref, "MediaBox", mediabox[1])
634
- if page.mediabox.x0 != 0 or page.mediabox.y0 != 0:
635
- x0 = page.mediabox.x0
636
- y0 = page.mediabox.y0
637
- x1 = page.mediabox.x1
638
- y1 = page.mediabox.y1
639
- page_box_data["MediaBox"] = doc.xref_get_key(page.xref, "MediaBox")[1]
640
- doc.xref_set_key(page.xref, "MediaBox", f"[0 0 {x1 - x0} {y1 - y0}]")
641
- if page.cropbox.x0 != 0 or page.cropbox.y0 != 0:
642
- x0 = page.cropbox.x0
643
- y0 = page.cropbox.y0
644
- x1 = page.cropbox.x1
645
- y1 = page.cropbox.y1
646
- page_box_data["CropBox"] = doc.xref_get_key(page.xref, "CropBox")[1]
647
- doc.xref_set_key(page.xref, "CropBox", f"[0 0 {x1 - x0} {y1 - x0}]")
648
- if page_box_data:
649
- mediabox_data[page.number] = page_box_data
630
+ for x in range(1, doc.xref_length()):
631
+ t = doc.xref_get_key(x, "Type")
632
+ box_set = {}
633
+ if t[1] in ["/Pages", "/Page"]:
634
+ mediabox = doc.xref_get_key(x, "MediaBox")
635
+ if mediabox[0] != "null":
636
+ _, _, x1, y1 = mediabox[1].replace("[", "").replace("]", "").split(" ")
637
+ doc.xref_set_key(x, "MediaBox", f"[0 0 {x1} {y1}]")
638
+ box_set["MediaBox"] = mediabox[1]
639
+ for k in ["CropBox", "BleedBox", "TrimBox", "ArtBox"]:
640
+ box = doc.xref_get_key(x, k)
641
+ if box[0] != "null":
642
+ box_set[k] = box[1]
643
+ doc.xref_set_key(x, k, "null")
644
+ if box_set:
645
+ mediabox_data[x] = box_set
650
646
  return mediabox_data
651
647
 
652
648
 
@@ -24,7 +24,7 @@ from babeldoc.translation_config import TranslationConfig
24
24
  from babeldoc.translation_config import WatermarkOutputMode
25
25
 
26
26
  logger = logging.getLogger(__name__)
27
- __version__ = "0.3.56"
27
+ __version__ = "0.3.58"
28
28
 
29
29
 
30
30
  def create_parser():
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "BabelDOC"
3
- version = "0.3.56"
3
+ version = "0.3.58"
4
4
  description = "Yet Another Document Translator"
5
5
  license = "AGPL-3.0"
6
6
  readme = "README.md"
@@ -151,7 +151,7 @@ pythonpath = [".", "src"]
151
151
  testpaths = ["tests"]
152
152
 
153
153
  [bumpver]
154
- current_version = "0.3.56"
154
+ current_version = "0.3.58"
155
155
  version_pattern = "MAJOR.MINOR.PATCH[.PYTAGNUM]"
156
156
 
157
157
  [bumpver.file_patterns]