summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn MacFarlane <jgm@berkeley.edu>2018-01-19 18:33:07 -0700
committerGitHub <noreply@github.com>2018-01-19 18:33:07 -0700
commit46cd6429d8a8b47a265093c433e69cb29103282e (patch)
tree394f10bc776778e3ad7c77e4ec5aa0abe51925b6
parent3eac24c8cf321c743e904eb26ab0acb7cdca1b2e (diff)
parenta0ee8420967c1973e1aef0b94ceebc2ce10cb0d8 (diff)
Merge pull request #4259 from italia/4248
in RST writer insert comment between lists and quotes, closes #4248
-rw-r--r--src/Text/Pandoc/Writers/RST.hs42
-rw-r--r--test/Tests/Writers/RST.hs10
2 files changed, 27 insertions, 25 deletions
diff --git a/src/Text/Pandoc/Writers/RST.hs b/src/Text/Pandoc/Writers/RST.hs
index 2b28dccf0..a57527aa8 100644
--- a/src/Text/Pandoc/Writers/RST.hs
+++ b/src/Text/Pandoc/Writers/RST.hs
@@ -57,7 +57,6 @@ data WriterState =
, stHasRawTeX :: Bool
, stOptions :: WriterOptions
, stTopLevel :: Bool
- , stLastNested :: Bool
}
type RST = StateT WriterState
@@ -68,7 +67,7 @@ writeRST opts document = do
let st = WriterState { stNotes = [], stLinks = [],
stImages = [], stHasMath = False,
stHasRawTeX = False, stOptions = opts,
- stTopLevel = True, stLastNested = False}
+ stTopLevel = True }
evalStateT (pandocToRST document) st
-- | Return RST representation of document.
@@ -353,33 +352,26 @@ blockListToRST' :: PandocMonad m
-> [Block] -- ^ List of block elements
-> RST m Doc
blockListToRST' topLevel blocks = do
+ -- insert comment between list and quoted blocks, see #4248 and #3675
+ let fixBlocks (b1:b2@(BlockQuote _):bs)
+ | toClose b1 = b1 : commentSep : b2 : fixBlocks bs
+ where
+ toClose (Plain{}) = False
+ toClose (Header{}) = False
+ toClose (LineBlock{}) = False
+ toClose (HorizontalRule) = False
+ toClose (Para [Image _ _ (_,'f':'i':'g':':':_)]) = True
+ toClose (Para{}) = False
+ toClose _ = True
+ commentSep = RawBlock "rst" "..\n\n"
+ fixBlocks (b:bs) = b : fixBlocks bs
+ fixBlocks [] = []
tl <- gets stTopLevel
- modify (\s->s{stTopLevel=topLevel, stLastNested=False})
- res <- vcat `fmap` mapM blockToRST' blocks
+ modify (\s->s{stTopLevel=topLevel})
+ res <- vcat `fmap` mapM blockToRST (fixBlocks blocks)
modify (\s->s{stTopLevel=tl})
return res
-blockToRST' :: PandocMonad m => Block -> RST m Doc
-blockToRST' (x@BlockQuote{}) = do
- lastNested <- gets stLastNested
- res <- blockToRST x
- modify (\s -> s{stLastNested = True})
- return $ if lastNested
- then ".." $+$ res
- else res
-blockToRST' x = do
- modify (\s -> s{stLastNested =
- case x of
- Para [Image _ _ (_,'f':'i':'g':':':_)] -> True
- Para{} -> False
- Plain{} -> False
- Header{} -> False
- LineBlock{} -> False
- HorizontalRule -> False
- _ -> True
- })
- blockToRST x
-
blockListToRST :: PandocMonad m
=> [Block] -- ^ List of block elements
-> RST m Doc
diff --git a/test/Tests/Writers/RST.hs b/test/Tests/Writers/RST.hs
index 13944ed34..4c0a926bb 100644
--- a/test/Tests/Writers/RST.hs
+++ b/test/Tests/Writers/RST.hs
@@ -40,6 +40,16 @@ tests = [ testGroup "rubrics"
, " :name: foo"
, " :class: baz"]
]
+ , testGroup "ligatures" -- handling specific sequences of blocks
+ [ "a list is closed by a comment before a quote" =: -- issue 4248
+ bulletList [plain "bulleted"] <> blockQuote (plain "quoted") =?>
+ unlines
+ [ "- bulleted"
+ , ""
+ , ".."
+ , ""
+ , " quoted"]
+ ]
, testGroup "headings"
[ "normal heading" =:
header 1 (text "foo") =?>