@@ -21,12 +21,13 @@ import Codec.Archive.Zip (Entry, addEntryToArchive, eRelativePath, emptyArchive,
2121import Control.Applicative ( (<|>) )
2222import Control.Monad (mplus, unless, when, zipWithM)
2323import Control.Monad.Except (catchError, throwError)
24−import Control.Monad.State.Strict (State, StateT, evalState, evalStateT, get,
25− gets, lift, modify, put)
24+import Control.Monad.State.Strict (StateT, evalState, evalStateT, get,
25+ gets, lift, modify)
2626import qualified Data.ByteString.Lazy as B
2727import qualified Data.ByteString.Lazy.Char8 as B8
2828import Data.Char (isAlphaNum, isAscii, isDigit, toLower)
2929import Data.List (isInfixOf, isPrefixOf)
30+import Data.List.Split (splitWhen)
3031import qualified Data.Map as M
3132import Data.Maybe (fromMaybe, isNothing, mapMaybe, isJust)
3233import qualified Data.Set as Set
@@ -513,38 +514,24 @@ pandocToEPUB version opts doc = do
513514
514515 let chapterHeaderLevel = writerEpubChapterLevel opts
515516
516− let isChapterHeader (Header n _ _) = n <= chapterHeaderLevel
517− isChapterHeader (Div ("refs",_,_) (Header n _ _:_)) =
518− n <= chapterHeaderLevel
517+ let isChapterHeader (Div _ (Header n _ _:_)) = n <= chapterHeaderLevel
519518 isChapterHeader _ = False
520519
521− let toChapters :: [Block] -> State [Int] [Chapter]
522− toChapters [] = return []
523− toChapters (Div _ bs@(Header 1 _ _:_) : rest) =
524− toChapters (bs ++ rest)
525− toChapters (Header n (ident,classes,kvs) ils : bs) = do
526− nums <- get
527− mbnum <- if "unnumbered" `elem` classes
528− then return Nothing
529− else case splitAt (n - 1) nums of
530− (ks, m:_) -> do
531− let nums' = ks ++ [m+1]
532− put nums'
533− return $ Just (ks ++ [m])
534− -- note, this is the offset not the sec number
535− (ks, []) -> do
536− let nums' = ks ++ [1]
537− put nums'
538− return $ Just ks
539− let (xs,ys) = break isChapterHeader bs
540− (Chapter mbnum
541− (Header n (ident,"chapter-title":classes,kvs) ils : xs) :) <$>
542− toChapters ys
543− toChapters (b:bs) = do
544− let (xs,ys) = break isChapterHeader bs
545− (Chapter Nothing (b:xs) :) <$> toChapters ys
546−
547− let chapters' = evalState (toChapters blocks') []
520+ let secsToChapters :: [Block] -> [Chapter]
521+ secsToChapters [] = []
522+ secsToChapters (d@(Div (_,"section":_,_) bs) : rest)
523+ | isChapterHeader d =
524+ Chapter mbnum [d] : secsToChapters rest
525+ where mbnum = case bs of
526+ (Header _ (_,_,kvs) _ : _) ->
527+ map (fromMaybe 0 . safeRead) .
528+ splitWhen (=='.') <$> lookup "number" kvs
529+ _ -> Nothing
530+ secsToChapters bs =
531+ Chapter Nothing xs : secsToChapters ys
532+ where (xs, ys) = break isChapterHeader bs
533+
534+ let chapters' = secsToChapters $ makeSections True Nothing blocks'
548535
549536 let extractLinkURL' :: Int -> Inline -> [(String, String)]
550537 extractLinkURL' num (Span (ident, _, _) _)
@@ -576,11 +563,11 @@ pandocToEPUB version opts doc = do
576563 Chapter mbnum $ walk fixInternalReferences bs)
577564 chapters'
578565
579− let chapToEntry num (Chapter mbnum bs) =
566+ let chapToEntry num (Chapter _ bs) =
580567 mkEntry ("text/" ++ showChapter num) =<<
581− writeHtml opts'{ writerNumberOffset = fromMaybe [] mbnum
582− , writerVariables = ("body-type", bodyType) :
583− cssvars True ++ vars } pdoc
568+ writeHtml opts'{ writerVariables = ("body-type", bodyType) :
569+ ("pagetitle", showChapter num) :
570+ cssvars True ++ vars } pdoc
584571 where (pdoc, bodyType) =
585572 case bs of
586573 (Header _ (_,_,kvs) xs : _) ->