python-docx-oss 0.3.3__tar.gz → 0.5.0__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 (568) hide show
  1. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/HISTORY.md +27 -0
  2. {python_docx_oss-0.3.3/src/python_docx_oss.egg-info → python_docx_oss-0.5.0}/PKG-INFO +43 -4
  3. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/README.md +42 -3
  4. python_docx_oss-0.5.0/docs/api/inspection.rst +11 -0
  5. python_docx_oss-0.5.0/docs/api/transforms.rst +9 -0
  6. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/index.rst +4 -0
  7. python_docx_oss-0.5.0/docs/user/inspection.rst +242 -0
  8. python_docx_oss-0.5.0/docs/user/transformations.rst +150 -0
  9. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/_scratch/test_out.docx +0 -0
  10. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/__init__.py +13 -2
  11. python_docx_oss-0.5.0/src/docx/inspection/__init__.py +31 -0
  12. python_docx_oss-0.5.0/src/docx/inspection/_structural_xml_tags.py +1929 -0
  13. python_docx_oss-0.5.0/src/docx/inspection/features.py +110 -0
  14. python_docx_oss-0.5.0/src/docx/inspection/fingerprint.py +348 -0
  15. python_docx_oss-0.5.0/src/docx/inspection/reader.py +289 -0
  16. python_docx_oss-0.5.0/src/docx/inspection/result.py +56 -0
  17. python_docx_oss-0.5.0/src/docx/inspection/source.py +40 -0
  18. python_docx_oss-0.5.0/src/docx/transforms/__init__.py +19 -0
  19. python_docx_oss-0.5.0/src/docx/transforms/hyperlinks.py +410 -0
  20. python_docx_oss-0.5.0/src/docx/transforms/normalize.py +93 -0
  21. python_docx_oss-0.5.0/src/docx/transforms/package.py +102 -0
  22. python_docx_oss-0.5.0/src/docx/transforms/repair.py +46 -0
  23. python_docx_oss-0.5.0/src/docx/transforms/result.py +48 -0
  24. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0/src/python_docx_oss.egg-info}/PKG-INFO +43 -4
  25. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/python_docx_oss.egg-info/SOURCES.txt +25 -0
  26. python_docx_oss-0.5.0/tests/inspection/helpers.py +49 -0
  27. python_docx_oss-0.5.0/tests/inspection/test_fingerprint.py +585 -0
  28. python_docx_oss-0.5.0/tests/inspection/test_inspect.py +382 -0
  29. python_docx_oss-0.5.0/tests/transforms/__init__.py +0 -0
  30. python_docx_oss-0.5.0/tests/transforms/helpers.py +84 -0
  31. python_docx_oss-0.5.0/tests/transforms/test_normalize.py +527 -0
  32. python_docx_oss-0.5.0/tests/transforms/test_repair.py +160 -0
  33. python_docx_oss-0.5.0/tests/unitutil/__init__.py +0 -0
  34. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/LICENSE +0 -0
  35. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/MANIFEST.in +0 -0
  36. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/Makefile +0 -0
  37. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/_static/.gitignore +0 -0
  38. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/_static/img/comment-parts.png +0 -0
  39. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/_static/img/example-docx-01.png +0 -0
  40. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/_static/img/hdrftr-01.png +0 -0
  41. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/_static/img/hdrftr-02.png +0 -0
  42. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/_static/img/oss.png +0 -0
  43. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/_templates/layout.html +0 -0
  44. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/_templates/sidebarlinks.html +0 -0
  45. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/_themes/armstrong/LICENSE +0 -0
  46. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/_themes/armstrong/layout.html +0 -0
  47. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/_themes/armstrong/rtd-themes.conf +0 -0
  48. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/_themes/armstrong/static/rtd.css_t +0 -0
  49. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/_themes/armstrong/theme.conf +0 -0
  50. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/_themes/armstrong/theme.conf.orig +0 -0
  51. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/api/comments.rst +0 -0
  52. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/api/dml.rst +0 -0
  53. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/api/document.rst +0 -0
  54. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/api/enum/MsoColorType.rst +0 -0
  55. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/api/enum/MsoThemeColorIndex.rst +0 -0
  56. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/api/enum/WdAlignParagraph.rst +0 -0
  57. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/api/enum/WdBuiltinStyle.rst +0 -0
  58. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/api/enum/WdCellVerticalAlignment.rst +0 -0
  59. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/api/enum/WdColorIndex.rst +0 -0
  60. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/api/enum/WdLineSpacing.rst +0 -0
  61. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/api/enum/WdOrientation.rst +0 -0
  62. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/api/enum/WdRowAlignment.rst +0 -0
  63. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/api/enum/WdRowHeightRule.rst +0 -0
  64. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/api/enum/WdSectionStart.rst +0 -0
  65. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/api/enum/WdStyleType.rst +0 -0
  66. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/api/enum/WdTabAlignment.rst +0 -0
  67. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/api/enum/WdTabLeader.rst +0 -0
  68. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/api/enum/WdTableDirection.rst +0 -0
  69. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/api/enum/WdUnderline.rst +0 -0
  70. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/api/enum/index.rst +0 -0
  71. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/api/sanitize.rst +0 -0
  72. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/api/section.rst +0 -0
  73. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/api/settings.rst +0 -0
  74. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/api/shape.rst +0 -0
  75. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/api/shared.rst +0 -0
  76. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/api/style.rst +0 -0
  77. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/api/table.rst +0 -0
  78. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/api/text.rst +0 -0
  79. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/conf.py +0 -0
  80. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/dev/analysis/features/comments.rst +0 -0
  81. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/dev/analysis/features/coreprops.rst +0 -0
  82. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/dev/analysis/features/header.rst +0 -0
  83. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/dev/analysis/features/numbering.rst +0 -0
  84. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/dev/analysis/features/sections.rst +0 -0
  85. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/dev/analysis/features/settings.rst +0 -0
  86. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/dev/analysis/features/shapes/index.rst +0 -0
  87. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/dev/analysis/features/shapes/picture.rst +0 -0
  88. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/dev/analysis/features/shapes/shapes-inline-size.rst +0 -0
  89. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/dev/analysis/features/shapes/shapes-inline.rst +0 -0
  90. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/dev/analysis/features/styles/character-style.rst +0 -0
  91. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/dev/analysis/features/styles/index.rst +0 -0
  92. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/dev/analysis/features/styles/latent-styles.rst +0 -0
  93. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/dev/analysis/features/styles/paragraph-style.rst +0 -0
  94. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/dev/analysis/features/styles/style.rst +0 -0
  95. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/dev/analysis/features/styles/styles.rst +0 -0
  96. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/dev/analysis/features/table/cell-merge.rst +0 -0
  97. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/dev/analysis/features/table/index.rst +0 -0
  98. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/dev/analysis/features/table/table-cell.rst +0 -0
  99. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/dev/analysis/features/table/table-props.rst +0 -0
  100. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/dev/analysis/features/table/table-row.rst +0 -0
  101. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/dev/analysis/features/text/breaks.rst +0 -0
  102. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/dev/analysis/features/text/font-color.rst +0 -0
  103. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/dev/analysis/features/text/font-highlight-color.rst +0 -0
  104. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/dev/analysis/features/text/font.rst +0 -0
  105. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/dev/analysis/features/text/hyperlink.rst +0 -0
  106. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/dev/analysis/features/text/index.rst +0 -0
  107. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/dev/analysis/features/text/paragraph-format.rst +0 -0
  108. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/dev/analysis/features/text/run-content.rst +0 -0
  109. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/dev/analysis/features/text/tab-stops.rst +0 -0
  110. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/dev/analysis/features/text/underline.rst +0 -0
  111. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/dev/analysis/index.rst +0 -0
  112. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/dev/analysis/schema/ct_body.rst +0 -0
  113. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/dev/analysis/schema/ct_document.rst +0 -0
  114. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/dev/analysis/schema/ct_p.rst +0 -0
  115. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/dev/upstream-maintenance.rst +0 -0
  116. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/requirements.txt +0 -0
  117. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/user/api-concepts.rst +0 -0
  118. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/user/comments.rst +0 -0
  119. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/user/compatibility.rst +0 -0
  120. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/user/custom-properties.rst +0 -0
  121. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/user/custom-xml.rst +0 -0
  122. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/user/documents.rst +0 -0
  123. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/user/hdrftr.rst +0 -0
  124. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/user/install.rst +0 -0
  125. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/user/quickstart.rst +0 -0
  126. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/user/sanitization.rst +0 -0
  127. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/user/sections.rst +0 -0
  128. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/user/shapes.rst +0 -0
  129. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/user/styles-understanding.rst +0 -0
  130. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/user/styles-using.rst +0 -0
  131. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/user/tables.rst +0 -0
  132. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/docs/user/text.rst +0 -0
  133. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/api-open-document.feature +0 -0
  134. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/blk-add-paragraph.feature +0 -0
  135. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/blk-add-table.feature +0 -0
  136. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/blk-iter-inner-content.feature +0 -0
  137. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/cmt-mutations.feature +0 -0
  138. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/cmt-props.feature +0 -0
  139. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/doc-access-collections.feature +0 -0
  140. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/doc-access-sections.feature +0 -0
  141. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/doc-add-comment.feature +0 -0
  142. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/doc-add-heading.feature +0 -0
  143. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/doc-add-page-break.feature +0 -0
  144. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/doc-add-paragraph.feature +0 -0
  145. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/doc-add-picture.feature +0 -0
  146. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/doc-add-section.feature +0 -0
  147. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/doc-add-table.feature +0 -0
  148. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/doc-comments.feature +0 -0
  149. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/doc-coreprops.feature +0 -0
  150. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/doc-customprops.feature +0 -0
  151. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/doc-settings.feature +0 -0
  152. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/doc-styles.feature +0 -0
  153. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/environment.py +0 -0
  154. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/hdr-header-footer.feature +0 -0
  155. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/hlk-props.feature +0 -0
  156. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/img-characterize-image.feature +0 -0
  157. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/num-access-numbering-part.feature +0 -0
  158. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/par-access-inner-content.feature +0 -0
  159. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/par-access-parfmt.feature +0 -0
  160. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/par-add-run.feature +0 -0
  161. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/par-alignment-prop.feature +0 -0
  162. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/par-clear-paragraph.feature +0 -0
  163. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/par-insert-paragraph.feature +0 -0
  164. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/par-set-text.feature +0 -0
  165. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/par-style-prop.feature +0 -0
  166. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/pbk-split-para.feature +0 -0
  167. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/run-access-font.feature +0 -0
  168. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/run-access-inner-content.feature +0 -0
  169. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/run-add-content.feature +0 -0
  170. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/run-add-picture.feature +0 -0
  171. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/run-char-style.feature +0 -0
  172. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/run-clear-run.feature +0 -0
  173. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/run-enum-props.feature +0 -0
  174. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/sct-section.feature +0 -0
  175. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/shp-inline-shape-access.feature +0 -0
  176. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/shp-inline-shape-size.feature +0 -0
  177. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/steps/api.py +0 -0
  178. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/steps/block.py +0 -0
  179. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/steps/comments.py +0 -0
  180. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/steps/coreprops.py +0 -0
  181. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/steps/customprops.py +0 -0
  182. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/steps/document.py +0 -0
  183. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/steps/font.py +0 -0
  184. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/steps/hdrftr.py +0 -0
  185. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/steps/helpers.py +0 -0
  186. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/steps/hyperlink.py +0 -0
  187. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/steps/image.py +0 -0
  188. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/steps/numbering.py +0 -0
  189. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/steps/pagebreak.py +0 -0
  190. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/steps/paragraph.py +0 -0
  191. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/steps/parfmt.py +0 -0
  192. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/steps/section.py +0 -0
  193. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/steps/settings.py +0 -0
  194. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/steps/shape.py +0 -0
  195. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/steps/shared.py +0 -0
  196. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/steps/styles.py +0 -0
  197. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/steps/table.py +0 -0
  198. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/steps/tabstops.py +0 -0
  199. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/steps/test_files/blk-containing-table.docx +0 -0
  200. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/steps/test_files/blk-paras-and-tables.docx +0 -0
  201. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/steps/test_files/comments-rich-para.docx +0 -0
  202. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/steps/test_files/court-exif.jpg +0 -0
  203. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/steps/test_files/doc-access-sections.docx +0 -0
  204. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/steps/test_files/doc-add-section.docx +0 -0
  205. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/steps/test_files/doc-coreprops.docx +0 -0
  206. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/steps/test_files/doc-customprops-legacy.docx +0 -0
  207. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/steps/test_files/doc-customprops.docx +0 -0
  208. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/steps/test_files/doc-default.docx +0 -0
  209. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/steps/test_files/doc-no-coreprops.docx +0 -0
  210. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/steps/test_files/doc-no-customprops.docx +0 -0
  211. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/steps/test_files/doc-odd-even-hdrs.docx +0 -0
  212. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/steps/test_files/doc-word-default-blank.docx +0 -0
  213. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/steps/test_files/fnt-color.docx +0 -0
  214. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/steps/test_files/hdr-header-footer.docx +0 -0
  215. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/steps/test_files/jfif-300-dpi.jpg +0 -0
  216. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/steps/test_files/jpeg420exif.jpg +0 -0
  217. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/steps/test_files/lena.bmp +0 -0
  218. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/steps/test_files/lena.gif +0 -0
  219. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/steps/test_files/lena.tif +0 -0
  220. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/steps/test_files/lena_std.jpg +0 -0
  221. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/steps/test_files/monty-truth.png +0 -0
  222. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/steps/test_files/mountain.bmp +0 -0
  223. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/steps/test_files/num-having-numbering-part.docx +0 -0
  224. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/steps/test_files/par-alignment.docx +0 -0
  225. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/steps/test_files/par-hlink-frags.docx +0 -0
  226. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/steps/test_files/par-hyperlinks.docx +0 -0
  227. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/steps/test_files/par-known-paragraphs.docx +0 -0
  228. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/steps/test_files/par-known-styles.docx +0 -0
  229. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/steps/test_files/par-rendered-page-breaks.docx +0 -0
  230. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/steps/test_files/python-icon.jpeg +0 -0
  231. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/steps/test_files/run-char-style.docx +0 -0
  232. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/steps/test_files/run-enumerated-props.docx +0 -0
  233. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/steps/test_files/sample.tif +0 -0
  234. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/steps/test_files/sct-first-page-hdrftr.docx +0 -0
  235. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/steps/test_files/sct-inner-content.docx +0 -0
  236. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/steps/test_files/sct-section-props.docx +0 -0
  237. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/steps/test_files/set-no-settings-part.docx +0 -0
  238. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/steps/test_files/shp-inline-shape-access.docx +0 -0
  239. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/steps/test_files/sty-behav-props.docx +0 -0
  240. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/steps/test_files/sty-having-no-styles-part.docx +0 -0
  241. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/steps/test_files/sty-having-styles-part.docx +0 -0
  242. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/steps/test_files/sty-known-styles.docx +0 -0
  243. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/steps/test_files/tab-stops.docx +0 -0
  244. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/steps/test_files/tbl-2x2-table.docx +0 -0
  245. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/steps/test_files/tbl-cell-access.docx +0 -0
  246. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/steps/test_files/tbl-cell-props.docx +0 -0
  247. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/steps/test_files/tbl-col-props.docx +0 -0
  248. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/steps/test_files/tbl-having-applied-style.docx +0 -0
  249. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/steps/test_files/tbl-having-tables.docx +0 -0
  250. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/steps/test_files/tbl-on-off-props.docx +0 -0
  251. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/steps/test_files/tbl-props.docx +0 -0
  252. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/steps/test_files/test.png +0 -0
  253. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/steps/test_files/txt-font-highlight-color.docx +0 -0
  254. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/steps/test_files/txt-font-props.docx +0 -0
  255. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/steps/text.py +0 -0
  256. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/sty-access-font.feature +0 -0
  257. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/sty-access-latent-styles.feature +0 -0
  258. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/sty-access-parfmt.feature +0 -0
  259. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/sty-add-style.feature +0 -0
  260. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/sty-delete-style.feature +0 -0
  261. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/sty-latent-add-del.feature +0 -0
  262. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/sty-latent-props.feature +0 -0
  263. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/sty-style-props.feature +0 -0
  264. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/tab-access-tabs.feature +0 -0
  265. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/tab-tabstop-props.feature +0 -0
  266. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/tbl-add-row-or-col.feature +0 -0
  267. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/tbl-cell-access.feature +0 -0
  268. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/tbl-cell-add-table.feature +0 -0
  269. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/tbl-cell-props.feature +0 -0
  270. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/tbl-cell-text.feature +0 -0
  271. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/tbl-col-props.feature +0 -0
  272. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/tbl-item-access.feature +0 -0
  273. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/tbl-merge-cells.feature +0 -0
  274. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/tbl-props.feature +0 -0
  275. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/tbl-row-props.feature +0 -0
  276. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/tbl-style.feature +0 -0
  277. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/txt-add-break.feature +0 -0
  278. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/txt-font-color.feature +0 -0
  279. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/txt-font-props.feature +0 -0
  280. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/features/txt-parfmt-props.feature +0 -0
  281. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/pyproject.toml +0 -0
  282. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/requirements-dev.txt +0 -0
  283. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/requirements-docs.txt +0 -0
  284. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/requirements-test.txt +0 -0
  285. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/requirements.txt +0 -0
  286. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/setup.cfg +0 -0
  287. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/api.py +0 -0
  288. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/blkcntnr.py +0 -0
  289. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/comments.py +0 -0
  290. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/dml/__init__.py +0 -0
  291. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/dml/color.py +0 -0
  292. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/document.py +0 -0
  293. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/drawing/__init__.py +0 -0
  294. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/enum/__init__.py +0 -0
  295. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/enum/base.py +0 -0
  296. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/enum/dml.py +0 -0
  297. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/enum/section.py +0 -0
  298. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/enum/shape.py +0 -0
  299. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/enum/style.py +0 -0
  300. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/enum/table.py +0 -0
  301. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/enum/text.py +0 -0
  302. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/exceptions.py +0 -0
  303. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/image/__init__.py +0 -0
  304. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/image/bmp.py +0 -0
  305. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/image/constants.py +0 -0
  306. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/image/emf.py +0 -0
  307. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/image/exceptions.py +0 -0
  308. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/image/gif.py +0 -0
  309. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/image/helpers.py +0 -0
  310. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/image/image.py +0 -0
  311. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/image/jpeg.py +0 -0
  312. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/image/png.py +0 -0
  313. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/image/svg.py +0 -0
  314. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/image/tiff.py +0 -0
  315. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/opc/__init__.py +0 -0
  316. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/opc/constants.py +0 -0
  317. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/opc/coreprops.py +0 -0
  318. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/opc/customprops.py +0 -0
  319. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/opc/exceptions.py +0 -0
  320. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/opc/oxml.py +0 -0
  321. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/opc/package.py +0 -0
  322. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/opc/packuri.py +0 -0
  323. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/opc/part.py +0 -0
  324. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/opc/parts/__init__.py +0 -0
  325. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/opc/parts/coreprops.py +0 -0
  326. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/opc/parts/customprops.py +0 -0
  327. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/opc/phys_pkg.py +0 -0
  328. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/opc/pkgreader.py +0 -0
  329. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/opc/pkgwriter.py +0 -0
  330. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/opc/rel.py +0 -0
  331. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/opc/shared.py +0 -0
  332. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/opc/spec.py +0 -0
  333. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/oxml/__init__.py +0 -0
  334. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/oxml/comments.py +0 -0
  335. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/oxml/coreprops.py +0 -0
  336. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/oxml/customprops.py +0 -0
  337. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/oxml/dml/CT_ExtensionList.py +0 -0
  338. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/oxml/document.py +0 -0
  339. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/oxml/drawing.py +0 -0
  340. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/oxml/exceptions.py +0 -0
  341. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/oxml/ns.py +0 -0
  342. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/oxml/numbering.py +0 -0
  343. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/oxml/parser.py +0 -0
  344. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/oxml/section.py +0 -0
  345. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/oxml/settings.py +0 -0
  346. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/oxml/shape.py +0 -0
  347. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/oxml/shared.py +0 -0
  348. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/oxml/simpletypes.py +0 -0
  349. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/oxml/styles.py +0 -0
  350. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/oxml/table.py +0 -0
  351. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/oxml/text/__init__.py +0 -0
  352. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/oxml/text/font.py +0 -0
  353. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/oxml/text/hyperlink.py +0 -0
  354. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/oxml/text/pagebreak.py +0 -0
  355. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/oxml/text/paragraph.py +0 -0
  356. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/oxml/text/parfmt.py +0 -0
  357. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/oxml/text/run.py +0 -0
  358. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/oxml/xmlchemy.py +0 -0
  359. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/package.py +0 -0
  360. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/parts/__init__.py +0 -0
  361. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/parts/comments.py +0 -0
  362. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/parts/customxml.py +0 -0
  363. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/parts/document.py +0 -0
  364. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/parts/hdrftr.py +0 -0
  365. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/parts/image.py +0 -0
  366. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/parts/numbering.py +0 -0
  367. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/parts/settings.py +0 -0
  368. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/parts/story.py +0 -0
  369. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/parts/styles.py +0 -0
  370. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/py.typed +0 -0
  371. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/sanitize/__init__.py +0 -0
  372. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/sanitize/cleaner.py +0 -0
  373. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/sanitize/result.py +0 -0
  374. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/section.py +0 -0
  375. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/settings.py +0 -0
  376. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/shape.py +0 -0
  377. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/shared.py +0 -0
  378. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/styles/__init__.py +0 -0
  379. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/styles/latent.py +0 -0
  380. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/styles/style.py +0 -0
  381. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/styles/styles.py +0 -0
  382. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/table.py +0 -0
  383. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/templates/default-comments.xml +0 -0
  384. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/templates/default-docx-template/[Content_Types].xml +0 -0
  385. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/templates/default-docx-template/_rels/.rels +0 -0
  386. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/templates/default-docx-template/customXml/_rels/item1.xml.rels +0 -0
  387. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/templates/default-docx-template/customXml/item1.xml +0 -0
  388. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/templates/default-docx-template/customXml/itemProps1.xml +0 -0
  389. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/templates/default-docx-template/docProps/app.xml +0 -0
  390. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/templates/default-docx-template/docProps/core.xml +0 -0
  391. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/templates/default-docx-template/docProps/thumbnail.jpeg +0 -0
  392. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/templates/default-docx-template/word/_rels/document.xml.rels +0 -0
  393. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/templates/default-docx-template/word/document.xml +0 -0
  394. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/templates/default-docx-template/word/fontTable.xml +0 -0
  395. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/templates/default-docx-template/word/numbering.xml +0 -0
  396. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/templates/default-docx-template/word/settings.xml +0 -0
  397. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/templates/default-docx-template/word/styles.xml +0 -0
  398. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/templates/default-docx-template/word/stylesWithEffects.xml +0 -0
  399. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/templates/default-docx-template/word/theme/theme1.xml +0 -0
  400. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/templates/default-docx-template/word/webSettings.xml +0 -0
  401. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/templates/default-footer.xml +0 -0
  402. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/templates/default-header.xml +0 -0
  403. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/templates/default-numbering.xml +0 -0
  404. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/templates/default-settings.xml +0 -0
  405. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/templates/default-styles.xml +0 -0
  406. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/templates/default.docx +0 -0
  407. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/text/__init__.py +0 -0
  408. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/text/font.py +0 -0
  409. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/text/hyperlink.py +0 -0
  410. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/text/pagebreak.py +0 -0
  411. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/text/paragraph.py +0 -0
  412. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/text/parfmt.py +0 -0
  413. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/text/run.py +0 -0
  414. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/text/tabstops.py +0 -0
  415. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/docx/types.py +0 -0
  416. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/python_docx_oss.egg-info/dependency_links.txt +0 -0
  417. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/python_docx_oss.egg-info/requires.txt +0 -0
  418. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/src/python_docx_oss.egg-info/top_level.txt +0 -0
  419. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/__init__.py +0 -0
  420. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/conftest.py +0 -0
  421. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/dml/__init__.py +0 -0
  422. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/dml/test_color.py +0 -0
  423. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/fixtures/README.md +0 -0
  424. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/fixtures/comments/word-comments-rich.docx +0 -0
  425. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/fixtures/customxml/generate_fixture.py +0 -0
  426. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/fixtures/customxml/multiple-custom-xml-parts.docx +0 -0
  427. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/fixtures/documents/word-blank.docx +0 -0
  428. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/fixtures/drawing/word-floating-picture.docx +0 -0
  429. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/fixtures/fonts/word-east-asian-fonts.docx +0 -0
  430. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/fixtures/images/word-svg-image.docx +0 -0
  431. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/image/__init__.py +0 -0
  432. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/image/test_bmp.py +0 -0
  433. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/image/test_emf.py +0 -0
  434. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/image/test_gif.py +0 -0
  435. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/image/test_helpers.py +0 -0
  436. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/image/test_image.py +0 -0
  437. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/image/test_jpeg.py +0 -0
  438. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/image/test_png.py +0 -0
  439. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/image/test_svg.py +0 -0
  440. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/image/test_tiff.py +0 -0
  441. {python_docx_oss-0.3.3/tests/opc → python_docx_oss-0.5.0/tests/inspection}/__init__.py +0 -0
  442. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/integration/__init__.py +0 -0
  443. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/integration/customxml/__init__.py +0 -0
  444. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/integration/customxml/test_custom_xml_roundtrip.py +0 -0
  445. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/integration/test_word_roundtrip.py +0 -0
  446. {python_docx_oss-0.3.3/tests/opc/parts → python_docx_oss-0.5.0/tests/opc}/__init__.py +0 -0
  447. {python_docx_oss-0.3.3/tests/opc/unitdata → python_docx_oss-0.5.0/tests/opc/parts}/__init__.py +0 -0
  448. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/opc/parts/test_coreprops.py +0 -0
  449. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/opc/parts/test_customprops.py +0 -0
  450. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/opc/test_coreprops.py +0 -0
  451. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/opc/test_customprops.py +0 -0
  452. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/opc/test_oxml.py +0 -0
  453. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/opc/test_package.py +0 -0
  454. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/opc/test_packuri.py +0 -0
  455. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/opc/test_part.py +0 -0
  456. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/opc/test_phys_pkg.py +0 -0
  457. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/opc/test_pkgreader.py +0 -0
  458. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/opc/test_pkgwriter.py +0 -0
  459. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/opc/test_rel.py +0 -0
  460. {python_docx_oss-0.3.3/tests/oxml → python_docx_oss-0.5.0/tests/opc/unitdata}/__init__.py +0 -0
  461. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/opc/unitdata/rels.py +0 -0
  462. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/opc/unitdata/types.py +0 -0
  463. {python_docx_oss-0.3.3/tests/oxml/parts → python_docx_oss-0.5.0/tests/oxml}/__init__.py +0 -0
  464. {python_docx_oss-0.3.3/tests/oxml/parts/unitdata → python_docx_oss-0.5.0/tests/oxml/parts}/__init__.py +0 -0
  465. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/oxml/parts/test_document.py +0 -0
  466. {python_docx_oss-0.3.3/tests/oxml/text → python_docx_oss-0.5.0/tests/oxml/parts/unitdata}/__init__.py +0 -0
  467. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/oxml/parts/unitdata/document.py +0 -0
  468. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/oxml/test__init__.py +0 -0
  469. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/oxml/test_comments.py +0 -0
  470. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/oxml/test_document.py +0 -0
  471. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/oxml/test_ns.py +0 -0
  472. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/oxml/test_section.py +0 -0
  473. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/oxml/test_styles.py +0 -0
  474. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/oxml/test_table.py +0 -0
  475. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/oxml/test_xmlchemy.py +0 -0
  476. {python_docx_oss-0.3.3/tests/oxml/unitdata → python_docx_oss-0.5.0/tests/oxml/text}/__init__.py +0 -0
  477. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/oxml/text/test_hyperlink.py +0 -0
  478. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/oxml/text/test_run.py +0 -0
  479. {python_docx_oss-0.3.3/tests/parts → python_docx_oss-0.5.0/tests/oxml/unitdata}/__init__.py +0 -0
  480. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/oxml/unitdata/dml.py +0 -0
  481. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/oxml/unitdata/numbering.py +0 -0
  482. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/oxml/unitdata/section.py +0 -0
  483. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/oxml/unitdata/shared.py +0 -0
  484. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/oxml/unitdata/styles.py +0 -0
  485. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/oxml/unitdata/table.py +0 -0
  486. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/oxml/unitdata/text.py +0 -0
  487. {python_docx_oss-0.3.3/tests/styles → python_docx_oss-0.5.0/tests/parts}/__init__.py +0 -0
  488. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/parts/test_comments.py +0 -0
  489. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/parts/test_customxml.py +0 -0
  490. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/parts/test_document.py +0 -0
  491. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/parts/test_hdrftr.py +0 -0
  492. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/parts/test_image.py +0 -0
  493. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/parts/test_numbering.py +0 -0
  494. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/parts/test_settings.py +0 -0
  495. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/parts/test_story.py +0 -0
  496. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/parts/test_styles.py +0 -0
  497. {python_docx_oss-0.3.3/tests/text → python_docx_oss-0.5.0/tests/styles}/__init__.py +0 -0
  498. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/styles/test_latent.py +0 -0
  499. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/styles/test_style.py +0 -0
  500. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/styles/test_styles.py +0 -0
  501. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/test_api.py +0 -0
  502. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/test_blkcntnr.py +0 -0
  503. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/test_comments.py +0 -0
  504. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/test_document.py +0 -0
  505. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/test_drawing.py +0 -0
  506. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/test_enum.py +0 -0
  507. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/test_files/150-dpi.png +0 -0
  508. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/test_files/300-dpi.TIF +0 -0
  509. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/test_files/300-dpi.jpg +0 -0
  510. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/test_files/300-dpi.png +0 -0
  511. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/test_files/72-dpi.tiff +0 -0
  512. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/test_files/CVS_LOGO.WMF +0 -0
  513. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/test_files/blk-inner-content.docx +0 -0
  514. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/test_files/exif-420-dpi.jpg +0 -0
  515. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/test_files/expanded_docx/[Content_Types].xml +0 -0
  516. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/test_files/expanded_docx/_rels/.rels +0 -0
  517. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/test_files/expanded_docx/customXml/_rels/item1.xml.rels +0 -0
  518. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/test_files/expanded_docx/customXml/item1.xml +0 -0
  519. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/test_files/expanded_docx/customXml/itemProps1.xml +0 -0
  520. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/test_files/expanded_docx/docProps/app.xml +0 -0
  521. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/test_files/expanded_docx/docProps/core.xml +0 -0
  522. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/test_files/expanded_docx/docProps/thumbnail.jpeg +0 -0
  523. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/test_files/expanded_docx/word/_rels/document.xml.rels +0 -0
  524. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/test_files/expanded_docx/word/document.xml +0 -0
  525. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/test_files/expanded_docx/word/fontTable.xml +0 -0
  526. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/test_files/expanded_docx/word/numbering.xml +0 -0
  527. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/test_files/expanded_docx/word/settings.xml +0 -0
  528. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/test_files/expanded_docx/word/styles.xml +0 -0
  529. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/test_files/expanded_docx/word/stylesWithEffects.xml +0 -0
  530. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/test_files/expanded_docx/word/theme/theme1.xml +0 -0
  531. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/test_files/expanded_docx/word/webSettings.xml +0 -0
  532. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/test_files/having-images.docx +0 -0
  533. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/test_files/jfif-iguana.jpg +0 -0
  534. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/test_files/jpeg_without_app0_and_app1.jpg +0 -0
  535. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/test_files/little-endian.tif +0 -0
  536. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/test_files/monty-truth.png +0 -0
  537. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/test_files/python-icon.jpeg +0 -0
  538. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/test_files/python-icon.png +0 -0
  539. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/test_files/python-powered.png +0 -0
  540. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/test_files/python.bmp +0 -0
  541. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/test_files/sct-inner-content.docx +0 -0
  542. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/test_files/snippets/add-row-col.txt +0 -0
  543. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/test_files/snippets/inline.txt +0 -0
  544. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/test_files/snippets/new-tbl.txt +0 -0
  545. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/test_files/snippets/tbl-cells.txt +0 -0
  546. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/test_files/sonic.emf +0 -0
  547. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/test_files/sonic.gif +0 -0
  548. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/test_files/test.docx +0 -0
  549. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/test_package.py +0 -0
  550. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/test_sanitize.py +0 -0
  551. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/test_section.py +0 -0
  552. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/test_settings.py +0 -0
  553. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/test_shape.py +0 -0
  554. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/test_shared.py +0 -0
  555. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/test_table.py +0 -0
  556. {python_docx_oss-0.3.3/tests/unitutil → python_docx_oss-0.5.0/tests/text}/__init__.py +0 -0
  557. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/text/test_font.py +0 -0
  558. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/text/test_hyperlink.py +0 -0
  559. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/text/test_pagebreak.py +0 -0
  560. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/text/test_paragraph.py +0 -0
  561. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/text/test_parfmt.py +0 -0
  562. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/text/test_run.py +0 -0
  563. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/text/test_tabstops.py +0 -0
  564. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/unitdata.py +0 -0
  565. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/unitutil/cxml.py +0 -0
  566. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/unitutil/file.py +0 -0
  567. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tests/unitutil/mock.py +0 -0
  568. {python_docx_oss-0.3.3 → python_docx_oss-0.5.0}/tox.ini +0 -0
