HFitUI-0.1.0.0: src/WebUI/Scripts/JavaScript/HJSTypes.hs
----------------------------------------------------------------
-- Модуль приложения
-- Скрипты графического интерфейса (HScript)
-- Типы для Языка JavaScript
----------------------------------------------------------------
module WebUI.Scripts.JavaScript.HJSTypes
( HLangJS (..)
, JsName (..)
, HJsTitle (..)
, HJsEmpty (..)
, HJsBegin (..)
, HJsEnd (..)
, HJsNull (..)
, HJsUndefined (..)
, HJsThis (..), thisJS
, HComment (..), commentJS , (//)
, HCommentMultiLine (..), commentMLineJS, (***)
, (+-+)
, hl
, hJS
, valInt, valInteger, valRational, valDouble
, valBool
, valStr, valText
) where
-- Импорт модулей
import Prelude as PRL
import Data.Char (toLower)
import Data.String.Utils (strip)
import qualified Data.Text.Lazy as DTL
import WebUI.Scripts.HScript
import WebUI.Scripts.JavaScript.HJSBuilder
import WebUI.Scripts.JavaScript.HJSKeywords
----------------------------------------------------------------
-- Основа синтаксисиа языка ----------------------------------
----------------------------------------------------------------
-- | Корневой тип для JavaScript
data HLangJS = forall a b. (BuilderHSL a, BuilderHSL b) => a :> b
| forall c. (BuilderHSL c ) => HL c
| HLangJS
-- | Реализуем класс скриптового языка для корневого типа JavaScript
instance HLanguage HLangJS where
nameHLang _ = "JavaScript"
typeHLang _ = THLScript
initHLang = (HJsTitle :> HJsEmpty)
emptyHLang = HL $ HJsEmpty
beginH = HL $ HJsBegin
endH = HL $ HJsEnd
-- | Реализуем класс билдера скриптов для HLangJS
instance BuilderHSL HLangJS where
buildHSL hbConf (a :> b) =
buildHSL hbConf a ++
buildHSL hbConf b
buildHSL hbConf (HL c) = buildHSL hbConf c
buildHSL _ HLangJS = ""
buildHSL_L hbConf (a :> b) =
buildHSL_L hbConf a ++
buildHSL_L hbConf b
buildHSL_L hbConf (HL c) = buildHSL_L hbConf c
buildHSL_L _ HLangJS = ""
buildHSL_R hbConf (a :> b) =
buildHSL_R hbConf a ++
buildHSL_R hbConf b
buildHSL_R hbConf (HL c) = buildHSL_R hbConf c
buildHSL_R _ HLangJS = ""
-- | Реализуем класс билдера скриптов для HLangJS
instance BuilderHSL [HLangJS] where
buildHSL _ [] = ""
buildHSL hbConf (x:xs) =
let bXS = (buildHSL hbConf xs) in
(buildHSL hbConf x) ++ (if bXS == "" then "" else ", ") ++ bXS
buildHSL_L _ [] = ""
buildHSL_L hbConf (x:xs) =
let bXS = (buildHSL_L hbConf xs) in
(buildHSL_L hbConf x) ++ (if bXS == "" then "" else ", ") ++ bXS
buildHSL_R _ [] = ""
buildHSL_R hbConf (x:xs) =
let bXS = (buildHSL_R hbConf xs) in
(buildHSL_R hbConf x) ++ (if bXS == "" then "" else ", ") ++ bXS
-- | Имена в JS
type JsName = String
-- | Заголовок скрипта
data HJsTitle = HJsTitle
-- | Реализуем класс билдера скриптов для HJsTitle
instance BuilderHSL HJsTitle where
buildHSL hbConf _ =
hbc_entryLine hbConf ++
if length hTC > 0 then jsComS ++ hTC ++ jsComF ++ hEL else ""
where
hEL = hbc_entryLine hbConf
hTC = strip . hbc_titleComment $ hbConf
-- | Пустота
data HJsEmpty = HJsEmpty
instance BuilderHSL HJsEmpty where
buildHSL _ _ = ""
-- | Условное начало
data HJsBegin = HJsBegin
instance BuilderHSL HJsBegin where
buildHSL _ _ = ""
-- | Условное окончание
data HJsEnd = HJsEnd
instance BuilderHSL HJsEnd where
buildHSL _ _ = ""
-- | Комментарий однострочный
data HComment = HComment String
instance BuilderHSL HComment where
buildHSL hbConf (HComment v) = "//" ++ v ++ "\n"
commentJS :: String
-> HSL HLangJS ()
commentJS text = do
cmn <- return $ HL $ HComment text
modify (:> cmn)
return ()
(//) = commentJS
-- | Комментарий многострочный
data HCommentMultiLine = HCommentMultiLine String
instance BuilderHSL HCommentMultiLine where
buildHSL hbConf (HCommentMultiLine v) = "/*" ++ v ++ "*/" ++ (hbc_entryLine hbConf)
commentMLineJS :: String
-> HSL HLangJS ()
commentMLineJS text = do
cmn <- return $ HL $ HCommentMultiLine text
modify (:> cmn)
return ()
(***) = commentMLineJS
(+-+) p1 p2 = p1 ++ "\n" ++ p2
-- | Значение Null
data HJsNull = HJsNull
instance BuilderHSL HJsNull where
buildHSL _ _ = "null"
-- | Значение Undefined
data HJsUndefined = HJsUndefined
instance BuilderHSL HJsUndefined where
buildHSL _ _ = "undefined"
-- | Значение This
data HJsThis = HJsThis
instance BuilderHSL HJsThis where
buildHSL _ _ = "this"
-- | Создать синтаксис This
thisJS :: HLangJS
thisJS = hl HJsThis
-- | Обернуть тип в HLangJS
hl :: (BuilderHSL a)
=> a
-> HLangJS
hl p = HL $ p
-- | Обернуть строку как JavaScript код
hJS :: String
-> HLangJS
hJS = hl
----------------------------------------------------------------
-- Значения --------------------------------------------------
-- | Значение Int
valInt :: Int
-> HLangJS
valInt = hl
-- | Значение Integer
valInteger :: Integer
-> HLangJS
valInteger = hl
-- | Значение Rational
valRational :: Rational
-> HLangJS
valRational = hl
-- | Значение Double
valDouble :: Double
-> HLangJS
valDouble = hl
-- | Значение Bool
valBool :: Bool
-> HLangJS
valBool = hl
-- | Значение String
valStr :: String
-> HLangJS
valStr txt = hl $ show txt
-- | Значение Text
valText :: DTL.Text
-> HLangJS
valText txt = hl $ show txt