aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--MANUAL.txt52
-rw-r--r--pandoc.cabal30
-rw-r--r--src/Text/Pandoc/Writers/Powerpoint/Output.hs179
-rw-r--r--src/Text/Pandoc/Writers/Powerpoint/Presentation.hs189
-rw-r--r--test/Tests/Writers/Powerpoint.hs61
-rw-r--r--test/pptx/blanks/just-speaker-notes/deleted-layouts.pptxbin0 -> 35181 bytes
-rw-r--r--test/pptx/blanks/just-speaker-notes/input.native7
-rw-r--r--test/pptx/blanks/just-speaker-notes/moved-layouts.pptxbin0 -> 45873 bytes
-rw-r--r--test/pptx/blanks/just-speaker-notes/output.pptxbin0 -> 32304 bytes
-rw-r--r--test/pptx/blanks/just-speaker-notes/templated.pptxbin0 -> 45369 bytes
-rw-r--r--test/pptx/blanks/nbsp-in-body/deleted-layouts.pptxbin0 -> 30444 bytes
-rw-r--r--test/pptx/blanks/nbsp-in-body/input.native6
-rw-r--r--test/pptx/blanks/nbsp-in-body/moved-layouts.pptxbin0 -> 41131 bytes
-rw-r--r--test/pptx/blanks/nbsp-in-body/output.pptxbin0 -> 27562 bytes
-rw-r--r--test/pptx/blanks/nbsp-in-body/templated.pptxbin0 -> 40630 bytes
-rw-r--r--test/pptx/blanks/nbsp-in-heading/deleted-layouts.pptxbin0 -> 30444 bytes
-rw-r--r--test/pptx/blanks/nbsp-in-heading/input.native5
-rw-r--r--test/pptx/blanks/nbsp-in-heading/moved-layouts.pptxbin0 -> 41131 bytes
-rw-r--r--test/pptx/blanks/nbsp-in-heading/output.pptxbin0 -> 27562 bytes
-rw-r--r--test/pptx/blanks/nbsp-in-heading/templated.pptxbin0 -> 40630 bytes
-rw-r--r--test/pptx/code-custom/deleted-layouts.pptxbin31033 -> 31069 bytes
-rw-r--r--test/pptx/code/deleted-layouts.pptxbin31032 -> 31068 bytes
-rw-r--r--test/pptx/comparison/both-columns/deleted-layouts.pptxbin0 -> 45804 bytes
-rw-r--r--test/pptx/comparison/both-columns/input.native23
-rw-r--r--test/pptx/comparison/both-columns/moved-layouts.pptxbin0 -> 56524 bytes
-rw-r--r--test/pptx/comparison/both-columns/output.pptxbin0 -> 42932 bytes
-rw-r--r--test/pptx/comparison/both-columns/templated.pptxbin0 -> 56025 bytes
-rw-r--r--test/pptx/comparison/extra-image/deleted-layouts.pptxbin0 -> 45833 bytes
-rw-r--r--test/pptx/comparison/extra-image/input.native24
-rw-r--r--test/pptx/comparison/extra-image/moved-layouts.pptxbin0 -> 56552 bytes
-rw-r--r--test/pptx/comparison/extra-image/output.pptxbin0 -> 42961 bytes
-rw-r--r--test/pptx/comparison/extra-image/templated.pptxbin0 -> 56053 bytes
-rw-r--r--test/pptx/comparison/extra-text/deleted-layouts.pptxbin0 -> 45804 bytes
-rw-r--r--test/pptx/comparison/extra-text/input.native23
-rw-r--r--test/pptx/comparison/extra-text/moved-layouts.pptxbin0 -> 56524 bytes
-rw-r--r--test/pptx/comparison/extra-text/output.pptxbin0 -> 42932 bytes
-rw-r--r--test/pptx/comparison/extra-text/templated.pptxbin0 -> 56025 bytes
-rw-r--r--test/pptx/comparison/non-text-first/deleted-layouts.pptxbin0 -> 45717 bytes
-rw-r--r--test/pptx/comparison/non-text-first/input.native21
-rw-r--r--test/pptx/comparison/non-text-first/moved-layouts.pptxbin0 -> 56417 bytes
-rw-r--r--test/pptx/comparison/non-text-first/output.pptxbin0 -> 42845 bytes
-rw-r--r--test/pptx/comparison/non-text-first/templated.pptxbin0 -> 55918 bytes
-rw-r--r--test/pptx/comparison/one-column/deleted-layouts.pptxbin0 -> 29136 bytes
-rw-r--r--test/pptx/comparison/one-column/input.native21
-rw-r--r--test/pptx/comparison/one-column/moved-layouts.pptxbin0 -> 39856 bytes
-rw-r--r--test/pptx/comparison/one-column/output.pptxbin0 -> 26258 bytes
-rw-r--r--test/pptx/comparison/one-column/templated.pptxbin0 -> 39357 bytes
-rw-r--r--test/pptx/content-with-caption/heading-text-image/deleted-layouts.pptxbin0 -> 45549 bytes
-rw-r--r--test/pptx/content-with-caption/heading-text-image/input.native3
-rw-r--r--test/pptx/content-with-caption/heading-text-image/moved-layouts.pptxbin0 -> 56248 bytes
-rw-r--r--test/pptx/content-with-caption/heading-text-image/output.pptxbin0 -> 42677 bytes
-rw-r--r--test/pptx/content-with-caption/heading-text-image/templated.pptxbin0 -> 55749 bytes
-rw-r--r--test/pptx/content-with-caption/image-text/deleted-layouts.pptxbin0 -> 46248 bytes
-rw-r--r--test/pptx/content-with-caption/image-text/input.native2
-rw-r--r--test/pptx/content-with-caption/image-text/moved-layouts.pptxbin0 -> 56934 bytes
-rw-r--r--test/pptx/content-with-caption/image-text/output.pptxbin0 -> 43374 bytes
-rw-r--r--test/pptx/content-with-caption/image-text/templated.pptxbin0 -> 56435 bytes
-rw-r--r--test/pptx/content-with-caption/text-image/deleted-layouts.pptxbin0 -> 45488 bytes
-rw-r--r--test/pptx/content-with-caption/text-image/input.native2
-rw-r--r--test/pptx/content-with-caption/text-image/moved-layouts.pptxbin0 -> 56188 bytes
-rw-r--r--test/pptx/content-with-caption/text-image/output.pptxbin0 -> 42616 bytes
-rw-r--r--test/pptx/content-with-caption/text-image/templated.pptxbin0 -> 55689 bytes
-rw-r--r--test/pptx/document-properties-short-desc/deleted-layouts.pptxbin29806 -> 29842 bytes
-rw-r--r--test/pptx/document-properties/deleted-layouts.pptxbin30210 -> 30246 bytes
-rw-r--r--test/pptx/endnotes-toc/deleted-layouts.pptxbin30596 -> 30632 bytes
-rw-r--r--test/pptx/endnotes/deleted-layouts.pptxbin29774 -> 29810 bytes
-rw-r--r--test/pptx/images/deleted-layouts.pptxbin47437 -> 47473 bytes
-rw-r--r--test/pptx/inline-formatting/deleted-layouts.pptxbin28966 -> 29002 bytes
-rw-r--r--test/pptx/lists/deleted-layouts.pptxbin29861 -> 29897 bytes
-rw-r--r--test/pptx/raw-ooxml/deleted-layouts.pptxbin29754 -> 29790 bytes
-rw-r--r--test/pptx/remove-empty-slides/deleted-layouts.pptxbin46867 -> 46218 bytes
-rw-r--r--test/pptx/remove-empty-slides/moved-layouts.pptxbin57656 -> 56903 bytes
-rw-r--r--test/pptx/remove-empty-slides/output.pptxbin44025 -> 43346 bytes
-rw-r--r--test/pptx/remove-empty-slides/templated.pptxbin57172 -> 56404 bytes
-rw-r--r--test/pptx/slide-breaks-slide-level-1/deleted-layouts.pptxbin30554 -> 30590 bytes
-rw-r--r--test/pptx/slide-breaks-toc/deleted-layouts.pptxbin32328 -> 32364 bytes
-rw-r--r--test/pptx/slide-breaks/deleted-layouts.pptxbin31378 -> 31414 bytes
-rw-r--r--test/pptx/slide-level-0/h1-h2-with-table/deleted-layouts.pptxbin29828 -> 29137 bytes
-rw-r--r--test/pptx/slide-level-0/h1-h2-with-table/moved-layouts.pptxbin40552 -> 39829 bytes
-rw-r--r--test/pptx/slide-level-0/h1-h2-with-table/output.pptxbin26985 -> 26259 bytes
-rw-r--r--test/pptx/slide-level-0/h1-h2-with-table/templated.pptxbin40052 -> 39330 bytes
-rw-r--r--test/pptx/slide-level-0/h1-with-image/deleted-layouts.pptxbin45433 -> 45469 bytes
-rw-r--r--test/pptx/slide-level-0/h1-with-table/deleted-layouts.pptxbin29008 -> 29044 bytes
-rw-r--r--test/pptx/slide-level-0/h2-with-image/deleted-layouts.pptxbin45433 -> 45469 bytes
-rw-r--r--test/pptx/speaker-notes-after-metadata/deleted-layouts.pptxbin34473 -> 34509 bytes
-rw-r--r--test/pptx/speaker-notes-afterheader/deleted-layouts.pptxbin33500 -> 33536 bytes
-rw-r--r--test/pptx/speaker-notes-afterseps/deleted-layouts.pptxbin54396 -> 54432 bytes
-rw-r--r--test/pptx/speaker-notes/deleted-layouts.pptxbin38203 -> 38239 bytes
-rw-r--r--test/pptx/start-numbering-at/deleted-layouts.pptxbin29837 -> 29873 bytes
-rw-r--r--test/pptx/tables/deleted-layouts.pptxbin30381 -> 30417 bytes
-rw-r--r--test/pptx/two-column/deleted-layouts.pptxbin28883 -> 28919 bytes
91 files changed, 580 insertions, 68 deletions
diff --git a/MANUAL.txt b/MANUAL.txt
index f81f4c70b..afdd66ddd 100644
--- a/MANUAL.txt
+++ b/MANUAL.txt
@@ -1182,11 +1182,15 @@ header when requesting a document from a URL:
- Title and Content
- Section Header
- Two Content
+ - Comparison
+ - Content with Caption
+ - Blank
For each name, the first layout found with that name will be used.
If no layout is found with one of the names, pandoc will output a
warning and use the layout with that name from the default reference
- doc instead.
+ doc instead. (How these layouts are used is described in [PowerPoint
+ layout choice](#powerpoint-layout-choice).)
All templates included with a recent version of MS PowerPoint
will fit these criteria. (You can click on `Layout` under the
@@ -1195,8 +1199,8 @@ header when requesting a document from a URL:
You can also modify the default `reference.pptx`: first run
`pandoc -o custom-reference.pptx --print-default-data-file
reference.pptx`, and then modify `custom-reference.pptx`
- in MS PowerPoint (pandoc will use the first four layout
- slides, as mentioned above).
+ in MS PowerPoint (pandoc will use the layouts with the names
+ listed above).
`--epub-cover-image=`*FILE*
@@ -5833,6 +5837,48 @@ you use deeper nesting of section levels with reveal.js unless you set
`--slide-level=0` (which lets reveal.js produce a one-dimensional layout
and only interprets horizontal rules as slide boundaries).
+### PowerPoint layout choice
+
+When creating slides, the pptx writer chooses from a number of pre-defined
+layouts, based on the content of the slide:
+
+Title Slide
+: This layout is used for the initial slide, which is generated and
+ filled from the metadata fields `date`, `author`, and `title`, if
+ they are present.
+
+Section Header
+: This layout is used for what pandoc calls “title slides”, i.e.
+ slides which start with a header which is above the slide level in
+ the hierarchy.
+
+Two Content
+: This layout is used for two-column slides, i.e. slides containing a
+ div with class `columns` which contains at least two divs with class
+ `column`.
+
+Comparison
+: This layout is used instead of “Two Content” for any two-column
+ slides in which at least one column contains text followed by
+ non-text (e.g. an image or a table).
+
+Content with Caption
+: This layout is used for any non-two-column slides which contain text
+ followed by non-text (e.g. an image or a table).
+
+Blank
+: This layout is used for any slides which only contain blank content,
+ e.g. a slide containing only speaker notes, or a slide containing
+ only a non-breaking space.
+
+Title and Content
+: This layout is used for all slides which do not match the criteria
+ for another layout.
+
+These layouts are chosen from the default pptx reference doc included with
+pandoc, unless an alternative reference doc is specified using
+`--reference-doc`.
+
## Incremental lists
By default, these writers produce lists that display "all at once."
diff --git a/pandoc.cabal b/pandoc.cabal
index 7fb951488..3de7da39c 100644
--- a/pandoc.cabal
+++ b/pandoc.cabal
@@ -380,17 +380,31 @@ extra-source-files:
test/rtf/*.native
test/rtf/*.rtf
test/pptx/*.pptx
+ test/pptx/blanks/just-speaker-notes/input.native
+ test/pptx/blanks/just-speaker-notes/*.pptx
+ test/pptx/blanks/nbsp-in-body/input.native
+ test/pptx/blanks/nbsp-in-body/*.pptx
+ test/pptx/blanks/nbsp-in-heading/input.native
+ test/pptx/blanks/nbsp-in-heading/*.pptx
test/pptx/code-custom/*.pptx
test/pptx/code/input.native
test/pptx/code/*.pptx
- test/pptx/comparison-both-columns/input.native
- test/pptx/comparison-both-columns/*.pptx
- test/pptx/comparison-extra-text/input.native
- test/pptx/comparison-extra-text/*.pptx
- test/pptx/comparison-non-text-first/input.native
- test/pptx/comparison-non-text-first/*.pptx
- test/pptx/comparison-one-column/input.native
- test/pptx/comparison-one-column/*.pptx
+ test/pptx/content-with-caption/heading-text-image/input.native
+ test/pptx/content-with-caption/heading-text-image/*.pptx
+ test/pptx/content-with-caption/image-text/input.native
+ test/pptx/content-with-caption/image-text/*.pptx
+ test/pptx/content-with-caption/text-image/input.native
+ test/pptx/content-with-caption/text-image/*.pptx
+ test/pptx/comparison/both-columns/input.native
+ test/pptx/comparison/both-columns/*.pptx
+ test/pptx/comparison/extra-image/input.native
+ test/pptx/comparison/extra-image/*.pptx
+ test/pptx/comparison/extra-text/input.native
+ test/pptx/comparison/extra-text/*.pptx
+ test/pptx/comparison/non-text-first/input.native
+ test/pptx/comparison/non-text-first/*.pptx
+ test/pptx/comparison/one-column/input.native
+ test/pptx/comparison/one-column/*.pptx
test/pptx/document-properties-short-desc/input.native
test/pptx/document-properties-short-desc/*.pptx
test/pptx/document-properties/input.native
diff --git a/src/Text/Pandoc/Writers/Powerpoint/Output.hs b/src/Text/Pandoc/Writers/Powerpoint/Output.hs
index 0e6a67861..d83fb2182 100644
--- a/src/Text/Pandoc/Writers/Powerpoint/Output.hs
+++ b/src/Text/Pandoc/Writers/Powerpoint/Output.hs
@@ -1,6 +1,7 @@
{-# LANGUAGE DeriveTraversable #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE PatternGuards #-}
+{-# LANGUAGE RecordWildCards #-}
{- |
Module : Text.Pandoc.Writers.Powerpoint.Output
Copyright : Copyright (C) 2017-2020 Jesse Rosenthal
@@ -115,7 +116,7 @@ data WriterEnv = WriterEnv { envRefArchive :: Archive
-- the end of the slide file name and
-- the rId number
, envSlideIdOffset :: Int
- , envContentType :: ContentType
+ , envPlaceholder :: Placeholder
, envSlideIdMap :: M.Map SlideId Int
-- maps the slide number to the
-- corresponding notes id number. If there
@@ -139,7 +140,7 @@ instance Default WriterEnv where
, envInNoteSlide = False
, envCurSlideId = 1
, envSlideIdOffset = 1
- , envContentType = NormalContent
+ , envPlaceholder = Placeholder ObjType 0
, envSlideIdMap = mempty
, envSpeakerNotesIdMap = mempty
, envInSpeakerNotes = False
@@ -153,6 +154,9 @@ data SlideLayoutsOf a = SlideLayouts
, title :: a
, content :: a
, twoColumn :: a
+ , comparison :: a
+ , contentWithCaption :: a
+ , blank :: a
} deriving (Show, Functor, Foldable, Traversable)
data SlideLayout = SlideLayout
@@ -170,10 +174,14 @@ getSlideLayouts = asks envSlideLayouts >>= maybe (throwError e) pure
e = PandocSomeError ("Slide layouts aren't defined, even though they should "
<> "always be. This is a bug in pandoc.")
-data ContentType = NormalContent
- | TwoColumnLeftContent
- | TwoColumnRightContent
- deriving (Show, Eq)
+-- | A placeholder within a layout, identified by type and index.
+--
+-- E.g., @Placeholder ObjType 2@ is the third placeholder of type 'ObjType' in
+-- the layout.
+data Placeholder = Placeholder
+ { placeholderType :: PHType
+ , index :: Int
+ } deriving (Show, Eq)
data MediaInfo = MediaInfo { mInfoFilePath :: FilePath
, mInfoLocalId :: Int
@@ -446,6 +454,9 @@ presentationToArchive opts meta pres = do
, title = "Section Header"
, content = "Title and Content"
, twoColumn = "Two Content"
+ , comparison = "Comparison"
+ , contentWithCaption = "Content with Caption"
+ , blank = "Blank"
}
layouts <- for layoutTitles $ \layoutTitle -> do
let layout = M.lookup (CI.mk layoutTitle) referenceLayouts
@@ -550,10 +561,13 @@ getLayout layout = getElement <$> getSlideLayouts
where
getElement =
slElement . case layout of
- MetadataSlide{} -> metadata
- TitleSlide{} -> title
- ContentSlide{} -> content
- TwoColumnSlide{} -> twoColumn
+ MetadataSlide{} -> metadata
+ TitleSlide{} -> title
+ ContentSlide{} -> content
+ TwoColumnSlide{} -> twoColumn
+ ComparisonSlide{} -> comparison
+ ContentWithCaptionSlide{} -> contentWithCaption
+ BlankSlide{} -> blank
shapeHasId :: NameSpaces -> T.Text -> Element -> Bool
shapeHasId ns ident element
@@ -566,17 +580,31 @@ shapeHasId ns ident element
getContentShape :: PandocMonad m => NameSpaces -> Element -> P m Element
getContentShape ns spTreeElem
| isElem ns "p" "spTree" spTreeElem = do
- contentType <- asks envContentType
- let contentShapes = getShapesByPlaceHolderType ns spTreeElem ObjType
- case contentType of
- NormalContent | (sp : _) <- contentShapes -> return sp
- TwoColumnLeftContent | (sp : _) <- contentShapes -> return sp
- TwoColumnRightContent | (_ : sp : _) <- contentShapes -> return sp
- _ -> throwError $ PandocSomeError
- "Could not find shape for Powerpoint content"
+ ph@Placeholder{..} <- asks envPlaceholder
+ case drop index (getShapesByPlaceHolderType ns spTreeElem placeholderType) of
+ sp : _ -> return sp
+ [] -> throwError $ PandocSomeError $ missingPlaceholderMessage ph
getContentShape _ _ = throwError $ PandocSomeError
"Attempted to find content on non shapeTree"
+missingPlaceholderMessage :: Placeholder -> Text
+missingPlaceholderMessage Placeholder{..} =
+ "Could not find a " <> ordinal
+ <> " placeholder of type " <> placeholderText
+ where
+ ordinal = T.pack (show index) <>
+ case (index `mod` 100, index `mod` 10) of
+ (11, _) -> "th"
+ (12, _) -> "th"
+ (13, _) -> "th"
+ (_, 1) -> "st"
+ (_, 2) -> "nd"
+ (_, 3) -> "rd"
+ _ -> "th"
+ placeholderText = case placeholderType of
+ ObjType -> "obj (or nothing)"
+ PHType t -> t
+
getShapeDimensions :: NameSpaces
-> Element
-> Maybe ((Integer, Integer), (Integer, Integer))
@@ -1302,7 +1330,7 @@ contentToElement layout hdrShape shapes
element <- nonBodyTextToElement layout [PHType "title"] hdrShape
let hdrShapeElements = [Elem element | not (null hdrShape)]
contentElements <- local
- (\env -> env {envContentType = NormalContent})
+ (\env -> env {envPlaceholder = Placeholder ObjType 0})
(shapesToElements layout shapes)
return $ buildSpTree ns spTree (hdrShapeElements <> contentElements)
contentToElement _ _ _ = return $ mknode "p:sp" [] ()
@@ -1315,10 +1343,10 @@ twoColumnToElement layout hdrShape shapesL shapesR
element <- nonBodyTextToElement layout [PHType "title"] hdrShape
let hdrShapeElements = [Elem element | not (null hdrShape)]
contentElementsL <- local
- (\env -> env {envContentType =TwoColumnLeftContent})
+ (\env -> env {envPlaceholder = Placeholder ObjType 0})
(shapesToElements layout shapesL)
contentElementsR <- local
- (\env -> env {envContentType =TwoColumnRightContent})
+ (\env -> env {envPlaceholder = Placeholder ObjType 1})
(shapesToElements layout shapesR)
-- let contentElementsL' = map (setIdx ns "1") contentElementsL
-- contentElementsR' = map (setIdx ns "2") contentElementsR
@@ -1326,6 +1354,76 @@ twoColumnToElement layout hdrShape shapesL shapesR
hdrShapeElements <> contentElementsL <> contentElementsR
twoColumnToElement _ _ _ _= return $ mknode "p:sp" [] ()
+comparisonToElement ::
+ PandocMonad m =>
+ Element ->
+ [ParaElem] ->
+ ([Shape], [Shape]) ->
+ ([Shape], [Shape]) ->
+ P m Element
+comparisonToElement layout hdrShape (shapesL1, shapesL2) (shapesR1, shapesR2)
+ | ns <- elemToNameSpaces layout
+ , Just cSld <- findChild (elemName ns "p" "cSld") layout
+ , Just spTree <- findChild (elemName ns "p" "spTree") cSld = do
+ element <- nonBodyTextToElement layout [PHType "title"] hdrShape
+ let hdrShapeElements = [Elem element | not (null hdrShape)]
+ contentElementsL1 <- local
+ (\env -> env {envPlaceholder = Placeholder (PHType "body") 0})
+ (shapesToElements layout shapesL1)
+ contentElementsL2 <- local
+ (\env -> env {envPlaceholder = Placeholder ObjType 0})
+ (shapesToElements layout shapesL2)
+ contentElementsR1 <- local
+ (\env -> env {envPlaceholder = Placeholder (PHType "body") 1})
+ (shapesToElements layout shapesR1)
+ contentElementsR2 <- local
+ (\env -> env {envPlaceholder = Placeholder ObjType 1})
+ (shapesToElements layout shapesR2)
+ return $ buildSpTree ns spTree $
+ mconcat [ hdrShapeElements
+ , contentElementsL1
+ , contentElementsL2
+ , contentElementsR1
+ , contentElementsR2
+ ]
+comparisonToElement _ _ _ _= return $ mknode "p:sp" [] ()
+
+contentWithCaptionToElement ::
+ PandocMonad m =>
+ Element ->
+ [ParaElem] ->
+ [Shape] ->
+ [Shape] ->
+ P m Element
+contentWithCaptionToElement layout hdrShape textShapes contentShapes
+ | ns <- elemToNameSpaces layout
+ , Just cSld <- findChild (elemName ns "p" "cSld") layout
+ , Just spTree <- findChild (elemName ns "p" "spTree") cSld = do
+ element <- nonBodyTextToElement layout [PHType "title"] hdrShape
+ let hdrShapeElements = [Elem element | not (null hdrShape)]
+ textElements <- local
+ (\env -> env {envPlaceholder = Placeholder (PHType "body") 0})
+ (shapesToElements layout textShapes)
+ contentElements <- local
+ (\env -> env {envPlaceholder = Placeholder ObjType 0})
+ (shapesToElements layout contentShapes)
+ return $ buildSpTree ns spTree $
+ mconcat [ hdrShapeElements
+ , textElements
+ , contentElements
+ ]
+contentWithCaptionToElement _ _ _ _ = return $ mknode "p:sp" [] ()
+
+blankToElement ::
+ PandocMonad m =>
+ Element ->
+ P m Element
+blankToElement layout
+ | ns <- elemToNameSpaces layout
+ , Just cSld <- findChild (elemName ns "p" "cSld") layout
+ , Just spTree <- findChild (elemName ns "p" "spTree") cSld = do
+ return $ buildSpTree ns spTree []
+blankToElement _ = return $ mknode "p:sp" [] ()
titleToElement :: PandocMonad m => Element -> [ParaElem] -> P m Element
titleToElement layout titleElems
@@ -1380,6 +1478,17 @@ slideToElement (Slide _ l@(TwoColumnSlide hdrElems shapesL shapesR) _) = do
("xmlns:r", "http://schemas.openxmlformats.org/officeDocument/2006/relationships"),
("xmlns:p", "http://schemas.openxmlformats.org/presentationml/2006/main")
] [mknode "p:cSld" [] [spTree]]
+slideToElement (Slide _ l@(ComparisonSlide hdrElems shapesL shapesR) _) = do
+ layout <- getLayout l
+ spTree <- local (\env -> if null hdrElems
+ then env
+ else env{envSlideHasHeader=True}) $
+ comparisonToElement layout hdrElems shapesL shapesR
+ return $ mknode "p:sld"
+ [ ("xmlns:a", "http://schemas.openxmlformats.org/drawingml/2006/main"),
+ ("xmlns:r", "http://schemas.openxmlformats.org/officeDocument/2006/relationships"),
+ ("xmlns:p", "http://schemas.openxmlformats.org/presentationml/2006/main")
+ ] [mknode "p:cSld" [] [spTree]]
slideToElement (Slide _ l@(TitleSlide hdrElems) _) = do
layout <- getLayout l
spTree <- titleToElement layout hdrElems
@@ -1396,7 +1505,22 @@ slideToElement (Slide _ l@(MetadataSlide titleElems subtitleElems authorElems da
("xmlns:r", "http://schemas.openxmlformats.org/officeDocument/2006/relationships"),
("xmlns:p", "http://schemas.openxmlformats.org/presentationml/2006/main")
] [mknode "p:cSld" [] [spTree]]
-
+slideToElement (Slide _ l@(ContentWithCaptionSlide hdrElems captionShapes contentShapes) _) = do
+ layout <- getLayout l
+ spTree <- contentWithCaptionToElement layout hdrElems captionShapes contentShapes
+ return $ mknode "p:sld"
+ [ ("xmlns:a", "http://schemas.openxmlformats.org/drawingml/2006/main"),
+ ("xmlns:r", "http://schemas.openxmlformats.org/officeDocument/2006/relationships"),
+ ("xmlns:p", "http://schemas.openxmlformats.org/presentationml/2006/main")
+ ] [mknode "p:cSld" [] [spTree]]
+slideToElement (Slide _ BlankSlide _) = do
+ layout <- getLayout BlankSlide
+ spTree <- blankToElement layout
+ return $ mknode "p:sld"
+ [ ("xmlns:a", "http://schemas.openxmlformats.org/drawingml/2006/main"),
+ ("xmlns:r", "http://schemas.openxmlformats.org/officeDocument/2006/relationships"),
+ ("xmlns:p", "http://schemas.openxmlformats.org/presentationml/2006/main")
+ ] [mknode "p:cSld" [] [spTree]]
--------------------------------------------------------------------
-- Notes:
@@ -1800,10 +1924,13 @@ slideToSlideRelElement slide = do
target <- flip fmap getSlideLayouts $
T.pack . ("../slideLayouts/" <>) . takeFileName .
slPath . case slide of
- (Slide _ MetadataSlide{} _) -> metadata
- (Slide _ TitleSlide{} _) -> title
- (Slide _ ContentSlide{} _) -> content
- (Slide _ TwoColumnSlide{} _) -> twoColumn
+ (Slide _ MetadataSlide{} _) -> metadata
+ (Slide _ TitleSlide{} _) -> title
+ (Slide _ ContentSlide{} _) -> content
+ (Slide _ TwoColumnSlide{} _) -> twoColumn
+ (Slide _ ComparisonSlide{} _) -> comparison
+ (Slide _ ContentWithCaptionSlide{} _) -> contentWithCaption
+ (Slide _ BlankSlide _) -> blank
speakerNotesRels <- maybeToList <$> speakerNotesSlideRelElement slide
diff --git a/src/Text/Pandoc/Writers/Powerpoint/Presentation.hs b/src/Text/Pandoc/Writers/Powerpoint/Presentation.hs
index 284b9ae62..10060d975 100644
--- a/src/Text/Pandoc/Writers/Powerpoint/Presentation.hs
+++ b/src/Text/Pandoc/Writers/Powerpoint/Presentation.hs
@@ -2,6 +2,7 @@
{-# LANGUAGE PatternGuards #-}
{-# LANGUAGE ViewPatterns #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
{- |
Module : Text.Pandoc.Writers.Powerpoint.Presentation
Copyright : Copyright (C) 2017-2020 Jesse Rosenthal
@@ -61,11 +62,13 @@ import Text.Pandoc.Writers.Shared (lookupMetaInlines, lookupMetaBlocks
, toLegacyTable)
import qualified Data.Map as M
import qualified Data.Set as S
-import Data.Maybe (maybeToList, fromMaybe)
+import Data.Maybe (maybeToList, fromMaybe, listToMaybe)
import Text.Pandoc.Highlighting
import qualified Data.Text as T
import Control.Applicative ((<|>))
import Skylighting
+import Data.Bifunctor (bimap)
+import Data.Char (isSpace)
data WriterEnv = WriterEnv { envMetadata :: Meta
, envRunProps :: RunProps
@@ -195,6 +198,11 @@ data Layout = MetadataSlide [ParaElem] [ParaElem] [[ParaElem]] [ParaElem]
-- heading content
| TwoColumnSlide [ParaElem] [Shape] [Shape]
-- heading left right
+ | ComparisonSlide [ParaElem] ([Shape], [Shape]) ([Shape], [Shape])
+ -- heading left@(text, content) right@(text, content)
+ | ContentWithCaptionSlide [ParaElem] [Shape] [Shape]
+ -- heading text content
+ | BlankSlide
deriving (Show, Eq)
data Shape = Pic PicProps FilePath T.Text [ParaElem]
@@ -584,7 +592,30 @@ isImage Image{} = True
isImage (Link _ (Image{} : _) _) = True
isImage _ = False
-splitBlocks' :: [Block] -> [[Block]] -> [Block] -> Pres [[Block]]
+plainOrPara :: Block -> Maybe [Inline]
+plainOrPara (Plain ils) = Just ils
+plainOrPara (Para ils) = Just ils
+plainOrPara _ = Nothing
+
+notText :: Block -> Bool
+notText block | startsWithImage block = True
+notText Table{} = True
+notText _ = False
+
+startsWithImage :: Block -> Bool
+startsWithImage block = fromMaybe False $ do
+ inline <- plainOrPara block >>= listToMaybe
+ pure (isImage inline)
+
+-- | Group blocks into a number of "splits"
+splitBlocks' ::
+ -- | Blocks so far in the current split
+ [Block] ->
+ -- | Splits so far
+ [[Block]] ->
+ -- | All remaining blocks
+ [Block] ->
+ Pres [[Block]]
splitBlocks' cur acc [] = return $ acc ++ ([cur | not (null cur)])
splitBlocks' cur acc (HorizontalRule : blks) =
splitBlocks' [] (acc ++ ([cur | not (null cur)])) blks
@@ -609,7 +640,9 @@ splitBlocks' cur acc (Para (il:ils) : blks) | isImage il = do
(acc ++ [cur ++ [Para [il]] ++ nts])
(if null ils then blks' else Para ils : blks')
_ -> splitBlocks' []
- (acc ++ ([cur | not (null cur)]) ++ [Para [il] : nts])
+ (if any notText cur
+ then acc ++ ([cur | not (null cur)]) ++ [Para [il] : nts]
+ else acc ++ [cur ++ [Para [il]] ++ nts])
(if null ils then blks' else Para ils : blks')
splitBlocks' cur acc (tbl@Table{} : blks) = do
slideLevel <- asks envSlideLevel
@@ -617,7 +650,11 @@ splitBlocks' cur acc (tbl@Table{} : blks) = do
case cur of
[Header n _ _] | n == slideLevel || slideLevel == 0 ->
splitBlocks' [] (acc ++ [cur ++ [tbl] ++ nts]) blks'
- _ -> splitBlocks' [] (acc ++ ([cur | not (null cur)]) ++ [tbl : nts]) blks'
+ _ -> splitBlocks' []
+ (if any notText cur
+ then acc ++ ([cur | not (null cur)]) ++ [tbl : nts]
+ else acc ++ ([cur ++ [tbl] ++ nts]))
+ blks'
splitBlocks' cur acc (d@(Div (_, classes, _) _): blks) | "columns" `elem` classes = do
slideLevel <- asks envSlideLevel
let (nts, blks') = span isNotesDiv blks
@@ -639,38 +676,56 @@ bodyBlocksToSlide _ (blk : blks) spkNotes
, Div (_, clsL, _) blksL : Div (_, clsR, _) blksR : remaining <- divBlks
, "column" `elem` clsL, "column" `elem` clsR = do
mapM_ (addLogMessage . BlockNotRendered) (blks ++ remaining)
- mbSplitBlksL <- splitBlocks blksL
- mbSplitBlksR <- splitBlocks blksR
- let blksL' = case mbSplitBlksL of
- bs : _ -> bs
- [] -> []
- let blksR' = case mbSplitBlksR of
- bs : _ -> bs
- [] -> []
- shapesL <- blocksToShapes blksL'
- shapesR <- blocksToShapes blksR'
- sldId <- asks envCurSlideId
- return $ Slide
- sldId
- (TwoColumnSlide [] shapesL shapesR)
- spkNotes
+ let mkTwoColumn left right = do
+ blksL' <- join . take 1 <$> splitBlocks left
+ blksR' <- join . take 1 <$> splitBlocks right
+ shapesL <- blocksToShapes blksL'
+ shapesR <- blocksToShapes blksR'
+ sldId <- asks envCurSlideId
+ return $ Slide
+ sldId
+ (TwoColumnSlide [] shapesL shapesR)
+ spkNotes
+ let mkComparison blksL1 blksL2 blksR1 blksR2 = do
+ shapesL1 <- blocksToShapes blksL1
+ shapesL2 <- blocksToShapes blksL2
+ shapesR1 <- blocksToShapes blksR1
+ shapesR2 <- blocksToShapes blksR2
+ sldId <- asks envCurSlideId
+ return $ Slide
+ sldId
+ (ComparisonSlide [] (shapesL1, shapesL2) (shapesR1, shapesR2))
+ spkNotes
+ case (break notText blksL, break notText blksR) of
+ ((_, []), (_, [])) -> mkTwoColumn blksL blksR
+ (([], _), ([], _)) -> mkTwoColumn blksL blksR
+ ((blksL1, blksL2), (blksR1, blksR2)) -> mkComparison blksL1 blksL2 blksR1 blksR2
bodyBlocksToSlide _ (blk : blks) spkNotes = do
- inNoteSlide <- asks envInNoteSlide
- shapes <- if inNoteSlide
- then forceFontSize noteSize $ blocksToShapes (blk : blks)
- else blocksToShapes (blk : blks)
sldId <- asks envCurSlideId
- return $
- Slide
- sldId
- (ContentSlide [] shapes)
- spkNotes
+ inNoteSlide <- asks envInNoteSlide
+ let mkSlide s =
+ Slide sldId s spkNotes
+ if inNoteSlide
+ then mkSlide . ContentSlide [] <$>
+ forceFontSize noteSize (blocksToShapes (blk : blks))
+ else let
+ contentOrBlankSlide =
+ if makesBlankSlide (blk : blks)
+ then pure (mkSlide BlankSlide)
+ else mkSlide . ContentSlide [] <$> blocksToShapes (blk : blks)
+ in case break notText (blk : blks) of
+ ([], _) -> contentOrBlankSlide
+ (_, []) -> contentOrBlankSlide
+ (textBlocks, contentBlocks) -> do
+ textShapes <- blocksToShapes textBlocks
+ contentShapes <- blocksToShapes contentBlocks
+ return (mkSlide (ContentWithCaptionSlide [] textShapes contentShapes))
bodyBlocksToSlide _ [] spkNotes = do
sldId <- asks envCurSlideId
return $
Slide
sldId
- (ContentSlide [] [])
+ BlankSlide
spkNotes
blocksToSlide' :: Int -> [Block] -> SpeakerNotes -> Pres Slide
@@ -689,6 +744,9 @@ blocksToSlide' lvl (Header n (ident, _, _) ils : blks) spkNotes
let layout = case slideLayout slide of
ContentSlide _ cont -> ContentSlide hdr cont
TwoColumnSlide _ contL contR -> TwoColumnSlide hdr contL contR
+ ComparisonSlide _ contL contR -> ComparisonSlide hdr contL contR
+ ContentWithCaptionSlide _ text content -> ContentWithCaptionSlide hdr text content
+ BlankSlide -> if all inlineIsBlank ils then BlankSlide else ContentSlide hdr []
layout' -> layout'
return $ slide{slideLayout = layout}
blocksToSlide' lvl blks spkNotes = bodyBlocksToSlide lvl blks spkNotes
@@ -834,6 +892,19 @@ applyToLayout f (TwoColumnSlide hdr contentL contentR) = do
contentL' <- mapM (applyToShape f) contentL
contentR' <- mapM (applyToShape f) contentR
return $ TwoColumnSlide hdr' contentL' contentR'
+applyToLayout f (ComparisonSlide hdr (contentL1, contentL2) (contentR1, contentR2)) = do
+ hdr' <- mapM f hdr
+ contentL1' <- mapM (applyToShape f) contentL1
+ contentL2' <- mapM (applyToShape f) contentL2
+ contentR1' <- mapM (applyToShape f) contentR1
+ contentR2' <- mapM (applyToShape f) contentR2
+ return $ ComparisonSlide hdr' (contentL1', contentL2') (contentR1', contentR2')
+applyToLayout f (ContentWithCaptionSlide hdr textShapes contentShapes) = do
+ hdr' <- mapM f hdr
+ textShapes' <- mapM (applyToShape f) textShapes
+ contentShapes' <- mapM (applyToShape f) contentShapes
+ return $ ContentWithCaptionSlide hdr' textShapes' contentShapes'
+applyToLayout _ BlankSlide = pure BlankSlide
applyToSlide :: Monad m => (ParaElem -> m ParaElem) -> Slide -> m Slide
applyToSlide f slide = do
@@ -885,10 +956,70 @@ emptyLayout layout = case layout of
all emptyParaElem hdr &&
all emptyShape shapes1 &&
all emptyShape shapes2
+ ComparisonSlide hdr (shapesL1, shapesL2) (shapesR1, shapesR2) ->
+ all emptyParaElem hdr &&
+ all emptyShape shapesL1 &&
+ all emptyShape shapesL2 &&
+ all emptyShape shapesR1 &&
+ all emptyShape shapesR2
+ ContentWithCaptionSlide hdr textShapes contentShapes ->
+ all emptyParaElem hdr &&
+ all emptyShape textShapes &&
+ all emptyShape contentShapes
+ BlankSlide -> False
+
emptySlide :: Slide -> Bool
emptySlide (Slide _ layout notes) = (notes == mempty) && emptyLayout layout
+makesBlankSlide :: [Block] -> Bool
+makesBlankSlide = all blockIsBlank
+
+blockIsBlank :: Block -> Bool
+blockIsBlank
+ = \case
+ Plain ins -> all inlineIsBlank ins
+ Para ins -> all inlineIsBlank ins
+ LineBlock inss -> all (all inlineIsBlank) inss
+ CodeBlock _ txt -> textIsBlank txt
+ RawBlock _ txt -> textIsBlank txt
+ BlockQuote bls -> all blockIsBlank bls
+ OrderedList _ blss -> all (all blockIsBlank) blss
+ BulletList blss -> all (all blockIsBlank) blss
+ DefinitionList ds -> all (uncurry (&&) . bimap (all inlineIsBlank) (all (all blockIsBlank))) ds
+ Header _ _ ils -> all inlineIsBlank ils
+ HorizontalRule -> True
+ Table{} -> False
+ Div _ bls -> all blockIsBlank bls
+ Null -> True
+
+textIsBlank :: T.Text -> Bool
+textIsBlank = T.all isSpace
+
+inlineIsBlank :: Inline -> Bool
+inlineIsBlank
+ = \case
+ (Str txt) -> textIsBlank txt
+ (Emph ins) -> all inlineIsBlank ins
+ (Underline ins) -> all inlineIsBlank ins
+ (Strong ins) -> all inlineIsBlank ins
+ (Strikeout ins) -> all inlineIsBlank ins
+ (Superscript ins) -> all inlineIsBlank ins
+ (Subscript ins) -> all inlineIsBlank ins
+ (SmallCaps ins) -> all inlineIsBlank ins
+ (Quoted _ ins) -> all inlineIsBlank ins
+ (Cite _ _) -> False
+ (Code _ txt) -> textIsBlank txt
+ Space -> True
+ SoftBreak -> True
+ LineBreak -> True
+ (Math _ txt) -> textIsBlank txt
+ (RawInline _ txt) -> textIsBlank txt
+ (Link _ ins (t1, t2)) -> all inlineIsBlank ins && textIsBlank t1 && textIsBlank t2
+ (Image _ ins (t1, t2)) -> all inlineIsBlank ins && textIsBlank t1 && textIsBlank t2
+ (Note bls) -> all blockIsBlank bls
+ (Span _ ins) -> all inlineIsBlank ins
+
blocksToPresentationSlides :: [Block] -> Pres [Slide]
blocksToPresentationSlides blks = do
opts <- asks envOpts
diff --git a/test/Tests/Writers/Powerpoint.hs b/test/Tests/Writers/Powerpoint.hs
index fd9871659..256ee1f7f 100644
--- a/test/Tests/Writers/Powerpoint.hs
+++ b/test/Tests/Writers/Powerpoint.hs
@@ -166,9 +166,66 @@ tests = groupPptxTests [ pptxTests "Inline formatting"
"pptx/slide-level-0/h1-with-table/output.pptx"
, pptxTests ("Using slide level 0, if the first thing on "
<> "a slide is a heading it's used as the "
- <> "slide title (two headings forces a "
- <> "slide break though)")
+ <> "slide title (content with caption layout)")
def { writerSlideLevel = Just 0 }
"pptx/slide-level-0/h1-h2-with-table/input.native"
"pptx/slide-level-0/h1-h2-with-table/output.pptx"
+ , pptxTests ("comparison layout used when two columns "
+ <> "contain text plus non-text")
+ def
+ "pptx/comparison/both-columns/input.native"
+ "pptx/comparison/both-columns/output.pptx"
+ , pptxTests ("comparison layout used even when only one "
+ <> "column contains text plus non-text")
+ def
+ "pptx/comparison/one-column/input.native"
+ "pptx/comparison/one-column/output.pptx"
+ , pptxTests ("extra text in one column in comparison "
+ <> "layout gets overlaid")
+ def
+ "pptx/comparison/extra-text/input.native"
+ "pptx/comparison/extra-text/output.pptx"
+ , pptxTests ("extra image in one column in comparison "
+ <> "layout gets overlaid")
+ def
+ "pptx/comparison/extra-image/input.native"
+ "pptx/comparison/extra-image/output.pptx"
+ , pptxTests "comparison not used if the non-text comes first"
+ def
+ "pptx/comparison/non-text-first/input.native"
+ "pptx/comparison/non-text-first/output.pptx"
+ , pptxTests ("Heading, text and an image on the same "
+ <> "slide uses the Content with Caption "
+ <> "layout")
+ def
+ "pptx/content-with-caption/heading-text-image/input.native"
+ "pptx/content-with-caption/heading-text-image/output.pptx"
+ , pptxTests ("Text and an image on the same "
+ <> "slide uses the Content with Caption "
+ <> "layout")
+ def
+ "pptx/content-with-caption/text-image/input.native"
+ "pptx/content-with-caption/text-image/output.pptx"
+ , pptxTests ("If the image comes first, Content with "
+ <> "Caption is not used")
+ def
+ "pptx/content-with-caption/image-text/input.native"
+ "pptx/content-with-caption/image-text/output.pptx"
+ , pptxTests ("If a slide contains only speaker notes, the "
+ <> "Blank layout is used")
+ def
+ "pptx/blanks/just-speaker-notes/input.native"
+ "pptx/blanks/just-speaker-notes/output.pptx"
+ , pptxTests ("If a slide contains only an empty heading "
+ <> "with a body of only non-breaking spaces"
+ <> ", the Blank layout is used")
+ def
+ "pptx/blanks/nbsp-in-body/input.native"
+ "pptx/blanks/nbsp-in-body/output.pptx"
+ , pptxTests ("If a slide contains only a heading "
+ <> "containing only non-breaking spaces, "
+ <> "the Blank layout is used")
+ def
+ "pptx/blanks/nbsp-in-heading/input.native"
+ "pptx/blanks/nbsp-in-heading/output.pptx"
]
diff --git a/test/pptx/blanks/just-speaker-notes/deleted-layouts.pptx b/test/pptx/blanks/just-speaker-notes/deleted-layouts.pptx
new file mode 100644
index 000000000..82800a074
--- /dev/null
+++ b/test/pptx/blanks/just-speaker-notes/deleted-layouts.pptx
Binary files differ
diff --git a/test/pptx/blanks/just-speaker-notes/input.native b/test/pptx/blanks/just-speaker-notes/input.native
new file mode 100644
index 000000000..d2e2cfbe2
--- /dev/null
+++ b/test/pptx/blanks/just-speaker-notes/input.native
@@ -0,0 +1,7 @@
+[Header 1 ("first-slide",[],[]) [Str "First",Space,Str "slide"]
+,Para [Str "Nothing",Space,Str "to",Space,Str "see",Space,Str "here"]
+,Header 1 ("section",[],[]) []
+,Div ("",["notes"],[])
+ [Para [Str "Some",Space,Str "notes",Space,Str "here:",Space,Str "this",Space,Str "first",Space,Str "slide",Space,Str "should",Space,Str "use",Space,Str "the",Space,Str "Blank",Space,Str "template"]]
+,Header 1 ("third-slide",[],[]) [Str "Third",Space,Str "slide"]
+,Para [Str "The",Space,Str "second",Space,Str "slide",Space,Str "should",Space,Str "be",Space,Str "blank"]]
diff --git a/test/pptx/blanks/just-speaker-notes/moved-layouts.pptx b/test/pptx/blanks/just-speaker-notes/moved-layouts.pptx
new file mode 100644
index 000000000..f5ef1d7bd
--- /dev/null
+++ b/test/pptx/blanks/just-speaker-notes/moved-layouts.pptx
Binary files differ
diff --git a/test/pptx/blanks/just-speaker-notes/output.pptx b/test/pptx/blanks/just-speaker-notes/output.pptx
new file mode 100644
index 000000000..59a643c3e
--- /dev/null
+++ b/test/pptx/blanks/just-speaker-notes/output.pptx
Binary files differ
diff --git a/test/pptx/blanks/just-speaker-notes/templated.pptx b/test/pptx/blanks/just-speaker-notes/templated.pptx
new file mode 100644
index 000000000..8cc7be75b
--- /dev/null
+++ b/test/pptx/blanks/just-speaker-notes/templated.pptx
Binary files differ
diff --git a/test/pptx/blanks/nbsp-in-body/deleted-layouts.pptx b/test/pptx/blanks/nbsp-in-body/deleted-layouts.pptx
new file mode 100644
index 000000000..98a1586df
--- /dev/null
+++ b/test/pptx/blanks/nbsp-in-body/deleted-layouts.pptx
Binary files differ
diff --git a/test/pptx/blanks/nbsp-in-body/input.native b/test/pptx/blanks/nbsp-in-body/input.native
new file mode 100644
index 000000000..56c105fb0
--- /dev/null
+++ b/test/pptx/blanks/nbsp-in-body/input.native
@@ -0,0 +1,6 @@
+[Header 1 ("first-slide",[],[]) [Str "First",Space,Str "slide"]
+,Para [Str "Uninteresting,",Space,Str "normal"]
+,Header 1 ("section",[],[]) []
+,Para [Str "\160"]
+,Header 1 ("third-slide",[],[]) [Str "Third",Space,Str "slide"]
+,Para [Str "Was",Space,Str "the",Space,Str "previous",Space,Str "one",Space,Str "blank?"]]
diff --git a/test/pptx/blanks/nbsp-in-body/moved-layouts.pptx b/test/pptx/blanks/nbsp-in-body/moved-layouts.pptx
new file mode 100644
index 000000000..fca99b672
--- /dev/null
+++ b/test/pptx/blanks/nbsp-in-body/moved-layouts.pptx
Binary files differ
diff --git a/test/pptx/blanks/nbsp-in-body/output.pptx b/test/pptx/blanks/nbsp-in-body/output.pptx
new file mode 100644
index 000000000..ed5c77e05
--- /dev/null
+++ b/test/pptx/blanks/nbsp-in-body/output.pptx
Binary files differ
diff --git a/test/pptx/blanks/nbsp-in-body/templated.pptx b/test/pptx/blanks/nbsp-in-body/templated.pptx
new file mode 100644
index 000000000..4104f6230
--- /dev/null
+++ b/test/pptx/blanks/nbsp-in-body/templated.pptx
Binary files differ
diff --git a/test/pptx/blanks/nbsp-in-heading/deleted-layouts.pptx b/test/pptx/blanks/nbsp-in-heading/deleted-layouts.pptx
new file mode 100644
index 000000000..98a1586df
--- /dev/null
+++ b/test/pptx/blanks/nbsp-in-heading/deleted-layouts.pptx
Binary files differ
diff --git a/test/pptx/blanks/nbsp-in-heading/input.native b/test/pptx/blanks/nbsp-in-heading/input.native
new file mode 100644
index 000000000..a5c7fc1ca
--- /dev/null
+++ b/test/pptx/blanks/nbsp-in-heading/input.native
@@ -0,0 +1,5 @@
+[Header 1 ("first-slide",[],[]) [Str "First",Space,Str "slide"]
+,Para [Str "Uninteresting,",Space,Str "normal"]
+,Header 1 ("section",[],[]) [Str "\160"]
+,Header 1 ("third-slide",[],[]) [Str "Third",Space,Str "slide"]
+,Para [Str "Was",Space,Str "the",Space,Str "previous",Space,Str "one",Space,Str "blank?"]]
diff --git a/test/pptx/blanks/nbsp-in-heading/moved-layouts.pptx b/test/pptx/blanks/nbsp-in-heading/moved-layouts.pptx
new file mode 100644
index 000000000..fca99b672
--- /dev/null
+++ b/test/pptx/blanks/nbsp-in-heading/moved-layouts.pptx
Binary files differ
diff --git a/test/pptx/blanks/nbsp-in-heading/output.pptx b/test/pptx/blanks/nbsp-in-heading/output.pptx
new file mode 100644
index 000000000..ed5c77e05
--- /dev/null
+++ b/test/pptx/blanks/nbsp-in-heading/output.pptx
Binary files differ
diff --git a/test/pptx/blanks/nbsp-in-heading/templated.pptx b/test/pptx/blanks/nbsp-in-heading/templated.pptx
new file mode 100644
index 000000000..4104f6230
--- /dev/null
+++ b/test/pptx/blanks/nbsp-in-heading/templated.pptx
Binary files differ
diff --git a/test/pptx/code-custom/deleted-layouts.pptx b/test/pptx/code-custom/deleted-layouts.pptx
index 9282e6354..fdcc7ce1d 100644
--- a/test/pptx/code-custom/deleted-layouts.pptx
+++ b/test/pptx/code-custom/deleted-layouts.pptx
Binary files differ
diff --git a/test/pptx/code/deleted-layouts.pptx b/test/pptx/code/deleted-layouts.pptx
index 0f503f553..c7f78ac40 100644
--- a/test/pptx/code/deleted-layouts.pptx
+++ b/test/pptx/code/deleted-layouts.pptx
Binary files differ
diff --git a/test/pptx/comparison/both-columns/deleted-layouts.pptx b/test/pptx/comparison/both-columns/deleted-layouts.pptx
new file mode 100644
index 000000000..6a5affdbf
--- /dev/null
+++ b/test/pptx/comparison/both-columns/deleted-layouts.pptx
Binary files differ
diff --git a/test/pptx/comparison/both-columns/input.native b/test/pptx/comparison/both-columns/input.native
new file mode 100644
index 000000000..2557880d4
--- /dev/null
+++ b/test/pptx/comparison/both-columns/input.native
@@ -0,0 +1,23 @@
+[Header 1 ("a-slide",[],[]) [Str "A",Space,Str "slide"]
+,Div ("",["columns"],[])
+ [Div ("",["column"],[])
+ [Para [Str "A",Space,Str "paragraph",Space,Str "here"]
+ ,Table ("",[],[]) (Caption Nothing
+ [])
+ [(AlignDefault,ColWidth 0.125)
+ ,(AlignDefault,ColWidth 0.125)]
+ (TableHead ("",[],[])
+ [])
+ [(TableBody ("",[],[]) (RowHeadColumns 0)
+ []
+ [Row ("",[],[])
+ [Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
+ [Plain [Str "plus"]]
+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
+ [Plain [Str "a",Space,Str "table"]]]])]
+ (TableFoot ("",[],[])
+ [])
+ ,Para [Str "Then",Space,Str "some",Space,Str "more",Space,Str "text"]]
+ ,Div ("",["column"],[])
+ [Para [Str "A",Space,Str "paragraph",Space,Str "here"]
+ ,Para [Image ("",[],[]) [Str "Plus",Space,Str "an",Space,Str "image"] ("lalune.jpg","fig:")]]]]
diff --git a/test/pptx/comparison/both-columns/moved-layouts.pptx b/test/pptx/comparison/both-columns/moved-layouts.pptx
new file mode 100644
index 000000000..88282fabb
--- /dev/null
+++ b/test/pptx/comparison/both-columns/moved-layouts.pptx
Binary files differ
diff --git a/test/pptx/comparison/both-columns/output.pptx b/test/pptx/comparison/both-columns/output.pptx
new file mode 100644
index 000000000..477072fb4
--- /dev/null
+++ b/test/pptx/comparison/both-columns/output.pptx
Binary files differ
diff --git a/test/pptx/comparison/both-columns/templated.pptx b/test/pptx/comparison/both-columns/templated.pptx
new file mode 100644
index 000000000..431d22392
--- /dev/null
+++ b/test/pptx/comparison/both-columns/templated.pptx
Binary files differ
diff --git a/test/pptx/comparison/extra-image/deleted-layouts.pptx b/test/pptx/comparison/extra-image/deleted-layouts.pptx
new file mode 100644
index 000000000..beed077f7
--- /dev/null
+++ b/test/pptx/comparison/extra-image/deleted-layouts.pptx
Binary files differ
diff --git a/test/pptx/comparison/extra-image/input.native b/test/pptx/comparison/extra-image/input.native
new file mode 100644
index 000000000..34aeb8f2b
--- /dev/null
+++ b/test/pptx/comparison/extra-image/input.native
@@ -0,0 +1,24 @@
+[Header 1 ("a-slide",[],[]) [Str "A",Space,Str "slide"]
+,Div ("",["columns"],[])
+ [Div ("",["column"],[])
+ [Para [Str "A",Space,Str "paragraph",Space,Str "here"]
+ ,Table ("",[],[]) (Caption Nothing
+ [])
+ [(AlignDefault,ColWidth 0.125)
+ ,(AlignDefault,ColWidth 0.125)]
+ (TableHead ("",[],[])
+ [])
+ [(TableBody ("",[],[]) (RowHeadColumns 0)
+ []
+ [Row ("",[],[])
+ [Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
+ [Plain [Str "plus"]]
+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
+ [Plain [Str "a",Space,Str "table"]]]])]
+ (TableFoot ("",[],[])
+ [])
+ ,Para [Str "Then",Space,Str "some",Space,Str "more",Space,Str "text"]]
+ ,Div ("",["column"],[])
+ [Para [Str "A",Space,Str "paragraph",Space,Str "here"]
+ ,Para [Image ("",[],[]) [Str "Plus",Space,Str "an",Space,Str "image"] ("lalune.jpg","fig:")]
+ ,Para [Image ("",[],[]) [Str "And",Space,Str "another",Space,Str "image"] ("lalune.jpg","fig:")]]]]
diff --git a/test/pptx/comparison/extra-image/moved-layouts.pptx b/test/pptx/comparison/extra-image/moved-layouts.pptx
new file mode 100644
index 000000000..f86f5b043
--- /dev/null
+++ b/test/pptx/comparison/extra-image/moved-layouts.pptx
Binary files differ
diff --git a/test/pptx/comparison/extra-image/output.pptx b/test/pptx/comparison/extra-image/output.pptx
new file mode 100644
index 000000000..a0eb5e847
--- /dev/null
+++ b/test/pptx/comparison/extra-image/output.pptx
Binary files differ
diff --git a/test/pptx/comparison/extra-image/templated.pptx b/test/pptx/comparison/extra-image/templated.pptx
new file mode 100644
index 000000000..a434ba29f
--- /dev/null
+++ b/test/pptx/comparison/extra-image/templated.pptx
Binary files differ
diff --git a/test/pptx/comparison/extra-text/deleted-layouts.pptx b/test/pptx/comparison/extra-text/deleted-layouts.pptx
new file mode 100644
index 000000000..6a5affdbf
--- /dev/null
+++ b/test/pptx/comparison/extra-text/deleted-layouts.pptx
Binary files differ
diff --git a/test/pptx/comparison/extra-text/input.native b/test/pptx/comparison/extra-text/input.native
new file mode 100644
index 000000000..2557880d4
--- /dev/null
+++ b/test/pptx/comparison/extra-text/input.native
@@ -0,0 +1,23 @@
+[Header 1 ("a-slide",[],[]) [Str "A",Space,Str "slide"]
+,Div ("",["columns"],[])
+ [Div ("",["column"],[])
+ [Para [Str "A",Space,Str "paragraph",Space,Str "here"]
+ ,Table ("",[],[]) (Caption Nothing
+ [])
+ [(AlignDefault,ColWidth 0.125)
+ ,(AlignDefault,ColWidth 0.125)]
+ (TableHead ("",[],[])
+ [])
+ [(TableBody ("",[],[]) (RowHeadColumns 0)
+ []
+ [Row ("",[],[])
+ [Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
+ [Plain [Str "plus"]]
+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
+ [Plain [Str "a",Space,Str "table"]]]])]
+ (TableFoot ("",[],[])
+ [])
+ ,Para [Str "Then",Space,Str "some",Space,Str "more",Space,Str "text"]]
+ ,Div ("",["column"],[])
+ [Para [Str "A",Space,Str "paragraph",Space,Str "here"]
+ ,Para [Image ("",[],[]) [Str "Plus",Space,Str "an",Space,Str "image"] ("lalune.jpg","fig:")]]]]
diff --git a/test/pptx/comparison/extra-text/moved-layouts.pptx b/test/pptx/comparison/extra-text/moved-layouts.pptx
new file mode 100644
index 000000000..88282fabb
--- /dev/null
+++ b/test/pptx/comparison/extra-text/moved-layouts.pptx
Binary files differ
diff --git a/test/pptx/comparison/extra-text/output.pptx b/test/pptx/comparison/extra-text/output.pptx
new file mode 100644
index 000000000..8de7d23b2
--- /dev/null
+++ b/test/pptx/comparison/extra-text/output.pptx
Binary files differ
diff --git a/test/pptx/comparison/extra-text/templated.pptx b/test/pptx/comparison/extra-text/templated.pptx
new file mode 100644
index 000000000..431d22392
--- /dev/null
+++ b/test/pptx/comparison/extra-text/templated.pptx
Binary files differ
diff --git a/test/pptx/comparison/non-text-first/deleted-layouts.pptx b/test/pptx/comparison/non-text-first/deleted-layouts.pptx
new file mode 100644
index 000000000..bd7aa69b7
--- /dev/null
+++ b/test/pptx/comparison/non-text-first/deleted-layouts.pptx
Binary files differ
diff --git a/test/pptx/comparison/non-text-first/input.native b/test/pptx/comparison/non-text-first/input.native
new file mode 100644
index 000000000..a8caad151
--- /dev/null
+++ b/test/pptx/comparison/non-text-first/input.native
@@ -0,0 +1,21 @@
+[Header 1 ("a-slide",[],[]) [Str "A",Space,Str "slide"]
+,Div ("",["columns"],[])
+ [Div ("",["column"],[])
+ [Table ("",[],[]) (Caption Nothing
+ [])
+ [(AlignDefault,ColWidth 0.125)
+ ,(AlignDefault,ColWidth 0.125)]
+ (TableHead ("",[],[])
+ [])
+ [(TableBody ("",[],[]) (RowHeadColumns 0)
+ []
+ [Row ("",[],[])
+ [Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
+ [Plain [Str "a"]]
+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
+ [Plain [Str "table"]]]])]
+ (TableFoot ("",[],[])
+ [])
+ ,Para [Str "Plus",Space,Str "a",Space,Str "paragraph",Space,Str "here"]]
+ ,Div ("",["column"],[])
+ [Para [Image ("",[],[]) [Str "Just",Space,Str "an",Space,Str "image",Space,Str "on",Space,Str "this",Space,Str "side"] ("lalune.jpg","fig:")]]]]
diff --git a/test/pptx/comparison/non-text-first/moved-layouts.pptx b/test/pptx/comparison/non-text-first/moved-layouts.pptx
new file mode 100644
index 000000000..a01def95c
--- /dev/null
+++ b/test/pptx/comparison/non-text-first/moved-layouts.pptx
Binary files differ
diff --git a/test/pptx/comparison/non-text-first/output.pptx b/test/pptx/comparison/non-text-first/output.pptx
new file mode 100644
index 000000000..cb7843fce
--- /dev/null
+++ b/test/pptx/comparison/non-text-first/output.pptx
Binary files differ
diff --git a/test/pptx/comparison/non-text-first/templated.pptx b/test/pptx/comparison/non-text-first/templated.pptx
new file mode 100644
index 000000000..32db19cbf
--- /dev/null
+++ b/test/pptx/comparison/non-text-first/templated.pptx
Binary files differ
diff --git a/test/pptx/comparison/one-column/deleted-layouts.pptx b/test/pptx/comparison/one-column/deleted-layouts.pptx
new file mode 100644
index 000000000..5fd7cf9b6
--- /dev/null
+++ b/test/pptx/comparison/one-column/deleted-layouts.pptx
Binary files differ
diff --git a/test/pptx/comparison/one-column/input.native b/test/pptx/comparison/one-column/input.native
new file mode 100644
index 000000000..b99740a14
--- /dev/null
+++ b/test/pptx/comparison/one-column/input.native
@@ -0,0 +1,21 @@
+[Header 1 ("a-slide",[],[]) [Str "A",Space,Str "slide"]
+,Div ("",["columns"],[])
+ [Div ("",["column"],[])
+ [Para [Str "A",Space,Str "paragraph",Space,Str "here"]
+ ,Table ("",[],[]) (Caption Nothing
+ [])
+ [(AlignDefault,ColWidth 0.125)
+ ,(AlignDefault,ColWidth 0.125)]
+ (TableHead ("",[],[])
+ [])
+ [(TableBody ("",[],[]) (RowHeadColumns 0)
+ []
+ [Row ("",[],[])
+ [Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
+ [Plain [Str "plus"]]
+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
+ [Plain [Str "a",Space,Str "table"]]]])]
+ (TableFoot ("",[],[])
+ [])]
+ ,Div ("",["column"],[])
+ [Para [Str "Only",Space,Str "a",Space,Str "paragraph",Space,Str "here"]]]]
diff --git a/test/pptx/comparison/one-column/moved-layouts.pptx b/test/pptx/comparison/one-column/moved-layouts.pptx
new file mode 100644
index 000000000..d5df2b751
--- /dev/null
+++ b/test/pptx/comparison/one-column/moved-layouts.pptx
Binary files differ
diff --git a/test/pptx/comparison/one-column/output.pptx b/test/pptx/comparison/one-column/output.pptx
new file mode 100644
index 000000000..6914162ff
--- /dev/null
+++ b/test/pptx/comparison/one-column/output.pptx
Binary files differ
diff --git a/test/pptx/comparison/one-column/templated.pptx b/test/pptx/comparison/one-column/templated.pptx
new file mode 100644
index 000000000..a30a24453
--- /dev/null
+++ b/test/pptx/comparison/one-column/templated.pptx
Binary files differ
diff --git a/test/pptx/content-with-caption/heading-text-image/deleted-layouts.pptx b/test/pptx/content-with-caption/heading-text-image/deleted-layouts.pptx
new file mode 100644
index 000000000..b5afcc021
--- /dev/null
+++ b/test/pptx/content-with-caption/heading-text-image/deleted-layouts.pptx
Binary files differ
diff --git a/test/pptx/content-with-caption/heading-text-image/input.native b/test/pptx/content-with-caption/heading-text-image/input.native
new file mode 100644
index 000000000..576bc1658
--- /dev/null
+++ b/test/pptx/content-with-caption/heading-text-image/input.native
@@ -0,0 +1,3 @@
+[Header 1 ("a-slide",[],[]) [Str "A",Space,Str "slide"]
+,Para [Str "Some",Space,Str "text",Space,Str "here"]
+,Para [Image ("",[],[]) [Str "Followed",Space,Str "by",Space,Str "a",Space,Str "picture"] ("lalune.jpg","fig:")]]
diff --git a/test/pptx/content-with-caption/heading-text-image/moved-layouts.pptx b/test/pptx/content-with-caption/heading-text-image/moved-layouts.pptx
new file mode 100644
index 000000000..05806a767
--- /dev/null
+++ b/test/pptx/content-with-caption/heading-text-image/moved-layouts.pptx
Binary files differ
diff --git a/test/pptx/content-with-caption/heading-text-image/output.pptx b/test/pptx/content-with-caption/heading-text-image/output.pptx
new file mode 100644
index 000000000..b3e89757b
--- /dev/null
+++ b/test/pptx/content-with-caption/heading-text-image/output.pptx
Binary files differ
diff --git a/test/pptx/content-with-caption/heading-text-image/templated.pptx b/test/pptx/content-with-caption/heading-text-image/templated.pptx
new file mode 100644
index 000000000..3b0fe64c3
--- /dev/null
+++ b/test/pptx/content-with-caption/heading-text-image/templated.pptx
Binary files differ
diff --git a/test/pptx/content-with-caption/image-text/deleted-layouts.pptx b/test/pptx/content-with-caption/image-text/deleted-layouts.pptx
new file mode 100644
index 000000000..e9e0551ac
--- /dev/null
+++ b/test/pptx/content-with-caption/image-text/deleted-layouts.pptx
Binary files differ
diff --git a/test/pptx/content-with-caption/image-text/input.native b/test/pptx/content-with-caption/image-text/input.native
new file mode 100644
index 000000000..2ffbf0888
--- /dev/null
+++ b/test/pptx/content-with-caption/image-text/input.native
@@ -0,0 +1,2 @@
+[Para [Image ("",[],[]) [Str "The",Space,Str "picture",Space,Str "first"] ("lalune.jpg","fig:")]
+,Para [Str "Then",Space,Str "some",Space,Str "text",Space,Str "here"]]
diff --git a/test/pptx/content-with-caption/image-text/moved-layouts.pptx b/test/pptx/content-with-caption/image-text/moved-layouts.pptx
new file mode 100644
index 000000000..77d706ed3
--- /dev/null
+++ b/test/pptx/content-with-caption/image-text/moved-layouts.pptx
Binary files differ
diff --git a/test/pptx/content-with-caption/image-text/output.pptx b/test/pptx/content-with-caption/image-text/output.pptx
new file mode 100644
index 000000000..94a2e8b88
--- /dev/null
+++ b/test/pptx/content-with-caption/image-text/output.pptx
Binary files differ
diff --git a/test/pptx/content-with-caption/image-text/templated.pptx b/test/pptx/content-with-caption/image-text/templated.pptx
new file mode 100644
index 000000000..bef1921a7
--- /dev/null
+++ b/test/pptx/content-with-caption/image-text/templated.pptx
Binary files differ
diff --git a/test/pptx/content-with-caption/text-image/deleted-layouts.pptx b/test/pptx/content-with-caption/text-image/deleted-layouts.pptx
new file mode 100644
index 000000000..68d3d7b9b
--- /dev/null
+++ b/test/pptx/content-with-caption/text-image/deleted-layouts.pptx
Binary files differ
diff --git a/test/pptx/content-with-caption/text-image/input.native b/test/pptx/content-with-caption/text-image/input.native
new file mode 100644
index 000000000..762d18426
--- /dev/null
+++ b/test/pptx/content-with-caption/text-image/input.native
@@ -0,0 +1,2 @@
+[Para [Str "Some",Space,Str "text",Space,Str "here"]
+,Para [Image ("",[],[]) [Str "Followed",Space,Str "by",Space,Str "a",Space,Str "picture"] ("lalune.jpg","fig:")]]
diff --git a/test/pptx/content-with-caption/text-image/moved-layouts.pptx b/test/pptx/content-with-caption/text-image/moved-layouts.pptx
new file mode 100644
index 000000000..feade1096
--- /dev/null
+++ b/test/pptx/content-with-caption/text-image/moved-layouts.pptx
Binary files differ
diff --git a/test/pptx/content-with-caption/text-image/output.pptx b/test/pptx/content-with-caption/text-image/output.pptx
new file mode 100644
index 000000000..efa814d65
--- /dev/null
+++ b/test/pptx/content-with-caption/text-image/output.pptx
Binary files differ
diff --git a/test/pptx/content-with-caption/text-image/templated.pptx b/test/pptx/content-with-caption/text-image/templated.pptx
new file mode 100644
index 000000000..ebd552252
--- /dev/null
+++ b/test/pptx/content-with-caption/text-image/templated.pptx
Binary files differ
diff --git a/test/pptx/document-properties-short-desc/deleted-layouts.pptx b/test/pptx/document-properties-short-desc/deleted-layouts.pptx
index e4cf6bd7b..a866f3c1f 100644
--- a/test/pptx/document-properties-short-desc/deleted-layouts.pptx
+++ b/test/pptx/document-properties-short-desc/deleted-layouts.pptx
Binary files differ
diff --git a/test/pptx/document-properties/deleted-layouts.pptx b/test/pptx/document-properties/deleted-layouts.pptx
index a00c8059d..1f52481f3 100644
--- a/test/pptx/document-properties/deleted-layouts.pptx
+++ b/test/pptx/document-properties/deleted-layouts.pptx
Binary files differ
diff --git a/test/pptx/endnotes-toc/deleted-layouts.pptx b/test/pptx/endnotes-toc/deleted-layouts.pptx
index 46708544c..60110a64e 100644
--- a/test/pptx/endnotes-toc/deleted-layouts.pptx
+++ b/test/pptx/endnotes-toc/deleted-layouts.pptx
Binary files differ
diff --git a/test/pptx/endnotes/deleted-layouts.pptx b/test/pptx/endnotes/deleted-layouts.pptx
index 5c69a6310..0b0bd2f53 100644
--- a/test/pptx/endnotes/deleted-layouts.pptx
+++ b/test/pptx/endnotes/deleted-layouts.pptx
Binary files differ
diff --git a/test/pptx/images/deleted-layouts.pptx b/test/pptx/images/deleted-layouts.pptx
index 053928863..2f8754e90 100644
--- a/test/pptx/images/deleted-layouts.pptx
+++ b/test/pptx/images/deleted-layouts.pptx
Binary files differ
diff --git a/test/pptx/inline-formatting/deleted-layouts.pptx b/test/pptx/inline-formatting/deleted-layouts.pptx
index bbd5bfeb4..2fbe21a45 100644
--- a/test/pptx/inline-formatting/deleted-layouts.pptx
+++ b/test/pptx/inline-formatting/deleted-layouts.pptx
Binary files differ
diff --git a/test/pptx/lists/deleted-layouts.pptx b/test/pptx/lists/deleted-layouts.pptx
index 6512e44bb..e527d3c5f 100644
--- a/test/pptx/lists/deleted-layouts.pptx
+++ b/test/pptx/lists/deleted-layouts.pptx
Binary files differ
diff --git a/test/pptx/raw-ooxml/deleted-layouts.pptx b/test/pptx/raw-ooxml/deleted-layouts.pptx
index 2ea155657..2da1b7a63 100644
--- a/test/pptx/raw-ooxml/deleted-layouts.pptx
+++ b/test/pptx/raw-ooxml/deleted-layouts.pptx
Binary files differ
diff --git a/test/pptx/remove-empty-slides/deleted-layouts.pptx b/test/pptx/remove-empty-slides/deleted-layouts.pptx
index 7ae4a5fab..51981b241 100644
--- a/test/pptx/remove-empty-slides/deleted-layouts.pptx
+++ b/test/pptx/remove-empty-slides/deleted-layouts.pptx
Binary files differ
diff --git a/test/pptx/remove-empty-slides/moved-layouts.pptx b/test/pptx/remove-empty-slides/moved-layouts.pptx
index 2572f2447..ddca32a52 100644
--- a/test/pptx/remove-empty-slides/moved-layouts.pptx
+++ b/test/pptx/remove-empty-slides/moved-layouts.pptx
Binary files differ
diff --git a/test/pptx/remove-empty-slides/output.pptx b/test/pptx/remove-empty-slides/output.pptx
index c6df8e18e..9e8b5eed2 100644
--- a/test/pptx/remove-empty-slides/output.pptx
+++ b/test/pptx/remove-empty-slides/output.pptx
Binary files differ
diff --git a/test/pptx/remove-empty-slides/templated.pptx b/test/pptx/remove-empty-slides/templated.pptx
index 1df48c5ad..579467452 100644
--- a/test/pptx/remove-empty-slides/templated.pptx
+++ b/test/pptx/remove-empty-slides/templated.pptx
Binary files differ
diff --git a/test/pptx/slide-breaks-slide-level-1/deleted-layouts.pptx b/test/pptx/slide-breaks-slide-level-1/deleted-layouts.pptx
index 2c7fd4d8b..2c891cd1d 100644
--- a/test/pptx/slide-breaks-slide-level-1/deleted-layouts.pptx
+++ b/test/pptx/slide-breaks-slide-level-1/deleted-layouts.pptx
Binary files differ
diff --git a/test/pptx/slide-breaks-toc/deleted-layouts.pptx b/test/pptx/slide-breaks-toc/deleted-layouts.pptx
index 1e0b76d46..b63994cce 100644
--- a/test/pptx/slide-breaks-toc/deleted-layouts.pptx
+++ b/test/pptx/slide-breaks-toc/deleted-layouts.pptx
Binary files differ
diff --git a/test/pptx/slide-breaks/deleted-layouts.pptx b/test/pptx/slide-breaks/deleted-layouts.pptx
index 86dfad3b2..fbf4054be 100644
--- a/test/pptx/slide-breaks/deleted-layouts.pptx
+++ b/test/pptx/slide-breaks/deleted-layouts.pptx
Binary files differ
diff --git a/test/pptx/slide-level-0/h1-h2-with-table/deleted-layouts.pptx b/test/pptx/slide-level-0/h1-h2-with-table/deleted-layouts.pptx
index 5e776e05c..217b000b6 100644
--- a/test/pptx/slide-level-0/h1-h2-with-table/deleted-layouts.pptx
+++ b/test/pptx/slide-level-0/h1-h2-with-table/deleted-layouts.pptx
Binary files differ
diff --git a/test/pptx/slide-level-0/h1-h2-with-table/moved-layouts.pptx b/test/pptx/slide-level-0/h1-h2-with-table/moved-layouts.pptx
index 35204de1b..d8a6c90fe 100644
--- a/test/pptx/slide-level-0/h1-h2-with-table/moved-layouts.pptx
+++ b/test/pptx/slide-level-0/h1-h2-with-table/moved-layouts.pptx
Binary files differ
diff --git a/test/pptx/slide-level-0/h1-h2-with-table/output.pptx b/test/pptx/slide-level-0/h1-h2-with-table/output.pptx
index 197a6833f..512b324bf 100644
--- a/test/pptx/slide-level-0/h1-h2-with-table/output.pptx
+++ b/test/pptx/slide-level-0/h1-h2-with-table/output.pptx
Binary files differ
diff --git a/test/pptx/slide-level-0/h1-h2-with-table/templated.pptx b/test/pptx/slide-level-0/h1-h2-with-table/templated.pptx
index 5c659952e..5ab88e94c 100644
--- a/test/pptx/slide-level-0/h1-h2-with-table/templated.pptx
+++ b/test/pptx/slide-level-0/h1-h2-with-table/templated.pptx
Binary files differ
diff --git a/test/pptx/slide-level-0/h1-with-image/deleted-layouts.pptx b/test/pptx/slide-level-0/h1-with-image/deleted-layouts.pptx
index 16c61d1be..5be799e3b 100644
--- a/test/pptx/slide-level-0/h1-with-image/deleted-layouts.pptx
+++ b/test/pptx/slide-level-0/h1-with-image/deleted-layouts.pptx
Binary files differ
diff --git a/test/pptx/slide-level-0/h1-with-table/deleted-layouts.pptx b/test/pptx/slide-level-0/h1-with-table/deleted-layouts.pptx
index 0eb7c0b08..127dcea01 100644
--- a/test/pptx/slide-level-0/h1-with-table/deleted-layouts.pptx
+++ b/test/pptx/slide-level-0/h1-with-table/deleted-layouts.pptx
Binary files differ
diff --git a/test/pptx/slide-level-0/h2-with-image/deleted-layouts.pptx b/test/pptx/slide-level-0/h2-with-image/deleted-layouts.pptx
index afc096ce6..5be799e3b 100644
--- a/test/pptx/slide-level-0/h2-with-image/deleted-layouts.pptx
+++ b/test/pptx/slide-level-0/h2-with-image/deleted-layouts.pptx
Binary files differ
diff --git a/test/pptx/speaker-notes-after-metadata/deleted-layouts.pptx b/test/pptx/speaker-notes-after-metadata/deleted-layouts.pptx
index 1298870e2..33304ae3e 100644
--- a/test/pptx/speaker-notes-after-metadata/deleted-layouts.pptx
+++ b/test/pptx/speaker-notes-after-metadata/deleted-layouts.pptx
Binary files differ
diff --git a/test/pptx/speaker-notes-afterheader/deleted-layouts.pptx b/test/pptx/speaker-notes-afterheader/deleted-layouts.pptx
index 853b918cb..00f05fae5 100644
--- a/test/pptx/speaker-notes-afterheader/deleted-layouts.pptx
+++ b/test/pptx/speaker-notes-afterheader/deleted-layouts.pptx
Binary files differ
diff --git a/test/pptx/speaker-notes-afterseps/deleted-layouts.pptx b/test/pptx/speaker-notes-afterseps/deleted-layouts.pptx
index 9fec1c279..139af783b 100644
--- a/test/pptx/speaker-notes-afterseps/deleted-layouts.pptx
+++ b/test/pptx/speaker-notes-afterseps/deleted-layouts.pptx
Binary files differ
diff --git a/test/pptx/speaker-notes/deleted-layouts.pptx b/test/pptx/speaker-notes/deleted-layouts.pptx
index 6a5ad524f..c63125d8a 100644
--- a/test/pptx/speaker-notes/deleted-layouts.pptx
+++ b/test/pptx/speaker-notes/deleted-layouts.pptx
Binary files differ
diff --git a/test/pptx/start-numbering-at/deleted-layouts.pptx b/test/pptx/start-numbering-at/deleted-layouts.pptx
index d9cf91804..68b4215df 100644
--- a/test/pptx/start-numbering-at/deleted-layouts.pptx
+++ b/test/pptx/start-numbering-at/deleted-layouts.pptx
Binary files differ
diff --git a/test/pptx/tables/deleted-layouts.pptx b/test/pptx/tables/deleted-layouts.pptx
index a52222551..d533d3c28 100644
--- a/test/pptx/tables/deleted-layouts.pptx
+++ b/test/pptx/tables/deleted-layouts.pptx
Binary files differ
diff --git a/test/pptx/two-column/deleted-layouts.pptx b/test/pptx/two-column/deleted-layouts.pptx
index 60a244f94..9622ed2cd 100644
--- a/test/pptx/two-column/deleted-layouts.pptx
+++ b/test/pptx/two-column/deleted-layouts.pptx
Binary files differ