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

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

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

root' :: TokenMatcher
root' =
    [ tok "^\\s*\".*" (Arbitrary "Comment")
    , tok "(?<=\\s)\"[^\\-:.%#=*].*" (Arbitrary "Comment")
    , tok "[ \\t]+" (Arbitrary "Text")
    , tok "/(\\\\\\\\|\\\\/|[^\\n/])*/" (Arbitrary "Literal" :. Arbitrary "String" :. Arbitrary "Regex")
    , tok "\"(\\\\\\\\|\\\\\"|[^\\n\"])*\"" (Arbitrary "Literal" :. Arbitrary "String" :. Arbitrary "Double")
    , tok "'(\\\\\\\\|\\\\'|[^\\n'])*'" (Arbitrary "Literal" :. Arbitrary "String" :. Arbitrary "Single")
    , tok "-?\\d+" (Arbitrary "Literal" :. Arbitrary "Number")
    , tok "#[0-9a-f]{6}" (Arbitrary "Literal" :. Arbitrary "Number" :. Arbitrary "Hex")
    , tok "^:" (Arbitrary "Punctuation")
    , tok "[()<>+=!|,\126-]" (Arbitrary "Punctuation")
    , tok "\\b(let|if|else|endif|elseif|fun|function|endfunction)\\b" (Arbitrary "Keyword")
    , tok "\\b(NONE|bold|italic|underline|dark|light)\\b" (Arbitrary "Name" :. Arbitrary "Builtin")
    , tok "\\b\\w+\\b" (Arbitrary "Name" :. Arbitrary "Other")
    , tok "." (Arbitrary "Text")
    ]