summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikolay Yakimov <root@livid.pp.ru>2015-09-19 17:45:54 +0300
committerNikolay Yakimov <root@livid.pp.ru>2015-09-19 17:45:54 +0300
commit5788f62ef55f59d00f5fae7f309cd5d1b349d8f8 (patch)
tree74fa7b28f33a0b5194fb298433f8cb6864bea4b7
parent4d49f76dbb8f51db5fd2527c3ef779996bf8936f (diff)
[RST Writer] Don't normalize heading levels below input minimum
-rw-r--r--src/Text/Pandoc/Writers/RST.hs8
-rw-r--r--tests/Tests/Writers/RST.hs25
2 files changed, 32 insertions, 1 deletions
diff --git a/src/Text/Pandoc/Writers/RST.hs b/src/Text/Pandoc/Writers/RST.hs
index fae908f30..754aee29c 100644
--- a/src/Text/Pandoc/Writers/RST.hs
+++ b/src/Text/Pandoc/Writers/RST.hs
@@ -81,7 +81,8 @@ pandocToRST (Pandoc meta blocks) = do
(fmap (render colwidth) . blockListToRST)
(fmap (trimr . render colwidth) . inlineListToRST)
$ deleteMeta "title" $ deleteMeta "subtitle" meta
- body <- blockListToRST' True $ normalizeHeadings 1 blocks
+ let minLev = findMinHeadingLevel Nothing blocks
+ body <- blockListToRST' True $ normalizeHeadings minLev 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
@@ -107,6 +108,11 @@ pandocToRST (Pandoc meta blocks) = do
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 2a511782f..bb7b2a446 100644
--- a/tests/Tests/Writers/RST.hs
+++ b/tests/Tests/Writers/RST.hs
@@ -75,5 +75,30 @@ tests = [ testGroup "rubrics"
, ""
, "Header 2"
, "--------"]
+ , "minimal heading levels" =:
+ header 2 (text "Header 1") <>
+ header 3 (text "Header 2") <>
+ header 2 (text "Header 1") <>
+ header 4 (text "Header 2") <>
+ header 5 (text "Header 3") <>
+ header 3 (text "Header 2") =?>
+ unlines
+ [ "Header 1"
+ , "--------"
+ , ""
+ , "Header 2"
+ , "~~~~~~~~"
+ , ""
+ , "Header 1"
+ , "--------"
+ , ""
+ , "Header 2"
+ , "~~~~~~~~"
+ , ""
+ , "Header 3"
+ , "^^^^^^^^"
+ , ""
+ , "Header 2"
+ , "~~~~~~~~"]
]
]