diff options
author | Igor Pashev <pashev.igor@gmail.com> | 2021-04-22 20:30:35 +0200 |
---|---|---|
committer | Igor Pashev <pashev.igor@gmail.com> | 2021-04-22 20:49:27 +0200 |
commit | 113479feb55e555a6a114cf6878f9a24c48b3347 (patch) | |
tree | 20d120caeea8f32e0ee94a04f415c30439a826f4 /src/Text/Pandoc | |
parent | d4710c262ffd694c25e2f9f40da80a621615d701 (diff) | |
download | pandoc-113479feb55e555a6a114cf6878f9a24c48b3347.tar.gz |
LaTeX->HTML: Automatically generate the TOC
Diffstat (limited to 'src/Text/Pandoc')
-rw-r--r-- | src/Text/Pandoc/Readers/LaTeX.hs | 1 | ||||
-rw-r--r-- | src/Text/Pandoc/Writers/HTML.hs | 18 |
2 files changed, 16 insertions, 3 deletions
diff --git a/src/Text/Pandoc/Readers/LaTeX.hs b/src/Text/Pandoc/Readers/LaTeX.hs index 493b8abac..7b942aed9 100644 --- a/src/Text/Pandoc/Readers/LaTeX.hs +++ b/src/Text/Pandoc/Readers/LaTeX.hs @@ -1549,6 +1549,7 @@ blockCommands = M.fromList <|> (grouped block >>= addMeta "title"))) , ("subtitle", mempty <$ (skipopts *> tok >>= addMeta "subtitle")) , ("author", mempty <$ (skipopts *> authors)) + , ("tableofcontents", mempty <$ (addMeta "tableOfContents" True)) -- -- in letter class, temp. store address & sig as title, author , ("address", mempty <$ (skipopts *> tok >>= addMeta "address")) , ("signature", mempty <$ (skipopts *> authors)) diff --git a/src/Text/Pandoc/Writers/HTML.hs b/src/Text/Pandoc/Writers/HTML.hs index c92131d5a..cba6b7d1c 100644 --- a/src/Text/Pandoc/Writers/HTML.hs +++ b/src/Text/Pandoc/Writers/HTML.hs @@ -28,6 +28,7 @@ module Text.Pandoc.Writers.HTML ( writeRevealJs, tagWithAttributes ) where +import Control.Monad.Identity (runIdentity) import Control.Monad.State.Strict import Data.Char (ord) import Data.List (intercalate, intersperse, partition, delete, (\\)) @@ -51,7 +52,7 @@ import Text.Pandoc.ImageSize import Text.Pandoc.Options import Text.Pandoc.Shared import Text.Pandoc.Slides -import Text.Pandoc.Templates (renderTemplate) +import Text.Pandoc.Templates (Template, compileTemplate, renderTemplate) import Text.Pandoc.Walk import Text.Pandoc.Writers.Math import Text.Pandoc.Writers.Shared @@ -203,10 +204,13 @@ writeHtmlString' :: PandocMonad m => WriterState -> WriterOptions -> Pandoc -> m Text writeHtmlString' st opts d = do (body, context) <- evalStateT (pandocToHtml opts d) st + let defaultTemplate = fmap (const tocTemplate) (getField "table-of-contents" context :: Maybe Text) + let template = msum [ writerTemplate opts + , defaultTemplate ] (if writerPreferAscii opts then toEntities else id) <$> - case writerTemplate opts of + case template of Nothing -> return $ renderHtml' body Just tpl -> do -- warn if empty lang @@ -239,6 +243,13 @@ writeHtml' st opts d = (body, _) <- evalStateT (pandocToHtml opts d) st return body +wantTOC :: Meta -> Maybe Bool +wantTOC = fmap (== MetaBool True) . lookupMeta "tableOfContents" + +tocTemplate :: Template Text +tocTemplate = either error id . runIdentity . compileTemplate "" $ + "<div class=\"toc\"><h1></h1>$table-of-contents$</div>$body$" + -- result is (title, authors, date, toc, body, new variables) pandocToHtml :: PandocMonad m => WriterOptions @@ -260,7 +271,8 @@ pandocToHtml opts (Pandoc meta blocks) = do if slideVariant == NoSlides then blocks else prepSlides slideLevel blocks - toc <- if writerTableOfContents opts && slideVariant /= S5Slides + let withTOC = fromMaybe (writerTableOfContents opts) (wantTOC meta) + toc <- if withTOC && slideVariant /= S5Slides then fmap renderHtml' <$> tableOfContents opts sects else return Nothing blocks' <- blockListToHtml opts sects |