diff --git a/src/Text/Pandoc/Writers/Docx.hs b/src/Text/Pandoc/Writers/Docx.hs index 36e20fc61..407df18e7 100644 --- a/src/Text/Pandoc/Writers/Docx.hs +++ b/src/Text/Pandoc/Writers/Docx.hs @@ -261,16 +261,9 @@ writeDocx opts doc@(Pandoc meta _) = do let tocTitle = fromMaybe (stTocTitle defaultWriterState) $ metaValueToInlines <$> lookupMeta "toc-title" meta - let isRTL = case lookupMeta "dir" meta of - Just (MetaString "rtl") -> True - Just (MetaInlines [Str "rtl"]) -> True - _ -> False - - ((contents, footnotes), st) <- runStateT ( - runReaderT - (writeOpenXML opts{writerWrapText = WrapNone} doc') - defaultWriterEnv { envRTL = isRTL } - ) defaultWriterState{ stChangesAuthor = fromMaybe "unknown" username + ((contents, footnotes), st) <- runStateT + (runReaderT (writeOpenXML opts{writerWrapText = WrapNone} doc') defaultWriterEnv) + defaultWriterState{ stChangesAuthor = fromMaybe "unknown" username , stChangesDate = formatTime defaultTimeLocale "%FT%XZ" utctime , stPrintWidth = (maybe 420 (\x -> quot x 20) pgContentWidth) , stStyleMaps = styleMaps @@ -723,8 +716,11 @@ makeTOC _ = return [] -- OpenXML elements (the main document and footnotes). writeOpenXML :: WriterOptions -> Pandoc -> WS ([Element], [Element]) writeOpenXML opts (Pandoc meta blocks) = do - isRTL <- asks envRTL - (if isRTL then (setRTL True) else id) $ do + let isRTL = case lookupMeta "dir" meta of + Just (MetaString "rtl") -> True + Just (MetaInlines [Str "rtl"]) -> True + _ -> False + (if isRTL then setRTL else id) $ do let tit = docTitle meta ++ case lookupMeta "subtitle" meta of Just (MetaBlocks [Plain xs]) -> LineBreak : xs _ -> [] @@ -797,7 +793,7 @@ blockToOpenXML opts (Div (ident,classes,kvs) bs) withParaPropM (pStyleM sty) $ blocksToOpenXML opts bs | Just "rtl" <- lookup "dir" kvs = do let kvs' = filter (("dir", "rtl")/=) kvs - setRTL False $ blockToOpenXML opts (Div (ident,classes,kvs') bs) + setRTL $ blockToOpenXML opts (Div (ident,classes,kvs') bs) | Just "ltr" <- lookup "dir" kvs = do let kvs' = filter (("dir", "ltr")/=) kvs setLTR $ blockToOpenXML opts (Div (ident,classes,kvs') bs) @@ -1042,7 +1038,7 @@ inlineToOpenXML opts (Span (ident,classes,kvs) ils) inlineToOpenXML opts (Span (ident,classes,kvs') ils) | Just "rtl" <- lookup "dir" kvs = do let kvs' = filter (("dir", "rtl")/=) kvs - setRTL False $ inlineToOpenXML opts (Span (ident,classes,kvs') ils) + setRTL $ inlineToOpenXML opts (Span (ident,classes,kvs') ils) | Just "ltr" <- lookup "dir" kvs = do let kvs' = filter (("dir", "ltr")/=) kvs setLTR $ inlineToOpenXML opts (Span (ident,classes,kvs') ils) @@ -1275,10 +1271,10 @@ fitToPage (x, y) pageWidth (pageWidth, floor $ ((fromIntegral pageWidth) / x) * y) | otherwise = (floor x, floor y) -setRTL :: Bool -> WS a -> WS a -setRTL topLevel x = do +setRTL :: WS a -> WS a +setRTL x = do isRTL <- asks envRTL - if isRTL && not topLevel + if isRTL then x else flip local x $ \env -> env { envRTL = True