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

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

lexer :: Lexer
lexer = Lexer
    { lName = "MAQL"
    , lAliases = ["maql"]
    , lExtensions = [".maql"]
    , lMimetypes = ["text/x-gooddata-maql", "application/x-gooddata-maql"]
    , lStart = root'
    , lFlags = [caseless]
    }

root' :: TokenMatcher
root' =
    [ tok "IDENTIFIER\\b" (Arbitrary "Name" :. Arbitrary "Builtin")
    , tok "\\{[^}]+\\}" (Arbitrary "Name" :. Arbitrary "Variable")
    , tok "[0-9]+(?:\\.[0-9]+)?(?:[eE][+-]?[0-9]{1,3})?" (Arbitrary "Literal" :. Arbitrary "Number")
    , tokNext "\"" (Arbitrary "Literal" :. Arbitrary "String") (GoTo stringLiteral')
    , tok "\\<\\>|\\!\\=" (Arbitrary "Operator")
    , tok "\\=|\\>\\=|\\>|\\<\\=|\\<" (Arbitrary "Operator")
    , tok "\\:\\=" (Arbitrary "Operator")
    , tok "\\[[^]]+\\]" (Arbitrary "Name" :. Arbitrary "Variable" :. Arbitrary "Class")
    , tok "(DIMENSIONS?|BOTTOM|METRIC|COUNT|OTHER|FACT|WITH|TOP|OR|ATTRIBUTE|CREATE|PARENT|FALSE|ROWS?|FROM|ALL|AS|PF|COLUMNS?|DEFINE|REPORT|LIMIT|TABLE|LIKE|AND|BY|BETWEEN|EXCEPT|SELECT|MATCH|WHERE|TRUE|FOR|IN|WITHOUT|FILTER|ALIAS|ORDER|FACT|WHEN|NOT|ON|KEYS|KEY|FULLSET|PRIMARY|LABELS|LABEL|VISUAL|TITLE|DESCRIPTION|FOLDER|ALTER|DROP|ADD|DATASET|DATATYPE|INT|BIGINT|DOUBLE|DATE|VARCHAR|DECIMAL|SYNCHRONIZE|TYPE|DEFAULT|ORDER|ASC|DESC|HYPERLINK|INCLUDE|TEMPLATE|MODIFY)\\b" (Arbitrary "Keyword")
    , tok "[a-zA-Z]\\w*\\b" (Arbitrary "Name" :. Arbitrary "Function")
    , tok "#.*" (Arbitrary "Comment" :. Arbitrary "Single")
    , 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")
    ]