aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn MacFarlane <jgm@berkeley.edu>2014-07-21 12:35:11 -0700
committerJohn MacFarlane <jgm@berkeley.edu>2014-07-21 12:35:11 -0700
commit2a46042661a088096ac54097db5cd3674438bb63 (patch)
tree6b4a6bafbc7521d3d6b48d27e7374f35c2a26373
parent3670dda17c39fa9803851eba05add208c346c413 (diff)
downloadpandoc-2a46042661a088096ac54097db5cd3674438bb63.tar.gz
Shared.hierarchicalize: Don't number subsections of unnumbered sections.
They were previously numbered, starting from the previous numbered section, which was wrong.
-rw-r--r--src/Text/Pandoc/Shared.hs43
1 files changed, 25 insertions, 18 deletions
diff --git a/src/Text/Pandoc/Shared.hs b/src/Text/Pandoc/Shared.hs
index bb13836f2..866fec674 100644
--- a/src/Text/Pandoc/Shared.hs
+++ b/src/Text/Pandoc/Shared.hs
@@ -105,7 +105,7 @@ import System.FilePath ( (</>), takeExtension, dropExtension )
import Data.Generics (Typeable, Data)
import qualified Control.Monad.State as S
import qualified Control.Exception as E
-import Control.Monad (msum, unless)
+import Control.Monad (msum)
import Text.Pandoc.Pretty (charWidth)
import System.Locale (defaultTimeLocale)
import Data.Time
@@ -615,25 +615,32 @@ inlineListToIdentifier =
-- | Convert list of Pandoc blocks into (hierarchical) list of Elements
hierarchicalize :: [Block] -> [Element]
-hierarchicalize blocks = S.evalState (hierarchicalizeWithIds blocks) []
-
-hierarchicalizeWithIds :: [Block] -> S.State [Int] [Element]
-hierarchicalizeWithIds [] = return []
-hierarchicalizeWithIds ((Header level attr@(_,classes,_) title'):xs) = do
- lastnum <- S.get
- let lastnum' = take level lastnum
- let newnum = case length lastnum' of
- x | "unnumbered" `elem` classes -> []
- | x >= level -> init lastnum' ++ [last lastnum' + 1]
- | otherwise -> lastnum ++
- replicate (level - length lastnum - 1) 0 ++ [1]
- unless (null newnum) $ S.put newnum
+hierarchicalize blocks = S.evalState (hierarchicalizeWithIds True blocks) []
+
+hierarchicalizeWithIds :: Bool -> [Block] -> S.State [Int] [Element]
+hierarchicalizeWithIds _ [] = return []
+hierarchicalizeWithIds number ((Header level attr@(_,classes,_) title'):xs) = do
+ let number' = number && "unnumbered" `notElem` classes
+ newnum <- if number'
+ then do
+ lastnum <- S.get
+ let lastnum' = take level lastnum
+ let n = case length lastnum' of
+ x | x >= level -> init lastnum' ++
+ [last lastnum' + 1]
+ | otherwise -> lastnum ++
+ replicate (level -
+ length lastnum - 1) 0 ++ [1]
+ S.put n
+ return n
+ else return []
let (sectionContents, rest) = break (headerLtEq level) xs
- sectionContents' <- hierarchicalizeWithIds sectionContents
- rest' <- hierarchicalizeWithIds rest
+ -- ensure that subsections of an unnumbered section aren't numbered
+ sectionContents' <- hierarchicalizeWithIds number' sectionContents
+ rest' <- hierarchicalizeWithIds number rest
return $ Sec level newnum attr title' sectionContents' : rest'
-hierarchicalizeWithIds (x:rest) = do
- rest' <- hierarchicalizeWithIds rest
+hierarchicalizeWithIds number (x:rest) = do
+ rest' <- hierarchicalizeWithIds number rest
return $ (Blk x) : rest'
headerLtEq :: Int -> Block -> Bool