diff options
-rw-r--r-- | MANUAL.txt | 15 | ||||
-rw-r--r-- | pandoc.hs | 15 | ||||
-rw-r--r-- | src/Text/Pandoc/Options.hs | 16 | ||||
-rw-r--r-- | src/Text/Pandoc/Writers/ConTeXt.hs | 17 | ||||
-rw-r--r-- | src/Text/Pandoc/Writers/Docbook.hs | 14 | ||||
-rw-r--r-- | src/Text/Pandoc/Writers/LaTeX.hs | 21 | ||||
-rw-r--r-- | src/Text/Pandoc/Writers/TEI.hs | 10 | ||||
-rw-r--r-- | tests/Tests/Writers/Docbook.hs | 28 | ||||
-rw-r--r-- | tests/Tests/Writers/LaTeX.hs | 39 |
9 files changed, 111 insertions, 64 deletions
diff --git a/MANUAL.txt b/MANUAL.txt index a2307bd01..9c926157c 100644 --- a/MANUAL.txt +++ b/MANUAL.txt @@ -684,17 +684,18 @@ Options affecting specific writers : Deprecated synonym for `--top-level-division=chapter`. -`--top-level-division=[section|chapter|part]` +`--top-level-division=[default|section|chapter|part]` : Treat top-level headers as the given division type in LaTeX, ConTeXt, DocBook, and TEI output. The hierarchy order is part, chapter, then section; all headers are shifted such that the top-level header becomes the specified - type. The default is `section`. When the LaTeX document class is set to - `report`, `book`, or `memoir` (unless the `article` option is specified), - `chapter` is implied as the setting for this option. If `beamer` is the - output format, specifying either `chapter` or `part` will cause top-level - headers to become `\part{..}`, while second-level headers remain as their - default type. + type. The default behavior is to determine the best division type via + heuristics: unless other conditions apply, `section` is chosen. When the + LaTeX document class is set to `report`, `book`, or `memoir` (unless the + `article` option is specified), `chapter` is implied as the setting for this + option. If `beamer` is the output format, specifying either `chapter` or + `part` will cause top-level headers to become `\part{..}`, while + second-level headers remain as their default type. `-N`, `--number-sections` @@ -181,7 +181,7 @@ data Opt = Opt , optHtmlQTags :: Bool -- ^ Use <q> tags in HTML , optHighlight :: Bool -- ^ Highlight source code , optHighlightStyle :: Style -- ^ Style to use for highlighted code - , optTopLevelDivision :: Maybe Division -- ^ Type of the top-level divisions + , optTopLevelDivision :: TopLevelDivision -- ^ Type of the top-level divisions , optHTMLMathMethod :: HTMLMathMethod -- ^ Method to print HTML math , optReferenceODT :: Maybe FilePath -- ^ Path of reference.odt , optReferenceDocx :: Maybe FilePath -- ^ Path of reference.docx @@ -246,7 +246,7 @@ defaultOpts = Opt , optHtmlQTags = False , optHighlight = True , optHighlightStyle = pygments - , optTopLevelDivision = Nothing + , optTopLevelDivision = TopLevelDefault , optHTMLMathMethod = PlainMath , optReferenceODT = Nothing , optReferenceDocx = Nothing @@ -598,14 +598,17 @@ options = (NoArg (\opt -> do warn $ "--chapters is deprecated. " ++ "Use --top-level-division=chapter instead." - return opt { optTopLevelDivision = Just Chapter })) + return opt { optTopLevelDivision = TopLevelChapter })) "" -- "Use chapter for top-level sections in LaTeX, DocBook" , Option "" ["top-level-division"] (ReqArg - (\arg opt -> case safeRead (uppercaseFirstLetter arg) of - Just dvsn -> return opt { optTopLevelDivision = Just dvsn } - _ -> err 76 "Top-level division must be section, chapter, or part") + (\arg opt -> do + let tldName = "TopLevel" ++ uppercaseFirstLetter arg + case safeRead tldName of + Just tlDiv -> return opt { optTopLevelDivision = tlDiv } + _ -> err 76 ("Top-level division must be " ++ + "section, chapter, part, or default")) "[section|chapter|part]") "" -- "Use top-level division type in LaTeX, ConTeXt, DocBook" diff --git a/src/Text/Pandoc/Options.hs b/src/Text/Pandoc/Options.hs index b890d1b9a..b02a5181f 100644 --- a/src/Text/Pandoc/Options.hs +++ b/src/Text/Pandoc/Options.hs @@ -43,7 +43,7 @@ module Text.Pandoc.Options ( Extension(..) , HTMLSlideVariant (..) , EPUBVersion (..) , WrapOption (..) - , Division (..) + , TopLevelDivision (..) , WriterOptions (..) , TrackChanges (..) , ReferenceLocation (..) @@ -341,10 +341,12 @@ data WrapOption = WrapAuto -- ^ Automatically wrap to width deriving (Show, Read, Eq, Data, Typeable, Generic) -- | Options defining the type of top-level headers. -data Division = Part -- ^ Top-level headers become parts - | Chapter -- ^ Top-level headers become chapters - | Section -- ^ Top-level headers become sections - deriving (Show, Read, Eq, Ord, Data, Typeable, Generic) +data TopLevelDivision = TopLevelPart -- ^ Top-level headers become parts + | TopLevelChapter -- ^ Top-level headers become chapters + | TopLevelSection -- ^ Top-level headers become sections + | TopLevelDefault -- ^ Top-level type is determined via + -- heuristics + deriving (Show, Read, Eq, Data, Typeable, Generic) -- | Locations for footnotes and references in markdown output data ReferenceLocation = EndOfBlock -- ^ End of block @@ -382,7 +384,7 @@ data WriterOptions = WriterOptions , writerHtmlQTags :: Bool -- ^ Use @<q>@ tags for quotes in HTML , writerBeamer :: Bool -- ^ Produce beamer LaTeX slide show , writerSlideLevel :: Maybe Int -- ^ Force header level of slides - , writerTopLevelDivision :: Maybe Division -- ^ Type of top-level divisions + , writerTopLevelDivision :: TopLevelDivision -- ^ Type of top-level divisions , writerListings :: Bool -- ^ Use listings package for code , writerHighlight :: Bool -- ^ Highlight source code , writerHighlightStyle :: Style -- ^ Style to use for highlighting @@ -430,7 +432,7 @@ instance Default WriterOptions where , writerHtmlQTags = False , writerBeamer = False , writerSlideLevel = Nothing - , writerTopLevelDivision = Nothing + , writerTopLevelDivision = TopLevelDefault , writerListings = False , writerHighlight = False , writerHighlightStyle = pygments diff --git a/src/Text/Pandoc/Writers/ConTeXt.hs b/src/Text/Pandoc/Writers/ConTeXt.hs index 8e6faefe2..70bed4961 100644 --- a/src/Text/Pandoc/Writers/ConTeXt.hs +++ b/src/Text/Pandoc/Writers/ConTeXt.hs @@ -37,7 +37,7 @@ import Text.Pandoc.Walk (query) import Text.Printf ( printf ) import Data.List ( intercalate, intersperse ) import Data.Char ( ord ) -import Data.Maybe ( catMaybes, fromMaybe ) +import Data.Maybe ( catMaybes ) import Control.Monad.State import Text.Pandoc.Pretty import Text.Pandoc.ImageSize @@ -85,9 +85,9 @@ pandocToConTeXt options (Pandoc meta blocks) = do $ defField "placelist" (intercalate ("," :: String) $ take (writerTOCDepth options + case writerTopLevelDivision options of - Just Part -> 0 - Just Chapter -> 0 - _ -> 1) + TopLevelPart -> 0 + TopLevelChapter -> 0 + _ -> 1) ["chapter","section","subsection","subsubsection", "subsubsubsection","subsubsubsubsection"]) $ defField "body" main @@ -423,10 +423,11 @@ sectionHeader (ident,classes,_) hdrLevel lst = do contents <- inlineListToConTeXt lst st <- get let opts = stOptions st - let level' = case fromMaybe Section (writerTopLevelDivision opts) of - Part -> hdrLevel - 2 - Chapter -> hdrLevel - 1 - Section -> hdrLevel + let level' = case writerTopLevelDivision opts of + TopLevelPart -> hdrLevel - 2 + TopLevelChapter -> hdrLevel - 1 + TopLevelSection -> hdrLevel + TopLevelDefault -> hdrLevel let ident' = toLabel ident let (section, chapter) = if "unnumbered" `elem` classes then (text "subject", text "title") diff --git a/src/Text/Pandoc/Writers/Docbook.hs b/src/Text/Pandoc/Writers/Docbook.hs index 6dc2c3a4b..278bbdcc8 100644 --- a/src/Text/Pandoc/Writers/Docbook.hs +++ b/src/Text/Pandoc/Writers/Docbook.hs @@ -39,7 +39,6 @@ import Text.Pandoc.Templates (renderTemplate') import Text.Pandoc.Readers.TeXMath import Data.List ( stripPrefix, isPrefixOf, intercalate, isSuffixOf ) import Data.Char ( toLower ) -import Data.Maybe ( fromMaybe, isNothing ) import Data.Monoid ( Any(..) ) import Text.Pandoc.Highlighting ( languages, languagesByExtension ) import Text.Pandoc.Pretty @@ -82,14 +81,15 @@ writeDocbook opts (Pandoc meta blocks) = else Nothing render' = render colwidth opts' = if ("/book>" `isSuffixOf` (trimr $ writerTemplate opts) && - isNothing (writerTopLevelDivision opts)) - then opts{ writerTopLevelDivision = Just Chapter } + TopLevelDefault == writerTopLevelDivision opts) + then opts{ writerTopLevelDivision = TopLevelChapter } else opts -- The numbering here follows LaTeX's internal numbering - startLvl = case fromMaybe Section (writerTopLevelDivision opts') of - Part -> -1 - Chapter -> 0 - Section -> 1 + startLvl = case writerTopLevelDivision opts' of + TopLevelPart -> -1 + TopLevelChapter -> 0 + TopLevelSection -> 1 + TopLevelDefault -> 1 auths' = map (authorToDocbook opts) $ docAuthors meta meta' = B.setMeta "author" auths' meta Just metadata = metaToJSON opts diff --git a/src/Text/Pandoc/Writers/LaTeX.hs b/src/Text/Pandoc/Writers/LaTeX.hs index 3657f3464..d9c9e3621 100644 --- a/src/Text/Pandoc/Writers/LaTeX.hs +++ b/src/Text/Pandoc/Writers/LaTeX.hs @@ -89,9 +89,9 @@ writeLaTeX options document = stUrl = False, stGraphics = False, stLHS = False, stBook = (case writerTopLevelDivision options of - Just Part -> True - Just Chapter -> True - _ -> False), + TopLevelPart -> True + TopLevelChapter -> True + _ -> False), stCsquotes = False, stHighlighting = False, stIncremental = writerIncremental options, stInternalLinks = [], stUsesEuro = False } @@ -763,15 +763,18 @@ sectionHeader unnumbered ident level lst = do <> braces (text plain)) book <- gets stBook opts <- gets stOptions - let topLevelDivision = fromMaybe (if book then Chapter else Section) - (writerTopLevelDivision opts) - let level' = if writerBeamer opts && topLevelDivision < Section + let topLevelDivision = if book && writerTopLevelDivision opts == TopLevelDefault + then TopLevelChapter + else writerTopLevelDivision opts + let level' = if writerBeamer opts && + topLevelDivision `elem` [TopLevelPart, TopLevelChapter] -- beamer has parts but no chapters then if level == 1 then -1 else level - 1 else case topLevelDivision of - Part -> level - 2 - Chapter -> level - 1 - Section -> level + TopLevelPart -> level - 2 + TopLevelChapter -> level - 1 + TopLevelSection -> level + TopLevelDefault -> level let sectionType = case level' of -1 -> "part" 0 -> "chapter" diff --git a/src/Text/Pandoc/Writers/TEI.hs b/src/Text/Pandoc/Writers/TEI.hs index 4b3a205a1..27f6898c3 100644 --- a/src/Text/Pandoc/Writers/TEI.hs +++ b/src/Text/Pandoc/Writers/TEI.hs @@ -36,7 +36,6 @@ import Text.Pandoc.Writers.Shared import Text.Pandoc.Options import Text.Pandoc.Templates (renderTemplate') import Data.List ( stripPrefix, isPrefixOf ) -import Data.Maybe ( fromMaybe ) import Data.Char ( toLower ) import Text.Pandoc.Highlighting ( languages, languagesByExtension ) import Text.Pandoc.Pretty @@ -61,10 +60,11 @@ writeTEI opts (Pandoc meta blocks) = then Just $ writerColumns opts else Nothing render' = render colwidth - startLvl = case fromMaybe Section (writerTopLevelDivision opts) of - Part -> -1 - Chapter -> 0 - Section -> 1 + startLvl = case writerTopLevelDivision opts of + TopLevelPart -> -1 + TopLevelChapter -> 0 + TopLevelSection -> 1 + TopLevelDefault -> 1 auths' = map (authorToTEI opts) $ docAuthors meta meta' = B.setMeta "author" auths' meta Just metadata = metaToJSON opts diff --git a/tests/Tests/Writers/Docbook.hs b/tests/Tests/Writers/Docbook.hs index f2a1e9d7b..a288242dc 100644 --- a/tests/Tests/Writers/Docbook.hs +++ b/tests/Tests/Writers/Docbook.hs @@ -236,11 +236,13 @@ tests = [ testGroup "line blocks" <> header 2 (text "header2") <> header 3 (text "header3") - docbookTopLevelDiv :: (ToPandoc a) => Division -> a -> String + docbookTopLevelDiv :: (ToPandoc a) + => TopLevelDivision -> a -> String docbookTopLevelDiv division = - docbookWithOpts def{ writerTopLevelDivision = Just division } + docbookWithOpts def{ writerTopLevelDivision = division } in - [ test (docbookTopLevelDiv Section) "sections as top-level" $ headers =?> + [ test (docbookTopLevelDiv TopLevelSection) "sections as top-level" $ + headers =?> unlines [ "<sect1>" , " <title>header1</title>" , " <sect2>" @@ -253,7 +255,8 @@ tests = [ testGroup "line blocks" , " </sect2>" , "</sect1>" ] - , test (docbookTopLevelDiv Chapter) "chapters as top-level" $ headers =?> + , test (docbookTopLevelDiv TopLevelChapter) "chapters as top-level" $ + headers =?> unlines [ "<chapter>" , " <title>header1</title>" , " <sect1>" @@ -266,7 +269,8 @@ tests = [ testGroup "line blocks" , " </sect1>" , "</chapter>" ] - , test (docbookTopLevelDiv Part) "parts as top-level" $ headers =?> + , test (docbookTopLevelDiv TopLevelPart) "parts as top-level" $ + headers =?> unlines [ "<part>" , " <title>header1</title>" , " <chapter>" @@ -279,6 +283,20 @@ tests = [ testGroup "line blocks" , " </chapter>" , "</part>" ] + , test (docbookTopLevelDiv TopLevelDefault) "default top-level" $ + headers =?> + unlines [ "<sect1>" + , " <title>header1</title>" + , " <sect2>" + , " <title>header2</title>" + , " <sect3>" + , " <title>header3</title>" + , " <para>" + , " </para>" + , " </sect3>" + , " </sect2>" + , "</sect1>" + ] ] ] ] diff --git a/tests/Tests/Writers/LaTeX.hs b/tests/Tests/Writers/LaTeX.hs index fb230e89a..d8bfa5924 100644 --- a/tests/Tests/Writers/LaTeX.hs +++ b/tests/Tests/Writers/LaTeX.hs @@ -88,45 +88,64 @@ tests = [ testGroup "code blocks" <> header 2 (text "header2") <> header 3 (text "header3") - latexTopLevelDiv :: (ToPandoc a) => Division -> a -> String + latexTopLevelDiv :: (ToPandoc a) => TopLevelDivision -> a -> String latexTopLevelDiv division = - latexWithOpts def{ writerTopLevelDivision = Just division } + latexWithOpts def{ writerTopLevelDivision = division } - beamerTopLevelDiv :: (ToPandoc a) => Division -> a -> String + beamerTopLevelDiv :: (ToPandoc a) + => TopLevelDivision -> a -> String beamerTopLevelDiv division = - latexWithOpts def { writerTopLevelDivision = Just division + latexWithOpts def { writerTopLevelDivision = division , writerBeamer = True } in - [ test (latexTopLevelDiv Section) "sections as top-level" $ headers =?> + [ test (latexTopLevelDiv TopLevelSection) + "sections as top-level" $ headers =?> unlines [ "\\section{header1}\n" , "\\subsection{header2}\n" , "\\subsubsection{header3}" ] - , test (latexTopLevelDiv Chapter) "chapters as top-level" $ headers =?> + , test (latexTopLevelDiv TopLevelChapter) + "chapters as top-level" $ headers =?> unlines [ "\\chapter{header1}\n" , "\\section{header2}\n" , "\\subsection{header3}" ] - , test (latexTopLevelDiv Part) "parts as top-level" $ headers =?> + , test (latexTopLevelDiv TopLevelPart) + "parts as top-level" $ headers =?> unlines [ "\\part{header1}\n" , "\\chapter{header2}\n" , "\\section{header3}" ] - , test (beamerTopLevelDiv Section) "sections as top-level in beamer" $ headers =?> + , test (latexTopLevelDiv TopLevelDefault) + "default top-level" $ headers =?> unlines [ "\\section{header1}\n" , "\\subsection{header2}\n" , "\\subsubsection{header3}" ] - , test (beamerTopLevelDiv Chapter) "chapters are as part in beamer" $ headers =?> + , test (beamerTopLevelDiv TopLevelSection) + "sections as top-level in beamer" $ headers =?> + unlines [ "\\section{header1}\n" + , "\\subsection{header2}\n" + , "\\subsubsection{header3}" + ] + , test (beamerTopLevelDiv TopLevelChapter) + "chapters are as part in beamer" $ headers =?> unlines [ "\\part{header1}\n" , "\\section{header2}\n" , "\\subsection{header3}" ] - , test (beamerTopLevelDiv Part) "parts as top-level in beamer" $ headers =?> + , test (beamerTopLevelDiv TopLevelPart) + "parts as top-level in beamer" $ headers =?> unlines [ "\\part{header1}\n" , "\\section{header2}\n" , "\\subsection{header3}" ] + , test (beamerTopLevelDiv TopLevelDefault) + "default top-level in beamer" $ headers =?> + unlines [ "\\section{header1}\n" + , "\\subsection{header2}\n" + , "\\subsubsection{header3}" + ] ] ] ] |