git.iko.soy/typeable/pandoc
on master help sign in
EPUB writer: improve splitting into chapters.

+ Use makeSection from T.P.Shared. This deals better with embedded divs. (Closes #5761.) + Remove chapter-title class from chapter h1, for now. (Reverts one change made earlier; we may revisit this in light of #5749.) + Avoid issuing warning multiple times when title not set (see #5760).

commit8408e584742ae5e3c6e3d752501992fe604ab7c5 authorJohn MacFarlane <jgm@berkeley.edu> dateThu 19 Sep 2019, 18:08 (7 years ago) parent5a85789
2 files changed+29−39
src/Text/Pandoc/Shared.hs+6−3 src/Text/Pandoc/Writers/EPUB.hs+23−36
src/Text/Pandoc/Shared.hs+6−3
@@ -510,9 +510,12 @@ makeSections numbering mbBaseLevel bs =
510510 S.modify $ \(_, ln) -> (mbLevel, ln)
511511 rest' <- go rest
512512 let divattr = (ident, ["section"], [])
513− let attr = ("",classes,kvs ++
514− [("number", intercalate "." (map show newnum))
515− | numbering])
513+ let attr = ("",classes,
514+ -- don't touch number if already present
515+ case lookup "number" kvs of
516+ Nothing | numbering ->
517+ ("number", intercalate "." (map show newnum)) : kvs
518+ _ -> kvs)
516519 return $
517520 Div divattr (Header level' attr title' : sectionContents') : rest'
518521 go (Div (dident,dclasses,dkvs)
src/Text/Pandoc/Writers/EPUB.hs+23−36
@@ -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 : _) ->