git.iko.soy/typeable/pandoc
on master help sign in
PowerPoint writer: Make default placeholder type for template lookup

This is the first step toward making templating work better. It seems that content shapes have a default ph type. In other words, shapes with *NO PH TYPE* should be considered to have an "obj" ph type, and used as content shapes. see https://github.com/scanny/python-pptx/blob/master/docs/dev/analysis/placeholders/slide-placeholders/placeholders-in-new-slide.rst

commitda802c1a2ef3961854761c988ef946de8677e9c3 authorJesse Rosenthal <jrosenthal@jhu.edu> dateMon 1 Apr 2019, 14:18 (8 years ago) parent0fa6951
1 file changed+42−18
src/Text/Pandoc/Writers/Powerpoint/Output.hs+42−18
src/Text/Pandoc/Writers/Powerpoint/Output.hs+42−18
@@ -975,21 +975,45 @@ graphicToElement tableWidth (Tbl tblPr hdrCells rows) = do
975975 ]
976976 ]
977977
978−getShapeByPlaceHolderType :: NameSpaces -> Element -> String -> Maybe Element
978+
979+-- We get the shape by placeholder type. If there is NO type, it
980+-- defaults to a content placeholder.
981+
982+data PHType = PHType String | ObjType
983+ deriving (Show, Eq)
984+
985+findPHType :: NameSpaces -> Element -> PHType -> Bool
986+findPHType ns spElem phType
987+ | isElem ns "p" "sp" spElem =
988+ let mbPHElem = (Just spElem >>=
989+ findChild (elemName ns "p" "nvSpPr") >>=
990+ findChild (elemName ns "p" "nvPr") >>=
991+ findChild (elemName ns "p" "ph"))
992+ in
993+ case mbPHElem of
994+ -- if it's a named PHType, we want to check that the attribute
995+ -- value matches.
996+ Just phElem | (PHType tp) <- phType ->
997+ case findAttr (QName "type" Nothing Nothing) phElem of
998+ Just tp' -> tp == tp'
999+ Nothing -> False
1000+ -- if it's an ObjType, we want to check that there is NO
1001+ -- "type" attribute. In other words, a lookup should return nothing.
1002+ Just phElem | ObjType <- phType ->
1003+ case findAttr (QName "type" Nothing Nothing) phElem of
1004+ Just _ -> False
1005+ Nothing -> True
1006+ Nothing -> False
1007+findPHType _ _ _ = False
1008+
1009+getShapeByPlaceHolderType :: NameSpaces -> Element -> PHType -> Maybe Element
9791010getShapeByPlaceHolderType ns spTreeElem phType
9801011 | isElem ns "p" "spTree" spTreeElem =
981− let findPhType element = isElem ns "p" "sp" element &&
982− Just phType == (Just element >>=
983− findChild (elemName ns "p" "nvSpPr") >>=
984− findChild (elemName ns "p" "nvPr") >>=
985− findChild (elemName ns "p" "ph") >>=
986− findAttr (QName "type" Nothing Nothing))
987− in
988− filterChild findPhType spTreeElem
1012+ filterChild (\e -> findPHType ns e phType) spTreeElem
9891013 | otherwise = Nothing
9901014
9911015-- Like the above, but it tries a number of different placeholder types
992−getShapeByPlaceHolderTypes :: NameSpaces -> Element -> [String] -> Maybe Element
1016+getShapeByPlaceHolderTypes :: NameSpaces -> Element -> [PHType] -> Maybe Element
9931017getShapeByPlaceHolderTypes _ _ [] = Nothing
9941018getShapeByPlaceHolderTypes ns spTreeElem (s:ss) =
9951019 case getShapeByPlaceHolderType ns spTreeElem s of
@@ -1010,7 +1034,7 @@ getShapeByPlaceHolderIndex ns spTreeElem phIdx
10101034 | otherwise = Nothing
10111035
10121036
1013−nonBodyTextToElement :: PandocMonad m => Element -> [String] -> [ParaElem] -> P m Element
1037+nonBodyTextToElement :: PandocMonad m => Element -> [PHType] -> [ParaElem] -> P m Element
10141038nonBodyTextToElement layout phTypes paraElements
10151039 | ns <- elemToNameSpaces layout
10161040 , Just cSld <- findChild (elemName ns "p" "cSld") layout
@@ -1030,7 +1054,7 @@ contentToElement layout hdrShape shapes
10301054 | ns <- elemToNameSpaces layout
10311055 , Just cSld <- findChild (elemName ns "p" "cSld") layout
10321056 , Just spTree <- findChild (elemName ns "p" "spTree") cSld = do
1033− element <- nonBodyTextToElement layout ["title"] hdrShape
1057+ element <- nonBodyTextToElement layout [PHType "title"] hdrShape
10341058 let hdrShapeElements = if null hdrShape
10351059 then []
10361060 else [element]
@@ -1048,7 +1072,7 @@ twoColumnToElement layout hdrShape shapesL shapesR
10481072 | ns <- elemToNameSpaces layout
10491073 , Just cSld <- findChild (elemName ns "p" "cSld") layout
10501074 , Just spTree <- findChild (elemName ns "p" "spTree") cSld = do
1051− element <- nonBodyTextToElement layout ["title"] hdrShape
1075+ element <- nonBodyTextToElement layout [PHType "title"] hdrShape
10521076 let hdrShapeElements = if null hdrShape
10531077 then []
10541078 else [element]
@@ -1072,7 +1096,7 @@ titleToElement layout titleElems
10721096 | ns <- elemToNameSpaces layout
10731097 , Just cSld <- findChild (elemName ns "p" "cSld") layout
10741098 , Just spTree <- findChild (elemName ns "p" "spTree") cSld = do
1075− element <- nonBodyTextToElement layout ["title", "ctrTitle"] titleElems
1099+ element <- nonBodyTextToElement layout [PHType "title", PHType "ctrTitle"] titleElems
10761100 let titleShapeElements = if null titleElems
10771101 then []
10781102 else [element]
@@ -1086,15 +1110,15 @@ metadataToElement layout titleElems subtitleElems authorsElems dateElems
10861110 , Just spTree <- findChild (elemName ns "p" "spTree") cSld = do
10871111 titleShapeElements <- if null titleElems
10881112 then return []
1089− else sequence [nonBodyTextToElement layout ["ctrTitle"] titleElems]
1113+ else sequence [nonBodyTextToElement layout [PHType "ctrTitle"] titleElems]
10901114 let combinedAuthorElems = intercalate [Break] authorsElems
10911115 subtitleAndAuthorElems = intercalate [Break, Break] [subtitleElems, combinedAuthorElems]
10921116 subtitleShapeElements <- if null subtitleAndAuthorElems
10931117 then return []
1094− else sequence [nonBodyTextToElement layout ["subTitle"] subtitleAndAuthorElems]
1118+ else sequence [nonBodyTextToElement layout [PHType "subTitle"] subtitleAndAuthorElems]
10951119 dateShapeElements <- if null dateElems
10961120 then return []
1097− else sequence [nonBodyTextToElement layout ["dt"] dateElems]
1121+ else sequence [nonBodyTextToElement layout [PHType "dt"] dateElems]
10981122 return $ replaceNamedChildren ns "p" "sp"
10991123 (titleShapeElements ++ subtitleShapeElements ++ dateShapeElements)
11001124 spTree
@@ -1155,7 +1179,7 @@ getSlideNumberFieldId notesMaster
11551179 | ns <- elemToNameSpaces notesMaster
11561180 , Just cSld <- findChild (elemName ns "p" "cSld") notesMaster
11571181 , Just spTree <- findChild (elemName ns "p" "spTree") cSld
1158− , Just sp <- getShapeByPlaceHolderType ns spTree "sldNum"
1182+ , Just sp <- getShapeByPlaceHolderType ns spTree (PHType "sldNum")
11591183 , Just txBody <- findChild (elemName ns "p" "txBody") sp
11601184 , Just p <- findChild (elemName ns "a" "p") txBody
11611185 , Just fld <- findChild (elemName ns "a" "fld") p