git.iko.soy/typeable/pandoc
on master help sign in
Powerpoint: Support raw openxml in pptx writer.

This allows raw openxml blocks and inlines to be used in the pptx writer. A few caveats: 1. It's up to the user to write well-formed openxml. The chances for corruption, especially with such a brittle format as pptx, is pretty high. 2. Because of the tricky way that blocks map onto shapes, if you are using a raw block, it should be the only block on a slide (otherwise other text might end up overlapping it). 3. The pptx ooxml namespace abbreviations are different from the docx ooxml namespaces. Again, it's up to the user to get it right. Unzipped document and ooxml specification should be consulted. Closes: #4976

commit5547cd6000a061a74aee22ec41b238b9a6c0f920 authorJesse Rosenthal <jrosenthal@jhu.edu> dateSat 20 Oct 2018, 08:22 (8 years ago) parent0c419a0
2 files changed+25−12
src/Text/Pandoc/Writers/Powerpoint/Output.hs+13−10 src/Text/Pandoc/Writers/Powerpoint/Presentation.hs+12−2
src/Text/Pandoc/Writers/Powerpoint/Output.hs+13−10
@@ -728,9 +728,9 @@ makePicElements layout picProps mInfo alt = do
728728 else return [picShape]
729729
730730
731−paraElemToElement :: PandocMonad m => ParaElem -> P m Element
732−paraElemToElement Break = return $ mknode "a:br" [] ()
733−paraElemToElement (Run rpr s) = do
731+paraElemToElements :: PandocMonad m => ParaElem -> P m [Element]
732+paraElemToElements Break = return [mknode "a:br" [] ()]
733+paraElemToElements (Run rpr s) = do
734734 let sizeAttrs = case rPropForceSize rpr of
735735 Just n -> [("sz", (show $ n * 100))]
736736 Nothing -> if rPropCode rpr
@@ -787,15 +787,17 @@ paraElemToElement (Run rpr s) = do
787787 then [mknode "a:latin" [("typeface", "Courier")] ()]
788788 else []
789789 let propContents = linkProps ++ colorContents ++ codeContents
790− return $ mknode "a:r" [] [ mknode "a:rPr" attrs $ propContents
791− , mknode "a:t" [] s
792− ]
793−paraElemToElement (MathElem mathType texStr) = do
790+ return [mknode "a:r" [] [ mknode "a:rPr" attrs $ propContents
791+ , mknode "a:t" [] s
792+ ]]
793+paraElemToElements (MathElem mathType texStr) = do
794794 res <- convertMath writeOMML mathType (unTeXString texStr)
795795 case res of
796− Right r -> return $ mknode "a14:m" [] $ addMathInfo r
797− Left (Str s) -> paraElemToElement (Run def s)
796+ Right r -> return [mknode "a14:m" [] $ addMathInfo r]
797+ Left (Str s) -> paraElemToElements (Run def s)
798798 Left _ -> throwError $ PandocShouldNeverHappenError "non-string math fallback"
799+paraElemToElements (RawOOXMLParaElem str) = return [ x | Elem x <- parseXML str ]
800+
799801
800802-- This is a bit of a kludge -- really requires adding an option to
801803-- TeXMath, but since that's a different package, we'll do this one
@@ -852,7 +854,7 @@ paragraphToElement par = do
852854 [mknode "a:buAutoNum" [("type", autoNumberingToType attrs')] ()]
853855 Nothing -> [mknode "a:buNone" [] ()]
854856 )
855− paras <- mapM paraElemToElement (paraElems par)
857+ paras <- concat <$> mapM paraElemToElements (paraElems par)
856858 return $ mknode "a:p" [] $ [mknode "a:pPr" attrs props] ++ paras
857859
858860shapeToElement :: PandocMonad m => Element -> Shape -> P m Element
@@ -882,6 +884,7 @@ shapeToElements layout (Pic picProps fp alt) = do
882884 Nothing -> shapeToElements layout $ TextBox [Paragraph def alt]
883885shapeToElements layout (GraphicFrame tbls cptn) =
884886 graphicFrameToElements layout tbls cptn
887+shapeToElements _ (RawOOXMLShape str) = return [ x | Elem x <- parseXML str ]
885888shapeToElements layout shp = do
886889 element <- shapeToElement layout shp
887890 return [element]
src/Text/Pandoc/Writers/Powerpoint/Presentation.hs+12−2
@@ -216,6 +216,7 @@ data Layout = MetadataSlide { metadataSlideTitle :: [ParaElem]
216216data Shape = Pic PicProps FilePath [ParaElem]
217217 | GraphicFrame [Graphic] [ParaElem]
218218 | TextBox [Paragraph]
219+ | RawOOXMLShape String
219220 deriving (Show, Eq)
220221
221222type Cell = [Paragraph]
@@ -266,6 +267,7 @@ data ParaElem = Break
266267 -- `convertmath` from T.P.Writers.Math. Will perhaps
267268 -- revisit in the future.
268269 | MathElem MathType TeXString
270+ | RawOOXMLParaElem String
269271 deriving (Show, Eq)
270272
271273data Strikethrough = NoStrike | SingleStrike | DoubleStrike
@@ -382,7 +384,11 @@ inlineToParElems (Quoted quoteType ils) =
382384 where (open, close) = case quoteType of
383385 SingleQuote -> ("\x2018", "\x2019")
384386 DoubleQuote -> ("\x201C", "\x201D")
385−inlineToParElems (RawInline _ _) = return []
387+inlineToParElems il@(RawInline fmt s) =
388+ case fmt of
389+ Format "openxml" -> return [RawOOXMLParaElem s]
390+ _ -> do addLogMessage $ InlineNotRendered il
391+ return []
386392inlineToParElems (Cite _ ils) = inlinesToParElems ils
387393-- Note: we shouldn't reach this, because images should be handled at
388394-- the shape level, but should that change in the future, we render
@@ -446,7 +452,8 @@ blockToParagraphs (BlockQuote blks) =
446452 , envRunProps = (envRunProps r){rPropForceSize = Just blockQuoteSize}})$
447453 concatMapM blockToParagraphs blks
448454-- TODO: work out the format
449−blockToParagraphs (RawBlock _ _) = return []
455+blockToParagraphs blk@(RawBlock _ _) = do addLogMessage $ BlockNotRendered blk
456+ return []
450457blockToParagraphs (Header _ (ident, _, _) ils) = do
451458 -- Note that this function only deals with content blocks, so it
452459 -- will only touch headers that are above the current slide level --
@@ -547,6 +554,8 @@ blockToShape (Table caption algn _ hdrCells rows) = do
547554 }
548555
549556 return $ GraphicFrame [Tbl tblPr hdrCells' rows'] caption'
557+-- If the format isn't openxml, we fall through to blockToPargraphs
558+blockToShape (RawBlock (Format "openxml") str) = return $ RawOOXMLShape str
550559blockToShape blk = do paras <- blockToParagraphs blk
551560 let paras' = map (\par -> par{paraElems = combineParaElems $ paraElems par}) paras
552561 return $ TextBox paras'
@@ -809,6 +818,7 @@ applyToShape :: Monad m => (ParaElem -> m ParaElem) -> Shape -> m Shape
809818applyToShape f (Pic pPr fp pes) = Pic pPr fp <$> mapM f pes
810819applyToShape f (GraphicFrame gfx pes) = GraphicFrame gfx <$> mapM f pes
811820applyToShape f (TextBox paras) = TextBox <$> mapM (applyToParagraph f) paras
821+applyToShape _ (RawOOXMLShape str) = return $ RawOOXMLShape str
812822
813823applyToLayout :: Monad m => (ParaElem -> m ParaElem) -> Layout -> m Layout
814824applyToLayout f (MetadataSlide title subtitle authors date) = do