git.iko.soy/typeable/pandoc
on master help sign in
Add setRTL and setLTR functions.
commit8d148c02a821ff3b15cc67f0f63521e8cd21a994 authorJesse Rosenthal <jrosenthal@jhu.edu> dateMon 3 Oct 2016, 17:04 (10 years ago) parenta2d3854
1 file changed+41−8
src/Text/Pandoc/Writers/Docx.hs+41−8
src/Text/Pandoc/Writers/Docx.hs+41−8
@@ -718,6 +718,8 @@ makeTOC _ = return []
718718-- OpenXML elements (the main document and footnotes).
719719writeOpenXML :: WriterOptions -> Pandoc -> WS ([Element], [Element])
720720writeOpenXML opts (Pandoc meta blocks) = do
721+ isRTL <- asks envRTL
722+ (if isRTL then setRTL else id) $ do
721723 let tit = docTitle meta ++ case lookupMeta "subtitle" meta of
722724 Just (MetaBlocks [Plain xs]) -> LineBreak : xs
723725 _ -> []
@@ -784,10 +786,16 @@ dynamicStyleKey = "custom-style"
784786-- | Convert a Pandoc block element to OpenXML.
785787blockToOpenXML :: WriterOptions -> Block -> WS [Element]
786788blockToOpenXML _ Null = return []
787−blockToOpenXML opts (Div (_,_,kvs) bs)
789+blockToOpenXML opts (Div (ident,classes,kvs) bs)
788790 | Just sty <- lookup dynamicStyleKey kvs = do
789791 modify $ \s -> s{stDynamicParaProps = sty : (stDynamicParaProps s)}
790792 withParaPropM (pStyleM sty) $ blocksToOpenXML opts bs
793+ | Just "rtl" <- lookup "dir" kvs = do
794+ let kvs' = filter (("dir", "rtl")/=) kvs
795+ setRTL $ blockToOpenXML opts (Div (ident,classes,kvs') bs)
796+ | Just "ltr" <- lookup "dir" kvs = do
797+ let kvs' = filter (("dir", "ltr")/=) kvs
798+ setLTR $ blockToOpenXML opts (Div (ident,classes,kvs') bs)
791799blockToOpenXML opts (Div (_,["references"],_) bs) = do
792800 let (hs, bs') = span isHeaderBlock bs
793801 header <- blocksToOpenXML opts hs
@@ -1027,6 +1035,12 @@ inlineToOpenXML opts (Span (ident,classes,kvs) ils)
10271035 modify $ \s -> s{stDynamicTextProps = sty : (stDynamicTextProps s)}
10281036 withTextProp (rCustomStyle sty) $
10291037 inlineToOpenXML opts (Span (ident,classes,kvs') ils)
1038+ | Just "rtl" <- lookup "dir" kvs = do
1039+ let kvs' = filter (("dir", "rtl")/=) kvs
1040+ setRTL $ inlineToOpenXML opts (Span (ident,classes,kvs') ils)
1041+ | Just "ltr" <- lookup "dir" kvs = do
1042+ let kvs' = filter (("dir", "ltr")/=) kvs
1043+ setLTR $ inlineToOpenXML opts (Span (ident,classes,kvs') ils)
10301044 | "insertion" `elem` classes = do
10311045 defaultAuthor <- gets stChangesAuthor
10321046 defaultDate <- gets stChangesDate
@@ -1256,11 +1270,30 @@ fitToPage (x, y) pageWidth
12561270 (pageWidth, floor $ ((fromIntegral pageWidth) / x) * y)
12571271 | otherwise = (floor x, floor y)
12581272
1259−-- setRTL :: WS a -> WS a
1260−-- setRTL = do
1261−-- isRTL <- asks envRTL
1262−-- if isRTL
1263−-- then id
1264−-- else (withParaProp (mknode "w:bidi" [] ()) . withTextProp (mknode "w:rtl" [] ()))
1273+setRTL :: WS a -> WS a
1274+setRTL x = do
1275+ isRTL <- asks envRTL
1276+ if isRTL
1277+ then x
1278+ else flip local x $ \env -> env {
1279+ envRTL = True
1280+ , envParaProperties = (mknode "w:bidi" [] ()) : envParaProperties env
1281+ , envTextProperties = (mknode "w:rtl" [] ()) : envTextProperties env
1282+ }
1283+
12651284
1266−-- setLTR :: WS a -> WS a
1285+setLTR :: WS a -> WS a
1286+setLTR x = do
1287+ isRTL <- asks envRTL
1288+ if isRTL
1289+ then do paraProps <- asks envParaProperties
1290+ textProps <- asks envTextProperties
1291+ let paraProps' = filter (\e -> (qName . elName) e /= "w:bidi") paraProps
1292+ textProps' = filter (\e -> (qName . elName) e /= "w:rtl") textProps
1293+ flip local x $ \env -> env { envRTL = False
1294+ , envParaProperties = paraProps'
1295+ , envTextProperties = textProps'
1296+ }
1297+ else x
1298+
1299+