diff options
author | Jesse Rosenthal <jrosenthal@jhu.edu> | 2016-08-15 12:19:24 -0400 |
---|---|---|
committer | Jesse Rosenthal <jrosenthal@jhu.edu> | 2016-08-15 12:19:24 -0400 |
commit | 59bc1e68aa5786284729c3dafc94d7e3dc924141 (patch) | |
tree | 572afb57ae864ad9d52a22be42ee1d6c39a715f2 | |
parent | 9999db2e6c3c9761060d92e6269af06ff67452eb (diff) | |
download | pandoc-59bc1e68aa5786284729c3dafc94d7e3dc924141.tar.gz |
Docx writer: Inject new paragraph properties
This injects new dynamic paragraph properties to be into the style
file. Nothing occurs if the prop already exists in the style file.
-rw-r--r-- | src/Text/Pandoc/Writers/Docx.hs | 27 |
1 files changed, 23 insertions, 4 deletions
diff --git a/src/Text/Pandoc/Writers/Docx.hs b/src/Text/Pandoc/Writers/Docx.hs index 1daae854e..82f8bfcac 100644 --- a/src/Text/Pandoc/Writers/Docx.hs +++ b/src/Text/Pandoc/Writers/Docx.hs @@ -64,8 +64,8 @@ import Text.Pandoc.Compat.Monoid ((<>)) import Text.Pandoc.MIME (MimeType, getMimeType, getMimeTypeDef, extensionFromMimeType) import Control.Applicative ((<|>)) -import Data.Maybe (fromMaybe, mapMaybe, maybeToList) -import Data.Char (ord) +import Data.Maybe (fromMaybe, mapMaybe, maybeToList, isNothing) +import Data.Char (ord, isSpace, toLower) data ListMarker = NoMarker | BulletMarker @@ -405,8 +405,14 @@ writeDocx opts doc@(Pandoc meta _) = do $ renderXml $ mknode "Relationships" [("xmlns","http://schemas.openxmlformats.org/package/2006/relationships")] linkrels - -- styles - let newstyles = styleToOpenXml styleMaps $ writerHighlightStyle opts + -- styles We only want to inject paragraph properties that are not + -- already in the style map. Note that keys in the stylemap are + -- normalized as lowercase. + let newDynamicParaProps = filter + (\sty -> isNothing $ M.lookup (toLower <$> sty) $ getMap $ sParaStyleMap styleMaps) + (stDynamicParaProps st) + let newstyles = map newParaPropToOpenXml newDynamicParaProps ++ + (styleToOpenXml styleMaps $ writerHighlightStyle opts) let styledoc' = styledoc{ elContent = modifyContent (elContent styledoc) } where modifyContent @@ -501,6 +507,19 @@ writeDocx opts doc@(Pandoc meta _) = do miscRelEntries ++ otherMediaEntries return $ fromArchive archive + +newParaPropToOpenXml :: String -> Element +newParaPropToOpenXml s = + let styleId = filter (not . isSpace) s + in mknode "w:style" [ ("w:type", "paragraph") + , ("w:customStyle", "1") + , ("w:styleId", styleId)] + [ mknode "w:name" [("w:val", s)] () + , mknode "w:basedOn" [("w:val","BodyText")] () + , mknode "w:qFormat" [] () + ] + + styleToOpenXml :: StyleMaps -> Style -> [Element] styleToOpenXml sm style = maybeToList parStyle ++ mapMaybe toStyle alltoktypes |