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

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

lexer :: Lexer
lexer = Lexer
    { lName = "CMake"
    , lAliases = ["cmake"]
    , lExtensions = [".cmake", "CMakeLists.txt"]
    , lMimetypes = ["text/x-cmake"]
    , lStart = root'
    , lFlags = [multiline]
    }

keywords' :: TokenMatcher
keywords' =
    [ tok "\\b(WIN32|UNIX|APPLE|CYGWIN|BORLAND|MINGW|MSVC|MSVC_IDE|MSVC60|MSVC70|MSVC71|MSVC80|MSVC90)\\b" (Arbitrary "Keyword")
    ]

ws' :: TokenMatcher
ws' =
    [ tok "[ \\t]+" (Arbitrary "Text")
    , tok "#.+\\n" (Arbitrary "Comment")
    ]

args' :: TokenMatcher
args' =
    [ tokNext "\\(" (Arbitrary "Punctuation") Push
    , tokNext "\\)" (Arbitrary "Punctuation") Pop
    , tok "(\\${)(.+?)(})" (ByGroups [(Arbitrary "Operator"), (Arbitrary "Name" :. Arbitrary "Variable"), (Arbitrary "Operator")])
    , tok "(?s)\".*?\"" (Arbitrary "Literal" :. Arbitrary "String" :. Arbitrary "Double")
    , tok "\\\\\\S+" (Arbitrary "Literal" :. Arbitrary "String")
    , tok "[^\\)$\"# \\t\\n]+" (Arbitrary "Literal" :. Arbitrary "String")
    , tok "\\n" (Arbitrary "Text")
    , anyOf keywords'
    , anyOf ws'
    ]

root' :: TokenMatcher
root' =
    [ tokNext "\\b([A-Za-z_]+)([ \\t]*)(\\()" (ByGroups [(Arbitrary "Name" :. Arbitrary "Builtin"), (Arbitrary "Text"), (Arbitrary "Punctuation")]) (GoTo args')
    , anyOf keywords'
    , anyOf ws'
    ]

string' :: TokenMatcher
string' =
    [ 
    ]