git.iko.soy/typeable/pandoc
on master help sign in
Shared.hierarchicalize: Don't number subsections of unnumbered sections.

They were previously numbered, starting from the previous numbered section, which was wrong.

commit2a46042661a088096ac54097db5cd3674438bb63 authorJohn MacFarlane <jgm@berkeley.edu> dateMon 21 Jul 2014, 12:35 (12 years ago) parent3670dda
1 file changed+25−18
src/Text/Pandoc/Shared.hs+25−18
src/Text/Pandoc/Shared.hs+25−18
@@ -105,7 +105,7 @@ import System.FilePath ( (</>), takeExtension, dropExtension )
105105import Data.Generics (Typeable, Data)
106106import qualified Control.Monad.State as S
107107import qualified Control.Exception as E
108−import Control.Monad (msum, unless)
108+import Control.Monad (msum)
109109import Text.Pandoc.Pretty (charWidth)
110110import System.Locale (defaultTimeLocale)
111111import Data.Time
@@ -615,25 +615,32 @@ inlineListToIdentifier =
615615
616616-- | Convert list of Pandoc blocks into (hierarchical) list of Elements
617617hierarchicalize :: [Block] -> [Element]
618−hierarchicalize blocks = S.evalState (hierarchicalizeWithIds blocks) []
619−
620−hierarchicalizeWithIds :: [Block] -> S.State [Int] [Element]
621−hierarchicalizeWithIds [] = return []
622−hierarchicalizeWithIds ((Header level attr@(_,classes,_) title'):xs) = do
623− lastnum <- S.get
624− let lastnum' = take level lastnum
625− let newnum = case length lastnum' of
626− x | "unnumbered" `elem` classes -> []
627− | x >= level -> init lastnum' ++ [last lastnum' + 1]
628− | otherwise -> lastnum ++
629− replicate (level - length lastnum - 1) 0 ++ [1]
630− unless (null newnum) $ S.put newnum
618+hierarchicalize blocks = S.evalState (hierarchicalizeWithIds True blocks) []
619+
620+hierarchicalizeWithIds :: Bool -> [Block] -> S.State [Int] [Element]
621+hierarchicalizeWithIds _ [] = return []
622+hierarchicalizeWithIds number ((Header level attr@(_,classes,_) title'):xs) = do
623+ let number' = number && "unnumbered" `notElem` classes
624+ newnum <- if number'
625+ then do
626+ lastnum <- S.get
627+ let lastnum' = take level lastnum
628+ let n = case length lastnum' of
629+ x | x >= level -> init lastnum' ++
630+ [last lastnum' + 1]
631+ | otherwise -> lastnum ++
632+ replicate (level -
633+ length lastnum - 1) 0 ++ [1]
634+ S.put n
635+ return n
636+ else return []
631637 let (sectionContents, rest) = break (headerLtEq level) xs
632− sectionContents' <- hierarchicalizeWithIds sectionContents
633− rest' <- hierarchicalizeWithIds rest
638+ -- ensure that subsections of an unnumbered section aren't numbered
639+ sectionContents' <- hierarchicalizeWithIds number' sectionContents
640+ rest' <- hierarchicalizeWithIds number rest
634641 return $ Sec level newnum attr title' sectionContents' : rest'
635−hierarchicalizeWithIds (x:rest) = do
636− rest' <- hierarchicalizeWithIds rest
642+hierarchicalizeWithIds number (x:rest) = do
643+ rest' <- hierarchicalizeWithIds number rest
637644 return $ (Blk x) : rest'
638645
639646headerLtEq :: Int -> Block -> Bool