@@ -780,7 +780,7 @@ makeTOC opts = do
780780 return
781781 [mknode "w:sdt" [] [
782782 mknode "w:sdtPr" [] (
783− mknode "w:docPartObj" []
783+ mknode "w:docPartObj" []
784784 [mknode "w:docPartGallery" [("w:val","Table of Contents")] (),
785785 mknode "w:docPartUnique" [] ()]
786786 -- w:docPartObj
@@ -809,12 +809,12 @@ writeOpenXML opts (Pandoc meta blocks) = do
809809 let includeTOC = writerTableOfContents opts || lookupMetaBool "toc" meta
810810 title <- withParaPropM (pStyleM "Title") $ blocksToOpenXML opts [Para tit | not (null tit)]
811811 subtitle <- withParaPropM (pStyleM "Subtitle") $ blocksToOpenXML opts [Para subtitle' | not (null subtitle')]
812− authors <- withParaProp (pCustomStyle "Author") $ blocksToOpenXML opts $
812+ authors <- withParaPropM (pStyleM "Author") $ blocksToOpenXML opts $
813813 map Para auths
814814 date <- withParaPropM (pStyleM "Date") $ blocksToOpenXML opts [Para dat | not (null dat)]
815815 abstract <- if null abstract'
816816 then return []
817− else withParaProp (pCustomStyle "Abstract") $ blocksToOpenXML opts abstract'
817+ else withParaPropM (pStyleM "Abstract") $ blocksToOpenXML opts abstract'
818818 let convertSpace (Str x : Space : Str y : xs) = Str (x ++ " " ++ y) : xs
819819 convertSpace (Str x : Str y : xs) = Str (x ++ y) : xs
820820 convertSpace xs = xs
@@ -848,18 +848,12 @@ writeOpenXML opts (Pandoc meta blocks) = do
848848blocksToOpenXML :: (PandocMonad m) => WriterOptions -> [Block] -> WS m [Element]
849849blocksToOpenXML opts bls = concat `fmap` mapM (blockToOpenXML opts) bls
850850
851−pCustomStyle :: String -> Element
852−pCustomStyle sty = mknode "w:pStyle" [("w:val",sty)] ()
853−
854851pStyleM :: (PandocMonad m) => String -> WS m XML.Element
855852pStyleM styleName = do
856853 styleMaps <- gets stStyleMaps
857854 let sty' = getStyleId styleName $ sParaStyleMap styleMaps
858855 return $ mknode "w:pStyle" [("w:val",sty')] ()
859856
860−rCustomStyle :: String -> Element
861−rCustomStyle sty = mknode "w:rStyle" [("w:val",sty)] ()
862−
863857rStyleM :: (PandocMonad m) => String -> WS m XML.Element
864858rStyleM styleName = do
865859 styleMaps <- gets stStyleMaps
@@ -921,19 +915,19 @@ blockToOpenXML' opts (Header lev (ident,_,_) lst) = do
921915blockToOpenXML' opts (Plain lst) = do
922916 isInTable <- gets stInTable
923917 let block = blockToOpenXML opts (Para lst)
924− para <- if isInTable then withParaProp (pCustomStyle "Compact") block else block
918+ prop <- pStyleM "Compact"
919+ para <- if isInTable then withParaProp prop block else block
925920 return $ para
926−
927921-- title beginning with fig: indicates that the image is a figure
928922blockToOpenXML' opts (Para [Image attr alt (src,'f':'i':'g':':':tit)]) = do
929923 setFirstPara
930− let prop = pCustomStyle $
924+ prop <- pStyleM $
931925 if null alt
932926 then "Figure"
933− else "CaptionedFigure"
927+ else "Captioned Figure"
934928 paraProps <- local (\env -> env { envParaProperties = EnvProps (Just prop) [] <> envParaProperties env }) (getParaProps False)
935929 contents <- inlinesToOpenXML opts [Image attr alt (src,tit)]
936− captionNode <- withParaProp (pCustomStyle "ImageCaption")
930+ captionNode <- withParaPropM (pStyleM "Image Caption")
937931 $ blockToOpenXML opts (Para alt)
938932 return $ mknode "w:p" [] (paraProps ++ contents) : captionNode
939933blockToOpenXML' opts (Para lst)
@@ -944,10 +938,10 @@ blockToOpenXML' opts (Para lst)
944938 [x] -> isDisplayMath x
945939 _ -> False
946940 paraProps <- getParaProps displayMathPara
947− bodyTextStyle <- pStyleM "Body Text"
941+ bodyTextStyle <- if isFirstPara
942+ then pStyleM "First Paragraph"
943+ else pStyleM "Body Text"
948944 let paraProps' = case paraProps of
949− [] | isFirstPara -> [mknode "w:pPr" []
950− [pCustomStyle "FirstParagraph"]]
951945 [] -> [mknode "w:pPr" [] [bodyTextStyle]]
952946 ps -> ps
953947 modify $ \s -> s { stFirstPara = False }
@@ -965,7 +959,7 @@ blockToOpenXML' opts (BlockQuote blocks) = do
965959 setFirstPara
966960 return p
967961blockToOpenXML' opts (CodeBlock attrs@(ident, _, _) str) = do
968− p <- withParaProp (pCustomStyle "SourceCode") (blockToOpenXML opts $ Para [Code attrs str])
962+ p <- withParaPropM (pStyleM "Source Code") (blockToOpenXML opts $ Para [Code attrs str])
969963 setFirstPara
970964 wrapBookmark ident p
971965blockToOpenXML' _ HorizontalRule = do
@@ -981,7 +975,7 @@ blockToOpenXML' opts (Table caption aligns widths headers rows) = do
981975 let captionStr = stringify caption
982976 caption' <- if null caption
983977 then return []
984− else withParaProp (pCustomStyle "TableCaption")
978+ else withParaPropM (pStyleM "Table Caption")
985979 $ blockToOpenXML opts (Para caption)
986980 let alignmentFor al = mknode "w:jc" [("w:val",alignmentToString al)] ()
987981 -- Table cells require a <w:p> element, even an empty one!
@@ -997,7 +991,8 @@ blockToOpenXML' opts (Table caption aligns widths headers rows) = do
997991 [ mknode "w:tcBorders" []
998992 $ mknode "w:bottom" [("w:val","single")] ()
999993 , mknode "w:vAlign" [("w:val","bottom")] () ]
1000− let emptyCell = [mknode "w:p" [] [mknode "w:pPr" [] [pCustomStyle "Compact"]]]
994+ compactStyle <- pStyleM "Compact"
995+ let emptyCell = [mknode "w:p" [] [mknode "w:pPr" [] [compactStyle]]]
1001996 let mkcell border contents = mknode "w:tc" []
1002997 $ [ borderProps | border ] ++
1003998 if null contents
@@ -1048,9 +1043,9 @@ blockToOpenXML' opts (DefinitionList items) = do
10481043
10491044definitionListItemToOpenXML :: (PandocMonad m) => WriterOptions -> ([Inline],[[Block]]) -> WS m [Element]
10501045definitionListItemToOpenXML opts (term,defs) = do
1051− term' <- withParaProp (pCustomStyle "DefinitionTerm")
1046+ term' <- withParaPropM (pStyleM "Definition Term")
10521047 $ blockToOpenXML opts (Para term)
1053− defs' <- withParaProp (pCustomStyle "Definition")
1048+ defs' <- withParaPropM (pStyleM "Definition")
10541049 $ concat `fmap` mapM (blocksToOpenXML opts) defs
10551050 return $ term' ++ defs'
10561051
@@ -1263,14 +1258,17 @@ inlineToOpenXML' opts (Math mathType str) = do
12631258 Left il -> inlineToOpenXML' opts il
12641259inlineToOpenXML' opts (Cite _ lst) = inlinesToOpenXML opts lst
12651260inlineToOpenXML' opts (Code attrs str) = do
1261+ let alltoktypes = [KeywordTok ..]
1262+ tokTypesMap <- mapM (\tt -> (,) tt <$> rStyleM (show tt)) alltoktypes
12661263 let unhighlighted = intercalate [br] `fmap`
12671264 mapM formattedString (lines str)
12681265 formatOpenXML _fmtOpts = intercalate [br] . map (map toHlTok)
1269− toHlTok (toktype,tok) = mknode "w:r" []
1270− [ mknode "w:rPr" []
1271− [ rCustomStyle (show toktype) ]
1272− , mknode "w:t" [("xml:space","preserve")] (T.unpack tok) ]
1273− withTextProp (rCustomStyle "VerbatimChar")
1266+ toHlTok (toktype,tok) =
1267+ mknode "w:r" []
1268+ [ mknode "w:rPr" [] $
1269+ maybeToList (lookup toktype tokTypesMap)
1270+ , mknode "w:t" [("xml:space","preserve")] (T.unpack tok) ]
1271+ withTextPropM (rStyleM "Verbatim Char")
12741272 $ if isNothing (writerHighlightStyle opts)
12751273 then unhighlighted
12761274 else case highlight (writerSyntaxMap opts)