summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn MacFarlane <jgm@berkeley.edu>2015-10-12 23:00:27 -0700
committerJohn MacFarlane <jgm@berkeley.edu>2015-10-12 23:00:27 -0700
commit24f68654e919a8ff138d0a1fcfbf8e045b8ae38b (patch)
treec25384e1afcc515f96aff2ae0120f39c4877c48f
parentfb51077712fbe2bca80b52d8e4b5f96b07980dcf (diff)
RST writer: do header normalization only in "standalone" mode.
If we're producing a fragment, just skip normalization. After all, the fragment might be somewhere in the middle of the document. It's more important for fragments to have consistency in rendering (so they can be pieced together) than to normalize. This closes #2394. It's simpler and more robust than my earlier fix.
-rw-r--r--src/Text/Pandoc/Writers/RST.hs13
-rw-r--r--tests/Tests/Writers/RST.hs21
2 files changed, 18 insertions, 16 deletions
diff --git a/src/Text/Pandoc/Writers/RST.hs b/src/Text/Pandoc/Writers/RST.hs
index 754aee29c..cb3ead514 100644
--- a/src/Text/Pandoc/Writers/RST.hs
+++ b/src/Text/Pandoc/Writers/RST.hs
@@ -81,8 +81,9 @@ pandocToRST (Pandoc meta blocks) = do
(fmap (render colwidth) . blockListToRST)
(fmap (trimr . render colwidth) . inlineListToRST)
$ deleteMeta "title" $ deleteMeta "subtitle" meta
- let minLev = findMinHeadingLevel Nothing blocks
- body <- blockListToRST' True $ normalizeHeadings minLev blocks
+ body <- blockListToRST' True $ if writerStandalone opts
+ then normalizeHeadings 1 blocks
+ else blocks
notes <- liftM (reverse . stNotes) get >>= notesToRST
-- note that the notes may contain refs, so we do them first
refs <- liftM (reverse . stLinks) get >>= refsToRST
@@ -102,17 +103,13 @@ pandocToRST (Pandoc meta blocks) = do
then return $ renderTemplate' (writerTemplate opts) context
else return main
where
- normalizeHeadings lev (Header l a i:bs) = Header lev a i:normalizeHeadings (lev+1) cont ++ normalizeHeadings lev bs'
+ normalizeHeadings lev (Header l a i:bs) =
+ Header lev a i:normalizeHeadings (lev+1) cont ++ normalizeHeadings lev bs'
where (cont,bs') = break (headerLtEq l) bs
headerLtEq level (Header l' _ _) = l' <= level
headerLtEq _ _ = False
normalizeHeadings lev (b:bs) = b:normalizeHeadings lev bs
normalizeHeadings _ [] = []
- findMinHeadingLevel Nothing (Header l _a _i:bs) = findMinHeadingLevel (Just l) bs
- findMinHeadingLevel (Just ol) (Header l _a _i:bs) =
- findMinHeadingLevel (Just $ if ol>l then l else ol) bs
- findMinHeadingLevel l (_:bs) = findMinHeadingLevel l bs
- findMinHeadingLevel l [] = fromMaybe 1 l
-- | Return RST representation of reference key table.
refsToRST :: Refs -> State WriterState Doc
diff --git a/tests/Tests/Writers/RST.hs b/tests/Tests/Writers/RST.hs
index bb7b2a446..b9e359dae 100644
--- a/tests/Tests/Writers/RST.hs
+++ b/tests/Tests/Writers/RST.hs
@@ -46,7 +46,10 @@ tests = [ testGroup "rubrics"
unlines
[ "foo"
, "==="]
- , "heading levels" =:
+ -- note: heading normalization is only done in standalone mode
+ , test (writeRST def{ writerStandalone = True,
+ writerTemplate = "$body$\n" } . toPandoc)
+ "heading levels" $
header 1 (text "Header 1") <>
header 3 (text "Header 2") <>
header 2 (text "Header 2") <>
@@ -75,7 +78,9 @@ tests = [ testGroup "rubrics"
, ""
, "Header 2"
, "--------"]
- , "minimal heading levels" =:
+ , test (writeRST def{ writerStandalone = True,
+ writerTemplate = "$body$\n" } . toPandoc)
+ "minimal heading levels" $
header 2 (text "Header 1") <>
header 3 (text "Header 2") <>
header 2 (text "Header 1") <>
@@ -84,21 +89,21 @@ tests = [ testGroup "rubrics"
header 3 (text "Header 2") =?>
unlines
[ "Header 1"
- , "--------"
+ , "========"
, ""
, "Header 2"
- , "~~~~~~~~"
+ , "--------"
, ""
, "Header 1"
- , "--------"
+ , "========"
, ""
, "Header 2"
- , "~~~~~~~~"
+ , "--------"
, ""
, "Header 3"
- , "^^^^^^^^"
+ , "~~~~~~~~"
, ""
, "Header 2"
- , "~~~~~~~~"]
+ , "--------"]
]
]