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

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

lexer :: Lexer
lexer = Lexer
    { lName = "Newspeak"
    , lAliases = ["newspeak"]
    , lExtensions = [".ns2"]
    , lMimetypes = ["text/x-newspeak"]
    , lStart = root'
    , lFlags = [multiline]
    }

literals' :: TokenMatcher
literals' =
    [ tok "\\$." (Arbitrary "Literal" :. Arbitrary "String")
    , tok "'[^']*'" (Arbitrary "Literal" :. Arbitrary "String")
    , tok "#'[^']*'" (Arbitrary "Literal" :. Arbitrary "String" :. Arbitrary "Symbol")
    , tok "#\\w+:?" (Arbitrary "Literal" :. Arbitrary "String" :. Arbitrary "Symbol")
    , tok "#(\\+|\\/|\126|\\*|<|>|=|@|%|\\||&|\\?|!|,|-)+" (Arbitrary "Literal" :. Arbitrary "String" :. Arbitrary "Symbol")
    ]

root' :: TokenMatcher
root' =
    [ tok "\\b(Newsqueak2)\\b" (Arbitrary "Keyword" :. Arbitrary "Declaration")
    , tok "'[^']*'" (Arbitrary "Literal" :. Arbitrary "String")
    , tok "\\b(class)(\\s+)([a-zA-Z0-9_]+)(\\s*)" (ByGroups [(Arbitrary "Keyword" :. Arbitrary "Declaration"), (Arbitrary "Text"), (Arbitrary "Name" :. Arbitrary "Class"), (Arbitrary "Text")])
    , tok "\\b(mixin|self|super|private|public|protected|nil|true|false)\\b" (Arbitrary "Keyword")
    , tok "([a-zA-Z0-9_]+\\:)(\\s*)([a-zA-Z_]\\w+)" (ByGroups [(Arbitrary "Name" :. Arbitrary "Function"), (Arbitrary "Text"), (Arbitrary "Name" :. Arbitrary "Variable")])
    , tok "([a-zA-Z0-9_]+)(\\s*)(=)" (ByGroups [(Arbitrary "Name" :. Arbitrary "Attribute"), (Arbitrary "Text"), (Arbitrary "Operator")])
    , tok "<[a-zA-Z0-9_]+>" (Arbitrary "Comment" :. Arbitrary "Special")
    , anyOf expressionstat'
    , anyOf whitespace'
    ]

whitespace' :: TokenMatcher
whitespace' =
    [ tok "\\s+" (Arbitrary "Text")
    , tok "\"[^\"]*\"" (Arbitrary "Comment")
    ]

expressionstat' :: TokenMatcher
expressionstat' =
    [ tok "(\\d+\\.\\d*|\\.\\d+|\\d+[fF])[fF]?" (Arbitrary "Literal" :. Arbitrary "Number" :. Arbitrary "Float")
    , tok "\\d+" (Arbitrary "Literal" :. Arbitrary "Number" :. Arbitrary "Integer")
    , tok ":\\w+" (Arbitrary "Name" :. Arbitrary "Variable")
    , tok "(\\w+)(::)" (ByGroups [(Arbitrary "Name" :. Arbitrary "Variable"), (Arbitrary "Operator")])
    , tok "\\w+:" (Arbitrary "Name" :. Arbitrary "Function")
    , tok "\\w+" (Arbitrary "Name" :. Arbitrary "Variable")
    , tok "\\(|\\)" (Arbitrary "Punctuation")
    , tok "\\[|\\]" (Arbitrary "Punctuation")
    , tok "\\{|\\}" (Arbitrary "Punctuation")
    , tok "(\\^|\\+|\\/|\126|\\*|<|>|=|@|%|\\||&|\\?|!|,|-|:)" (Arbitrary "Operator")
    , tok "\\.|;" (Arbitrary "Punctuation")
    , anyOf whitespace'
    , anyOf literals'
    ]