module Text.Highlighter.Lexers.Smarty (lexer) where
import qualified Text.Highlighter.Lexers.Php as Php
import Text.Regex.PCRE.Light
import Text.Highlighter.Types

lexer :: Lexer
lexer = Lexer
    { lName = "Smarty"
    , lAliases = ["smarty"]
    , lExtensions = [".tpl"]
    , lMimetypes = ["application/x-smarty"]
    , lStart = root'
    , lFlags = [multiline, dotall]
    }

root' :: TokenMatcher
root' =
    [ tok "[^{]+" (Arbitrary "Other")
    , tok "(\\{)(\\*.*?\\*)(\\})" (ByGroups [(Arbitrary "Comment" :. Arbitrary "Preproc"), (Arbitrary "Comment"), (Arbitrary "Comment" :. Arbitrary "Preproc")])
    , tok "(\\{php\\})(.*?)(\\{/php\\})" (ByGroups [(Arbitrary "Comment" :. Arbitrary "Preproc"), (Using Php.lexer), (Arbitrary "Comment" :. Arbitrary "Preproc")])
    , tokNext "(\\{)(/?[a-zA-Z_][a-zA-Z0-9_]*)(\\s*)" (ByGroups [(Arbitrary "Comment" :. Arbitrary "Preproc"), (Arbitrary "Name" :. Arbitrary "Function"), (Arbitrary "Text")]) (GoTo smarty')
    , tokNext "\\{" (Arbitrary "Comment" :. Arbitrary "Preproc") (GoTo smarty')
    ]

smarty' :: TokenMatcher
smarty' =
    [ tok "\\s+" (Arbitrary "Text")
    , tokNext "\\}" (Arbitrary "Comment" :. Arbitrary "Preproc") Pop
    , tok "#[a-zA-Z_][a-zA-Z0-9_]*#" (Arbitrary "Name" :. Arbitrary "Variable")
    , tok "\\$[a-zA-Z_][a-zA-Z0-9_]*(\\.[a-zA-Z0-9_]+)*" (Arbitrary "Name" :. Arbitrary "Variable")
    , tok "[\126!%^&*()+=|\\[\\]:;,.<>/?{}@-]" (Arbitrary "Operator")
    , tok "(true|false|null)\8" (Arbitrary "Keyword" :. Arbitrary "Constant")
    , tok "[0-9](\\.[0-9]*)?(eE[+-][0-9])?[flFLdD]?|0[xX][0-9a-fA-F]+[Ll]?" (Arbitrary "Literal" :. Arbitrary "Number")
    , tok "\"(\\\\\\\\|\\\\\"|[^\"])*\"" (Arbitrary "Literal" :. Arbitrary "String" :. Arbitrary "Double")
    , tok "'(\\\\\\\\|\\\\'|[^'])*'" (Arbitrary "Literal" :. Arbitrary "String" :. Arbitrary "Single")
    , tok "[a-zA-Z_][a-zA-Z0-9_]*" (Arbitrary "Name" :. Arbitrary "Attribute")
    ]