@@ -1,5 +1,32 @@
1
1
  ## Release History
2
2
 
3
+ **0.5.0 (2026-11-02)**
4
+
5
+ - Rejected DTDs and entity expansion in XML tree serialization.
6
+ - Distinguished complete scans from clean inspection reports.
7
+ - Kept complex-field detection within its paragraph, including text boxes.
8
+ - Ignored indentation in schema-derived Word and DrawingML structures (fingerprint v3).
9
+ - Added a callback to exclude package parts or XML subtrees from fingerprints.
10
+ - Added a per-part normalization callback and a reusable XML tree serializer.
11
+ - Preserved following text when excluding elements with the XML tree serializer.
12
+ - Preserved XML namespace declarations when fingerprinting, including namespace
13
+ references in attribute values.
14
+ - Ignored formatting whitespace in known Word structural XML elements by default
15
+ when fingerprinting, preserving text and allowing exact structural whitespace comparison.
16
+ - Fixed hyperlink field conversion when proofing markers appear in the result.
17
+ - Added streaming story queries with caller-defined predicates and optional early exit.
18
+ - Replaced the fixed hyperlink feature fields with general-purpose scan events.
19
+
20
+ **0.4.0 (2026-10-29)**
21
+
22
+ - Added explicit, transactional empty Custom XML repair and conservative hyperlink
23
+ field conversion and run merging, with immutable change reports and selection callbacks.
24
+ - Added read-only package inspection with immutable inventories, structured findings,
25
+ empty and whitespace-only XML detection, and streaming hyperlink feature detection
26
+ across Word story parts.
27
+ - Added configurable SHA-256 package fingerprints with incremental payload processing,
28
+ XML canonicalization, and explicit part, relationship, and XML exclusions.
29
+
3
30
  **0.3.3 (2026-09-10)**
