Powerpoint writer: Use ph name and idx for getting layout shapes
Internal change: when we take shapes from the layout for title, content, etc, we should use the attributes of the "ph" (placeholder) tag -- idx and name. This is what powerpoint uses internally, and therefore seems more dependable across reference-docs than using the shape names, as we had previously done. There should be no output changes as a result of this commit.
This commit is contained in:
parent
a16382b06b
commit
b9b66d3b29
1 changed files with 26 additions and 37 deletions
|
@ -351,14 +351,6 @@ getLayout layout = do
|
||||||
layoutpath ++ " missing in reference file"
|
layoutpath ++ " missing in reference file"
|
||||||
return root
|
return root
|
||||||
|
|
||||||
shapeHasName :: NameSpaces -> String -> Element -> Bool
|
|
||||||
shapeHasName ns name element
|
|
||||||
| Just nvSpPr <- findChild (elemName ns "p" "nvSpPr") element
|
|
||||||
, Just cNvPr <- findChild (elemName ns "p" "cNvPr") nvSpPr
|
|
||||||
, Just nm <- findAttr (QName "name" Nothing Nothing) cNvPr =
|
|
||||||
nm == name
|
|
||||||
| otherwise = False
|
|
||||||
|
|
||||||
shapeHasId :: NameSpaces -> String -> Element -> Bool
|
shapeHasId :: NameSpaces -> String -> Element -> Bool
|
||||||
shapeHasId ns ident element
|
shapeHasId ns ident element
|
||||||
| Just nvSpPr <- findChild (elemName ns "p" "nvSpPr") element
|
| Just nvSpPr <- findChild (elemName ns "p" "nvSpPr") element
|
||||||
|
@ -374,14 +366,11 @@ getContentShape :: PandocMonad m => NameSpaces -> Element -> P m Element
|
||||||
getContentShape ns spTreeElem
|
getContentShape ns spTreeElem
|
||||||
| isElem ns "p" "spTree" spTreeElem = do
|
| isElem ns "p" "spTree" spTreeElem = do
|
||||||
contentType <- asks envContentType
|
contentType <- asks envContentType
|
||||||
let ident = case contentType of
|
let idx = case contentType of
|
||||||
NormalContent -> "3"
|
NormalContent -> "1"
|
||||||
TwoColumnLeftContent -> "3"
|
TwoColumnLeftContent -> "1"
|
||||||
TwoColumnRightContent -> "4"
|
TwoColumnRightContent -> "2"
|
||||||
case filterChild
|
case getShapeByPlaceHolderIndex ns spTreeElem idx of
|
||||||
(\e -> (isElem ns "p" "sp" e) && (shapeHasId ns ident e))
|
|
||||||
spTreeElem
|
|
||||||
of
|
|
||||||
Just e -> return e
|
Just e -> return e
|
||||||
Nothing -> throwError $
|
Nothing -> throwError $
|
||||||
PandocSomeError $
|
PandocSomeError $
|
||||||
|
@ -992,14 +981,6 @@ graphicToElement tableWidth (Tbl tblPr hdrCells rows) = do
|
||||||
]
|
]
|
||||||
]
|
]
|
||||||
|
|
||||||
getShapeByName :: NameSpaces -> Element -> String -> Maybe Element
|
|
||||||
getShapeByName ns spTreeElem name
|
|
||||||
| isElem ns "p" "spTree" spTreeElem =
|
|
||||||
filterChild (\e -> (isElem ns "p" "sp" e) && (shapeHasName ns name e)) spTreeElem
|
|
||||||
| otherwise = Nothing
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
getShapeByPlaceHolderType :: NameSpaces -> Element -> String -> Maybe Element
|
getShapeByPlaceHolderType :: NameSpaces -> Element -> String -> Maybe Element
|
||||||
getShapeByPlaceHolderType ns spTreeElem phType
|
getShapeByPlaceHolderType ns spTreeElem phType
|
||||||
| isElem ns "p" "spTree" spTreeElem =
|
| isElem ns "p" "spTree" spTreeElem =
|
||||||
|
@ -1013,18 +994,26 @@ getShapeByPlaceHolderType ns spTreeElem phType
|
||||||
filterChild findPhType spTreeElem
|
filterChild findPhType spTreeElem
|
||||||
| otherwise = Nothing
|
| otherwise = Nothing
|
||||||
|
|
||||||
-- getShapeById :: NameSpaces -> Element -> String -> Maybe Element
|
getShapeByPlaceHolderIndex :: NameSpaces -> Element -> String -> Maybe Element
|
||||||
-- getShapeById ns spTreeElem ident
|
getShapeByPlaceHolderIndex ns spTreeElem phIdx
|
||||||
-- | isElem ns "p" "spTree" spTreeElem =
|
| isElem ns "p" "spTree" spTreeElem =
|
||||||
-- filterChild (\e -> (isElem ns "p" "sp" e) && (shapeHasId ns ident e)) spTreeElem
|
let findPhType element = isElem ns "p" "sp" element &&
|
||||||
-- | otherwise = Nothing
|
Just phIdx == (Just element >>=
|
||||||
|
findChild (elemName ns "p" "nvSpPr") >>=
|
||||||
|
findChild (elemName ns "p" "nvPr") >>=
|
||||||
|
findChild (elemName ns "p" "ph") >>=
|
||||||
|
findAttr (QName "idx" Nothing Nothing))
|
||||||
|
in
|
||||||
|
filterChild findPhType spTreeElem
|
||||||
|
| otherwise = Nothing
|
||||||
|
|
||||||
|
|
||||||
nonBodyTextToElement :: PandocMonad m => Element -> String -> [ParaElem] -> P m Element
|
nonBodyTextToElement :: PandocMonad m => Element -> String -> [ParaElem] -> P m Element
|
||||||
nonBodyTextToElement layout shapeName paraElements
|
nonBodyTextToElement layout phType paraElements
|
||||||
| ns <- elemToNameSpaces layout
|
| ns <- elemToNameSpaces layout
|
||||||
, Just cSld <- findChild (elemName ns "p" "cSld") layout
|
, Just cSld <- findChild (elemName ns "p" "cSld") layout
|
||||||
, Just spTree <- findChild (elemName ns "p" "spTree") cSld
|
, Just spTree <- findChild (elemName ns "p" "spTree") cSld
|
||||||
, Just sp <- getShapeByName ns spTree shapeName = do
|
, Just sp <- getShapeByPlaceHolderType ns spTree phType = do
|
||||||
let hdrPara = Paragraph def paraElements
|
let hdrPara = Paragraph def paraElements
|
||||||
element <- paragraphToElement hdrPara
|
element <- paragraphToElement hdrPara
|
||||||
let txBody = mknode "p:txBody" [] $
|
let txBody = mknode "p:txBody" [] $
|
||||||
|
@ -1039,7 +1028,7 @@ contentToElement layout hdrShape shapes
|
||||||
| ns <- elemToNameSpaces layout
|
| ns <- elemToNameSpaces layout
|
||||||
, Just cSld <- findChild (elemName ns "p" "cSld") layout
|
, Just cSld <- findChild (elemName ns "p" "cSld") layout
|
||||||
, Just spTree <- findChild (elemName ns "p" "spTree") cSld = do
|
, Just spTree <- findChild (elemName ns "p" "spTree") cSld = do
|
||||||
element <- nonBodyTextToElement layout "Title 1" hdrShape
|
element <- nonBodyTextToElement layout "title" hdrShape
|
||||||
let hdrShapeElements = if null hdrShape
|
let hdrShapeElements = if null hdrShape
|
||||||
then []
|
then []
|
||||||
else [element]
|
else [element]
|
||||||
|
@ -1057,7 +1046,7 @@ twoColumnToElement layout hdrShape shapesL shapesR
|
||||||
| ns <- elemToNameSpaces layout
|
| ns <- elemToNameSpaces layout
|
||||||
, Just cSld <- findChild (elemName ns "p" "cSld") layout
|
, Just cSld <- findChild (elemName ns "p" "cSld") layout
|
||||||
, Just spTree <- findChild (elemName ns "p" "spTree") cSld = do
|
, Just spTree <- findChild (elemName ns "p" "spTree") cSld = do
|
||||||
element <- nonBodyTextToElement layout "Title 1" hdrShape
|
element <- nonBodyTextToElement layout "title" hdrShape
|
||||||
let hdrShapeElements = if null hdrShape
|
let hdrShapeElements = if null hdrShape
|
||||||
then []
|
then []
|
||||||
else [element]
|
else [element]
|
||||||
|
@ -1081,7 +1070,7 @@ titleToElement layout titleElems
|
||||||
| ns <- elemToNameSpaces layout
|
| ns <- elemToNameSpaces layout
|
||||||
, Just cSld <- findChild (elemName ns "p" "cSld") layout
|
, Just cSld <- findChild (elemName ns "p" "cSld") layout
|
||||||
, Just spTree <- findChild (elemName ns "p" "spTree") cSld = do
|
, Just spTree <- findChild (elemName ns "p" "spTree") cSld = do
|
||||||
element <- nonBodyTextToElement layout "Title 1" titleElems
|
element <- nonBodyTextToElement layout "title" titleElems
|
||||||
let titleShapeElements = if null titleElems
|
let titleShapeElements = if null titleElems
|
||||||
then []
|
then []
|
||||||
else [element]
|
else [element]
|
||||||
|
@ -1095,15 +1084,15 @@ metadataToElement layout titleElems subtitleElems authorsElems dateElems
|
||||||
, Just spTree <- findChild (elemName ns "p" "spTree") cSld = do
|
, Just spTree <- findChild (elemName ns "p" "spTree") cSld = do
|
||||||
titleShapeElements <- if null titleElems
|
titleShapeElements <- if null titleElems
|
||||||
then return []
|
then return []
|
||||||
else sequence [nonBodyTextToElement layout "Title 1" titleElems]
|
else sequence [nonBodyTextToElement layout "ctrTitle" titleElems]
|
||||||
let combinedAuthorElems = intercalate [Break] authorsElems
|
let combinedAuthorElems = intercalate [Break] authorsElems
|
||||||
subtitleAndAuthorElems = intercalate [Break, Break] [subtitleElems, combinedAuthorElems]
|
subtitleAndAuthorElems = intercalate [Break, Break] [subtitleElems, combinedAuthorElems]
|
||||||
subtitleShapeElements <- if null subtitleAndAuthorElems
|
subtitleShapeElements <- if null subtitleAndAuthorElems
|
||||||
then return []
|
then return []
|
||||||
else sequence [nonBodyTextToElement layout "Subtitle 2" subtitleAndAuthorElems]
|
else sequence [nonBodyTextToElement layout "subTitle" subtitleAndAuthorElems]
|
||||||
dateShapeElements <- if null dateElems
|
dateShapeElements <- if null dateElems
|
||||||
then return []
|
then return []
|
||||||
else sequence [nonBodyTextToElement layout "Date Placeholder 3" dateElems]
|
else sequence [nonBodyTextToElement layout "dt" dateElems]
|
||||||
return $ replaceNamedChildren ns "p" "sp"
|
return $ replaceNamedChildren ns "p" "sp"
|
||||||
(titleShapeElements ++ subtitleShapeElements ++ dateShapeElements)
|
(titleShapeElements ++ subtitleShapeElements ++ dateShapeElements)
|
||||||
spTree
|
spTree
|
||||||
|
|
Loading…
Add table
Reference in a new issue