git.iko.soy/typeable/pandoc
on master help sign in
Powerpoint: Support raw openxml in pptx writer.
5547cd6Jesse Rosenthal
src/Text/Pandoc/Writers/Powerpoint/Output.hs+13−10
@@ -728,9 +728,9 @@ makePicElements layout picProps mInfo alt = do
728 else return [picShape]
728 else return [picShape]
729
729
730
730
731−paraElemToElement :: PandocMonad m => ParaElem -> P m Element
731+paraElemToElements :: PandocMonad m => ParaElem -> P m [Element]
732−paraElemToElement Break = return $ mknode "a:br" [] ()
732+paraElemToElements Break = return [mknode "a:br" [] ()]
733−paraElemToElement (Run rpr s) = do
733+paraElemToElements (Run rpr s) = do
734 let sizeAttrs = case rPropForceSize rpr of
734 let sizeAttrs = case rPropForceSize rpr of
735 Just n -> [("sz", (show $ n * 100))]
735 Just n -> [("sz", (show $ n * 100))]
736 Nothing -> if rPropCode rpr
736 Nothing -> if rPropCode rpr
@@ -787,15 +787,17 @@ paraElemToElement (Run rpr s) = do
787 then [mknode "a:latin" [("typeface", "Courier")] ()]
787 then [mknode "a:latin" [("typeface", "Courier")] ()]
788 else []
788 else []
789 let propContents = linkProps ++ colorContents ++ codeContents
789 let propContents = linkProps ++ colorContents ++ codeContents
790− return $ mknode "a:r" [] [ mknode "a:rPr" attrs $ propContents
790+ return [mknode "a:r" [] [ mknode "a:rPr" attrs $ propContents
791− , mknode "a:t" [] s
791+ , mknode "a:t" [] s
792− ]
792+ ]]
793−paraElemToElement (MathElem mathType texStr) = do
793+paraElemToElements (MathElem mathType texStr) = do
794 res <- convertMath writeOMML mathType (unTeXString texStr)
794 res <- convertMath writeOMML mathType (unTeXString texStr)
795 case res of
795 case res of
796− Right r -> return $ mknode "a14:m" [] $ addMathInfo r
796+ Right r -> return [mknode "a14:m" [] $ addMathInfo r]
797− Left (Str s) -> paraElemToElement (Run def s)
797+ Left (Str s) -> paraElemToElements (Run def s)
798 Left _ -> throwError $ PandocShouldNeverHappenError "non-string math fallback"
798 Left _ -> throwError $ PandocShouldNeverHappenError "non-string math fallback"
799+paraElemToElements (RawOOXMLParaElem str) = return [ x | Elem x <- parseXML str ]
800+
799
801
800-- This is a bit of a kludge -- really requires adding an option to
802-- This is a bit of a kludge -- really requires adding an option to
801-- TeXMath, but since that's a different package, we'll do this one
803-- TeXMath, but since that's a different package, we'll do this one
@@ -852,7 +854,7 @@ paragraphToElement par = do
852 [mknode "a:buAutoNum" [("type", autoNumberingToType attrs')] ()]
854 [mknode "a:buAutoNum" [("type", autoNumberingToType attrs')] ()]
853 Nothing -> [mknode "a:buNone" [] ()]
855 Nothing -> [mknode "a:buNone" [] ()]
854 )
856 )
855− paras <- mapM paraElemToElement (paraElems par)
857+ paras <- concat <$> mapM paraElemToElements (paraElems par)
856 return $ mknode "a:p" [] $ [mknode "a:pPr" attrs props] ++ paras
858 return $ mknode "a:p" [] $ [mknode "a:pPr" attrs props] ++ paras
857
859
858shapeToElement :: PandocMonad m => Element -> Shape -> P m Element
860shapeToElement :: PandocMonad m => Element -> Shape -> P m Element
@@ -882,6 +884,7 @@ shapeToElements layout (Pic picProps fp alt) = do
882 Nothing -> shapeToElements layout $ TextBox [Paragraph def alt]
884 Nothing -> shapeToElements layout $ TextBox [Paragraph def alt]
883shapeToElements layout (GraphicFrame tbls cptn) =
885shapeToElements layout (GraphicFrame tbls cptn) =
884 graphicFrameToElements layout tbls cptn
886 graphicFrameToElements layout tbls cptn
887+shapeToElements _ (RawOOXMLShape str) = return [ x | Elem x <- parseXML str ]
885shapeToElements layout shp = do
888shapeToElements layout shp = do
886 element <- shapeToElement layout shp
889 element <- shapeToElement layout shp
887 return [element]
890 return [element]
src/Text/Pandoc/Writers/Powerpoint/Presentation.hs+12−2
@@ -216,6 +216,7 @@ data Layout = MetadataSlide { metadataSlideTitle :: [ParaElem]
216data Shape = Pic PicProps FilePath [ParaElem]
216data Shape = Pic PicProps FilePath [ParaElem]
217 | GraphicFrame [Graphic] [ParaElem]
217 | GraphicFrame [Graphic] [ParaElem]
218 | TextBox [Paragraph]
218 | TextBox [Paragraph]
219+ | RawOOXMLShape String
219 deriving (Show, Eq)
220 deriving (Show, Eq)
220
221
221type Cell = [Paragraph]
222type Cell = [Paragraph]
@@ -266,6 +267,7 @@ data ParaElem = Break
266 -- `convertmath` from T.P.Writers.Math. Will perhaps
267 -- `convertmath` from T.P.Writers.Math. Will perhaps
267 -- revisit in the future.
268 -- revisit in the future.
268 | MathElem MathType TeXString
269 | MathElem MathType TeXString
270+ | RawOOXMLParaElem String
269 deriving (Show, Eq)
271 deriving (Show, Eq)
270
272
271data Strikethrough = NoStrike | SingleStrike | DoubleStrike
273data Strikethrough = NoStrike | SingleStrike | DoubleStrike
@@ -382,7 +384,11 @@ inlineToParElems (Quoted quoteType ils) =
382 where (open, close) = case quoteType of
384 where (open, close) = case quoteType of
383 SingleQuote -> ("\x2018", "\x2019")
385 SingleQuote -> ("\x2018", "\x2019")
384 DoubleQuote -> ("\x201C", "\x201D")
386 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 []
386inlineToParElems (Cite _ ils) = inlinesToParElems ils
392inlineToParElems (Cite _ ils) = inlinesToParElems ils
387-- Note: we shouldn't reach this, because images should be handled at
393-- Note: we shouldn't reach this, because images should be handled at
388-- the shape level, but should that change in the future, we render
394-- the shape level, but should that change in the future, we render
@@ -446,7 +452,8 @@ blockToParagraphs (BlockQuote blks) =
446 , envRunProps = (envRunProps r){rPropForceSize = Just blockQuoteSize}})$
452 , envRunProps = (envRunProps r){rPropForceSize = Just blockQuoteSize}})$
447 concatMapM blockToParagraphs blks
453 concatMapM blockToParagraphs blks
448-- TODO: work out the format
454-- TODO: work out the format
449−blockToParagraphs (RawBlock _ _) = return []
455+blockToParagraphs blk@(RawBlock _ _) = do addLogMessage $ BlockNotRendered blk
456+ return []
450blockToParagraphs (Header _ (ident, _, _) ils) = do
457blockToParagraphs (Header _ (ident, _, _) ils) = do
451 -- Note that this function only deals with content blocks, so it
458 -- Note that this function only deals with content blocks, so it
452 -- will only touch headers that are above the current slide level --
459 -- will only touch headers that are above the current slide level --
@@ -547,6 +554,8 @@ blockToShape (Table caption algn _ hdrCells rows) = do
547 }
554 }
548
555
549 return $ GraphicFrame [Tbl tblPr hdrCells' rows'] caption'
556 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
550blockToShape blk = do paras <- blockToParagraphs blk
559blockToShape blk = do paras <- blockToParagraphs blk
551 let paras' = map (\par -> par{paraElems = combineParaElems $ paraElems par}) paras
560 let paras' = map (\par -> par{paraElems = combineParaElems $ paraElems par}) paras
552 return $ TextBox paras'
561 return $ TextBox paras'
@@ -809,6 +818,7 @@ applyToShape :: Monad m => (ParaElem -> m ParaElem) -> Shape -> m Shape
809applyToShape f (Pic pPr fp pes) = Pic pPr fp <$> mapM f pes
818applyToShape f (Pic pPr fp pes) = Pic pPr fp <$> mapM f pes
810applyToShape f (GraphicFrame gfx pes) = GraphicFrame gfx <$> mapM f pes
819applyToShape f (GraphicFrame gfx pes) = GraphicFrame gfx <$> mapM f pes
811applyToShape f (TextBox paras) = TextBox <$> mapM (applyToParagraph f) paras
820applyToShape f (TextBox paras) = TextBox <$> mapM (applyToParagraph f) paras
821+applyToShape _ (RawOOXMLShape str) = return $ RawOOXMLShape str
812
822
813applyToLayout :: Monad m => (ParaElem -> m ParaElem) -> Layout -> m Layout
823applyToLayout :: Monad m => (ParaElem -> m ParaElem) -> Layout -> m Layout
814applyToLayout f (MetadataSlide title subtitle authors date) = do
824applyToLayout f (MetadataSlide title subtitle authors date) = do