git.iko.soy/typeable/pandoc
on master help sign in
Bug fixes to EPUB chapter splitting.
6d4b35dJohn MacFarlane
src/Text/Pandoc/Writers/EPUB.hs+16−15
@@ -61,6 +61,7 @@ import Text.Pandoc.XML (escapeStringForXML)
61
61
62-- A Chapter includes a list of blocks.
62-- A Chapter includes a list of blocks.
63data Chapter = Chapter [Block]
63data Chapter = Chapter [Block]
64+ deriving (Show)
64
65
65data EPUBState = EPUBState {
66data EPUBState = EPUBState {
66 stMediaPaths :: [(FilePath, (FilePath, Maybe Entry))]
67 stMediaPaths :: [(FilePath, (FilePath, Maybe Entry))]
@@ -501,13 +502,6 @@ pandocToEPUB version opts doc = do
501
502
502 -- body pages
503 -- body pages
503
504
504− -- add level 1 header to beginning if none there
505− let blocks' = addIdentifiers opts
506− $ case blocks of
507− (Header 1 _ _ : _) -> blocks
508− _ -> Header 1 ("",["unnumbered"],[])
509− (docTitle' meta) : blocks
510−
511 let chapterHeaderLevel = writerEpubChapterLevel opts
505 let chapterHeaderLevel = writerEpubChapterLevel opts
512
506
513 let isChapterHeader (Div _ (Header n _ _:_)) = n <= chapterHeaderLevel
507 let isChapterHeader (Div _ (Header n _ _:_)) = n <= chapterHeaderLevel
@@ -515,19 +509,28 @@ pandocToEPUB version opts doc = do
515
509
516 let secsToChapters :: [Block] -> [Chapter]
510 let secsToChapters :: [Block] -> [Chapter]
517 secsToChapters [] = []
511 secsToChapters [] = []
518− secsToChapters (d@(Div attr@(_,"section":_,_)
519− (h@(Header lvl _ _) : bs)) : rest)
512+ secsToChapters (d@(Div attr (h@(Header lvl _ _) : bs)) : rest)
520 | chapterHeaderLevel == lvl =
513 | chapterHeaderLevel == lvl =
521− Chapter [d] : secsToChapters rest
514+ Chapter [d] : secsToChapters rest
522 | chapterHeaderLevel > lvl =
515 | chapterHeaderLevel > lvl =
523 Chapter [Div attr (h:xs)] :
516 Chapter [Div attr (h:xs)] :
524 secsToChapters ys ++ secsToChapters rest
517 secsToChapters ys ++ secsToChapters rest
525 where (xs, ys) = break isChapterHeader bs
518 where (xs, ys) = break isChapterHeader bs
526 secsToChapters bs =
519 secsToChapters bs =
527− Chapter xs : secsToChapters ys
520+ (if null xs then id else (Chapter xs :)) $ secsToChapters ys
528 where (xs, ys) = break isChapterHeader bs
521 where (xs, ys) = break isChapterHeader bs
529
522
523+ -- add level 1 header to beginning if none there
530− let chapters' = secsToChapters $ makeSections True Nothing blocks'
524+ let secs = makeSections True Nothing
525+ $ addIdentifiers opts
526+ $ case blocks of
527+ (Div _
528+ (Header{}:_) : _) -> blocks
529+ (Header 1 _ _ : _) -> blocks
530+ _ -> Header 1 ("",["unnumbered"],[])
531+ (docTitle' meta) : blocks
532+
533+ let chapters' = secsToChapters secs
531
534
532 let extractLinkURL' :: Int -> Inline -> [(String, String)]
535 let extractLinkURL' :: Int -> Inline -> [(String, String)]
533 extractLinkURL' num (Span (ident, _, _) _)
536 extractLinkURL' num (Span (ident, _, _) _)
@@ -696,14 +699,12 @@ pandocToEPUB version opts doc = do
696 contentsEntry <- mkEntry "content.opf" contentsData
699 contentsEntry <- mkEntry "content.opf" contentsData
697
700
698 -- toc.ncx
701 -- toc.ncx
699− let secs = makeSections True (Just 1) blocks'
700−
701 let tocLevel = writerTOCDepth opts
702 let tocLevel = writerTOCDepth opts
702
703
703 let navPointNode :: PandocMonad m
704 let navPointNode :: PandocMonad m
704 => (Int -> [Inline] -> String -> [Element] -> Element)
705 => (Int -> [Inline] -> String -> [Element] -> Element)
705 -> Block -> StateT Int m [Element]
706 -> Block -> StateT Int m [Element]
706− navPointNode formatter (Div (ident,"section":_,_)
707+ navPointNode formatter (Div (ident,_,_)
707 (Header lvl (_,_,kvs) ils : children)) = do
708 (Header lvl (_,_,kvs) ils : children)) = do
708 if lvl > tocLevel
709 if lvl > tocLevel
709 then return []
710 then return []