4
31
 
5
32
  - Switched PyPI distribution to GitHub Actions automated releases using PyPI Trusted Publishing (OIDC).
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-docx-oss
3
- Version: 0.3.3
3
+ Version: 0.5.0
4
4
  Summary: Create, read, and update Microsoft Word .docx files.
5
5
  Author: Ethan St Lee
6
6
  License-Expression: MIT
@@ -66,7 +66,10 @@ or low-level package and relationship access.
66
66
  | Low-level OPC parts and relationships | Stable | `document.part.package`, `part.rels` |
67
67
  | In-memory read, export, and independent copies | Stable | `Document()`, `to_bytes()`, `copy()` |
68
68
  | Document sanitization | Development | `document.sanitize()` |
69
- | Package inspection and diff | Planned | — |
69
+ | Read-only package inspection and story feature scanning | Development | `inspect()` |
70
+ | Configurable package-content fingerprints | Development | `fingerprint()`, `FingerprintPolicy` |
71
+ | Explicit empty Custom XML repair and hyperlink normalization | Development | `repair()`, `normalize()` |
72
+ | Package and semantic diff | Planned | — |
70
73
 
71
74
  ## Installation
72
75
 
@@ -116,6 +119,42 @@ document.save("output.docx")
116
119
 
117
120
  ## Advanced Capabilities
