git.iko.soy/typeable/pandoc
on master help sign in
Docx writer: bookmarks for Span with id.

And cleaned up code.

commit5441e11b06a1ef70bf4b13d63e57d2350484bb08 authorJohn MacFarlane <jgm@berkeley.edu> dateSat 25 Feb 2017, 20:41 (10 years ago) parentf8f3b69
1 file changed+58−45
src/Text/Pandoc/Writers/Docx.hs+58−45
src/Text/Pandoc/Writers/Docx.hs+58−45
@@ -1,4 +1,5 @@
1−{-# LANGUAGE ScopedTypeVariables, PatternGuards, ViewPatterns, DeriveFunctor #-}
1+{-# LANGUAGE ScopedTypeVariables, PatternGuards, ViewPatterns, DeriveFunctor,
2+ ScopedTypeVariables, RankNTypes #-}
23{-
34Copyright (C) 2012-2015 John MacFarlane <jgm@berkeley.edu>
45
@@ -1048,50 +1049,62 @@ inlineToOpenXML' :: PandocMonad m => WriterOptions -> Inline -> WS m [Element]
10481049inlineToOpenXML' _ (Str str) = formattedString str
10491050inlineToOpenXML' opts Space = inlineToOpenXML opts (Str " ")
10501051inlineToOpenXML' opts SoftBreak = inlineToOpenXML opts (Str " ")
1051−inlineToOpenXML' opts (Span (ident,classes,kvs) ils)
1052− | Just sty <- lookup dynamicStyleKey kvs = do
1053− let kvs' = filter ((dynamicStyleKey, sty)/=) kvs
1054− modify $ \s -> s{stDynamicTextProps = sty : (stDynamicTextProps s)}
1055− withTextProp (rCustomStyle sty) $
1056− inlineToOpenXML opts (Span (ident,classes,kvs') ils)
1057− | Just "rtl" <- lookup "dir" kvs = do
1058− let kvs' = filter (("dir", "rtl")/=) kvs
1059− local (\env -> env { envRTL = True }) $
1060− inlineToOpenXML opts (Span (ident,classes,kvs') ils)
1061− | Just "ltr" <- lookup "dir" kvs = do
1062− let kvs' = filter (("dir", "ltr")/=) kvs
1063− local (\env -> env { envRTL = False }) $
1064− inlineToOpenXML opts (Span (ident,classes,kvs') ils)
1065− | "insertion" `elem` classes = do
1066− defaultAuthor <- asks envChangesAuthor
1067− defaultDate <- asks envChangesDate
1068− let author = fromMaybe defaultAuthor (lookup "author" kvs)
1069− date = fromMaybe defaultDate (lookup "date" kvs)
1070− insId <- gets stInsId
1071− modify $ \s -> s{stInsId = (insId + 1)}
1072− x <- inlinesToOpenXML opts ils
1073− return [ mknode "w:ins" [("w:id", (show insId)),
1074− ("w:author", author),
1075− ("w:date", date)]
1076− x ]
1077− | "deletion" `elem` classes = do
1078− defaultAuthor <- asks envChangesAuthor
1079− defaultDate <- asks envChangesDate
1080− let author = fromMaybe defaultAuthor (lookup "author" kvs)
1081− date = fromMaybe defaultDate (lookup "date" kvs)
1082− delId <- gets stDelId
1083− modify $ \s -> s{stDelId = (delId + 1)}
1084− x <- local (\env -> env {envInDel = True}) (inlinesToOpenXML opts ils)
1085− return [ mknode "w:del" [("w:id", (show delId)),
1086− ("w:author", author),
1087− ("w:date", date)]
1088− x ]
1089− | otherwise = do
1090− let off x = withTextProp (mknode x [("w:val","0")] ())
1091− ((if "csl-no-emph" `elem` classes then off "w:i" else id) .
1092− (if "csl-no-strong" `elem` classes then off "w:b" else id) .
1093− (if "csl-no-smallcaps" `elem` classes then off "w:smallCaps" else id))
1094− $ inlinesToOpenXML opts ils
1052+inlineToOpenXML' opts (Span (ident,classes,kvs) ils) = do
1053+ stylemod <- case lookup dynamicStyleKey kvs of
1054+ Just sty -> do
1055+ modify $ \s ->
1056+ s{stDynamicTextProps = sty : (stDynamicTextProps s)}
1057+ return $ withTextProp (rCustomStyle sty)
1058+ _ -> return id
1059+ let dirmod = case lookup "dir" kvs of
1060+ Just "rtl" -> local (\env -> env { envRTL = True })
1061+ Just "ltr" -> local (\env -> env { envRTL = False })
1062+ _ -> id
1063+ let off x = withTextProp (mknode x [("w:val","0")] ())
1064+ let pmod = (if "csl-no-emph" `elem` classes then off "w:i" else id) .
1065+ (if "csl-no-strong" `elem` classes then off "w:b" else id) .
1066+ (if "csl-no-smallcaps" `elem` classes
1067+ then off "w:smallCaps"
1068+ else id)
1069+ insmod <- if "insertion" `elem` classes
1070+ then do
1071+ defaultAuthor <- asks envChangesAuthor
1072+ defaultDate <- asks envChangesDate
1073+ let author = fromMaybe defaultAuthor (lookup "author" kvs)
1074+ date = fromMaybe defaultDate (lookup "date" kvs)
1075+ insId <- gets stInsId
1076+ modify $ \s -> s{stInsId = (insId + 1)}
1077+ return $ \f -> do
1078+ x <- f
1079+ return $ [ mknode "w:ins"
1080+ [("w:id", (show insId)),
1081+ ("w:author", author),
1082+ ("w:date", date)] x]
1083+ else return id
1084+ delmod <- if "insertion" `elem` classes
1085+ then do
1086+ defaultAuthor <- asks envChangesAuthor
1087+ defaultDate <- asks envChangesDate
1088+ let author = fromMaybe defaultAuthor (lookup "author" kvs)
1089+ date = fromMaybe defaultDate (lookup "date" kvs)
1090+ insId <- gets stInsId
1091+ modify $ \s -> s{stInsId = (insId + 1)}
1092+ return $ \f -> do
1093+ x <- f
1094+ return [mknode "w:ins"
1095+ [("w:id", (show insId)),
1096+ ("w:author", author),
1097+ ("w:date", date)] x]
1098+ else return id
1099+ contents <- insmod $ delmod $ dirmod $ stylemod $ pmod
1100+ $ inlinesToOpenXML opts ils
1101+ id' <- getUniqueId
1102+ let bookmarkStart = mknode "w:bookmarkStart" [("w:id", id')
1103+ ,("w:name",ident)] ()
1104+ let bookmarkEnd = mknode "w:bookmarkEnd" [("w:id", id')] ()
1105+ return $ if null ident
1106+ then contents
1107+ else bookmarkStart : contents ++ [bookmarkEnd]
10951108inlineToOpenXML' opts (Strong lst) =
10961109 withTextProp (mknode "w:b" [] ()) $ inlinesToOpenXML opts lst
10971110inlineToOpenXML' opts (Emph lst) =