git.iko.soy/typeable/pandoc
on master help sign in
Docx writer: move a couple more vars to ReaderT
1893f8fJesse Rosenthal
src/Text/Pandoc/Writers/Docx.hs+29−21
@@ -97,6 +97,10 @@ data WriterEnv = WriterEnv{ envTextProperties :: [Element]
97 , envRTL :: Bool
97 , envRTL :: Bool
98 , envListLevel :: Int
98 , envListLevel :: Int
99 , envListNumId :: Int
99 , envListNumId :: Int
100+ , envInDel :: Bool
101+ , envChangesAuthor :: String
102+ , envChangesDate :: String
103+
100 }
104 }
101
105
102defaultWriterEnv :: WriterEnv
106defaultWriterEnv :: WriterEnv
@@ -105,6 +109,9 @@ defaultWriterEnv = WriterEnv{ envTextProperties = []
105 , envRTL = False
109 , envRTL = False
106 , envListLevel = -1
110 , envListLevel = -1
107 , envListNumId = 1
111 , envListNumId = 1
112+ , envInDel = False
113+ , envChangesAuthor = "unknown"
114+ , envChangesDate = "1969-12-31T19:00:00Z"
108 }
115 }
109
116
110data WriterState = WriterState{
117data WriterState = WriterState{
@@ -115,9 +122,6 @@ data WriterState = WriterState{
115 , stLists :: [ListMarker]
122 , stLists :: [ListMarker]
116 , stInsId :: Int
123 , stInsId :: Int
117 , stDelId :: Int
124 , stDelId :: Int
118− , stInDel :: Bool
119− , stChangesAuthor :: String
120− , stChangesDate :: String
121 , stPrintWidth :: Integer
125 , stPrintWidth :: Integer
122 , stStyleMaps :: StyleMaps
126 , stStyleMaps :: StyleMaps
123 , stFirstPara :: Bool
127 , stFirstPara :: Bool
@@ -135,9 +139,6 @@ defaultWriterState = WriterState{
135 , stLists = [NoMarker]
139 , stLists = [NoMarker]
136 , stInsId = 1
140 , stInsId = 1
137 , stDelId = 1
141 , stDelId = 1
138− , stInDel = False
139− , stChangesAuthor = "unknown"
140− , stChangesDate = "1969-12-31T19:00:00Z"
141 , stPrintWidth = 1
142 , stPrintWidth = 1
142 , stStyleMaps = defaultStyleMaps
143 , stStyleMaps = defaultStyleMaps
143 , stFirstPara = False
144 , stFirstPara = False
@@ -257,14 +258,23 @@ writeDocx opts doc@(Pandoc meta _) = do
257 let tocTitle = fromMaybe (stTocTitle defaultWriterState) $
258 let tocTitle = fromMaybe (stTocTitle defaultWriterState) $
258 metaValueToInlines <$> lookupMeta "toc-title" meta
259 metaValueToInlines <$> lookupMeta "toc-title" meta
259
260
261+ let initialSt = defaultWriterState {
262+ stPrintWidth = (maybe 420 (\x -> quot x 20) pgContentWidth)
263+ , stStyleMaps = styleMaps
264+ , stTocTitle = tocTitle
265+ }
266+
267+ let env = defaultWriterEnv {
268+ envChangesAuthor = fromMaybe "unknown" username
269+ , envChangesDate = formatTime defaultTimeLocale "%FT%XZ" utctime
270+ }
271+
272+
260 ((contents, footnotes), st) <- runStateT
273 ((contents, footnotes), st) <- runStateT
274+ (runReaderT
261− (runReaderT (writeOpenXML opts{writerWrapText = WrapNone} doc') defaultWriterEnv)
275+ (writeOpenXML opts{writerWrapText = WrapNone} doc')
262− defaultWriterState{ stChangesAuthor = fromMaybe "unknown" username
276+ env)
263− , stChangesDate = formatTime defaultTimeLocale "%FT%XZ" utctime
277+ initialSt
264− , stPrintWidth = (maybe 420 (\x -> quot x 20) pgContentWidth)
265− , stStyleMaps = styleMaps
266− , stTocTitle = tocTitle
267− }
268 let epochtime = floor $ utcTimeToPOSIXSeconds utctime
278 let epochtime = floor $ utcTimeToPOSIXSeconds utctime
269 let imgs = M.elems $ stImages st
279 let imgs = M.elems $ stImages st
270
280
@@ -1006,7 +1016,7 @@ withParaPropM = (. flip withParaProp) . (>>=)
1006formattedString :: String -> WS [Element]
1016formattedString :: String -> WS [Element]
1007formattedString str = do
1017formattedString str = do
1008 props <- getTextProps
1018 props <- getTextProps
1009− inDel <- gets stInDel
1019+ inDel <- asks envInDel
1010 return [ mknode "w:r" [] $
1020 return [ mknode "w:r" [] $
1011 props ++
1021 props ++
1012 [ mknode (if inDel then "w:delText" else "w:t")
1022 [ mknode (if inDel then "w:delText" else "w:t")
@@ -1033,8 +1043,8 @@ inlineToOpenXML opts (Span (ident,classes,kvs) ils)
1033 let kvs' = filter (("dir", "ltr")/=) kvs
1043 let kvs' = filter (("dir", "ltr")/=) kvs
1034 setLTR $ inlineToOpenXML opts (Span (ident,classes,kvs') ils)
1044 setLTR $ inlineToOpenXML opts (Span (ident,classes,kvs') ils)
1035 | "insertion" `elem` classes = do
1045 | "insertion" `elem` classes = do
1036− defaultAuthor <- gets stChangesAuthor
1046+ defaultAuthor <- asks envChangesAuthor
1037− defaultDate <- gets stChangesDate
1047+ defaultDate <- asks envChangesDate
1038 let author = fromMaybe defaultAuthor (lookup "author" kvs)
1048 let author = fromMaybe defaultAuthor (lookup "author" kvs)
1039 date = fromMaybe defaultDate (lookup "date" kvs)
1049 date = fromMaybe defaultDate (lookup "date" kvs)
1040 insId <- gets stInsId
1050 insId <- gets stInsId
@@ -1045,15 +1055,13 @@ inlineToOpenXML opts (Span (ident,classes,kvs) ils)
1045 ("w:date", date)]
1055 ("w:date", date)]
1046 x ]
1056 x ]
1047 | "deletion" `elem` classes = do
1057 | "deletion" `elem` classes = do
1048− defaultAuthor <- gets stChangesAuthor
1058+ defaultAuthor <- asks envChangesAuthor
1049− defaultDate <- gets stChangesDate
1059+ defaultDate <- asks envChangesDate
1050 let author = fromMaybe defaultAuthor (lookup "author" kvs)
1060 let author = fromMaybe defaultAuthor (lookup "author" kvs)
1051 date = fromMaybe defaultDate (lookup "date" kvs)
1061 date = fromMaybe defaultDate (lookup "date" kvs)
1052 delId <- gets stDelId
1062 delId <- gets stDelId
1053 modify $ \s -> s{stDelId = (delId + 1)}
1063 modify $ \s -> s{stDelId = (delId + 1)}
1054− modify $ \s -> s{stInDel = True}
1055− x <- inlinesToOpenXML opts ils
1064+ x <- local (\env -> env {envInDel = True}) (inlinesToOpenXML opts ils)
1056− modify $ \s -> s{stInDel = False}
1057 return [ mknode "w:del" [("w:id", (show delId)),
1065 return [ mknode "w:del" [("w:id", (show delId)),
1058 ("w:author", author),
1066 ("w:author", author),
1059 ("w:date", date)]
1067 ("w:date", date)]