118
121
 
122
+ ### Package inspection and fingerprints
123
+
124
+ Inspect damaged documents before opening them, without loading media payloads:
125
+
126
+ ```python
127
+ from docx import FingerprintPolicy, fingerprint, inspect
128
+
129
+ report = inspect("input.docx")
130
+ for finding in report.findings:
131
+ print(finding.code, finding.partname)
132
+
133
+ digest = fingerprint("input.docx", policy=FingerprintPolicy(exclude_parts=("docProps/*",)))
134
+ ```
135
+
136
+ These APIs leave inputs unchanged and restore seekable stream positions. Fingerprints
137
+ ignore ZIP metadata and member ordering; all content is included unless explicitly
138
+ excluded. See [Package inspection and fingerprints](docs/user/inspection.rst) for
139
+ finding codes, XML comparison semantics, and policy rules.
140
+
141
+ ### Explicit repair and normalization
142
+
143
+ ```python
144
+ from docx import normalize, repair
145
+
146
+ repaired = repair(source_bytes, empty_custom_xml=True)
147
+ if repaired.report.succeeded:
148
+ normalized = normalize(repaired.content, hyperlink_fields=True, hyperlink_runs=True)
149
+ if normalized.report.succeeded:
150
+ output_bytes = normalized.content
151
+ ```
152
+
153
+ Operations are disabled by default. Results include committed changes, skipped cases,
154
+ and errors; validation failures return the original bytes. See
155
+ [Repair and normalization](docs/user/transformations.rst) for supported structures,
156
+ selection callbacks, and preservation rules.
157
+
119
158
  ### Custom properties
