Blame src/Text/Pandoc/Slides.hs

Packit Service d2f85f
{-
Packit Service d2f85f
Copyright (C) 2012-2017 John MacFarlane <jgm@berkeley.edu>
Packit Service d2f85f
Packit Service d2f85f
This program is free software; you can redistribute it and/or modify
Packit Service d2f85f
it under the terms of the GNU General Public License as published by
Packit Service d2f85f
the Free Software Foundation; either version 2 of the License, or
Packit Service d2f85f
(at your option) any later version.
Packit Service d2f85f
Packit Service d2f85f
This program is distributed in the hope that it will be useful,
Packit Service d2f85f
but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service d2f85f
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service d2f85f
GNU General Public License for more details.
Packit Service d2f85f
Packit Service d2f85f
You should have received a copy of the GNU General Public License
Packit Service d2f85f
along with this program; if not, write to the Free Software
Packit Service d2f85f
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
Packit Service d2f85f
-}
Packit Service d2f85f
Packit Service d2f85f
{- |
Packit Service d2f85f
   Module      : Text.Pandoc.Slides
Packit Service d2f85f
   Copyright   : Copyright (C) 2012-2017 John MacFarlane
Packit Service d2f85f
   License     : GNU GPL, version 2 or above
Packit Service d2f85f
Packit Service d2f85f
   Maintainer  : John MacFarlane <jgm@berkeley.edu>
Packit Service d2f85f
   Stability   : alpha
Packit Service d2f85f
   Portability : portable
Packit Service d2f85f
Packit Service d2f85f
Utility functions for splitting documents into slides for slide
Packit Service d2f85f
show formats (dzslides, revealjs, s5, slidy, slideous, beamer).
Packit Service d2f85f
-}
Packit Service d2f85f
module Text.Pandoc.Slides ( getSlideLevel, prepSlides ) where
Packit Service d2f85f
import Text.Pandoc.Definition
Packit Service d2f85f
Packit Service d2f85f
-- | Find level of header that starts slides (defined as the least header
Packit Service d2f85f
-- level that occurs before a non-header/non-hrule in the blocks).
Packit Service d2f85f
getSlideLevel :: [Block] -> Int
Packit Service d2f85f
getSlideLevel = go 6
Packit Service d2f85f
  where go least (Header n _ _ : x : xs)
Packit Service d2f85f
                 | n < least && nonHOrHR x = go n xs
Packit Service d2f85f
                 | otherwise               = go least (x:xs)
Packit Service d2f85f
        go least (_ : xs) = go least xs
Packit Service d2f85f
        go least [] = least
Packit Service d2f85f
        nonHOrHR Header{}       = False
Packit Service d2f85f
        nonHOrHR HorizontalRule = False
Packit Service d2f85f
        nonHOrHR _              = True
Packit Service d2f85f
Packit Service d2f85f
-- | Prepare a block list to be passed to hierarchicalize.
Packit Service d2f85f
prepSlides :: Int -> [Block] -> [Block]
Packit Service d2f85f
prepSlides slideLevel = ensureStartWithH . splitHrule . extractRefsHeader
Packit Service d2f85f
  where splitHrule (HorizontalRule : Header n attr xs : ys)
Packit Service d2f85f
                       | n == slideLevel = Header slideLevel attr xs : splitHrule ys
Packit Service d2f85f
        splitHrule (HorizontalRule : xs) = Header slideLevel nullAttr [Str "\0"] :
Packit Service d2f85f
                                           splitHrule xs
Packit Service d2f85f
        splitHrule (x : xs)              = x : splitHrule xs
Packit Service d2f85f
        splitHrule []                    = []
Packit Service d2f85f
        extractRefsHeader bs             =
Packit Service d2f85f
          case reverse bs of
Packit Service d2f85f
               (Div ("",["references"],[]) (Header n attrs xs : ys) : zs)
Packit Service d2f85f
                 -> reverse zs ++ (Header n attrs xs : [Div ("",["references"],[]) ys])
Packit Service d2f85f
               _ -> bs
Packit Service d2f85f
        ensureStartWithH bs@(Header n _ _:_)
Packit Service d2f85f
                       | n <= slideLevel = bs
Packit Service d2f85f
        ensureStartWithH bs              = Header slideLevel nullAttr [Str "\0"] : bs