-------------------------------------------------------------------------------
-- |
-- Module      :  Text.SmallCaps.TeX
-- Copyright   :  (c) Stefan Berthold 2014
-- License     :  BSD3-style (see LICENSE)
--
-- Maintainer  :  stefan.berthold@gmx.net
-- Stability   :  unstable
-- Portability :  GHC
--
-- This modules specifies the data types 'TeX' and 'TeXElement'.
--
-------------------------------------------------------------------------------

module Text.SmallCaps.TeX where

import Data.Text ( Text, empty, intercalate )
import Data.Char ( isPrint, isNumber, isSpace, isLetter )

type TeX = [TeXElement]

data TeXElement
  = Printable Text
  | Macro Text
  | Block TeX
  | BBlock TeX
  | Comment Text
  deriving (Eq, Show)

-- ** Query

isPrintable :: TeXElement -> Bool
isPrintable (Printable _) = True
isPrintable _             = False

isMacro :: TeXElement -> Bool
isMacro (Macro _) = True
isMacro _         = False

isBlock :: TeXElement -> Bool
isBlock (Block _) = True
isBlock _         = False

isBBlock :: TeXElement -> Bool
isBBlock (BBlock _) = True
isBBlock _          = False

isComment :: TeXElement -> Bool
isComment (Comment _) = True
isComment _           = False

isMacroLetter :: Char -> Bool
isMacroLetter c = isLetter c || c == '@' || c == '*'

isMacroSign :: Char -> Bool
isMacroSign c = c == ' ' || (isPrint c && not (isNumber c || isSpace c))

-- ** Accessors

content :: TeXElement -> Text
content (Printable text)  = text
content (Macro text)      = text
content (Comment text)    = text
content _                 = empty

printable :: TeXElement -> Text
printable (Printable text)  = text
printable (Block tex)       = intercalate empty $ map printable tex
printable (BBlock tex)      = intercalate empty $ map printable tex
printable _                 = empty

body :: TeXElement -> TeX
body (Block tex)  = tex
body (BBlock tex) = tex
body _            = []

-- vim: ft=haskell:sts=2:sw=2:et:nu:ai
