{-# LANGUAGE OverloadedStrings, BangPatterns #-}
module Graphics.Rendering.MiniTypeset.Document where
import Data.String
import Graphics.Rendering.MiniTypeset.Common
import Graphics.Rendering.MiniTypeset.Box ( WhichQuad(..) )
data Document ident
= Symbol !Char
| String !String
| Space
| HorzCat !VAlign [Document ident]
| VertCat !HAlign [Document ident]
| Overlay !(HAlign,VAlign) [Document ident]
| SubSupScript !(SubSup ident) !(Document ident)
| Delimited !Delimiter [Document ident]
| Fraction !Bool !(Document ident) !(Document ident)
| AboveBelow !(AboveBelow ident) !(Document ident)
| WithColor !Col !(Document ident)
| WithStyle !BasicStyle !(Document ident)
| Decorated !TextDecoration !(Document ident)
| AddMargin !Margin !(Document ident)
| Realign !WhichQuad !(Document ident)
| Trim !(Document ident)
| RePosition !Pos !(Document ident)
| UnsafeResize !(Double,Double) !(Document ident)
| Identified !ident !(Document ident)
| EmptyDoc
deriving (Eq,Ord,Show)
data TextDecoration
= Underline
| Overline
| StrikeThrough
deriving (Eq,Ord,Show)
data SubSup ident
= Subscript !(Document ident)
| Superscript !(Document ident)
| SubAndSupscript !(Document ident) !(Document ident)
deriving (Eq,Ord,Show)
subSupDocs :: SubSup ident -> (Document ident, Document ident)
subSupDocs subsup = case subsup of
Subscript sub -> (sub , EmptyDoc)
Superscript sup -> (EmptyDoc , sup )
SubAndSupscript sub sup -> (sub , sup )
data AboveBelow ident
= Above !(Document ident)
| Below !(Document ident)
| AboveAndBelow !(Document ident) !(Document ident)
deriving (Eq,Ord,Show)
aboveBelowDocs :: AboveBelow ident -> (Document ident, Document ident)
aboveBelowDocs abelow = case abelow of
Above ab -> (ab , EmptyDoc)
Below be -> (EmptyDoc , be )
AboveAndBelow ab be -> (ab , be )
instance IsString (Document ident) where
fromString = String
string :: String -> Document a
string = String
char :: Char -> Document a
char = Symbol
space :: Document a
space = Space
zeroWidthSpace :: Document a
zeroWidthSpace = Symbol '\x200B'
(<|>) :: Document a -> Document a -> Document a
(<|>) x y = hcat [x,y]
(<->) :: Document a -> Document a -> Document a
(<->) x y = vcat [x,y]
(<#>) :: Document a -> Document a -> Document a
(<#>) x y = overlay [x,y]
hcat :: [Document a] -> Document a
hcat = hcatB
vcat :: [Document a] -> Document a
vcat = vcatL
overlay :: [Document a] -> Document a
overlay = Overlay (AlignLeft,AlignBottom)
hcatB :: [Document a] -> Document a
hcatB = HorzCat AlignBottom
hcatT :: [Document a] -> Document a
hcatT = HorzCat AlignTop
vcatL :: [Document a] -> Document a
vcatL = VertCat AlignLeft
vcatR :: [Document a] -> Document a
vcatR = VertCat AlignRight
subscript :: Document a -> Document a -> Document a
subscript doc sub = SubSupScript (Subscript sub) doc
supscript :: Document a -> Document a -> Document a
supscript doc sup = SubSupScript (Superscript sup) doc
subSup :: Document a -> (Document a, Document a) -> Document a
subSup doc (sub,sup) = SubSupScript (SubAndSupscript sub sup) doc
above :: Document a -> Document a -> Document a
above doc ab = AboveBelow (Above ab) doc
below :: Document a -> Document a -> Document a
below doc be = AboveBelow (Below be) doc
aboveBelow :: Document a -> (Document a, Document a) -> Document a
aboveBelow doc (ab,be) = AboveBelow (AboveAndBelow ab be) doc
fraction :: Document a -> Document a -> Document a
fraction = Fraction True
choose :: Document a -> Document a -> Document a
choose = choose' Paren
choose' :: Delimiter -> Document a -> Document a -> Document a
choose' delim above below = delimited delim (Fraction False above below)
delimited :: Delimiter -> Document a -> Document a
delimited delim doc = Delimited delim [doc]
delimiteds :: Delimiter -> [Document a] -> Document a
delimiteds delim docs = Delimited delim docs
underline, overline, strike :: Document a -> Document a
underline = Decorated Underline
overline = Decorated Overline
strike = Decorated StrikeThrough
regular, bold, italic, boldItalic :: Document a -> Document a
regular = WithStyle Regular
bold = WithStyle Bold
italic = WithStyle Italic
boldItalic = WithStyle BoldItalic
white, black, red, green, blue :: Document a -> Document a
white = WithColor (Col 1 1 1)
black = WithColor (Col 0 0 0)
red = WithColor (Col 1 0 0)
green = WithColor (Col 0 1 0)
blue = WithColor (Col 0 0 1)
rgb :: Float -> Float -> Float -> Document a -> Document a
rgb r g b = WithColor (Col r g b)
margin :: Double -> Document a -> Document a
margin x = AddMargin (Margin x x x x)
hmargin :: Double -> Document a -> Document a
hmargin x = AddMargin (Margin x x 0 0)
vmargin :: Double -> Document a -> Document a
vmargin x = AddMargin (Margin 0 0 x x)
margin' :: Double -> Double -> Double -> Double -> Document a -> Document a
margin' l r t b = AddMargin (Margin l r t b)