module Text.Highlighter.Lexers.GoodDataCL (lexer) where

import Text.Regex.PCRE.Light
import Text.Highlighter.Types

lexer :: Lexer
lexer = Lexer
    { lName = "GoodData-CL"
    , lAliases = ["gooddata-cl"]
    , lExtensions = [".gdc"]
    , lMimetypes = ["text/x-gooddata-cl"]
    , lStart = root'
    , lFlags = [caseless]
    }

argsList' :: TokenMatcher
argsList' =
    [ tokNext "\\)" (Arbitrary "Punctuation") Pop
    , tok "," (Arbitrary "Punctuation")
    , tok "[a-zA-Z]\\w*" (Arbitrary "Name" :. Arbitrary "Variable")
    , tok "=" (Arbitrary "Operator")
    , tokNext "\"" (Arbitrary "Literal" :. Arbitrary "String") (GoTo stringLiteral')
    , tok "[0-9]+(?:\\.[0-9]+)?(?:[eE][+-]?[0-9]{1,3})?" (Arbitrary "Literal" :. Arbitrary "Number")
    , tok "\\s" (Arbitrary "Text")
    ]

root' :: TokenMatcher
root' =
    [ tok "#.*" (Arbitrary "Comment" :. Arbitrary "Single")
    , tok "[a-zA-Z]\\w*" (Arbitrary "Name" :. Arbitrary "Function")
    , tokNext "\\(" (Arbitrary "Punctuation") (GoTo argsList')
    , tok ";" (Arbitrary "Punctuation")
    , tok "\\s+" (Arbitrary "Text")
    ]

stringLiteral' :: TokenMatcher
stringLiteral' =
    [ tok "\\\\[tnrfbae\"\\\\]" (Arbitrary "Literal" :. Arbitrary "String" :. Arbitrary "Escape")
    , tokNext "\"" (Arbitrary "Literal" :. Arbitrary "String") Pop
    , tok "[^\\\\\"]+" (Arbitrary "Literal" :. Arbitrary "String")
    ]