120
159
 
121
160
  ```python
@@ -200,8 +239,8 @@ uv run pyright
200
239
  ## Project Status
201
240
 
202
241
  The current focus is stabilizing the independent SDK baseline, its in-memory workflows,
203
- and its advanced OOXML capabilities before expanding document inspection, comparison,
204
- sanitization, composition, and validation APIs.
242
+ sanitization, and read-only package analysis before expanding document comparison,
243
+ composition, and validation APIs.
205
244
 
206
245
  ## Credits
207
246
 
@@ -37,7 +37,10 @@ or low-level package and relationship access.
37
37
  | Low-level OPC parts and relationships | Stable | `document.part.package`, `part.rels` |
38
38
  | In-memory read, export, and independent copies | Stable | `Document()`, `to_bytes()`, `copy()` |
39
39
  | Document sanitization | Development | `document.sanitize()` |
40
- | Package inspection and diff | Planned | — |
40
+ | Read-only package inspection and story feature scanning | Development | `inspect()` |
41
+ | Configurable package-content fingerprints | Development | `fingerprint()`, `FingerprintPolicy` |
42
+ | Explicit empty Custom XML repair and hyperlink normalization | Development | `repair()`, `normalize()` |
43
+ | Package and semantic diff | Planned | — |
41
44
 
42
45
  ## Installation
43
46
 
@@ -87,6 +90,42 @@ document.save("output.docx")
87
90
 
88
91
  ## Advanced Capabilities
89
92
 
93
+ ### Package inspection and fingerprints
94
+
95
+ Inspect damaged documents before opening them, without loading media payloads:
96
+
97
+ ```python
98
+ from docx import FingerprintPolicy, fingerprint, inspect
99
+
100
+ report = inspect("input.docx")
101
+ for finding in report.findings:
102
+ print(finding.code, finding.partname)
103
+
104
+ digest = fingerprint("input.docx", policy=FingerprintPolicy(exclude_parts=("docProps/*",)))
105
+ ```
106
+
107
+ These APIs leave inputs unchanged and restore seekable stream positions. Fingerprints
108
+ ignore ZIP metadata and member ordering; all content is included unless explicitly
109
+ excluded. See [Package inspection and fingerprints](docs/user/inspection.rst) for
110
+ finding codes, XML comparison semantics, and policy rules.
111
+
112
+ ### Explicit repair and normalization
113
+
114
+ ```python
115
+ from docx import normalize, repair
116
+
117
+ repaired = repair(source_bytes, empty_custom_xml=True)
118
+ if repaired.report.succeeded:
119
+ normalized = normalize(repaired.content, hyperlink_fields=True, hyperlink_runs=True)
120
+ if normalized.report.succeeded:
121
+ output_bytes = normalized.content
122
+ ```
123
+
124
+ Operations are disabled by default. Results include committed changes, skipped cases,
125
+ and errors; validation failures return the original bytes. See
126
+ [Repair and normalization](docs/user/transformations.rst) for supported structures,
127
+ selection callbacks, and preservation rules.
128
+
90
129
  ### Custom properties
91
130
 
92
131
  ```python
