git.iko.soy/typeable/pandoc
on master help sign in
Docx writer bookmark improvements.

- Bookmark start/end now surrounds content rather than preceding it. - Bookmarks generated for Div with id. Fixes jgm/pandoc-citeproc#205. - Cleaner code for handling dir and style attributes for Div.

commitf8f3b69c253958964d001e1e1873e7eb595cf851 authorJohn MacFarlane <jgm@berkeley.edu> dateSat 25 Feb 2017, 15:51 (10 years ago) parent3a1a50a
1 file changed+29−21
src/Text/Pandoc/Writers/Docx.hs+29−21
src/Text/Pandoc/Writers/Docx.hs+29−21
@@ -795,25 +795,32 @@ blockToOpenXML opts blk = withDirection $ blockToOpenXML' opts blk
795795
796796blockToOpenXML' :: (PandocMonad m) => WriterOptions -> Block -> WS m [Element]
797797blockToOpenXML' _ Null = return []
798−blockToOpenXML' opts (Div (ident,classes,kvs) bs)
799− | Just sty <- lookup dynamicStyleKey kvs = do
800− modify $ \s -> s{stDynamicParaProps = sty : (stDynamicParaProps s)}
801− withParaPropM (pStyleM sty) $ blocksToOpenXML opts bs
802− | Just "rtl" <- lookup "dir" kvs = do
803− let kvs' = filter (("dir", "rtl")/=) kvs
804− local (\env -> env { envRTL = True }) $
805− blockToOpenXML opts (Div (ident,classes,kvs') bs)
806− | Just "ltr" <- lookup "dir" kvs = do
807− let kvs' = filter (("dir", "ltr")/=) kvs
808− local (\env -> env { envRTL = False }) $
809− blockToOpenXML opts (Div (ident,classes,kvs') bs)
810−blockToOpenXML' opts (Div (_,["references"],_) bs) = do
811− let (hs, bs') = span isHeaderBlock bs
812− header <- blocksToOpenXML opts hs
813− -- We put the Bibliography style on paragraphs after the header
814− rest <- withParaPropM (pStyleM "Bibliography") $ blocksToOpenXML opts bs'
815− return (header ++ rest)
816−blockToOpenXML' opts (Div _ bs) = blocksToOpenXML opts bs
798+blockToOpenXML' opts (Div (ident,classes,kvs) bs) = do
799+ stylemod <- case lookup dynamicStyleKey kvs of
800+ Just sty -> do
801+ modify $ \s ->
802+ s{stDynamicParaProps = sty : (stDynamicParaProps s)}
803+ return $ withParaPropM (pStyleM sty)
804+ _ -> return id
805+ dirmod <- case lookup "dir" kvs of
806+ Just "rtl" -> return $ local (\env -> env { envRTL = True })
807+ Just "ltr" -> return $ local (\env -> env { envRTL = False })
808+ _ -> return id
809+ let (hs, bs') = if "references" `elem` classes
810+ then span isHeaderBlock bs
811+ else ([], bs)
812+ let bibmod = if "references" `elem` classes
813+ then withParaPropM (pStyleM "Bibliography")
814+ else id
815+ header <- dirmod $ stylemod $ blocksToOpenXML opts hs
816+ contents <- dirmod $ bibmod $ stylemod $ blocksToOpenXML opts bs'
817+ id' <- getUniqueId
818+ let bookmarkStart = mknode "w:bookmarkStart" [("w:id", id')
819+ ,("w:name",ident)] ()
820+ let bookmarkEnd = mknode "w:bookmarkEnd" [("w:id", id')] ()
821+ if null ident
822+ then return $ header ++ contents
823+ else return $ bookmarkStart : header ++ contents ++ [bookmarkEnd]
817824blockToOpenXML' opts (Header lev (ident,_,_) lst) = do
818825 setFirstPara
819826 paraProps <- withParaPropM (pStyleM ("Heading "++show lev)) $
@@ -824,11 +831,12 @@ blockToOpenXML' opts (Header lev (ident,_,_) lst) = do
824831 then uniqueIdent lst usedIdents
825832 else ident
826833 modify $ \s -> s{ stSectionIds = Set.insert bookmarkName $ stSectionIds s }
827− id' <- (lift . lift) getUniqueId
834+ id' <- getUniqueId
828835 let bookmarkStart = mknode "w:bookmarkStart" [("w:id", id')
829836 ,("w:name",bookmarkName)] ()
830837 let bookmarkEnd = mknode "w:bookmarkEnd" [("w:id", id')] ()
831− return [mknode "w:p" [] (paraProps ++ [bookmarkStart, bookmarkEnd] ++ contents)]
838+ return [mknode "w:p" [] (paraProps ++ [bookmarkStart] ++ contents
839+ ++ [bookmarkEnd])]
832840blockToOpenXML' opts (Plain lst) = withParaProp (pCustomStyle "Compact")
833841 $ blockToOpenXML opts (Para lst)
834842-- title beginning with fig: indicates that the image is a figure