aboutsummaryrefslogtreecommitdiff
path: root/src/Text
diff options
context:
space:
mode:
authorJohn MacFarlane <fiddlosopher@gmail.com>2013-01-04 22:29:41 -0800
committerJohn MacFarlane <fiddlosopher@gmail.com>2013-01-04 22:29:41 -0800
commit30361308e7913eb82eb5e6f0cb7339153bd4ea32 (patch)
treead5219ae12bd2095a8f254573cff3d956b8bb281 /src/Text
parent1d16349f38a39db9831cc852d4388e98a3086d49 (diff)
downloadpandoc-30361308e7913eb82eb5e6f0cb7339153bd4ea32.tar.gz
Added `--epub-chapter-level` and `--epub-toc-level` options.
Also added writerEpubChapterLevel and writerEpubTOCLevel fields to WriterOptions.
Diffstat (limited to 'src/Text')
-rw-r--r--src/Text/Pandoc/Options.hs4
-rw-r--r--src/Text/Pandoc/Writers/EPUB.hs24
2 files changed, 17 insertions, 11 deletions
diff --git a/src/Text/Pandoc/Options.hs b/src/Text/Pandoc/Options.hs
index 86b1f5b99..0424b434f 100644
--- a/src/Text/Pandoc/Options.hs
+++ b/src/Text/Pandoc/Options.hs
@@ -237,6 +237,8 @@ data WriterOptions = WriterOptions
, writerTeXLigatures :: Bool -- ^ Use tex ligatures quotes, dashes in latex
, writerEpubStylesheet :: Maybe String -- ^ EPUB stylesheet specified at command line
, writerEpubFonts :: [FilePath] -- ^ Paths to fonts to embed
+ , writerEpubChapterLevel :: Int -- ^ Header level for chapters (separate files)
+ , writerEpubTOCLevel :: Int -- ^ Number of levels to include in TOC
, writerReferenceODT :: Maybe FilePath -- ^ Path to reference ODT if specified
, writerReferenceDocx :: Maybe FilePath -- ^ Ptah to reference DOCX if specified
} deriving Show
@@ -275,6 +277,8 @@ instance Default WriterOptions where
, writerTeXLigatures = True
, writerEpubStylesheet = Nothing
, writerEpubFonts = []
+ , writerEpubChapterLevel = 1
+ , writerEpubTOCLevel = 3
, writerReferenceODT = Nothing
, writerReferenceDocx = Nothing
}
diff --git a/src/Text/Pandoc/Writers/EPUB.hs b/src/Text/Pandoc/Writers/EPUB.hs
index 5d3325ba9..024823b38 100644
--- a/src/Text/Pandoc/Writers/EPUB.hs
+++ b/src/Text/Pandoc/Writers/EPUB.hs
@@ -60,9 +60,6 @@ import Text.Blaze.Html.Renderer.Utf8 (renderHtml)
data EPUBVersion = EPUB2 | EPUB3 deriving Eq
--- TODO - make an option
-chapterHeaderLevel = 1
-
writeEPUB2, writeEPUB3 :: WriterOptions -- ^ Writer options
-> Pandoc -- ^ Document to convert
-> IO B.ByteString
@@ -133,10 +130,12 @@ writeEPUB version opts doc@(Pandoc meta _) = do
(Header 1 _ : _) -> blocks
_ -> Header 1 (docTitle meta) : blocks
+ let chapterHeaderLevel = writerEpubChapterLevel opts
+
-- internal reference IDs change when we chunk the file,
-- so that '#my-header-1' might turn into 'chap004.xhtml#my-header'.
-- the next two lines fix that:
- let reftable = correlateRefs blocks'
+ let reftable = correlateRefs chapterHeaderLevel blocks'
let blocks'' = replaceRefs reftable blocks'
let isChapterHeader (Header n _) = n <= chapterHeaderLevel
@@ -230,6 +229,8 @@ writeEPUB version opts doc@(Pandoc meta _) = do
-- toc.ncx
let secs = hierarchicalize blocks''
+ let tocLevel = writerEpubTOCLevel opts
+
let navPointNode :: (Int -> String -> String -> [Element] -> Element)
-> Shared.Element -> State Int Element
navPointNode formatter (Sec _ nums ident ils children) = do
@@ -244,7 +245,7 @@ writeEPUB version opts doc@(Pandoc meta _) = do
let src = case lookup ident reftable of
Just x -> x
Nothing -> error (ident ++ " not found in reftable")
- let isSec (Sec lev _ _ _ _) = lev <= 3 -- only includes levels 1-3
+ let isSec (Sec lev _ _ _ _) = lev <= tocLevel
isSec _ = False
let subsecs = filter isSec children
subs <- mapM (navPointNode formatter) subsecs
@@ -443,12 +444,13 @@ showChapter = printf "ch%03d.xhtml"
-- that would be used in a normal pandoc document with
-- new URLs to be used in the EPUB. For example, what
-- was "header-1" might turn into "ch006.xhtml#header".
-correlateRefs :: [Block] -> [(String,String)]
-correlateRefs bs = identTable $ execState (mapM_ go bs)
- IdentState{ chapterNumber = 0
- , runningIdents = []
- , chapterIdents = []
- , identTable = [] }
+correlateRefs :: Int -> [Block] -> [(String,String)]
+correlateRefs chapterHeaderLevel bs =
+ identTable $ execState (mapM_ go bs)
+ IdentState{ chapterNumber = 0
+ , runningIdents = []
+ , chapterIdents = []
+ , identTable = [] }
where go :: Block -> State IdentState ()
go (Header n ils) = do
when (n <= chapterHeaderLevel) $