@@ -171,8 +210,8 @@ uv run pyright
171
210
  ## Project Status
172
211
 
173
212
  The current focus is stabilizing the independent SDK baseline, its in-memory workflows,
174
- and its advanced OOXML capabilities before expanding document inspection, comparison,
175
- sanitization, composition, and validation APIs.
213
+ sanitization, and read-only package analysis before expanding document comparison,
214
+ composition, and validation APIs.
176
215
 
177
216
  ## Credits
178
217
 
@@ -0,0 +1,11 @@
1
+ .. _inspection_api:
2
+
3
+ Package inspection and fingerprinting
4
+ ============================================
5
+
6
+ .. automodule:: docx.inspection
7
+ :members: inspect, fingerprint, FingerprintPolicy, PackageInspection,
8
+ PackageInventory, PartInventory, RelationshipInventory, Finding, ScanEvent
9
+
10
+ See :ref:`package_inspection` for finding codes, exclusions, scan scope, and
11
+ resource guarantees.
@@ -0,0 +1,9 @@
1
+ Package transformation APIs
2
+ ============================================
3
+
4
+ .. automodule:: docx.transforms
5
+ :members: repair, normalize, TransformationResult, TransformationReport, Change,
6
+ HyperlinkTarget
7
+
8
+ See :ref:`package_transformations` for repair eligibility, supported hyperlink
9
+ structures, transactional errors, and preservation guarantees.
@@ -97,6 +97,8 @@ User Guide
97
97
  user/styles-using
98
98
  user/comments
99
99
  user/sanitization
100
+ user/inspection
101
+ user/transformations
100
102
  user/shapes
101
103
  user/custom-properties
102
104
  user/custom-xml
@@ -117,6 +119,8 @@ API Documentation
117
119
  api/section
118
120
  api/comments
119
121
  api/sanitize
122
+ api/inspection
123
+ api/transforms
120
124
  api/shape
121
125
  api/dml
122
126
  api/shared
