RST writer: add empty comments when needed...

to avoid including a blocquote in the indented content
of a preceding block.

Closes #3675.
This commit is contained in:
John MacFarlane
2017-05-19 21:05:15 +02:00
parent 95c37d1e1f
commit ca77f0a95e
3 changed files with 46 additions and 3 deletions
+25 -3
View File
@@ -57,6 +57,7 @@ data WriterState =
, stHasRawTeX :: Bool
, stOptions :: WriterOptions
, stTopLevel :: Bool
, stLastNested :: Bool
}
type RST = StateT WriterState
@@ -67,7 +68,7 @@ writeRST opts document = do
let st = WriterState { stNotes = [], stLinks = [],
stImages = [], stHasMath = False,
stHasRawTeX = False, stOptions = opts,
stTopLevel = True}
stTopLevel = True, stLastNested = False}
evalStateT (pandocToRST document) st
-- | Return RST representation of document.
@@ -343,11 +344,32 @@ blockListToRST' :: PandocMonad m
-> RST m Doc
blockListToRST' topLevel blocks = do
tl <- gets stTopLevel
modify (\s->s{stTopLevel=topLevel})
res <- vcat `fmap` mapM blockToRST blocks
modify (\s->s{stTopLevel=topLevel, stLastNested=False})
res <- vcat `fmap` mapM blockToRST' 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
+15
View File
@@ -0,0 +1,15 @@
````
% pandoc -t rst
```python
print("hello")
```
> block quote
^D
.. code:: python
print("hello")
..
block quote
````
+6
View File
@@ -75,6 +75,8 @@ E-mail style:
This is a block quote. It is pretty short.
..
Code in a block quote:
::
@@ -92,6 +94,8 @@ E-mail style:
nested
..
nested
This should not be a block quote: 2 > 1.
@@ -342,6 +346,8 @@ Multiple blocks with italics:
{ orange code block }
..
orange block quote
Multiple definitions, tight: