git.iko.soy/typeable/pandoc
on master help sign in
Powerpoint writer: allow arbitrary OOXML in raw inline elements

The raw text is now included verbatim in the output. Previously is was parsed into XML elements, which prevented the inclusion of partial XML snippets.

commitdcd89413f3d4412c7a17b0b2f1019ea592a35858 authorAlbert Krewinkel <albert@zeitkraut.de> dateSat 26 Dec 2020, 22:51 (6 years ago) parent47f4352
2 files changed+28−23
src/Text/Pandoc/Writers/Powerpoint/Output.hs+27−22 test/pptx/raw_ooxml.native+1−1
src/Text/Pandoc/Writers/Powerpoint/Output.hs+27−22
@@ -437,10 +437,10 @@ getContentShapeSize ns layout master
437437getContentShapeSize _ _ _ = throwError $ PandocSomeError
438438 "Attempted to find content shape size in non-layout"
439439
440−buildSpTree :: NameSpaces -> Element -> [Element] -> Element
440+buildSpTree :: NameSpaces -> Element -> [Content] -> Element
441441buildSpTree ns spTreeElem newShapes =
442442 emptySpTreeElem { elContent = newContent }
443− where newContent = elContent emptySpTreeElem <> map Elem newShapes
443+ where newContent = elContent emptySpTreeElem <> newShapes
444444 emptySpTreeElem = spTreeElem { elContent = filter fn (elContent spTreeElem) }
445445 fn :: Content -> Bool
446446 fn (Elem e) = isElem ns "p" "nvGrpSpPr" e ||
@@ -744,8 +744,8 @@ makePicElements layout picProps mInfo alt = do
744744 else return [picShape]
745745
746746
747−paraElemToElements :: PandocMonad m => ParaElem -> P m [Element]
748−paraElemToElements Break = return [mknode "a:br" [] ()]
747+paraElemToElements :: PandocMonad m => ParaElem -> P m [Content]
748+paraElemToElements Break = return [Elem $ mknode "a:br" [] ()]
749749paraElemToElements (Run rpr s) = do
750750 sizeAttrs <- fontSizeAttributes rpr
751751 let attrs = sizeAttrs <>
@@ -801,19 +801,20 @@ paraElemToElements (Run rpr s) = do
801801 let codeContents =
802802 [mknode "a:latin" [("typeface", T.unpack codeFont)] () | rPropCode rpr]
803803 let propContents = linkProps <> colorContents <> codeContents
804− return [mknode "a:r" [] [ mknode "a:rPr" attrs propContents
805− , mknode "a:t" [] $ T.unpack s
806− ]]
804+ return [Elem $ mknode "a:r" [] [ mknode "a:rPr" attrs propContents
805+ , mknode "a:t" [] $ T.unpack s
806+ ]]
807807paraElemToElements (MathElem mathType texStr) = do
808808 isInSpkrNotes <- asks envInSpeakerNotes
809809 if isInSpkrNotes
810810 then paraElemToElements $ Run def $ unTeXString texStr
811811 else do res <- convertMath writeOMML mathType (unTeXString texStr)
812812 case res of
813− Right r -> return [mknode "a14:m" [] $ addMathInfo r]
813+ Right r -> return [Elem $ mknode "a14:m" [] $ addMathInfo r]
814814 Left (Str s) -> paraElemToElements (Run def s)
815815 Left _ -> throwError $ PandocShouldNeverHappenError "non-string math fallback"
816−paraElemToElements (RawOOXMLParaElem str) = return [ x | Elem x <- parseXML str ]
816+paraElemToElements (RawOOXMLParaElem str) = return
817+ [Text (CData CDataRaw (T.unpack str) Nothing)]
817818
818819
819820-- This is a bit of a kludge -- really requires adding an option to
@@ -875,8 +876,9 @@ paragraphToElement par = do
875876 [mknode "a:buAutoNum" (autoNumAttrs attrs') ()]
876877 Nothing -> [mknode "a:buNone" [] ()]
877878 )
878− paras <- concat <$> mapM paraElemToElements (paraElems par)
879− return $ mknode "a:p" [] $ [mknode "a:pPr" attrs props] <> paras
879+ paras <- mapM paraElemToElements (paraElems par)
880+ return $ mknode "a:p" [] $
881+ [Elem $ mknode "a:pPr" attrs props] <> concat paras
880882
881883shapeToElement :: PandocMonad m => Element -> Shape -> P m Element
882884shapeToElement layout (TextBox paras)
@@ -896,21 +898,22 @@ shapeToElement layout (TextBox paras)
896898-- GraphicFrame and Pic should never reach this.
897899shapeToElement _ _ = return $ mknode "p:sp" [] ()
898900
899−shapeToElements :: PandocMonad m => Element -> Shape -> P m [Element]
901+shapeToElements :: PandocMonad m => Element -> Shape -> P m [Content]
900902shapeToElements layout (Pic picProps fp alt) = do
901903 mInfo <- registerMedia fp alt
902904 case mInfoExt mInfo of
903− Just _ ->
905+ Just _ -> map Elem <$>
904906 makePicElements layout picProps mInfo alt
905907 Nothing -> shapeToElements layout $ TextBox [Paragraph def alt]
906−shapeToElements layout (GraphicFrame tbls cptn) =
908+shapeToElements layout (GraphicFrame tbls cptn) = map Elem <$>
907909 graphicFrameToElements layout tbls cptn
908−shapeToElements _ (RawOOXMLShape str) = return [ x | Elem x <- parseXML str ]
910+shapeToElements _ (RawOOXMLShape str) = return
911+ [Text (CData CDataRaw (T.unpack str) Nothing)]
909912shapeToElements layout shp = do
910913 element <- shapeToElement layout shp
911− return [element]
914+ return [Elem element]
912915
913−shapesToElements :: PandocMonad m => Element -> [Shape] -> P m [Element]
916+shapesToElements :: PandocMonad m => Element -> [Shape] -> P m [Content]
914917shapesToElements layout shps =
915918 concat <$> mapM (shapeToElements layout) shps
916919
@@ -1083,7 +1086,7 @@ contentToElement layout hdrShape shapes
10831086 , Just cSld <- findChild (elemName ns "p" "cSld") layout
10841087 , Just spTree <- findChild (elemName ns "p" "spTree") cSld = do
10851088 element <- nonBodyTextToElement layout [PHType "title"] hdrShape
1086− let hdrShapeElements = [element | not (null hdrShape)]
1089+ let hdrShapeElements = [Elem element | not (null hdrShape)]
10871090 contentElements <- local
10881091 (\env -> env {envContentType = NormalContent})
10891092 (shapesToElements layout shapes)
@@ -1096,7 +1099,7 @@ twoColumnToElement layout hdrShape shapesL shapesR
10961099 , Just cSld <- findChild (elemName ns "p" "cSld") layout
10971100 , Just spTree <- findChild (elemName ns "p" "spTree") cSld = do
10981101 element <- nonBodyTextToElement layout [PHType "title"] hdrShape
1099− let hdrShapeElements = [element | not (null hdrShape)]
1102+ let hdrShapeElements = [Elem element | not (null hdrShape)]
11001103 contentElementsL <- local
11011104 (\env -> env {envContentType =TwoColumnLeftContent})
11021105 (shapesToElements layout shapesL)
@@ -1105,7 +1108,8 @@ twoColumnToElement layout hdrShape shapesL shapesR
11051108 (shapesToElements layout shapesR)
11061109 -- let contentElementsL' = map (setIdx ns "1") contentElementsL
11071110 -- contentElementsR' = map (setIdx ns "2") contentElementsR
1108− return $ buildSpTree ns spTree (hdrShapeElements <> contentElementsL <> contentElementsR)
1111+ return $ buildSpTree ns spTree $
1112+ hdrShapeElements <> contentElementsL <> contentElementsR
11091113twoColumnToElement _ _ _ _= return $ mknode "p:sp" [] ()
11101114
11111115
@@ -1115,7 +1119,7 @@ titleToElement layout titleElems
11151119 , Just cSld <- findChild (elemName ns "p" "cSld") layout
11161120 , Just spTree <- findChild (elemName ns "p" "spTree") cSld = do
11171121 element <- nonBodyTextToElement layout [PHType "title", PHType "ctrTitle"] titleElems
1118− let titleShapeElements = [element | not (null titleElems)]
1122+ let titleShapeElements = [Elem element | not (null titleElems)]
11191123 return $ buildSpTree ns spTree titleShapeElements
11201124titleToElement _ _ = return $ mknode "p:sp" [] ()
11211125
@@ -1135,7 +1139,8 @@ metadataToElement layout titleElems subtitleElems authorsElems dateElems
11351139 dateShapeElements <- if null dateElems
11361140 then return []
11371141 else sequence [nonBodyTextToElement layout [PHType "dt"] dateElems]
1138− return $ buildSpTree ns spTree (titleShapeElements <> subtitleShapeElements <> dateShapeElements)
1142+ return . buildSpTree ns spTree . map Elem $
1143+ (titleShapeElements <> subtitleShapeElements <> dateShapeElements)
11391144metadataToElement _ _ _ _ _ = return $ mknode "p:sp" [] ()
11401145
11411146slideToElement :: PandocMonad m => Slide -> P m Element
test/pptx/raw_ooxml.native+1−1
@@ -1,3 +1,3 @@
11[Para [Str "Here",Space,Str "is",Space,Str "some",Space,Str "text,",Space,Str "written",Space,Str "as",Space,Str "a",Space,Str "raw",Space,Str "inline:",Space,RawInline (Format "openxml") "<a:r><a:rPr /><a:t>Here are examples of </a:t></a:r><a:r><a:rPr i=\"1\" /><a:t>italics</a:t></a:r><a:r><a:rPr /><a:t>, </a:t></a:r><a:r><a:rPr b=\"1\" /><a:t>bold</a:t></a:r>"]
22,HorizontalRule
3−,RawBlock (Format "openxml") " <p:sp>\n <p:nvSpPr>\n <p:cNvPr id=\"3\" name=\"Content Placeholder 2\"/>\n <p:cNvSpPr>\n <a:spLocks noGrp=\"1\"/>\n </p:cNvSpPr>\n <p:nvPr>\n <p:ph idx=\"1\"/>\n </p:nvPr>\n </p:nvSpPr>\n <p:spPr/>\n <p:txBody>\n <a:bodyPr/>\n <a:lstStyle/>\n <a:p>\n <a:pPr lvl=\"1\"/>\n <a:r>\n <a:rPr/>\n <a:t>Bulleted bulleted lists.</a:t>\n </a:r>\n </a:p>\n <a:p>\n <a:pPr lvl=\"1\"/>\n <a:r>\n <a:rPr/>\n <a:t>And go to arbitrary depth.</a:t>\n </a:r>\n </a:p>\n <a:p>\n <a:pPr lvl=\"2\"/>\n <a:r>\n <a:rPr/>\n <a:t>Like this</a:t>\n </a:r>\n </a:p>\n <a:p>\n <a:pPr lvl=\"3\"/>\n <a:r>\n <a:rPr/>\n <a:t>Or this</a:t>\n </a:r>\n </a:p>\n <a:p>\n <a:pPr lvl=\"2\"/>\n <a:r>\n <a:rPr/>\n <a:t>Back to here.</a:t>\n </a:r>\n </a:p>\n </p:txBody>\n </p:sp>"]
3+,RawBlock (Format "openxml") "<p:sp>\n <p:nvSpPr>\n <p:cNvPr id=\"3\" name=\"Content Placeholder 2\" />\n <p:cNvSpPr>\n <a:spLocks noGrp=\"1\" />\n </p:cNvSpPr>\n <p:nvPr>\n <p:ph idx=\"1\" />\n </p:nvPr>\n </p:nvSpPr>\n <p:spPr />\n <p:txBody>\n <a:bodyPr />\n <a:lstStyle />\n <a:p>\n <a:pPr lvl=\"1\" />\n <a:r>\n <a:rPr />\n <a:t>Bulleted bulleted lists.</a:t>\n </a:r>\n </a:p>\n <a:p>\n <a:pPr lvl=\"1\" />\n <a:r>\n <a:rPr />\n <a:t>And go to arbitrary depth.</a:t>\n </a:r>\n </a:p>\n <a:p>\n <a:pPr lvl=\"2\" />\n <a:r>\n <a:rPr />\n <a:t>Like this</a:t>\n </a:r>\n </a:p>\n <a:p>\n <a:pPr lvl=\"3\" />\n <a:r>\n <a:rPr />\n <a:t>Or this</a:t>\n </a:r>\n </a:p>\n <a:p>\n <a:pPr lvl=\"2\" />\n <a:r>\n <a:rPr />\n <a:t>Back to here.</a:t>\n </a:r>\n </a:p>\n </p:txBody>\n </p:sp>"]