@@ -0,0 +1,242 @@
1
+ .. _package_inspection:
2
+
3
+ Inspecting packages and comparing content
4
+ ================================================
5
+
6
+ ``inspect()`` observes a DOCX before it can be opened as a ``Document``. It does
7
+ not repair or rewrite the input. Both inspection and fingerprinting accept a
8
+ filesystem path (including ``pathlib.Path``), raw bytes, or a binary stream::
9
+
10
+ from docx import inspect
11
+
12
+ report = inspect("input.docx")
13
+ for finding in report.findings:
14
+ print(finding.code, finding.partname, finding.target)
15
+
16
+ The report contains an immutable package inventory and structured findings.
17
+
18
+ To search Word story XML, provide a predicate that receives read-only events::
19
+
20
+ def find_bookmark(event):
21
+ return event.kind == "start" and event.tag.endswith("}bookmarkStart")
22
+
23
+ report = inspect("input.docx", predicate=find_bookmark, stop_on_match=True)
24
+ if report.findings:
25
+ print("The scanned package is damaged")
26
+ elif report.matched:
27
+ print("Bookmark found")
28
+
29
+ A predicate selects query scope: the main document and reachable headers,
30
+ footers, footnotes, endnotes, and comments. Query reports have empty inventory
31
+ and ``scope == "query"``. Without a predicate, inspection retains full scope
32
+ and inventory. The predicate runs on immutable ``ScanEvent`` objects with
33
+ ``partname``, ``kind`` (start/end/text), expanded ``tag``, ``attributes`` on
34
+ start events, and ``text`` on text events. Text may be delivered in multiple
35
+ chunks. A stateful callable may track element nesting and split text.
36
+
37
+ The default scans the full query scope even after a match; ``stop_on_match=True``
38
+ stops at the first match and sets ``scan_complete=False``. Findings report only
39
+ scanned content; neither an early match nor a query with no findings proves the
40
+ whole package is valid. Predicate exceptions propagate. The source stream is
41
+ never handed to the predicate.
42
+
43
+ ``scan_complete`` describes whether the selected scope was scanned successfully,
44
+ not whether the package is clean. Findings such as a missing relationship target
45
+ can coexist with a complete scan. Empty XML parts cannot be parsed as XML and,
46
+ like unreadable or unparseable parts, make the scan incomplete. Early stops also
47
+ make the scan incomplete. A query is incomplete if a reachable story is missing.
48
+
49
+ Names are package-relative without a leading slash. The relationship source
50
+ ``/`` denotes the package root. Internal target paths are resolved relative to
51
+ their source, with URI percent escapes decoded. Reachability does not imply
52
+ that a part is well-formed or safe to open.
53
+
54
+ Findings
55
+ --------
56
+
57
+ Use ``report.has_finding(code)`` or ``report.findings_by_code(code)`` rather than
58
+ matching human-readable exception messages. Findings carry the affected member
59
+ name when one is available, and missing-target findings carry ``target``.
60
+
61
+ .. list-table::
62
+ :header-rows: 1
63
+ :widths: 35 65
64
+
65
+ * - Code
66
+ - Meaning
67
+ * - ``not_a_package``
68
+ - An opened source cannot be read as a ZIP package.
69
+ * - ``missing_content_types``
70
+ - The package has no ``[Content_Types].xml`` member.
71
+ * - ``missing_main_document``
72
+ - No package-root officeDocument relationship resolves to an existing part.
73
+ * - ``invalid_content_types``
74
+ - The Content-Types member has an unexpected root element.
75
+ * - ``invalid_relationships``
76
+ - A relationship member has an unexpected root, missing required attributes,
77
+ duplicate IDs, or an invalid target URI.
78
+ * - ``empty_xml_part``
79
+ - An XML member has zero bytes or contains only XML whitespace.
80
+ * - ``unparseable_xml_part``
81
+ - XML is malformed or uses a DTD, which this API rejects.
82
+ * - ``missing_relationship_target``
83
+ - An internal relationship points to an absent member.
84
+ * - ``unreadable_part``
85
+ - An XML member cannot be decompressed or fails its ZIP integrity check.
86
+ * - ``duplicate_member``
87
+ - The ZIP contains the same member name more than once; inventory uses the first.
88
+ * - ``unsafe_member_name``
89
+ - A ZIP member has an absolute name, backslash, or parent-directory component.
90
+
91
+ All recognizable XML parts are checked, including unreachable XML. A broken
92
+ relationship part does not prevent other parts from being inventoried. Findings
93
+ are observations, not a complete OPC/schema/security validation; an empty list
94
+ does not guarantee that ``Document()`` or Microsoft Word can open the input.
95
+ Invalid source argument types raise ``TypeError``. Source opening failures, such
96
+ as ``FileNotFoundError`` or ``PermissionError``, propagate to the caller rather
97
+ than being classified as package damage. This matches ``repair()`` and ``normalize()``.
98
+
99
+ Story scanning and resource use
100
+ --------------------------------------
101
+
102
+ The query scans all reachable Word story parts, including Transitional and Strict
103
+ Word namespaces. No built-in hyperlink-specific feature is assumed.
104
+
105
+ Inspection reads XML incrementally without building an element tree. Media,
106
+ embedded objects, and other binary member payloads are never opened. Memory use
107
+ scales with package inventory and XML/field nesting depth, rather than story text or
108
+ media size. Metadata lists still scale with the number of parts and relationships.
109
+ Binary payload checksums are therefore not validated by inspection.
110
+
111
+ Seekable streams are read from the beginning, then restored to their original
112
+ position on success or failure. Caller-owned streams are never closed. A
113
+ forward-only stream is consumed and spooled, spilling to a temporary file beyond
114
+ 1 MiB. Paths and temporary handles are closed internally.
115
+
116
+ Content fingerprints
117
+ --------------------
118
+
119
+ ``fingerprint()`` computes a versioned SHA-256 package-content fingerprint::
120
+
121
+ from docx import FingerprintPolicy, fingerprint
122
+
123
+ unchanged = fingerprint(before_bytes) == fingerprint(after_bytes)
124
+
125
+ policy = FingerprintPolicy(exclude_parts=("docProps/*",))
126
+ unchanged_except_properties = (
127
+ fingerprint(before_bytes, policy=policy)
128
+ == fingerprint(after_bytes, policy=policy)
129
+ )
130
+
131
+ Member ordering, compression, ZIP timestamps, directory entries, and other ZIP
132
+ metadata do not affect the fingerprint. Member names and contents do. XML uses
133
+ C14N 2.0 with comments, which normalizes attribute ordering, quote style, and
134
+ empty-element spelling. By default, whitespace-only text directly inside known
135
+ element-only Word, DrawingML, MCE, and WordprocessingShape structures is ignored.
136
+ This includes whitespace between extension children of a known structure. Text
137
+ elements, unknown or unverified extension elements, generic Custom XML parts, and
138
+ elements under ``xml:space="preserve"`` retain whitespace. An explicit
139
+ ``xml:space="default"`` resets inherited preservation. Elements with an
140
+ ``xsi:type`` override are preserved conservatively. Set ``ignore_structural_whitespace=False`` on the policy
141
+ to retain structural whitespace. Namespace prefixes and declarations are preserved,
142
+ including declarations referenced only from attribute values. This rule applies
143
+ only to parts declared with a known WordprocessingML or DrawingML theme content
144
+ type, and to specific structural elements within them. The generated name list
145
+ comes from ECMA-376 fifth-edition Transitional and Strict schemas, ECMA-376 Part 3
146
+ MCE structures, and Microsoft's MS-ODRAWXML WordprocessingShape schema. It excludes
147
+ ambiguous element names, VML, and unverified extensions. The document is not schema
148
+ validated; this rule assumes the known elements follow their element-only or empty
149
+ content model. Use ``normalize`` for broader application-specific comparison.
150
+ Raw XML hashing with
151
+ ``canonicalize_xml=False`` always preserves the original bytes.
152
+ This is not a semantic Word comparison: equivalent rendering can produce
153
+ different fingerprints. Compare fingerprints with the same policy and API
154
+ algorithm version; the digest is not compatible with arbitrary existing hashes.
155
+ The expanded structural-whitespace rules use fingerprint algorithm version 3, so
156
+ digest strings differ from earlier versions even when whitespace handling is disabled.
157
+
158
+ The optional ``normalize`` callback can replace the bytes hashed for a part::
159
+
160
+ from docx import FingerprintItem, FingerprintPolicy, serialize_xml
161
+ from lxml import etree
162
+
163
+ def normalize(item: FingerprintItem, read_bytes):
164
+ if not item.part_name.endswith(".xml"):
165
+ return "raw"
166
+ content = read_bytes()
167
+ try:
168
+ return serialize_xml(content, part_name=item.part_name)
169
+ except etree.XMLSyntaxError:
170
+ return content
171
+
172
+ policy = FingerprintPolicy(normalize=normalize)
173
+
174
+ The callback receives a part item and an on-demand reader. Return bytes to hash
175
+ those bytes directly, ``"raw"`` to hash the original part incrementally, or
176
+ ``None`` to use the default processing. ``read_bytes()`` returns the original
177
+ bytes, can be called repeatedly, and materializes that part in memory only when
178
+ called. Errors propagate. The callback must produce deterministic results.
179
+ Part exclusions run first. For bytes or raw results, the callback is responsible
180
+ for any element-level exclusions; default XML canonicalization and element
181
+ exclusion callbacks are bypassed. When every included part is handled by the
182
+ callback, Content Types need not be read for classification. Otherwise the
183
+ Content Types member is still read to classify parts using default processing.
184
+
185
+ ``serialize_xml()`` is a tree-based helper: it removes blank text using lxml,
186
+ optionally excludes XML elements with the same predicate as ``exclude``, and
187
+ returns serialized bytes. It preserves attribute order, requires memory
188
+ proportional to the XML part, and preserves text following an excluded element
189
+ that remains after lxml's blank-text removal.
190
+ Its blank-text treatment is broader
191
+ than the default structural-whitespace rule; use it only when appropriate.
192
+
193
+ The default includes document properties, Custom XML, relationships, and binary
194
+ content. ``FingerprintPolicy`` can explicitly exclude:
195
+
196
+ * ``exclude_parts``: shell-style patterns against member names; ``*`` also
197
+ matches ``/``;
198
+ * ``exclude_relationship_types``: complete relationship Type URIs;
199
+ * ``exclude_xml_tags``: expanded XML names, removing entire subtrees;
200
+ * ``exclude_xml_attributes``: expanded XML attribute names.
201
+ * ``exclude``: a predicate for package parts and XML elements.
202
+
203
+ The predicate receives a read-only ``FingerprintItem``. Its ``kind`` is ``part``
204
+ or ``xml_element``; ``part_name`` is the package-relative member name. XML
205
+ elements also expose expanded-name ``tag`` and ``attributes``, ``ancestors``
206
+ (root first), and ``parent_tag`` (or ``None`` for a root). For example::
207
+
208
+ from docx import FingerprintItem, FingerprintPolicy
209
+
210
+ def exclude(item: FingerprintItem) -> bool:
211
+ if item.kind == "part":
212
+ return item.part_name.startswith("docProps/")
213
+ return item.tag == "{urn:example}color" and item.parent_tag == "{urn:example}properties"
214
+
215
+ policy = FingerprintPolicy(exclude=exclude)
216
+
217
+ Returning true excludes the part or the element and its entire subtree; excluded
218
+ subtrees are not visited. Exclusions combine with the other policy settings: any
219
+ matching rule excludes the item. XML element callbacks run only when XML
220
+ canonicalization is enabled. Part callbacks run even with raw XML hashing.
221
+ Content Types are read for default XML classification even when excluded. The
222
+ predicate must be deterministic and equivalent for both fingerprints being
223
+ compared; its exceptions propagate to the caller.
224
+
225
+ For example, ``exclude_xml_tags=("{namespace-uri}element",)`` applies to that
226
+ element throughout the package. Excluding a member does not automatically
227
+ exclude relationships or Content-Type declarations that reference it.
228
+ Relationship exclusions do not remove their target parts. Applications must
229
+ choose the complete policy appropriate to their comparison.
230
+
231
+ When default XML processing is used, ``[Content_Types].xml`` is read for
232
+ XML classification, even if excluded from the digest. XML parts with nonstandard
233
+ extensions therefore retain the same comparison rules. A malformed or empty
234
+ Content-Types member raises a member-specific ``ValueError`` even when excluded.
235
+
236
+ Set ``canonicalize_xml=False`` to hash XML bytes exactly. XML exclusions cannot
237
+ be combined with that mode. Unlike ``inspect()``, fingerprinting raises on
238
+ unreadable packages or malformed included XML rather than returning a partial
239
+ digest. Duplicate member names are rejected. DTDs are rejected when XML is
240
+ canonicalized. Binary and XML contents are processed incrementally; the function
241
+ does not collect all member payloads in memory. Stream guarantees match
242
+ ``inspect()``.
@@ -0,0 +1,150 @@
1
+ .. _package_transformations:
2
+
3
+ Repairing and normalizing packages
4
+ ============================================
5
+
6
+ ``repair()`` and ``normalize()`` perform explicit package edits. Every operation
7
+ is disabled by default. They accept the same path, bytes, and binary stream
8
+ inputs as :ref:`package_inspection`, and return a ``TransformationResult`` with
9
+ ``content`` bytes and an immutable ``report``::
10
+
11
+ from docx import normalize, repair
12
+
13
+ repaired = repair(source_bytes, empty_custom_xml=True)
14
+ if repaired.report.succeeded:
15
+ normalized = normalize(
16
+ repaired.content,
17
+ hyperlink_fields=True,
18
+ hyperlink_runs=True,
19
+ )
20
+ if normalized.report.succeeded:
21
+ output_bytes = normalized.content
22
+
23
+ Inputs are never overwritten. Seekable streams are read from the beginning and
24
+ their positions restored; borrowed streams stay open. Forward-only streams are
25
+ consumed. Source access failures and invalid argument types raise because original
26
+ bytes cannot be obtained. Application selector exceptions also propagate.
27
+
28
+ Reports and transactional behavior
29
+ --------------------------------------------
30
+
31
+ The report exposes:
32
+
33
+ * ``before`` and ``after``: package inspection reports for the original and
34
+ returned content;
35
+ * ``changes``: committed operations with member name, count, and, where relevant,
36
+ relationship ID and target;
37
+ * ``skipped``: unsupported or unselected hyperlink operations, with member context;
38
+ * ``errors``: conditions that prevented the operation;
39
+ * ``succeeded``: whether the operation completed without errors;
40
+ * ``changed``: whether any changes were committed.
41
+
42
+ When all options are disabled, the original bytes are returned with an inspection
43
+ report, without attempting repair or document-open validation. Existing findings
44
+ remain visible in ``before``; ``succeeded`` does not imply those findings were fixed.
45
+
46
+ With an operation enabled, input inspection runs first. Unsupported damage blocks
47
+ the operation. A candidate is inspected again and opened as a ``Document``; its
48
+ main part must be a supported Word document with a body. On failure, the original
49
+ bytes are returned, ``errors`` explains why, and ``changes`` is empty. Thus
50
+ ``after`` always describes the bytes actually returned. Successful operations may
51
+ still contain ``skipped`` entries; inspect those before assuming every hyperlink
52
+ was normalized.
53
+
54
+ This validates package relationships and library readability, not full OOXML
55
+ schema conformance or Microsoft Word rendering. Operations currently target the
56
+ Transitional Word namespace supported by ``Document()``.
57
+
58
+ Empty Custom XML repair
59
+ --------------------------------------------
60
+
61
+ ``repair(source, empty_custom_xml=True)`` replaces empty Custom XML data with
62
+ ``<root/>``. Eligibility requires both:
63
+
64
+ * all incoming internal relationships to the part are ``customXml``; and
65
+ * the Content-Type is generic ``application/xml`` or ``text/xml``.
66
+
67
+ Zero-byte and XML-whitespace-only parts qualify as empty. The original schema,
68
+ business tags, or lost data cannot be reconstructed: the replacement is a neutral
69
+ well-formed placeholder. The report records ``filled_empty_custom_xml`` for each
70
+ part. Relationships, Custom XML properties, and other package members are retained.
71
+
72
+ The API does not fill empty main documents, headers, Custom XML properties, or
73
+ unidentified orphan XML. Malformed nonempty XML and other inspection findings
74
+ cause the whole repair to fail, preserving the original bytes. Run normalization
75
+ separately after a successful repair. Repeating repair on its output is a byte
76
+ identical no-op.
77
+
78
+ Hyperlink normalization
79
+ --------------------------------------------
80
+
81
+ ``hyperlink_fields=True`` converts supported ``HYPERLINK`` fields into standard
82
+ ``w:hyperlink`` elements. It handles simple fields and paragraph-local complex
83
+ fields with separate begin, instruction, separator, result, and end runs. Field
84
+ instructions may span runs. Result runs retain their text and formatting; proofing
85
+ markers within the result remain in their original order.
86
+
87
+ Supported targets include quoted or unquoted addresses, bookmark-only links,
88
+ and address plus bookmark. Supported switches are ``\l`` (anchor), ``\o``
89
+ (tooltip), ``\t`` (target frame), and ``\* MERGEFORMAT``. Unknown switches,
90
+ locked or nested fields, revision markup, mixed delimiter/content runs, and
91
+ bookmark or comment range boundaries are left unchanged and reported. Other
92
+ field types, such as TOC and REF, are untouched.
93
+
94
+ Quoted field arguments decode escaped backslashes and escaped double quotes.
95
+ Unknown or malformed escapes, unclosed strings, and doubled-quote notation are
96
+ preserved and reported as skipped rather than converted into potentially wrong targets.
97
+
98
+ External hyperlink relationships are reused when possible. New IDs avoid existing
99
+ IDs in that story part. Missing relationship members and their Content-Type
100
+ declarations are added when needed. Main document, headers, footers, footnotes,
101
+ endnotes, and comments are processed through their reachable story relationships.
102
+
103
+ ``hyperlink_runs=True`` merges adjacent text-only runs inside a hyperlink only
104
+ when explicit run properties and attributes other than ``w:rsidR`` and
105
+ ``w:rsidRPr`` match. The surviving run retains its original session identifiers;
106
+ per-run session provenance is coalesced. Text and spaces are preserved.
107
+ Different formatting, other attributes (including ``w:rsidDel``), drawings,
108
+ tabs, breaks, revision containers,
109
+ and intervening markup prevent merging across that boundary. Safe adjacent groups
110
+ can still be merged while unsupported groups are reported as skipped.
111
+
112
+ Application-owned selection
113
+ --------------------------------------------
114
+
115
+ The optional ``select_hyperlink`` callback receives an immutable
116
+ ``HyperlinkTarget(partname, address, anchor)``. Return ``True`` to select a
117
+ supported field conversion or existing-link run merge::
118
+
119
+ def select_link(target):
120
+ return target.address is not None and target.address.startswith(
121
+ "https://example.test/documents/"
122
+ )
123
+
124
+ result = normalize(
125
+ source_bytes,
126
+ hyperlink_fields=True,
127
+ hyperlink_runs=True,
128
+ select_hyperlink=select_link,
129
+ )
130
+
131
+ Without a callback all supported hyperlinks are selected. The SDK contains no
132
+ application URL or tag rules. For existing hyperlinks ``address`` comes from the
133
+ story relationship target; bookmark-only links have ``address=None``. The callback
134
+ must be deterministic: it may be called for conversion and then again for merging
135
+ the resulting link. Returning ``False`` is reported as skipped.
136
+
137
+ Preservation and resource use
138
+ --------------------------------------------
139
+
140
+ Only edited XML members are serialized. Other member contents, including opaque
141
+ media, embedded objects, macros, unknown XML, and unreachable parts, are copied
142
+ unchanged. ZIP member metadata and archive comments are retained where supported
143
+ by Python's ZIP writer; compressed bytes and ZIP offsets may change. The package
144
+ is not saved through ``Document`` during transformation.
145
+
146
+ These editing APIs retain input and output bytes, build a tree for the story
147
+ currently being edited, and open the result for validation. They do not have the
148
+ streaming memory profile of ``inspect()``. No-op results retain the original bytes
149
+ exactly. Repeated normalization with the same deterministic selection is a byte
150
+ identical no-op once supported changes have been applied.
@@ -9,14 +9,25 @@ from __future__ import annotations
9
9
  from typing import TYPE_CHECKING, Type
