python-pptx2 2.16.0__tar.gz → 2.18.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 (618) hide show
  1. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/HISTORY.rst +41 -0
  2. {python_pptx2-2.16.0/src/python_pptx2.egg-info → python_pptx2-2.18.0}/PKG-INFO +1 -1
  3. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/__init__.py +1 -1
  4. python_pptx2-2.18.0/src/pptx2/_agent_friendly.py +136 -0
  5. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/_textstyle.py +1 -0
  6. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/audit.py +24 -3
  7. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/shapes/shapetree.py +216 -17
  8. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/skill/references/basics.md +9 -0
  9. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/skill/references/lint.md +7 -0
  10. {python_pptx2-2.16.0 → python_pptx2-2.18.0/src/python_pptx2.egg-info}/PKG-INFO +1 -1
  11. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/python_pptx2.egg-info/SOURCES.txt +1 -0
  12. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_audit.py +31 -0
  13. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_shape_helpers.py +93 -0
  14. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/LICENSE +0 -0
  15. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/MANIFEST.in +0 -0
  16. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/README.rst +0 -0
  17. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/act-action.feature +0 -0
  18. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/act-hyperlink.feature +0 -0
  19. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/cht-axis-props.feature +0 -0
  20. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/cht-axistitle-props.feature +0 -0
  21. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/cht-category-access.feature +0 -0
  22. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/cht-category-props.feature +0 -0
  23. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/cht-chart.feature +0 -0
  24. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/cht-charttitle-props.feature +0 -0
  25. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/cht-data-props.feature +0 -0
  26. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/cht-datalabels.feature +0 -0
  27. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/cht-gridlines-props.feature +0 -0
  28. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/cht-legend-access.feature +0 -0
  29. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/cht-legend-props.feature +0 -0
  30. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/cht-marker-props.feature +0 -0
  31. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/cht-plot-props.feature +0 -0
  32. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/cht-point-access.feature +0 -0
  33. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/cht-point-props.feature +0 -0
  34. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/cht-replace-data.feature +0 -0
  35. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/cht-series.feature +0 -0
  36. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/cht-ticklabels-props.feature +0 -0
  37. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/dml-color.feature +0 -0
  38. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/dml-effect.feature +0 -0
  39. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/dml-fill.feature +0 -0
  40. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/dml-line.feature +0 -0
  41. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/environment.py +0 -0
  42. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/ph-inherit-props.feature +0 -0
  43. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/ph-insert-shape.feature +0 -0
  44. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/ph-phfmt-props.feature +0 -0
  45. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/ph-placeholder-props.feature +0 -0
  46. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/prs-coreprops.feature +0 -0
  47. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/prs-default-template.feature +0 -0
  48. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/prs-open-save.feature +0 -0
  49. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/prs-presentation-props.feature +0 -0
  50. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/shp-autoshape.feature +0 -0
  51. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/shp-connector.feature +0 -0
  52. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/shp-freeform.feature +0 -0
  53. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/shp-graphicframe.feature +0 -0
  54. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/shp-groupshape.feature +0 -0
  55. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/shp-movie-props.feature +0 -0
  56. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/shp-picture.feature +0 -0
  57. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/shp-placeholder.feature +0 -0
  58. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/shp-shapes.feature +0 -0
  59. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/shp-shared.feature +0 -0
  60. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/sld-background.feature +0 -0
  61. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/sld-slide.feature +0 -0
  62. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/sld-slides.feature +0 -0
  63. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/action.py +0 -0
  64. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/axis.py +0 -0
  65. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/background.py +0 -0
  66. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/category.py +0 -0
  67. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/chart.py +0 -0
  68. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/chartdata.py +0 -0
  69. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/color.py +0 -0
  70. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/coreprops.py +0 -0
  71. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/datalabel.py +0 -0
  72. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/effect.py +0 -0
  73. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/fill.py +0 -0
  74. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/font.py +0 -0
  75. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/font_color.py +0 -0
  76. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/helpers.py +0 -0
  77. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/legend.py +0 -0
  78. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/line.py +0 -0
  79. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/picture.py +0 -0
  80. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/placeholder.py +0 -0
  81. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/plot.py +0 -0
  82. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/presentation.py +0 -0
  83. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/series.py +0 -0
  84. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/shape.py +0 -0
  85. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/shapes.py +0 -0
  86. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/slide.py +0 -0
  87. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/slides.py +0 -0
  88. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/table.py +0 -0
  89. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/72-dpi.tiff +0 -0
  90. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/CVS_LOGO.WMF +0 -0
  91. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/act-props.pptm +0 -0
  92. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/calibriz.ttf +0 -0
  93. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/cht-axis-props.pptx +0 -0
  94. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/cht-category-access.pptx +0 -0
  95. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/cht-chart-props.pptx +0 -0
  96. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/cht-chart-type.pptx +0 -0
  97. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/cht-charts.pptx +0 -0
  98. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/cht-datalabels.pptx +0 -0
  99. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/cht-gridlines-props.pptx +0 -0
  100. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/cht-legend-props.pptx +0 -0
  101. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/cht-legend.pptx +0 -0
  102. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/cht-marker-props.pptx +0 -0
  103. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/cht-plot-props.pptx +0 -0
  104. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/cht-point-access.pptx +0 -0
  105. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/cht-point-props.pptx +0 -0
  106. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/cht-replace-data.pptx +0 -0
  107. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/cht-series.pptx +0 -0
  108. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/cht-ticklabels-props.pptx +0 -0
  109. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/dml-effect.pptx +0 -0
  110. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/dml-fill.pptx +0 -0
  111. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/dml-line.pptx +0 -0
  112. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/ext-rels.pptx +0 -0
  113. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/extracted-pptx/[Content_Types].xml +0 -0
  114. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/extracted-pptx/_rels/.rels +0 -0
  115. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/extracted-pptx/docProps/app.xml +0 -0
  116. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/extracted-pptx/docProps/core.xml +0 -0
  117. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/extracted-pptx/docProps/thumbnail.jpeg +0 -0
  118. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/extracted-pptx/ppt/_rels/presentation.xml.rels +0 -0
  119. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/extracted-pptx/ppt/presProps.xml +0 -0
  120. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/extracted-pptx/ppt/presentation.xml +0 -0
  121. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/extracted-pptx/ppt/printerSettings/printerSettings1.bin +0 -0
  122. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/_rels/slideLayout1.xml.rels +0 -0
  123. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/_rels/slideLayout10.xml.rels +0 -0
  124. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/_rels/slideLayout11.xml.rels +0 -0
  125. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/_rels/slideLayout2.xml.rels +0 -0
  126. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/_rels/slideLayout3.xml.rels +0 -0
  127. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/_rels/slideLayout4.xml.rels +0 -0
  128. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/_rels/slideLayout5.xml.rels +0 -0
  129. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/_rels/slideLayout6.xml.rels +0 -0
  130. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/_rels/slideLayout7.xml.rels +0 -0
  131. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/_rels/slideLayout8.xml.rels +0 -0
  132. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/_rels/slideLayout9.xml.rels +0 -0
  133. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/slideLayout1.xml +0 -0
  134. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/slideLayout10.xml +0 -0
  135. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/slideLayout11.xml +0 -0
  136. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/slideLayout2.xml +0 -0
  137. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/slideLayout3.xml +0 -0
  138. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/slideLayout4.xml +0 -0
  139. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/slideLayout5.xml +0 -0
  140. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/slideLayout6.xml +0 -0
  141. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/slideLayout7.xml +0 -0
  142. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/slideLayout8.xml +0 -0
  143. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/slideLayout9.xml +0 -0
  144. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/extracted-pptx/ppt/slideMasters/_rels/slideMaster1.xml.rels +0 -0
  145. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/extracted-pptx/ppt/slideMasters/slideMaster1.xml +0 -0
  146. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/extracted-pptx/ppt/slides/_rels/slide1.xml.rels +0 -0
  147. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/extracted-pptx/ppt/slides/slide1.xml +0 -0
  148. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/extracted-pptx/ppt/tableStyles.xml +0 -0
  149. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/extracted-pptx/ppt/theme/theme1.xml +0 -0
  150. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/extracted-pptx/ppt/viewProps.xml +0 -0
  151. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/font-color.pptx +0 -0
  152. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/just-two-mice.mp4 +0 -0
  153. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/just-two-mice.png +0 -0
  154. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/lyt-shapes.pptx +0 -0
  155. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/minimal.pptx +0 -0
  156. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/monty-truth.png +0 -0
  157. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/mst-placeholders.pptx +0 -0
  158. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/mst-shapes.pptx +0 -0
  159. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/mst-slide-layouts.pptx +0 -0
  160. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/ph-inherit-props.pptx +0 -0
  161. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/ph-populated-placeholders.pptx +0 -0
  162. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/ph-unpopulated-placeholders.pptx +0 -0
  163. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/pic.emf +0 -0
  164. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/prs-add-slide.pptx +0 -0
  165. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/prs-notes.pptx +0 -0
  166. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/prs-properties.pptx +0 -0
  167. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/prs-slide-masters.pptx +0 -0
  168. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/python-icon.jpeg +0 -0
  169. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/python-powered.png +0 -0
  170. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/python.bmp +0 -0
  171. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/shp-access-chart.pptx +0 -0
  172. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/shp-access-ole-object.pptx +0 -0
  173. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/shp-autoshape-adjustments.pptx +0 -0
  174. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/shp-autoshape-props.pptx +0 -0
  175. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/shp-common-props.pptx +0 -0
  176. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/shp-connector-props.pptx +0 -0
  177. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/shp-embedded-docx.docx +0 -0
  178. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/shp-embedded-pptx.pptx +0 -0
  179. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/shp-embedded-xlsx.xlsx +0 -0
  180. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/shp-freeform.pptx +0 -0
  181. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/shp-groupshape.pptx +0 -0
  182. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/shp-movie-props.pptx +0 -0
  183. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/shp-picture.pptx +0 -0
  184. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/shp-pos-and-size.pptx +0 -0
  185. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/shp-shapes.pptx +0 -0
  186. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/sld-background.pptx +0 -0
  187. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/sld-blank.pptx +0 -0
  188. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/sld-notes.pptx +0 -0
  189. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/sld-slide.pptx +0 -0
  190. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/sld-slides.pptx +0 -0
  191. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/sonic.gif +0 -0
  192. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/tbl-cell.pptx +0 -0
  193. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/test-image-jpg-mime.pptx +0 -0
  194. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/test.pptx +0 -0
  195. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/txt-fit-text.pptx +0 -0
  196. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/txt-font-props.pptx +0 -0
  197. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/txt-font-typeface.pptx +0 -0
  198. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/txt-paragraph-spacing.pptx +0 -0
  199. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/txt-text-frame.pptx +0 -0
  200. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/txt-text.pptx +0 -0
  201. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/text.py +0 -0
  202. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/text_frame.py +0 -0
  203. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/tbl-cell.feature +0 -0
  204. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/tbl-column.feature +0 -0
  205. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/tbl-table.feature +0 -0
  206. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/txt-fit-text.feature +0 -0
  207. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/txt-font-color.feature +0 -0
  208. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/txt-font-props.feature +0 -0
  209. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/txt-paragraph.feature +0 -0
  210. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/txt-text.feature +0 -0
  211. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/txt-textframe.feature +0 -0
  212. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/pyproject.toml +0 -0
  213. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/setup.cfg +0 -0
  214. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/_color.py +0 -0
  215. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/_slide_importer.py +0 -0
  216. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/_svg.py +0 -0
  217. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/_template_applier.py +0 -0
  218. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/accessibility.py +0 -0
  219. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/action.py +0 -0
  220. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/animation.py +0 -0
  221. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/api.py +0 -0
  222. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/chart/__init__.py +0 -0
  223. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/chart/analytics.py +0 -0
  224. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/chart/axis.py +0 -0
  225. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/chart/category.py +0 -0
  226. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/chart/chart.py +0 -0
  227. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/chart/data.py +0 -0
  228. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/chart/datalabel.py +0 -0
  229. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/chart/legend.py +0 -0
  230. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/chart/marker.py +0 -0
  231. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/chart/palettes.py +0 -0
  232. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/chart/plot.py +0 -0
  233. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/chart/point.py +0 -0
  234. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/chart/quick_layouts.py +0 -0
  235. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/chart/series.py +0 -0
  236. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/chart/xlsx.py +0 -0
  237. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/chart/xmlwriter.py +0 -0
  238. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/compose/__init__.py +0 -0
  239. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/compose/from_spec.py +0 -0
  240. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/design/__init__.py +0 -0
  241. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/design/components.py +0 -0
  242. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/design/figures.py +0 -0
  243. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/design/layout.py +0 -0
  244. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/design/recipes.py +0 -0
  245. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/design/style.py +0 -0
  246. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/design/tokens.py +0 -0
  247. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/diagrams.py +0 -0
  248. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/dml/__init__.py +0 -0
  249. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/dml/chtfmt.py +0 -0
  250. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/dml/color.py +0 -0
  251. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/dml/effect.py +0 -0
  252. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/dml/fill.py +0 -0
  253. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/dml/line.py +0 -0
  254. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/dml/picture.py +0 -0
  255. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/dml/three_d.py +0 -0
  256. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/enum/__init__.py +0 -0
  257. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/enum/action.py +0 -0
  258. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/enum/animation.py +0 -0
  259. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/enum/base.py +0 -0
  260. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/enum/chart.py +0 -0
  261. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/enum/dml.py +0 -0
  262. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/enum/lang.py +0 -0
  263. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/enum/presentation.py +0 -0
  264. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/enum/shapes.py +0 -0
  265. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/enum/text.py +0 -0
  266. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/exc.py +0 -0
  267. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/formats.py +0 -0
  268. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/geometry.py +0 -0
  269. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/inherit.py +0 -0
  270. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/lint.py +0 -0
  271. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/math.py +0 -0
  272. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/mathml2omml.py +0 -0
  273. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/media.py +0 -0
  274. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/opc/__init__.py +0 -0
  275. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/opc/constants.py +0 -0
  276. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/opc/oxml.py +0 -0
  277. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/opc/package.py +0 -0
  278. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/opc/packuri.py +0 -0
  279. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/opc/serialized.py +0 -0
  280. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/opc/shared.py +0 -0
  281. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/opc/spec.py +0 -0
  282. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/oxml/__init__.py +0 -0
  283. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/oxml/action.py +0 -0
  284. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/oxml/chart/__init__.py +0 -0
  285. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/oxml/chart/axis.py +0 -0
  286. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/oxml/chart/chart.py +0 -0
  287. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/oxml/chart/datalabel.py +0 -0
  288. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/oxml/chart/legend.py +0 -0
  289. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/oxml/chart/marker.py +0 -0
  290. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/oxml/chart/plot.py +0 -0
  291. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/oxml/chart/series.py +0 -0
  292. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/oxml/chart/shared.py +0 -0
  293. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/oxml/coreprops.py +0 -0
  294. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/oxml/customprops.py +0 -0
  295. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/oxml/dml/__init__.py +0 -0
  296. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/oxml/dml/color.py +0 -0
  297. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/oxml/dml/effect.py +0 -0
  298. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/oxml/dml/fill.py +0 -0
  299. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/oxml/dml/line.py +0 -0
  300. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/oxml/dml/three_d.py +0 -0
  301. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/oxml/ns.py +0 -0
  302. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/oxml/presentation.py +0 -0
  303. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/oxml/shapes/__init__.py +0 -0
  304. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/oxml/shapes/autoshape.py +0 -0
  305. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/oxml/shapes/connector.py +0 -0
  306. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/oxml/shapes/graphfrm.py +0 -0
  307. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/oxml/shapes/groupshape.py +0 -0
  308. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/oxml/shapes/picture.py +0 -0
  309. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/oxml/shapes/shared.py +0 -0
  310. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/oxml/simpletypes.py +0 -0
  311. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/oxml/slide.py +0 -0
  312. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/oxml/table.py +0 -0
  313. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/oxml/text.py +0 -0
  314. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/oxml/theme.py +0 -0
  315. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/oxml/xmlchemy.py +0 -0
  316. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/package.py +0 -0
  317. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/parts/__init__.py +0 -0
  318. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/parts/chart.py +0 -0
  319. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/parts/coreprops.py +0 -0
  320. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/parts/customprops.py +0 -0
  321. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/parts/diagram.py +0 -0
  322. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/parts/embeddedpackage.py +0 -0
  323. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/parts/image.py +0 -0
  324. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/parts/media.py +0 -0
  325. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/parts/presentation.py +0 -0
  326. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/parts/slide.py +0 -0
  327. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/presentation.py +0 -0
  328. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/py.typed +0 -0
  329. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/render.py +0 -0
  330. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/section.py +0 -0
  331. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/shapes/__init__.py +0 -0
  332. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/shapes/autoshape.py +0 -0
  333. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/shapes/base.py +0 -0
  334. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/shapes/connector.py +0 -0
  335. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/shapes/freeform.py +0 -0
  336. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/shapes/graphfrm.py +0 -0
  337. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/shapes/group.py +0 -0
  338. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/shapes/picture.py +0 -0
  339. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/shapes/placeholder.py +0 -0
  340. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/shared.py +0 -0
  341. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/skill/SKILL.md +0 -0
  342. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/skill/__init__.py +0 -0
  343. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/skill/__main__.py +0 -0
  344. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/skill/references/animations.md +0 -0
  345. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/skill/references/charts.md +0 -0
  346. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/skill/references/compose.md +0 -0
  347. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/skill/references/design.md +0 -0
  348. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/skill/references/effects.md +0 -0
  349. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/skill/references/end-to-end-deck.md +0 -0
  350. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/skill/references/geometry-and-arrows.md +0 -0
  351. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/skill/references/math.md +0 -0
  352. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/skill/references/picture-effects.md +0 -0
  353. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/skill/references/render.md +0 -0
  354. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/skill/references/smart-art.md +0 -0
  355. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/skill/references/space-aware-authoring.md +0 -0
  356. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/skill/references/tables.md +0 -0
  357. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/skill/references/theme.md +0 -0
  358. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/skill/references/three-d.md +0 -0
  359. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/skill/references/transitions.md +0 -0
  360. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/slide.py +0 -0
  361. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/smart_art.py +0 -0
  362. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/spec.py +0 -0
  363. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/table.py +0 -0
  364. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/table_styles.py +0 -0
  365. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/templates/default.pptx +0 -0
  366. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/templates/docx-icon.emf +0 -0
  367. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/templates/generic-icon.emf +0 -0
  368. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/templates/notes.xml +0 -0
  369. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/templates/notesMaster.xml +0 -0
  370. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/templates/pptx-icon.emf +0 -0
  371. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/templates/theme.xml +0 -0
  372. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/templates/xlsx-icon.emf +0 -0
  373. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/text/__init__.py +0 -0
  374. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/text/fonts.py +0 -0
  375. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/text/layout.py +0 -0
  376. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/text/text.py +0 -0
  377. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/theme.py +0 -0
  378. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/types.py +0 -0
  379. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/util.py +0 -0
  380. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/python_pptx2.egg-info/dependency_links.txt +0 -0
  381. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/python_pptx2.egg-info/entry_points.txt +0 -0
  382. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/python_pptx2.egg-info/requires.txt +0 -0
  383. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/python_pptx2.egg-info/top_level.txt +0 -0
  384. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/__init__.py +0 -0
  385. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/chart/__init__.py +0 -0
  386. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/chart/test_analytics.py +0 -0
  387. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/chart/test_axis.py +0 -0
  388. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/chart/test_category.py +0 -0
  389. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/chart/test_chart.py +0 -0
  390. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/chart/test_chart_toggles.py +0 -0
  391. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/chart/test_collision_strategy.py +0 -0
  392. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/chart/test_data.py +0 -0
  393. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/chart/test_datalabel.py +0 -0
  394. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/chart/test_legend.py +0 -0
  395. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/chart/test_marker.py +0 -0
  396. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/chart/test_palettes.py +0 -0
  397. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/chart/test_plot.py +0 -0
  398. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/chart/test_point.py +0 -0
  399. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/chart/test_quick_layouts.py +0 -0
  400. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/chart/test_series.py +0 -0
  401. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/chart/test_xlsx.py +0 -0
  402. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/chart/test_xmlwriter.py +0 -0
  403. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/design/__init__.py +0 -0
  404. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/design/test_components.py +0 -0
  405. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/design/test_figures.py +0 -0
  406. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/design/test_layout.py +0 -0
  407. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/design/test_recipes.py +0 -0
  408. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/design/test_style.py +0 -0
  409. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/design/test_tokens.py +0 -0
  410. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/dml/__init__.py +0 -0
  411. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/dml/test_chtfmt.py +0 -0
  412. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/dml/test_color.py +0 -0
  413. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/dml/test_effect.py +0 -0
  414. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/dml/test_fill.py +0 -0
  415. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/dml/test_line.py +0 -0
  416. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/dml/test_three_d.py +0 -0
  417. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/enum/__init__.py +0 -0
  418. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/enum/test_base.py +0 -0
  419. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/enum/test_shapes.py +0 -0
  420. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/integration/__init__.py +0 -0
  421. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/integration/round_trip.py +0 -0
  422. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/integration/test_add_slide_layout.py +0 -0
  423. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/integration/test_apply_template.py +0 -0
  424. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/integration/test_compose_package.py +0 -0
  425. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/integration/test_import_slide.py +0 -0
  426. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/integration/test_round_trip.py +0 -0
  427. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/opc/__init__.py +0 -0
  428. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/opc/test_oxml.py +0 -0
  429. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/opc/test_package.py +0 -0
  430. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/opc/test_packuri.py +0 -0
  431. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/opc/test_serialized.py +0 -0
  432. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/oxml/__init__.py +0 -0
  433. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/oxml/shapes/__init__.py +0 -0
  434. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/oxml/shapes/test_autoshape.py +0 -0
  435. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/oxml/shapes/test_graphfrm.py +0 -0
  436. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/oxml/shapes/test_groupshape.py +0 -0
  437. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/oxml/shapes/test_picture.py +0 -0
  438. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/oxml/test___init__.py +0 -0
  439. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/oxml/test_dml.py +0 -0
  440. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/oxml/test_ns.py +0 -0
  441. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/oxml/test_presentation.py +0 -0
  442. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/oxml/test_simpletypes.py +0 -0
  443. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/oxml/test_slide.py +0 -0
  444. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/oxml/test_table.py +0 -0
  445. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/oxml/test_theme.py +0 -0
  446. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/oxml/test_xmlchemy.py +0 -0
  447. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/oxml/unitdata/__init__.py +0 -0
  448. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/oxml/unitdata/dml.py +0 -0
  449. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/oxml/unitdata/shape.py +0 -0
  450. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/oxml/unitdata/text.py +0 -0
  451. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/parts/__init__.py +0 -0
  452. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/parts/test_chart.py +0 -0
  453. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/parts/test_coreprops.py +0 -0
  454. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/parts/test_customprops.py +0 -0
  455. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/parts/test_embeddedpackage.py +0 -0
  456. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/parts/test_image.py +0 -0
  457. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/parts/test_media.py +0 -0
  458. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/parts/test_presentation.py +0 -0
  459. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/parts/test_slide.py +0 -0
  460. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/schema/__init__.py +0 -0
  461. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/schema/oxml_schema_validator.py +0 -0
  462. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/schema/test_schema_validity.py +0 -0
  463. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/shapes/__init__.py +0 -0
  464. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/shapes/test_anchor.py +0 -0
  465. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/shapes/test_animate.py +0 -0
  466. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/shapes/test_autoshape.py +0 -0
  467. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/shapes/test_base.py +0 -0
  468. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/shapes/test_connector.py +0 -0
  469. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/shapes/test_freeform.py +0 -0
  470. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/shapes/test_graphfrm.py +0 -0
  471. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/shapes/test_group.py +0 -0
  472. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/shapes/test_picture.py +0 -0
  473. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/shapes/test_placeholder.py +0 -0
  474. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/shapes/test_shapetree.py +0 -0
  475. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_accessibility.py +0 -0
  476. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_action.py +0 -0
  477. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_animation.py +0 -0
  478. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_api.py +0 -0
  479. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_compose_from_spec.py +0 -0
  480. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_diagrams.py +0 -0
  481. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/calibriz.ttf +0 -0
  482. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/cdw-logo.eps +0 -0
  483. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/dummy.mp4 +0 -0
  484. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/expanded_pptx/[Content_Types].xml +0 -0
  485. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/expanded_pptx/_rels/.rels +0 -0
  486. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/expanded_pptx/docProps/app.xml +0 -0
  487. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/expanded_pptx/docProps/core.xml +0 -0
  488. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/expanded_pptx/docProps/thumbnail.jpeg +0 -0
  489. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/expanded_pptx/ppt/_rels/presentation.xml.rels +0 -0
  490. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/expanded_pptx/ppt/presProps.xml +0 -0
  491. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/expanded_pptx/ppt/presentation.xml +0 -0
  492. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/expanded_pptx/ppt/printerSettings/printerSettings1.bin +0 -0
  493. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/_rels/slideLayout1.xml.rels +0 -0
  494. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/_rels/slideLayout10.xml.rels +0 -0
  495. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/_rels/slideLayout11.xml.rels +0 -0
  496. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/_rels/slideLayout2.xml.rels +0 -0
  497. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/_rels/slideLayout3.xml.rels +0 -0
  498. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/_rels/slideLayout4.xml.rels +0 -0
  499. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/_rels/slideLayout5.xml.rels +0 -0
  500. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/_rels/slideLayout6.xml.rels +0 -0
  501. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/_rels/slideLayout7.xml.rels +0 -0
  502. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/_rels/slideLayout8.xml.rels +0 -0
  503. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/_rels/slideLayout9.xml.rels +0 -0
  504. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/slideLayout1.xml +0 -0
  505. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/slideLayout10.xml +0 -0
  506. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/slideLayout11.xml +0 -0
  507. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/slideLayout2.xml +0 -0
  508. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/slideLayout3.xml +0 -0
  509. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/slideLayout4.xml +0 -0
  510. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/slideLayout5.xml +0 -0
  511. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/slideLayout6.xml +0 -0
  512. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/slideLayout7.xml +0 -0
  513. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/slideLayout8.xml +0 -0
  514. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/slideLayout9.xml +0 -0
  515. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/expanded_pptx/ppt/slideMasters/_rels/slideMaster1.xml.rels +0 -0
  516. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/expanded_pptx/ppt/slideMasters/slideMaster1.xml +0 -0
  517. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/expanded_pptx/ppt/slides/_rels/slide1.xml.rels +0 -0
  518. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/expanded_pptx/ppt/slides/slide1.xml +0 -0
  519. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/expanded_pptx/ppt/tableStyles.xml +0 -0
  520. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/expanded_pptx/ppt/theme/theme1.xml +0 -0
  521. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/expanded_pptx/ppt/viewProps.xml +0 -0
  522. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/minimal.pptx +0 -0
  523. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/minimal_slide.xml +0 -0
  524. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/missing_rels_item.pptx +0 -0
  525. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/monty-truth.png +0 -0
  526. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/no-core-props.pptx +0 -0
  527. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/no-slides.pptx +0 -0
  528. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/presentation.xml +0 -0
  529. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/python-icon.jpeg +0 -0
  530. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/python-powered.png +0 -0
  531. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/python.bmp +0 -0
  532. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/slideLayout1.xml +0 -0
  533. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/smart_art_org_chart.pptx +0 -0
  534. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/2x2-area-date.txt +0 -0
  535. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/2x2-area-float.txt +0 -0
  536. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/2x2-area-stacked-100.txt +0 -0
  537. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/2x2-area-stacked.txt +0 -0
  538. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/2x2-area.txt +0 -0
  539. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/2x2-bar-clustered-date.txt +0 -0
  540. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/2x2-bar-clustered-float.txt +0 -0
  541. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/2x2-bar-clustered.txt +0 -0
  542. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/2x2-bar-stacked-100.txt +0 -0
  543. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/2x2-bar-stacked.txt +0 -0
  544. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/2x2-column-clustered.txt +0 -0
  545. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/2x2-column-stacked-100.txt +0 -0
  546. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/2x2-column-stacked.txt +0 -0
  547. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/2x2-line-date.txt +0 -0
  548. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/2x2-line-float.txt +0 -0
  549. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/2x2-line-markers-stacked-100.txt +0 -0
  550. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/2x2-line-markers-stacked.txt +0 -0
  551. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/2x2-line-markers.txt +0 -0
  552. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/2x2-line-stacked-100.txt +0 -0
  553. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/2x2-line-stacked.txt +0 -0
  554. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/2x2-line.txt +0 -0
  555. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/2x3-bubble-3d.txt +0 -0
  556. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/2x3-bubble.txt +0 -0
  557. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/2x3-xy-lines-no-markers.txt +0 -0
  558. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/2x3-xy-lines.txt +0 -0
  559. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/2x3-xy-smooth-no-markers.txt +0 -0
  560. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/2x3-xy-smooth.txt +0 -0
  561. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/2x3-xy.txt +0 -0
  562. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/2x5-radar.txt +0 -0
  563. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/3x1-pie-exploded.txt +0 -0
  564. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/3x1-pie.txt +0 -0
  565. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/3x2-doughnut-exploded.txt +0 -0
  566. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/3x2-doughnut.txt +0 -0
  567. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/4x2-multi-cat-bar.txt +0 -0
  568. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/adjust-ser-count.txt +0 -0
  569. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/cat-labels.txt +0 -0
  570. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/content-types-xml.txt +0 -0
  571. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/default-notes.txt +0 -0
  572. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/default-notesMaster.txt +0 -0
  573. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/default-theme.txt +0 -0
  574. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/freeform.txt +0 -0
  575. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/package-rels-xml.txt +0 -0
  576. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/placeholders.txt +0 -0
  577. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/presentation-rels-xml.txt +0 -0
  578. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/relationships.txt +0 -0
  579. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/rels-load-from-xml.txt +0 -0
  580. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/rewrite-ser.txt +0 -0
  581. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/timing.txt +0 -0
  582. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/test.pptx +0 -0
  583. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/test_slides.pptx +0 -0
  584. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_formats.py +0 -0
  585. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_geometry.py +0 -0
  586. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_inherit.py +0 -0
  587. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_lint.py +0 -0
  588. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_lint_on_save.py +0 -0
  589. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_math.py +0 -0
  590. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_media.py +0 -0
  591. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_new_features.py +0 -0
  592. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_package.py +0 -0
  593. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_pathlike_inputs.py +0 -0
  594. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_powerpoint_strict_validation.py +0 -0
  595. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_presentation.py +0 -0
  596. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_render.py +0 -0
  597. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_render_slides_alias.py +0 -0
  598. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_section.py +0 -0
  599. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_shared.py +0 -0
  600. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_skill.py +0 -0
  601. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_slide.py +0 -0
  602. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_smart_art.py +0 -0
  603. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_svg_picture.py +0 -0
  604. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_table.py +0 -0
  605. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_table_extras.py +0 -0
  606. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_theme.py +0 -0
  607. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_transition_morph.py +0 -0
  608. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_util.py +0 -0
  609. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/text/__init__.py +0 -0
  610. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/text/test_fonts.py +0 -0
  611. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/text/test_layout.py +0 -0
  612. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/text/test_text.py +0 -0
  613. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/unitdata.py +0 -0
  614. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/unitutil/__init__.py +0 -0
  615. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/unitutil/cxml.py +0 -0
  616. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/unitutil/file.py +0 -0
  617. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/unitutil/mock.py +0 -0
  618. {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tox.ini +0 -0
@@ -15,6 +15,47 @@ can sit beside both ``python-pptx`` (``pptx``) and ``power-pptx``
15
15
  .. _`scanny/python-pptx`: https://github.com/scanny/python-pptx
16
16
 
17
17
 
18
+ 2.18.0 (2026-08-30)
19
+ +++++++++++++++++++
20
+
21
+ Added
22
+ .....
23
+
24
+ * **Agent-friendly kwargs** on the one-call helpers. ``add_text()``,
25
+ ``add_equation()``, and ``add_arrow()`` now absorb cross-library
26
+ keyword spellings — matplotlib's ``ha`` / ``va`` / ``fontsize`` /
27
+ ``fontfamily``, CSS-flavored ``halign`` / ``text_color``, British
28
+ ``colour``, ``x`` / ``y`` / ``w`` / ``h`` geometry keywords,
29
+ ``begin`` / ``to`` arrow endpoints, and more — plus unambiguous
30
+ near-misses (``algn`` → ``align``). Synonyms substitute, never
31
+ contradict: two different values for the same logical argument still
32
+ raise. A genuinely unknown kwarg raises a ``TypeError`` that lists
33
+ every accepted argument, so a model reading the traceback
34
+ self-corrects in one step.
35
+
36
+
37
+ 2.17.0 (2026-08-30)
38
+ +++++++++++++++++++
39
+
40
+ Added
41
+ .....
42
+
43
+ * ``add_text()`` / ``add_equation()`` accept ``font_family`` and
44
+ ``valign`` as aliases for ``font`` and ``anchor`` (with ``"mid"``
45
+ now a valid anchor token). Code generators trained on matplotlib
46
+ habitually reach for the longer spellings and died with
47
+ ``TypeError: unexpected keyword argument 'font_family'``; passing
48
+ both an alias and its canonical with *different* values still
49
+ raises.
50
+
51
+ * The audit font-warning safe-list now recognizes the **Aptos**
52
+ family — the Microsoft 365 default theme fonts since 2024 — and
53
+ merges the ``PPTX2_SAFE_FONTS`` environment variable (comma- or
54
+ semicolon-separated) into the safe-list on every ``audit()`` call,
55
+ so a rendering environment can declare its font inventory once
56
+ instead of every caller passing ``extra_safe_fonts``.
57
+
58
+
18
59
  2.16.0 (2026-08-30)
19
60
  +++++++++++++++++++
20
61
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-pptx2
3
- Version: 2.16.0
3
+ Version: 2.18.0
4
4
  Summary: Create, read, and update PowerPoint 2007+ (.pptx) files. Fork of power-pptx / python-pptx, published as python-pptx2.
5
5
  Author: Matěj Štágl
6
6
  Author-email: stagl@wattlescript.org
@@ -57,7 +57,7 @@ from pptx2.parts.slide import (
57
57
  if TYPE_CHECKING:
58
58
  from pptx2.opc.package import Part
59
59
 
60
- __version__ = "2.16.0"
60
+ __version__ = "2.18.0"
61
61
 
62
62
  sys.modules["pptx2.exceptions"] = exceptions
63
63
  del sys
@@ -0,0 +1,136 @@
1
+ """Agent-friendly kwarg normalization for the one-call shape helpers.
2
+
3
+ Code generators (LLM-trained models among them) reliably spell keyword
4
+ arguments the way *other* libraries spell them — matplotlib's
5
+ ``fontfamily``/``fontsize``/``ha``/``va``, CSS-flavored ``text-align``,
6
+ ``colour`` — and die on ``TypeError: unexpected keyword argument``. This
7
+ module absorbs that whole error class for the ergonomic helpers
8
+ (``add_text`` / ``add_equation`` / ``add_arrow``) in three layers:
9
+
10
+ 1. **Synonyms** — a fixed map from common spellings onto each canonical
11
+ argument (``halign`` → ``align``, ``font_size`` → ``size_pt`` …).
12
+ 2. **Fuzzy matching** — a near-miss kwarg (``algn``, ``colr``) is resolved
13
+ to its closest canonical or synonym when unambiguous.
14
+ 3. **Didactic errors** — anything still unknown raises a ``TypeError``
15
+ that names the closest candidate and lists every accepted kwarg, so a
16
+ model reading the traceback self-corrects in one step.
17
+
18
+ An alias may *substitute* for its canonical but never contradict it:
19
+ passing two different values for the same logical argument is a genuine
20
+ caller bug and still raises.
21
+ """
22
+
23
+ from __future__ import annotations
24
+
25
+ import difflib
26
+
27
+ # Canonical kwarg -> spellings other ecosystems use for the same thing.
28
+ SYNONYMS: dict[str, tuple[str, ...]] = {
29
+ "text": ("txt", "string", "content", "label", "caption", "value"),
30
+ "font": ("font_family", "fontfamily", "font_name", "fontname", "typeface", "family", "face"),
31
+ "size_pt": ("size", "font_size", "fontsize", "pt_size", "point_size"),
32
+ "align": ("halign", "ha", "horizontal_align", "horizontal_alignment", "text_align", "text_alignment"),
33
+ "anchor": ("valign", "va", "vertical_align", "vertical_alignment", "v_align"),
34
+ "color": (
35
+ "colour",
36
+ "font_color",
37
+ "font_colour",
38
+ "text_color",
39
+ "text_colour",
40
+ "fg_color",
41
+ "line_color",
42
+ "stroke_color",
43
+ ),
44
+ "weight_pt": ("weight", "line_weight", "width_pt", "stroke_width"),
45
+ "bold": ("font_bold", "is_bold"),
46
+ "italic": ("font_italic", "is_italic", "oblique"),
47
+ "word_wrap": ("wrap", "wrap_text", "text_wrap"),
48
+ "margin_pt": ("margin", "padding", "padding_pt", "inset", "inset_pt"),
49
+ "latex": ("tex", "formula", "equation", "expression", "math"),
50
+ "left": ("x",),
51
+ "top": ("y",),
52
+ "width": ("w",),
53
+ "height": ("h",),
54
+ "start": ("begin", "start_point", "start_shape", "from", "source"),
55
+ "end": ("to", "end_point", "end_shape", "target"),
56
+ }
57
+
58
+ _ALIAS_TO_CANONICAL: dict[str, str] = {
59
+ alias: canonical
60
+ for canonical, aliases in SYNONYMS.items()
61
+ for alias in aliases
62
+ }
63
+
64
+ _FUZZY_CUTOFF = 0.85
65
+
66
+
67
+ def _did_you_mean(name: str, candidates: list[str], known: "list[str] | tuple[str, ...]") -> str | None:
68
+ """Return the canonical arg *name* points at, or None.
69
+
70
+ Near-misses that hit both a canonical and one of its own aliases
71
+ (``algn`` → ``align`` and ``halign``) are NOT ambiguous — they agree —
72
+ so candidates are collapsed to their canonical form before the
73
+ ambiguity check.
74
+ """
75
+ if not candidates:
76
+ return None
77
+ matches = difflib.get_close_matches(name, candidates, n=3, cutoff=_FUZZY_CUTOFF)
78
+ distinct = set()
79
+ for m in matches:
80
+ canonical = m if m in known else _ALIAS_TO_CANONICAL.get(m)
81
+ if canonical in known:
82
+ distinct.add(canonical)
83
+ if len(distinct) == 1:
84
+ return distinct.pop()
85
+ return None
86
+
87
+
88
+ def absorb_agent_kwargs(
89
+ method: str,
90
+ kwargs: dict,
91
+ canonical_names: "list[str] | tuple[str, ...]",
92
+ ) -> dict:
93
+ """Map alias / near-miss *kwargs* onto canonical names; raise else.
94
+
95
+ *canonical_names* lists the kwargs the method actually understands
96
+ (including any already-bound explicit parameters). Returns a dict
97
+ containing only canonical names. A synonym that matches a canonical
98
+ the caller already supplied with a *different* value raises
99
+ ``TypeError``; equal values are fine.
100
+ """
101
+ known = list(canonical_names)
102
+ alias_space = [a for a in _ALIAS_TO_CANONICAL if a not in known]
103
+ candidates = known + alias_space
104
+
105
+ resolved: dict = {}
106
+ for name, value in kwargs.items():
107
+ if name in known or name in resolved:
108
+ if name in resolved and resolved[name] != value:
109
+ raise TypeError(
110
+ f"{method}(): got {name!r} twice with different values "
111
+ f"({resolved[name]!r} vs {value!r})"
112
+ )
113
+ resolved[name] = value
114
+ continue
115
+ canonical = _ALIAS_TO_CANONICAL.get(name)
116
+ if canonical is not None and canonical not in known:
117
+ # The alias resolves to an argument this method doesn't take
118
+ # (e.g. ``to=`` on add_text); fall through to the fuzzy/error
119
+ # path rather than silently dropping the value.
120
+ canonical = None
121
+ if canonical is None:
122
+ canonical = _did_you_mean(name, candidates, known)
123
+ if canonical is None:
124
+ raise TypeError(
125
+ f"{method}(): got an unexpected keyword argument {name!r}. "
126
+ f"Accepted: {', '.join(sorted(known))} "
127
+ f"(synonyms like font_family/halign/valign/colour are fine)"
128
+ )
129
+ if canonical in resolved and resolved[canonical] != value:
130
+ raise TypeError(
131
+ f"{method}(): {name!r} and the value already given for "
132
+ f"{canonical!r} disagree ({value!r} vs {resolved[canonical]!r}); "
133
+ f"pass one spelling only"
134
+ )
135
+ resolved[canonical] = value
136
+ return resolved
@@ -28,6 +28,7 @@ ALIGN_MAP = {
28
28
  ANCHOR_MAP = {
29
29
  "top": MSO_VERTICAL_ANCHOR.TOP,
30
30
  "middle": MSO_VERTICAL_ANCHOR.MIDDLE,
31
+ "mid": MSO_VERTICAL_ANCHOR.MIDDLE,
31
32
  "center": MSO_VERTICAL_ANCHOR.MIDDLE,
32
33
  "centre": MSO_VERTICAL_ANCHOR.MIDDLE,
33
34
  "bottom": MSO_VERTICAL_ANCHOR.BOTTOM,
@@ -41,7 +41,8 @@ __all__ = ["AuditReport", "audit"]
41
41
 
42
42
 
43
43
  # Fonts that ship with stock Windows / macOS / Office installs. Used as
44
- # a (very conservative) safe-list for the font_warnings probe.
44
+ # a (very conservative) safe-list for the font_warnings probe. Aptos and
45
+ # family are the Microsoft 365 default theme fonts since 2024.
45
46
  _COMMON_FONTS = frozenset(
46
47
  name.lower()
47
48
  for name in (
@@ -51,9 +52,17 @@ _COMMON_FONTS = frozenset(
51
52
  "Lucida Console", "Palatino", "Palatino Linotype", "Symbol",
52
53
  "Wingdings", "Wingdings 2", "Wingdings 3", "Webdings",
53
54
  "Inter", "Roboto", "Open Sans", "Lato", "Noto Sans",
55
+ "Aptos", "Aptos Display", "Aptos Narrow", "Aptos Serif", "Aptos Mono",
56
+ "Aptos Symbols",
54
57
  )
55
58
  )
56
59
 
60
+ # Environment variable merged into the safe-list on every audit() call, so
61
+ # rendering environments (sandboxes, CI) can declare their font inventory
62
+ # once instead of every caller passing ``extra_safe_fonts``. Comma- or
63
+ # semicolon-separated font names.
64
+ _SAFE_FONTS_ENV_VAR = "PPTX2_SAFE_FONTS"
65
+
57
66
 
58
67
  @dataclass
59
68
  class AuditReport:
@@ -188,12 +197,24 @@ def audit(
188
197
  environment genuinely ships the font — e.g. ``DejaVu Sans`` in a
189
198
  sandbox whose font policy standardizes on it, or a corporate font
190
199
  you embed in every deck.
200
+
201
+ The ``PPTX2_SAFE_FONTS`` environment variable (comma- or
202
+ semicolon-separated font names) is merged into the safe-list on
203
+ every call, so an environment can declare its font inventory once
204
+ for all callers.
191
205
  """
206
+ import os
207
+
192
208
  from pptx2.shapes.picture import Picture
193
209
 
194
210
  safe_fonts = _COMMON_FONTS
195
- if extra_safe_fonts is not None:
196
- safe_fonts = _COMMON_FONTS | frozenset(f.lower() for f in extra_safe_fonts)
211
+ extra_names = list(extra_safe_fonts) if extra_safe_fonts else []
212
+ for env_raw in os.environ.get(_SAFE_FONTS_ENV_VAR, "").replace(";", ",").split(","):
213
+ env_name = env_raw.strip()
214
+ if env_name:
215
+ extra_names.append(env_name)
216
+ if extra_names:
217
+ safe_fonts = _COMMON_FONTS | frozenset(f.lower() for f in extra_names)
197
218
 
198
219
  report = AuditReport()
199
220
  slides = list(prs.slides)
@@ -908,38 +908,108 @@ class _BaseGroupShapes(_BaseShapes):
908
908
  anchor: str | None = None,
909
909
  margin_pt: float | tuple[float, float, float, float] | None = None,
910
910
  word_wrap: bool | None = True,
911
+ **kwargs,
911
912
  ) -> Shape:
912
913
  """Add a textbox carrying *text* with one-call styling.
913
914
 
914
- Accepts either a :class:`~pptx2.geometry.BBox` positionally
915
- or the four ``(left, top, width, height)`` lengths::
915
+ Accepts either a :class:`~pptx2.geometry.BBox` positionally, the
916
+ four ``(left, top, width, height)`` lengths positionally, *or* the
917
+ same four as keyword arguments (``x`` / ``y`` / ``w`` / ``h``
918
+ synonyms included)::
916
919
 
917
920
  slide.shapes.add_text(bbox, text="Hello", size_pt=24, bold=True,
918
921
  color="#0B5CFF", align="center")
919
922
  slide.shapes.add_text(Inches(1), Inches(2), Inches(4), Inches(1),
920
923
  text="Hello")
924
+ slide.shapes.add_text(x=Inches(1), y=Inches(2), w=Inches(4),
925
+ h=Inches(1), text="Hello")
921
926
 
922
927
  Keyword args:
923
928
 
929
+ * ``text`` — the string (``label`` / ``content`` synonyms work).
924
930
  * ``font`` — typeface name (e.g. ``"Inter"``); ``None`` inherits.
925
- * ``size_pt`` — font size in points; ``None`` inherits.
931
+ * ``size_pt`` — font size in points (synonyms: ``size``,
932
+ ``font_size``, ``fontsize``).
926
933
  * ``bold`` / ``italic`` — ``True``/``False``/``None``.
927
934
  * ``color`` — any "color-like" (``"#RRGGBB"``, ``RGBColor``,
928
- ``(r, g, b)``).
935
+ ``(r, g, b)``); ``colour`` / ``text_color`` synonyms work.
929
936
  * ``align`` — ``"left"`` / ``"center"`` / ``"right"`` /
930
- ``"justify"``; ``None`` inherits.
931
- * ``anchor`` — vertical anchor: ``"top"`` / ``"middle"`` /
932
- ``"bottom"``; ``None`` inherits.
937
+ ``"justify"``; ``halign`` is a synonym.
938
+ * ``anchor`` — vertical anchor: ``"top"`` / ``"middle"`` (also
939
+ ``"mid"`` / ``"center"``) / ``"bottom"``; ``valign`` is a
940
+ synonym.
933
941
  * ``margin_pt`` — uniform margin in points, or a 4-tuple
934
942
  ``(top, right, bottom, left)``.
935
943
  * ``word_wrap`` — defaults to ``True``.
936
944
 
945
+ Misspelled or cross-library kwargs are absorbed when unambiguous
946
+ (``font_family`` → ``font``, ``fontsize`` → ``size_pt``, ``algn``
947
+ → ``align`` …); anything unrecognizable raises a ``TypeError``
948
+ naming the accepted arguments.
949
+
937
950
  Returns the textbox :class:`Shape` so further mutation works as
938
951
  normal.
939
952
  """
953
+ from pptx2._agent_friendly import absorb_agent_kwargs
940
954
  from pptx2._textstyle import apply_margins, apply_text_style, coerce_anchor
941
955
  from pptx2.geometry import BBox
942
956
 
957
+ if kwargs:
958
+ kwargs = absorb_agent_kwargs(
959
+ "add_text",
960
+ kwargs,
961
+ (
962
+ "text", "font", "size_pt", "bold", "italic", "color",
963
+ "align", "anchor", "margin_pt", "word_wrap",
964
+ "left", "top", "width", "height",
965
+ ),
966
+ )
967
+ geo_names = ("left", "top", "width", "height")
968
+ if any(g in kwargs for g in geo_names):
969
+ if bbox_or_positional:
970
+ raise TypeError(
971
+ "add_text(): got both positional geometry and geometry "
972
+ "keyword arguments; pass one form only"
973
+ )
974
+ if not all(g in kwargs for g in geo_names):
975
+ missing = [g for g in geo_names if g not in kwargs]
976
+ raise TypeError(
977
+ "add_text(): geometry keywords need all of "
978
+ f"left/top/width/height; missing {', '.join(missing)}"
979
+ )
980
+ bbox_or_positional = tuple(kwargs[g] for g in geo_names)
981
+ defaults = {
982
+ "text": "", "font": None, "size_pt": None, "bold": None,
983
+ "italic": None, "color": None, "align": None, "anchor": None,
984
+ "margin_pt": None, "word_wrap": True,
985
+ }
986
+ given = {
987
+ "text": text, "font": font, "size_pt": size_pt, "bold": bold,
988
+ "italic": italic, "color": color, "align": align,
989
+ "anchor": anchor, "margin_pt": margin_pt,
990
+ "word_wrap": word_wrap,
991
+ }
992
+ for name in defaults:
993
+ if name not in kwargs:
994
+ continue
995
+ value = kwargs[name]
996
+ if given[name] != defaults[name] and given[name] != value:
997
+ raise TypeError(
998
+ f"add_text(): {name!r} given twice with different "
999
+ f"values ({given[name]!r} vs {value!r})"
1000
+ )
1001
+ given[name] = value
1002
+ text = given["text"]
1003
+ font = given["font"]
1004
+ size_pt = given["size_pt"]
1005
+ bold = given["bold"]
1006
+ italic = given["italic"]
1007
+ color = given["color"]
1008
+ align = given["align"]
1009
+ anchor = given["anchor"]
1010
+ margin_pt = given["margin_pt"]
1011
+ word_wrap = given["word_wrap"]
1012
+
943
1013
  if len(bbox_or_positional) == 1 and isinstance(bbox_or_positional[0], BBox):
944
1014
  box = bbox_or_positional[0]
945
1015
  left, top, width, height = box.left, box.top, box.width, box.height
@@ -983,7 +1053,7 @@ class _BaseGroupShapes(_BaseShapes):
983
1053
  def add_equation(
984
1054
  self,
985
1055
  *bbox_or_positional,
986
- latex: str,
1056
+ latex: str | None = None,
987
1057
  display: bool = True,
988
1058
  font: str | None = None,
989
1059
  size_pt: float | None = None,
@@ -991,11 +1061,13 @@ class _BaseGroupShapes(_BaseShapes):
991
1061
  align: str | None = "center",
992
1062
  anchor: str | None = "middle",
993
1063
  margin_pt: float | tuple[float, float, float, float] | None = None,
1064
+ **kwargs,
994
1065
  ) -> Shape:
995
1066
  """Add a text box containing a native PowerPoint equation from LaTeX.
996
1067
 
997
- Accepts either a :class:`~pptx2.geometry.BBox` or
998
- ``(left, top, width, height)``::
1068
+ Accepts either a :class:`~pptx2.geometry.BBox`, the four
1069
+ ``(left, top, width, height)`` lengths positionally, or the same
1070
+ four as keyword arguments (``x`` / ``y`` / ``w`` / ``h`` included)::
999
1071
 
1000
1072
  slide.shapes.add_equation(bbox, latex=r"\\frac{a}{b}", size_pt=28)
1001
1073
  slide.shapes.add_equation(
@@ -1008,13 +1080,75 @@ class _BaseGroupShapes(_BaseShapes):
1008
1080
  equation editor.
1009
1081
 
1010
1082
  Keyword args match :meth:`add_text` for *font* / *size_pt* /
1011
- *color* / *align* / *anchor* / *margin_pt*. *display* (default
1012
- |True|) emits a display-math paragraph; set |False| for inline
1013
- OMML.
1083
+ *color* / *align* / *anchor* / *margin_pt*, and *latex* accepts
1084
+ the ``tex`` / ``formula`` / ``equation`` synonyms. Misspelled or
1085
+ cross-library kwargs are absorbed when unambiguous (see
1086
+ :meth:`add_text`). *display* (default |True|) emits a display-math
1087
+ paragraph; set |False| for inline OMML.
1014
1088
  """
1089
+ from pptx2._agent_friendly import absorb_agent_kwargs
1015
1090
  from pptx2._textstyle import apply_margins, coerce_align, coerce_anchor
1016
1091
  from pptx2.geometry import BBox
1017
1092
 
1093
+ if kwargs:
1094
+ kwargs = absorb_agent_kwargs(
1095
+ "add_equation",
1096
+ kwargs,
1097
+ (
1098
+ "latex", "display", "font", "size_pt", "color", "align",
1099
+ "anchor", "margin_pt", "left", "top", "width", "height",
1100
+ ),
1101
+ )
1102
+ geo_names = ("left", "top", "width", "height")
1103
+ if any(g in kwargs for g in geo_names):
1104
+ if bbox_or_positional:
1105
+ raise TypeError(
1106
+ "add_equation(): got both positional geometry and "
1107
+ "geometry keyword arguments; pass one form only"
1108
+ )
1109
+ if not all(g in kwargs for g in geo_names):
1110
+ missing = [g for g in geo_names if g not in kwargs]
1111
+ raise TypeError(
1112
+ "add_equation(): geometry keywords need all of "
1113
+ f"left/top/width/height; missing {', '.join(missing)}"
1114
+ )
1115
+ bbox_or_positional = tuple(kwargs[g] for g in geo_names)
1116
+ defaults = {
1117
+ "latex": None, "display": True, "font": None, "size_pt": None,
1118
+ "color": None, "align": "center", "anchor": "middle",
1119
+ "margin_pt": None,
1120
+ }
1121
+ given = {
1122
+ "latex": latex, "display": display, "font": font,
1123
+ "size_pt": size_pt, "color": color, "align": align,
1124
+ "anchor": anchor, "margin_pt": margin_pt,
1125
+ }
1126
+ for name in defaults:
1127
+ if name not in kwargs:
1128
+ continue
1129
+ value = kwargs[name]
1130
+ if given[name] != defaults[name] and given[name] != value:
1131
+ raise TypeError(
1132
+ f"add_equation(): {name!r} given twice with different "
1133
+ f"values ({given[name]!r} vs {value!r})"
1134
+ )
1135
+ given[name] = value
1136
+ latex = given["latex"]
1137
+ display = given["display"]
1138
+ font = given["font"]
1139
+ size_pt = given["size_pt"]
1140
+ color = given["color"]
1141
+ align = given["align"]
1142
+ anchor = given["anchor"]
1143
+ margin_pt = given["margin_pt"]
1144
+
1145
+ if latex is None:
1146
+ raise TypeError(
1147
+ "add_equation() missing required argument: 'latex' "
1148
+ "(synonyms 'tex' / 'formula' / 'equation' accepted)"
1149
+ )
1150
+
1151
+
1018
1152
  if len(bbox_or_positional) == 1 and isinstance(bbox_or_positional[0], BBox):
1019
1153
  box = bbox_or_positional[0]
1020
1154
  left, top, width, height = box.left, box.top, box.width, box.height
@@ -1048,8 +1182,8 @@ class _BaseGroupShapes(_BaseShapes):
1048
1182
 
1049
1183
  def add_arrow(
1050
1184
  self,
1051
- start,
1052
- end,
1185
+ start=None,
1186
+ end=None,
1053
1187
  *,
1054
1188
  head: str | None = "triangle",
1055
1189
  tail: str | None = None,
@@ -1062,6 +1196,7 @@ class _BaseGroupShapes(_BaseShapes):
1062
1196
  inset_pt: float = 0.0,
1063
1197
  end_side: str = "auto",
1064
1198
  start_side: str = "auto",
1199
+ **kwargs,
1065
1200
  ) -> Connector:
1066
1201
  """Add an arrow connector with proper arrowhead and inset routing.
1067
1202
 
@@ -1084,12 +1219,18 @@ class _BaseGroupShapes(_BaseShapes):
1084
1219
 
1085
1220
  ``style`` is ``"solid"`` / ``"dashed"`` / ``"dotted"``.
1086
1221
 
1087
- ``route`` is ``"straight"`` (default), ``"elbow"``, or
1088
- ``"curved"`` — picks the underlying
1222
+ ``route`` is ``"straight"`` (default), ``"elbow"``, or ``"curved"``
1223
+ — picks the underlying
1089
1224
  :class:`~pptx2.enum.shapes.MSO_CONNECTOR_TYPE`.
1090
1225
 
1226
+ Keyword synonyms are absorbed: ``begin`` / ``from`` / ``source``
1227
+ for ``start``, ``to`` / ``target`` for ``end``, ``stroke_color`` /
1228
+ ``colour`` for ``color``, ``weight`` / ``line_weight`` for
1229
+ ``weight_pt`` — see :meth:`add_text` for the full aliasing story.
1230
+
1091
1231
  Returns the :class:`Connector` so callers can tweak further.
1092
1232
  """
1233
+ from pptx2._agent_friendly import absorb_agent_kwargs
1093
1234
  from pptx2._color import coerce_color
1094
1235
  from pptx2.enum.dml import (
1095
1236
  MSO_LINE_DASH_STYLE,
@@ -1099,6 +1240,64 @@ class _BaseGroupShapes(_BaseShapes):
1099
1240
  from pptx2.enum.shapes import MSO_CONNECTOR_TYPE
1100
1241
  from pptx2.util import Pt
1101
1242
 
1243
+ if kwargs:
1244
+ kwargs = absorb_agent_kwargs(
1245
+ "add_arrow",
1246
+ kwargs,
1247
+ (
1248
+ "start", "end", "head", "tail", "head_size", "tail_size",
1249
+ "color", "weight_pt", "style", "route", "inset_pt",
1250
+ "end_side", "start_side",
1251
+ ),
1252
+ )
1253
+ defaults = {
1254
+ "head": "triangle", "tail": None, "head_size": "medium",
1255
+ "tail_size": "medium", "color": None, "weight_pt": 1.5,
1256
+ "style": "solid", "route": "straight", "inset_pt": 0.0,
1257
+ "end_side": "auto", "start_side": "auto",
1258
+ }
1259
+ given = {
1260
+ "head": head, "tail": tail, "head_size": head_size,
1261
+ "tail_size": tail_size, "color": color, "weight_pt": weight_pt,
1262
+ "style": style, "route": route, "inset_pt": inset_pt,
1263
+ "end_side": end_side, "start_side": start_side,
1264
+ }
1265
+ for name in defaults:
1266
+ if name not in kwargs:
1267
+ continue
1268
+ value = kwargs[name]
1269
+ if given[name] != defaults[name] and given[name] != value:
1270
+ raise TypeError(
1271
+ f"add_arrow(): {name!r} given twice with different "
1272
+ f"values ({given[name]!r} vs {value!r})"
1273
+ )
1274
+ given[name] = value
1275
+ head = given["head"]
1276
+ tail = given["tail"]
1277
+ head_size = given["head_size"]
1278
+ tail_size = given["tail_size"]
1279
+ color = given["color"]
1280
+ weight_pt = given["weight_pt"]
1281
+ style = given["style"]
1282
+ route = given["route"]
1283
+ inset_pt = given["inset_pt"]
1284
+ end_side = given["end_side"]
1285
+ start_side = given["start_side"]
1286
+ # start/end synonyms (from=/to=/begin=/source=/target=)
1287
+ if "start" in kwargs:
1288
+ start = kwargs["start"]
1289
+ if "end" in kwargs:
1290
+ end = kwargs["end"]
1291
+ if start is None or end is None:
1292
+ raise TypeError(
1293
+ "add_arrow() missing required argument(s): "
1294
+ + ", ".join(
1295
+ name for name, value in (("start", start), ("end", end))
1296
+ if value is None
1297
+ )
1298
+ + " (synonyms begin/from/source and to/target accepted)"
1299
+ )
1300
+
1102
1301
  _CONNECTOR = {
1103
1302
  "straight": MSO_CONNECTOR_TYPE.STRAIGHT,
1104
1303
  "elbow": MSO_CONNECTOR_TYPE.ELBOW,
@@ -449,3 +449,12 @@ print(slide.notes) # "" when the slide has no notes
449
449
  `start_slide_index` claims every slide from that position to the deck
450
450
  end. `move` raises `IndexError` out of range; `reorder` raises
451
451
  `ValueError` unless given a clean permutation.
452
+
453
+ ### Forgiving keyword arguments
454
+
455
+ The one-call helpers (`add_text`, `add_equation`, `add_arrow`) absorb
456
+ cross-library and near-miss kwargs, so the `font_family=` / `halign=` /
457
+ `fontsize=` / `colour` / `x,y,w,h` / `begin,to` habits of other
458
+ ecosystems just work. Synonyms substitute, never contradict (two
459
+ different values for the same logical argument still raise), and a
460
+ truly unknown kwarg raises a `TypeError` listing every accepted name.
@@ -187,6 +187,13 @@ drown in noise:
187
187
  report = audit(prs, extra_safe_fonts=["DejaVu Sans", "Noto Sans CJK JP"])
188
188
  ```
189
189
 
190
+ Or declare the inventory once for every caller via the environment
191
+ (merged into the safe-list on each `audit()`):
192
+
193
+ ```bash
194
+ export PPTX2_SAFE_FONTS="DejaVu Sans; Noto Sans CJK JP"
195
+ ```
196
+
190
197
  ## Save-time hooks (via `from_spec`)
191
198
 
192
199
  If you build the deck through `pptx2.compose.from_spec`, the spec dict
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-pptx2
3
- Version: 2.16.0
3
+ Version: 2.18.0
4
4
  Summary: Create, read, and update PowerPoint 2007+ (.pptx) files. Fork of power-pptx / python-pptx, published as python-pptx2.
5
5
  Author: Matěj Štágl
6
6
  Author-email: stagl@wattlescript.org
@@ -200,6 +200,7 @@ features/steps/test_files/extracted-pptx/ppt/slides/slide1.xml
200
200
  features/steps/test_files/extracted-pptx/ppt/slides/_rels/slide1.xml.rels
201
201
  features/steps/test_files/extracted-pptx/ppt/theme/theme1.xml
202
202
  src/pptx2/__init__.py
203
+ src/pptx2/_agent_friendly.py
203
204
  src/pptx2/_color.py
204
205
  src/pptx2/_slide_importer.py
205
206
  src/pptx2/_svg.py