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.
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/HISTORY.rst +41 -0
- {python_pptx2-2.16.0/src/python_pptx2.egg-info → python_pptx2-2.18.0}/PKG-INFO +1 -1
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/__init__.py +1 -1
- python_pptx2-2.18.0/src/pptx2/_agent_friendly.py +136 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/_textstyle.py +1 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/audit.py +24 -3
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/shapes/shapetree.py +216 -17
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/skill/references/basics.md +9 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/skill/references/lint.md +7 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0/src/python_pptx2.egg-info}/PKG-INFO +1 -1
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/python_pptx2.egg-info/SOURCES.txt +1 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_audit.py +31 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_shape_helpers.py +93 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/LICENSE +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/MANIFEST.in +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/README.rst +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/act-action.feature +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/act-hyperlink.feature +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/cht-axis-props.feature +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/cht-axistitle-props.feature +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/cht-category-access.feature +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/cht-category-props.feature +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/cht-chart.feature +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/cht-charttitle-props.feature +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/cht-data-props.feature +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/cht-datalabels.feature +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/cht-gridlines-props.feature +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/cht-legend-access.feature +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/cht-legend-props.feature +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/cht-marker-props.feature +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/cht-plot-props.feature +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/cht-point-access.feature +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/cht-point-props.feature +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/cht-replace-data.feature +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/cht-series.feature +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/cht-ticklabels-props.feature +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/dml-color.feature +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/dml-effect.feature +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/dml-fill.feature +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/dml-line.feature +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/environment.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/ph-inherit-props.feature +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/ph-insert-shape.feature +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/ph-phfmt-props.feature +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/ph-placeholder-props.feature +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/prs-coreprops.feature +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/prs-default-template.feature +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/prs-open-save.feature +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/prs-presentation-props.feature +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/shp-autoshape.feature +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/shp-connector.feature +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/shp-freeform.feature +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/shp-graphicframe.feature +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/shp-groupshape.feature +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/shp-movie-props.feature +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/shp-picture.feature +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/shp-placeholder.feature +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/shp-shapes.feature +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/shp-shared.feature +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/sld-background.feature +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/sld-slide.feature +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/sld-slides.feature +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/action.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/axis.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/background.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/category.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/chart.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/chartdata.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/color.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/coreprops.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/datalabel.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/effect.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/fill.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/font.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/font_color.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/helpers.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/legend.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/line.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/picture.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/placeholder.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/plot.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/presentation.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/series.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/shape.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/shapes.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/slide.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/slides.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/table.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/72-dpi.tiff +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/CVS_LOGO.WMF +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/act-props.pptm +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/calibriz.ttf +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/cht-axis-props.pptx +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/cht-category-access.pptx +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/cht-chart-props.pptx +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/cht-chart-type.pptx +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/cht-charts.pptx +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/cht-datalabels.pptx +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/cht-gridlines-props.pptx +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/cht-legend-props.pptx +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/cht-legend.pptx +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/cht-marker-props.pptx +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/cht-plot-props.pptx +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/cht-point-access.pptx +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/cht-point-props.pptx +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/cht-replace-data.pptx +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/cht-series.pptx +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/cht-ticklabels-props.pptx +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/dml-effect.pptx +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/dml-fill.pptx +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/dml-line.pptx +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/ext-rels.pptx +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/extracted-pptx/[Content_Types].xml +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/extracted-pptx/_rels/.rels +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/extracted-pptx/docProps/app.xml +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/extracted-pptx/docProps/core.xml +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/extracted-pptx/docProps/thumbnail.jpeg +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/extracted-pptx/ppt/_rels/presentation.xml.rels +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/extracted-pptx/ppt/presProps.xml +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/extracted-pptx/ppt/presentation.xml +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/extracted-pptx/ppt/printerSettings/printerSettings1.bin +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/_rels/slideLayout1.xml.rels +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/_rels/slideLayout10.xml.rels +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/_rels/slideLayout11.xml.rels +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/_rels/slideLayout2.xml.rels +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/_rels/slideLayout3.xml.rels +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/_rels/slideLayout4.xml.rels +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/_rels/slideLayout5.xml.rels +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/_rels/slideLayout6.xml.rels +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/_rels/slideLayout7.xml.rels +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/_rels/slideLayout8.xml.rels +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/_rels/slideLayout9.xml.rels +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/slideLayout1.xml +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/slideLayout10.xml +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/slideLayout11.xml +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/slideLayout2.xml +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/slideLayout3.xml +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/slideLayout4.xml +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/slideLayout5.xml +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/slideLayout6.xml +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/slideLayout7.xml +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/slideLayout8.xml +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/extracted-pptx/ppt/slideLayouts/slideLayout9.xml +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/extracted-pptx/ppt/slideMasters/_rels/slideMaster1.xml.rels +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/extracted-pptx/ppt/slideMasters/slideMaster1.xml +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/extracted-pptx/ppt/slides/_rels/slide1.xml.rels +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/extracted-pptx/ppt/slides/slide1.xml +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/extracted-pptx/ppt/tableStyles.xml +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/extracted-pptx/ppt/theme/theme1.xml +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/extracted-pptx/ppt/viewProps.xml +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/font-color.pptx +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/just-two-mice.mp4 +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/just-two-mice.png +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/lyt-shapes.pptx +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/minimal.pptx +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/monty-truth.png +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/mst-placeholders.pptx +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/mst-shapes.pptx +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/mst-slide-layouts.pptx +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/ph-inherit-props.pptx +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/ph-populated-placeholders.pptx +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/ph-unpopulated-placeholders.pptx +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/pic.emf +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/prs-add-slide.pptx +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/prs-notes.pptx +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/prs-properties.pptx +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/prs-slide-masters.pptx +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/python-icon.jpeg +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/python-powered.png +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/python.bmp +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/shp-access-chart.pptx +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/shp-access-ole-object.pptx +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/shp-autoshape-adjustments.pptx +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/shp-autoshape-props.pptx +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/shp-common-props.pptx +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/shp-connector-props.pptx +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/shp-embedded-docx.docx +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/shp-embedded-pptx.pptx +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/shp-embedded-xlsx.xlsx +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/shp-freeform.pptx +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/shp-groupshape.pptx +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/shp-movie-props.pptx +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/shp-picture.pptx +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/shp-pos-and-size.pptx +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/shp-shapes.pptx +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/sld-background.pptx +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/sld-blank.pptx +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/sld-notes.pptx +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/sld-slide.pptx +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/sld-slides.pptx +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/sonic.gif +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/tbl-cell.pptx +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/test-image-jpg-mime.pptx +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/test.pptx +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/txt-fit-text.pptx +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/txt-font-props.pptx +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/txt-font-typeface.pptx +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/txt-paragraph-spacing.pptx +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/txt-text-frame.pptx +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/test_files/txt-text.pptx +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/text.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/steps/text_frame.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/tbl-cell.feature +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/tbl-column.feature +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/tbl-table.feature +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/txt-fit-text.feature +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/txt-font-color.feature +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/txt-font-props.feature +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/txt-paragraph.feature +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/txt-text.feature +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/features/txt-textframe.feature +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/pyproject.toml +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/setup.cfg +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/_color.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/_slide_importer.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/_svg.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/_template_applier.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/accessibility.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/action.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/animation.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/api.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/chart/__init__.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/chart/analytics.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/chart/axis.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/chart/category.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/chart/chart.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/chart/data.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/chart/datalabel.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/chart/legend.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/chart/marker.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/chart/palettes.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/chart/plot.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/chart/point.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/chart/quick_layouts.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/chart/series.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/chart/xlsx.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/chart/xmlwriter.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/compose/__init__.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/compose/from_spec.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/design/__init__.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/design/components.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/design/figures.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/design/layout.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/design/recipes.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/design/style.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/design/tokens.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/diagrams.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/dml/__init__.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/dml/chtfmt.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/dml/color.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/dml/effect.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/dml/fill.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/dml/line.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/dml/picture.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/dml/three_d.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/enum/__init__.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/enum/action.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/enum/animation.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/enum/base.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/enum/chart.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/enum/dml.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/enum/lang.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/enum/presentation.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/enum/shapes.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/enum/text.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/exc.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/formats.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/geometry.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/inherit.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/lint.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/math.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/mathml2omml.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/media.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/opc/__init__.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/opc/constants.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/opc/oxml.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/opc/package.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/opc/packuri.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/opc/serialized.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/opc/shared.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/opc/spec.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/oxml/__init__.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/oxml/action.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/oxml/chart/__init__.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/oxml/chart/axis.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/oxml/chart/chart.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/oxml/chart/datalabel.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/oxml/chart/legend.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/oxml/chart/marker.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/oxml/chart/plot.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/oxml/chart/series.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/oxml/chart/shared.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/oxml/coreprops.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/oxml/customprops.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/oxml/dml/__init__.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/oxml/dml/color.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/oxml/dml/effect.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/oxml/dml/fill.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/oxml/dml/line.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/oxml/dml/three_d.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/oxml/ns.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/oxml/presentation.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/oxml/shapes/__init__.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/oxml/shapes/autoshape.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/oxml/shapes/connector.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/oxml/shapes/graphfrm.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/oxml/shapes/groupshape.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/oxml/shapes/picture.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/oxml/shapes/shared.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/oxml/simpletypes.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/oxml/slide.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/oxml/table.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/oxml/text.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/oxml/theme.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/oxml/xmlchemy.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/package.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/parts/__init__.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/parts/chart.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/parts/coreprops.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/parts/customprops.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/parts/diagram.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/parts/embeddedpackage.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/parts/image.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/parts/media.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/parts/presentation.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/parts/slide.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/presentation.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/py.typed +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/render.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/section.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/shapes/__init__.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/shapes/autoshape.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/shapes/base.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/shapes/connector.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/shapes/freeform.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/shapes/graphfrm.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/shapes/group.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/shapes/picture.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/shapes/placeholder.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/shared.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/skill/SKILL.md +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/skill/__init__.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/skill/__main__.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/skill/references/animations.md +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/skill/references/charts.md +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/skill/references/compose.md +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/skill/references/design.md +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/skill/references/effects.md +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/skill/references/end-to-end-deck.md +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/skill/references/geometry-and-arrows.md +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/skill/references/math.md +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/skill/references/picture-effects.md +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/skill/references/render.md +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/skill/references/smart-art.md +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/skill/references/space-aware-authoring.md +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/skill/references/tables.md +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/skill/references/theme.md +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/skill/references/three-d.md +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/skill/references/transitions.md +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/slide.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/smart_art.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/spec.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/table.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/table_styles.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/templates/default.pptx +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/templates/docx-icon.emf +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/templates/generic-icon.emf +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/templates/notes.xml +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/templates/notesMaster.xml +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/templates/pptx-icon.emf +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/templates/theme.xml +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/templates/xlsx-icon.emf +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/text/__init__.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/text/fonts.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/text/layout.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/text/text.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/theme.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/types.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/pptx2/util.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/python_pptx2.egg-info/dependency_links.txt +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/python_pptx2.egg-info/entry_points.txt +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/python_pptx2.egg-info/requires.txt +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/src/python_pptx2.egg-info/top_level.txt +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/__init__.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/chart/__init__.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/chart/test_analytics.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/chart/test_axis.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/chart/test_category.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/chart/test_chart.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/chart/test_chart_toggles.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/chart/test_collision_strategy.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/chart/test_data.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/chart/test_datalabel.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/chart/test_legend.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/chart/test_marker.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/chart/test_palettes.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/chart/test_plot.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/chart/test_point.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/chart/test_quick_layouts.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/chart/test_series.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/chart/test_xlsx.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/chart/test_xmlwriter.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/design/__init__.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/design/test_components.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/design/test_figures.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/design/test_layout.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/design/test_recipes.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/design/test_style.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/design/test_tokens.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/dml/__init__.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/dml/test_chtfmt.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/dml/test_color.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/dml/test_effect.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/dml/test_fill.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/dml/test_line.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/dml/test_three_d.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/enum/__init__.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/enum/test_base.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/enum/test_shapes.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/integration/__init__.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/integration/round_trip.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/integration/test_add_slide_layout.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/integration/test_apply_template.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/integration/test_compose_package.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/integration/test_import_slide.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/integration/test_round_trip.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/opc/__init__.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/opc/test_oxml.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/opc/test_package.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/opc/test_packuri.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/opc/test_serialized.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/oxml/__init__.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/oxml/shapes/__init__.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/oxml/shapes/test_autoshape.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/oxml/shapes/test_graphfrm.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/oxml/shapes/test_groupshape.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/oxml/shapes/test_picture.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/oxml/test___init__.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/oxml/test_dml.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/oxml/test_ns.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/oxml/test_presentation.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/oxml/test_simpletypes.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/oxml/test_slide.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/oxml/test_table.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/oxml/test_theme.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/oxml/test_xmlchemy.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/oxml/unitdata/__init__.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/oxml/unitdata/dml.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/oxml/unitdata/shape.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/oxml/unitdata/text.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/parts/__init__.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/parts/test_chart.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/parts/test_coreprops.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/parts/test_customprops.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/parts/test_embeddedpackage.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/parts/test_image.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/parts/test_media.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/parts/test_presentation.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/parts/test_slide.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/schema/__init__.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/schema/oxml_schema_validator.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/schema/test_schema_validity.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/shapes/__init__.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/shapes/test_anchor.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/shapes/test_animate.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/shapes/test_autoshape.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/shapes/test_base.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/shapes/test_connector.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/shapes/test_freeform.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/shapes/test_graphfrm.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/shapes/test_group.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/shapes/test_picture.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/shapes/test_placeholder.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/shapes/test_shapetree.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_accessibility.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_action.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_animation.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_api.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_compose_from_spec.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_diagrams.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/calibriz.ttf +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/cdw-logo.eps +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/dummy.mp4 +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/expanded_pptx/[Content_Types].xml +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/expanded_pptx/_rels/.rels +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/expanded_pptx/docProps/app.xml +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/expanded_pptx/docProps/core.xml +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/expanded_pptx/docProps/thumbnail.jpeg +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/expanded_pptx/ppt/_rels/presentation.xml.rels +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/expanded_pptx/ppt/presProps.xml +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/expanded_pptx/ppt/presentation.xml +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/expanded_pptx/ppt/printerSettings/printerSettings1.bin +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/_rels/slideLayout1.xml.rels +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/_rels/slideLayout10.xml.rels +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/_rels/slideLayout11.xml.rels +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/_rels/slideLayout2.xml.rels +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/_rels/slideLayout3.xml.rels +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/_rels/slideLayout4.xml.rels +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/_rels/slideLayout5.xml.rels +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/_rels/slideLayout6.xml.rels +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/_rels/slideLayout7.xml.rels +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/_rels/slideLayout8.xml.rels +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/_rels/slideLayout9.xml.rels +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/slideLayout1.xml +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/slideLayout10.xml +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/slideLayout11.xml +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/slideLayout2.xml +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/slideLayout3.xml +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/slideLayout4.xml +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/slideLayout5.xml +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/slideLayout6.xml +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/slideLayout7.xml +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/slideLayout8.xml +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/expanded_pptx/ppt/slideLayouts/slideLayout9.xml +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/expanded_pptx/ppt/slideMasters/_rels/slideMaster1.xml.rels +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/expanded_pptx/ppt/slideMasters/slideMaster1.xml +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/expanded_pptx/ppt/slides/_rels/slide1.xml.rels +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/expanded_pptx/ppt/slides/slide1.xml +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/expanded_pptx/ppt/tableStyles.xml +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/expanded_pptx/ppt/theme/theme1.xml +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/expanded_pptx/ppt/viewProps.xml +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/minimal.pptx +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/minimal_slide.xml +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/missing_rels_item.pptx +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/monty-truth.png +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/no-core-props.pptx +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/no-slides.pptx +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/presentation.xml +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/python-icon.jpeg +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/python-powered.png +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/python.bmp +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/slideLayout1.xml +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/smart_art_org_chart.pptx +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/2x2-area-date.txt +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/2x2-area-float.txt +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/2x2-area-stacked-100.txt +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/2x2-area-stacked.txt +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/2x2-area.txt +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/2x2-bar-clustered-date.txt +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/2x2-bar-clustered-float.txt +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/2x2-bar-clustered.txt +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/2x2-bar-stacked-100.txt +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/2x2-bar-stacked.txt +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/2x2-column-clustered.txt +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/2x2-column-stacked-100.txt +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/2x2-column-stacked.txt +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/2x2-line-date.txt +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/2x2-line-float.txt +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/2x2-line-markers-stacked-100.txt +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/2x2-line-markers-stacked.txt +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/2x2-line-markers.txt +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/2x2-line-stacked-100.txt +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/2x2-line-stacked.txt +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/2x2-line.txt +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/2x3-bubble-3d.txt +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/2x3-bubble.txt +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/2x3-xy-lines-no-markers.txt +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/2x3-xy-lines.txt +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/2x3-xy-smooth-no-markers.txt +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/2x3-xy-smooth.txt +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/2x3-xy.txt +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/2x5-radar.txt +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/3x1-pie-exploded.txt +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/3x1-pie.txt +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/3x2-doughnut-exploded.txt +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/3x2-doughnut.txt +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/4x2-multi-cat-bar.txt +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/adjust-ser-count.txt +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/cat-labels.txt +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/content-types-xml.txt +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/default-notes.txt +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/default-notesMaster.txt +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/default-theme.txt +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/freeform.txt +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/package-rels-xml.txt +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/placeholders.txt +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/presentation-rels-xml.txt +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/relationships.txt +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/rels-load-from-xml.txt +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/rewrite-ser.txt +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/snippets/timing.txt +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/test.pptx +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_files/test_slides.pptx +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_formats.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_geometry.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_inherit.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_lint.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_lint_on_save.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_math.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_media.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_new_features.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_package.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_pathlike_inputs.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_powerpoint_strict_validation.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_presentation.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_render.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_render_slides_alias.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_section.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_shared.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_skill.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_slide.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_smart_art.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_svg_picture.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_table.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_table_extras.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_theme.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_transition_morph.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/test_util.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/text/__init__.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/text/test_fonts.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/text/test_layout.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/text/test_text.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/unitdata.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/unitutil/__init__.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/unitutil/cxml.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/unitutil/file.py +0 -0
- {python_pptx2-2.16.0 → python_pptx2-2.18.0}/tests/unitutil/mock.py +0 -0
- {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.
|
|
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
|
|
@@ -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
|
|
196
|
-
|
|
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
|
-
|
|
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
|
|
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"``; ``
|
|
931
|
-
* ``anchor`` — vertical anchor: ``"top"`` / ``"middle"``
|
|
932
|
-
``"bottom"``; ``
|
|
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
|
|
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
|
|
1012
|
-
|
|
1013
|
-
|
|
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
|
-
|
|
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.
|
|
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
|