aboutsummaryrefslogtreecommitdiff
path: root/src/Text/Pandoc
diff options
context:
space:
mode:
authorFrancesco Occhipinti <focchi.pinti@gmail.com>2018-03-18 04:17:55 +0100
committerJohn MacFarlane <jgm@berkeley.edu>2018-03-17 20:17:55 -0700
commit90a705c8aff676dff174ebc3bfd45d632f65005f (patch)
tree16ffe5f9cf359e7dbcbbde0456528718bcaf28cc /src/Text/Pandoc
parent65cc909fdee4dbc93ba0cf1c04ff64780caae57e (diff)
downloadpandoc-90a705c8aff676dff174ebc3bfd45d632f65005f.tar.gz
RST writer: separate inline transformation logic from writing logic (#4438)
This is to help enable solutions solutions to #4434 and #4368.
Diffstat (limited to 'src/Text/Pandoc')
-rw-r--r--src/Text/Pandoc/Writers/RST.hs40
1 files changed, 22 insertions, 18 deletions
diff --git a/src/Text/Pandoc/Writers/RST.hs b/src/Text/Pandoc/Writers/RST.hs
index 91bc9d66a..28d44533a 100644
--- a/src/Text/Pandoc/Writers/RST.hs
+++ b/src/Text/Pandoc/Writers/RST.hs
@@ -46,6 +46,7 @@ import Text.Pandoc.Pretty
import Text.Pandoc.Shared
import Text.Pandoc.Templates (renderTemplate')
import Text.Pandoc.Writers.Shared
+import Text.Pandoc.Walk
type Refs = [([Inline], Target)]
@@ -376,13 +377,9 @@ blockListToRST :: PandocMonad m
-> RST m Doc
blockListToRST = blockListToRST' False
--- | Convert list of Pandoc inline elements to RST.
-inlineListToRST :: PandocMonad m => [Inline] -> RST m Doc
-inlineListToRST lst =
- mapM inlineToRST ((stripLeadingTrailingSpace .
- removeSpaceAfterDisplayMath .
- insertBS) lst) >>=
- return . hcat
+transformInlines :: [Inline] -> [Inline]
+transformInlines =
+ removeLeadingTrailingSpace . removeSpaceAfterDisplayMath . insertBS
where -- remove spaces after displaymath, as they screw up indentation:
removeSpaceAfterDisplayMath (Math DisplayMath x : zs) =
Math DisplayMath x : dropWhile (==Space) zs
@@ -438,44 +435,51 @@ inlineListToRST lst =
isComplex (Span _ (x:_)) = isComplex x
isComplex _ = False
+inlineListToRST :: PandocMonad m => [Inline] -> RST m Doc
+inlineListToRST = writeInlines . walk transformInlines
+
+-- | Convert list of Pandoc inline elements to RST.
+writeInlines :: PandocMonad m => [Inline] -> RST m Doc
+writeInlines lst = mapM inlineToRST lst >>= return . hcat
+
-- | Convert Pandoc inline element to RST.
inlineToRST :: PandocMonad m => Inline -> RST m Doc
inlineToRST (Span (_,_,kvs) ils) = do
- contents <- inlineListToRST ils
+ contents <- writeInlines ils
return $
case lookup "role" kvs of
Just role -> ":" <> text role <> ":`" <> contents <> "`"
Nothing -> contents
inlineToRST (Emph lst) = do
- contents <- inlineListToRST lst
+ contents <- writeInlines lst
return $ "*" <> contents <> "*"
inlineToRST (Strong lst) = do
- contents <- inlineListToRST lst
+ contents <- writeInlines lst
return $ "**" <> contents <> "**"
inlineToRST (Strikeout lst) = do
- contents <- inlineListToRST lst
+ contents <- writeInlines lst
return $ "[STRIKEOUT:" <> contents <> "]"
inlineToRST (Superscript lst) = do
- contents <- inlineListToRST lst
+ contents <- writeInlines lst
return $ ":sup:`" <> contents <> "`"
inlineToRST (Subscript lst) = do
- contents <- inlineListToRST lst
+ contents <- writeInlines lst
return $ ":sub:`" <> contents <> "`"
-inlineToRST (SmallCaps lst) = inlineListToRST lst
+inlineToRST (SmallCaps lst) = writeInlines lst
inlineToRST (Quoted SingleQuote lst) = do
- contents <- inlineListToRST lst
+ contents <- writeInlines lst
opts <- gets stOptions
if isEnabled Ext_smart opts
then return $ "'" <> contents <> "'"
else return $ "‘" <> contents <> "’"
inlineToRST (Quoted DoubleQuote lst) = do
- contents <- inlineListToRST lst
+ contents <- writeInlines lst
opts <- gets stOptions
if isEnabled Ext_smart opts
then return $ "\"" <> contents <> "\""
else return $ "“" <> contents <> "”"
inlineToRST (Cite _ lst) =
- inlineListToRST lst
+ writeInlines lst
inlineToRST (Code _ str) = do
opts <- gets stOptions
-- we trim the string because the delimiters must adjoin a
@@ -526,7 +530,7 @@ inlineToRST (Link _ [Image attr alt (imgsrc,imgtit)] (src, _tit)) = do
return $ "|" <> label <> "|"
inlineToRST (Link _ txt (src, tit)) = do
useReferenceLinks <- gets $ writerReferenceLinks . stOptions
- linktext <- inlineListToRST $ B.toList . B.trimInlines . B.fromList $ txt
+ linktext <- writeInlines $ B.toList . B.trimInlines . B.fromList $ txt
if useReferenceLinks
then do refs <- gets stLinks
case lookup txt refs of