module Control.Monad.Takahashi.Slide
( BlockOption(..)
, fontColor, bgColor, frameColor, frameStyle
, SlideOption(..)
, slideTitle, slideFontSize, titleOption, codeOption
, contentsOption, contentsOption2, annotationOption, blockFontSize
, defaultSlideOption
, Taka(..)
, buildTakahashi
, writeSlideWithTemplate
, writeSlide
, runTakahashi
, showTakahashi
, makeSlideWithTemplate
, makeSlide
, makeTitleStyle
, makeContentsStyle
, makeContentsStyle2
, makeAnnotationStyle
, makeCodeStyle
, contents
, central
, Contents(..)
, bindPage
) where
import Control.Lens
import Control.Monad.RWS
import Data.List
import Paths_takahashi
import Control.Monad.Takahashi.Monad
import Control.Monad.Takahashi.HtmlBuilder
import Control.Monad.Takahashi.Util
import Control.Monad.Operational
data BlockOption = BlockOption
{ _fontColor :: Maybe Color
, _bgColor :: Maybe Color
, _frameColor :: Maybe Color
, _frameStyle :: Maybe BorderStyle
, _blockFontSize :: Maybe Int
} deriving (Show, Read, Eq, Ord)
data SlideOption = SlideOption
{ _slideTitle :: String
, _slideFontSize :: Maybe Int
, _titleOption :: BlockOption
, _contentsOption :: BlockOption
, _contentsOption2 :: BlockOption
, _annotationOption :: BlockOption
, _codeOption :: BlockOption
} deriving (Show, Read, Eq, Ord)
makeLenses ''BlockOption
makeLenses ''SlideOption
defaultSlideOption :: SlideOption
defaultSlideOption = SlideOption
{ _slideTitle = ""
, _slideFontSize = Nothing
, _titleOption = BlockOption
{ _fontColor = Just $ Color 0 0 80
, _bgColor = Just $ Color 100 100 255
, _frameColor = Just $ Color 0 0 80
, _frameStyle = Just BorderSolid
, _blockFontSize = Nothing
}
, _contentsOption = BlockOption
{ _fontColor = Just $ Color 0 0 80
, _bgColor = Just $ Color 200 200 255
, _frameColor = Just $ Color 255 255 255
, _frameStyle = Just BorderSolid
, _blockFontSize = Nothing
}
, _contentsOption2 = BlockOption
{ _fontColor = Just $ Color 80 0 0
, _bgColor = Just $ Color 255 200 200
, _frameColor = Just $ Color 255 255 255
, _frameStyle = Just BorderSolid
, _blockFontSize = Nothing
}
, _annotationOption = BlockOption
{ _fontColor = Just $ Color 255 0 0
, _bgColor = Nothing
, _frameColor = Just $ Color 255 255 255
, _frameStyle = Nothing
, _blockFontSize = Nothing
}
, _codeOption = BlockOption
{ _fontColor = Just $ Color 0 0 80
, _bgColor = Nothing
, _frameColor = Just $ Color 0 0 80
, _frameStyle = Just BorderDouble
, _blockFontSize = Nothing
}
}
type TakahashiRWS a = RWS () Html SlideOption a
type Taka a = Takahashi SlideOption a
buildTakahashi :: Taka a -> TakahashiRWS a
buildTakahashi t = interpret advent t
where
advent :: TakahashiBase SlideOption a -> TakahashiRWS a
advent GetSlideOption = get
advent (PutSlideOption o) = put o
advent (Slide t) = do
style <- mkStyle
tell $ Div Nothing (Just "pages") (Just style) (runBuildHtml t) Emp
mkStyle :: TakahashiRWS Style
mkStyle = do
option <- get
return . execMakeStyle defaultStyle $ do
font.fontSize .= option^.slideFontSize
runTakahashi :: Taka a -> Html
runTakahashi t = snd $ execRWS (buildTakahashi t) () defaultSlideOption
showTakahashi :: Taka a -> String
showTakahashi = showHtml . runTakahashi
makeSlideWithTemplate :: String -> Taka a -> IO String
makeSlideWithTemplate r t = do
instr <- readFile r
return $ sub "##Presentation" (showTakahashi t) instr
makeSlide :: Taka a -> IO String
makeSlide t = getDataFileName "html/Temp.html" >>= flip makeSlideWithTemplate t
writeSlideWithTemplate :: String -> String -> Taka a -> IO ()
writeSlideWithTemplate r w = makeSlideWithTemplate r >=> writeFile w
writeSlide :: String -> Taka a -> IO ()
writeSlide w = makeSlide >=> writeFile w
makeTitleStyle :: SlideOption -> MakeStyle ()
makeTitleStyle = makeBlockStyle titleOption
makeContentsStyle :: SlideOption -> MakeStyle ()
makeContentsStyle = makeBlockStyle contentsOption
makeContentsStyle2 :: SlideOption -> MakeStyle ()
makeContentsStyle2 = makeBlockStyle contentsOption2
makeAnnotationStyle :: SlideOption -> MakeStyle ()
makeAnnotationStyle = makeBlockStyle annotationOption
makeCodeStyle :: SlideOption -> MakeStyle ()
makeCodeStyle o = do
makeBlockStyle codeOption o
align.verticalAlign .= Just AlignMiddle
font.fontFamily .= Just [SensSelif, Monospace]
font.whiteSpace .= Just Pre
makeBlockStyle :: Getter SlideOption BlockOption -> SlideOption -> MakeStyle ()
makeBlockStyle getter option = do
border.borderStyle .= Just BorderSolid
border.boxSizing .= Just BorderBox
border.borderWidth .= Just 10
border.borderColor .= option^.getter.frameColor
font.foreColor .= option^.getter.fontColor
font.fontSize .= option^.getter.blockFontSize
border.borderStyle .= option^.getter.frameStyle
backGround .= option^.getter.bgColor
contents :: MakeStyle () -> HBuilder () -> HBuilder ()
contents mStyle f = let
innerDiv = do
verticalDiv
[ divInfo
{ divMakeStyle = do
mStyle
display .= Just TableCell
, divData = f
}
]
in do
verticalDiv
[ divInfo
{ divMakeStyle = do
display .= Just Table
, divData = innerDiv
}
]
central :: MakeStyle () -> HBuilder () -> HBuilder ()
central mStyle f = let
newStyle = do
mStyle
align.textAlign .= Just AlignCenter
align.verticalAlign .= Just AlignMiddle
in contents newStyle f
newtype Contents = Contents { extructHBuilder :: SlideOption -> HBuilder () }
bindPage :: Contents -> Taka ()
bindPage p = do
o <- get
slide . extructHBuilder p $ o