10
10
 
11
11
  from docx.api import Document
12
+ from docx.inspection import FingerprintItem, FingerprintPolicy, fingerprint, inspect, serialize_xml
13
+ from docx.transforms import normalize, repair
12
14
 
13
15
  if TYPE_CHECKING:
14
16
  from docx.opc.part import Part
15
17
 
16
- __version__ = "0.3.3"
18
+ __version__ = "0.5.0"
17
19
 
18
20
 
19
- __all__ = ["Document"]
21
+ __all__ = [
22
+ "Document",
23
+ "FingerprintItem",
24
+ "FingerprintPolicy",
25
+ "fingerprint",
26
+ "inspect",
27
+ "normalize",
28
+ "repair",
29
+ "serialize_xml",
30
+ ]
20
31
 
21
32
 
22
33
  # -- register custom Part classes with opc package reader --
@@ -0,0 +1,31 @@
1
+ """Read-only package inspection and configurable content fingerprints."""
2
+
3
+ from docx.inspection.features import ScanEvent
4
+ from docx.inspection.fingerprint import (
5
+ FingerprintItem,
6
+ FingerprintPolicy,
7
+ fingerprint,
8
+ serialize_xml,
9
+ )
10
+ from docx.inspection.reader import inspect
11
+ from docx.inspection.result import (
12
+ Finding,
13
+ PackageInspection,
14
+ PackageInventory,
15
+ PartInventory,
16
+ RelationshipInventory,
17
+ )
18
+
19
+ __all__ = [
20
+ "ScanEvent",
21
+ "Finding",
22
+ "FingerprintItem",
23
+ "FingerprintPolicy",
24
+ "PackageInspection",
25
+ "PackageInventory",
26
+ "PartInventory",
27
+ "RelationshipInventory",
28
+ "fingerprint",
29
+ "serialize_xml",
30
+ "inspect",
31
+ ]