highlighter-0.2: src/Text/Highlighter/Lexers/Autohotkey.hs
module Text.Highlighter.Lexers.Autohotkey (lexer) where
import Text.Regex.PCRE.Light
import Text.Highlighter.Types
lexer :: Lexer
lexer = Lexer
{ lName = "autohotkey"
, lAliases = ["ahk"]
, lExtensions = [".ahk", ".ahkl"]
, lMimetypes = ["text/x-autohotkey"]
, lStart = root'
, lFlags = [caseless, multiline, dotall]
}
commands' :: TokenMatcher
commands' =
[ tokNext "(autotrim|blockinput|break|click|clipwait|continue|control|controlclick|controlfocus|controlget|controlgetfocus|controlgetpos|controlgettext|controlmove|controlsend|controlsendraw|controlsettext|coordmode|critical|detecthiddentext|detecthiddenwindows|dllcall|drive|driveget|drivespacefree|else|envadd|envdiv|envget|envmult|envset|envsub|envupdate|exit|exitapp|fileappend|filecopy|filecopydir|filecreatedir|filecreateshortcut|filedelete|filegetattrib|filegetshortcut|filegetsize|filegettime|filegetversion|fileinstall|filemove|filemovedir|fileread|filereadline|filerecycle|filerecycleempty|fileremovedir|fileselectfile|fileselectfolder|filesetattrib|filesettime|formattime|gosub|goto|groupactivate|groupadd|groupclose|groupdeactivate|gui|guicontrol|guicontrolget|hotkey|ifexist|ifgreater|ifgreaterorequal|ifinstring|ifless|iflessorequal|ifmsgbox|ifnotequal|ifnotexist|ifnotinstring|ifwinactive|ifwinexist|ifwinnotactive|ifwinnotexist|imagesearch|inidelete|iniread|iniwrite|input|inputbox|keyhistory|keywait|listhotkeys|listlines|listvars|loop|menu|mouseclick|mouseclickdrag|mousegetpos|mousemove|msgbox|onmessage|onexit|outputdebug|pixelgetcolor|pixelsearch|postmessage|process|progress|random|regexmatch|regexreplace|registercallback|regdelete|regread|regwrite|reload|repeat|return|run|runas|runwait|send|sendevent|sendinput|sendmessage|sendmode|sendplay|sendraw|setbatchlines|setcapslockstate|setcontroldelay|setdefaultmousespeed|setenv|setformat|setkeydelay|setmousedelay|setnumlockstate|setscrolllockstate|setstorecapslockmode|settimer|settitlematchmode|setwindelay|setworkingdir|shutdown|sleep|sort|soundbeep|soundget|soundgetwavevolume|soundplay|soundset|soundsetwavevolume|splashimage|splashtextoff|splashtexton|splitpath|statusbargettext|statusbarwait|stringcasesense|stringgetpos|stringleft|stringlen|stringlower|stringmid|stringreplace|stringright|stringsplit|stringtrimleft|stringtrimright|stringupper|suspend|sysget|thread|tooltip|transform|traytip|urldownloadtofile|while|varsetcapacity|winactivate|winactivatebottom|winclose|winget|wingetactivestats|wingetactivetitle|wingetclass|wingetpos|wingettext|wingettitle|winhide|winkill|winmaximize|winmenuselectitem|winminimize|winminimizeall|winminimizeallundo|winmove|winrestore|winset|winsettitle|winshow|winwait|winwaitactive|winwaitclose|winwaitnotactivetrue|false|NULL)\\b" (Arbitrary "Keyword") (GoTo command')
]
literals' :: TokenMatcher
literals' =
[ tokNext "\"" (Arbitrary "Literal" :. Arbitrary "String") (GoTo string')
, tok "A_\\w+" (Arbitrary "Name" :. Arbitrary "Builtin")
, tok "%[]\\w#@$?[]+?%" (Arbitrary "Name" :. Arbitrary "Variable")
, tokNext "[-\126!%^&*+|?:<>/=]=?" (Arbitrary "Operator") (GoTo expressions')
, tokNext "==" (Arbitrary "Operator") (GoTo expressions')
, tok "[{()},.%#`;]" (Arbitrary "Punctuation")
, tok "\\\\" (Arbitrary "Punctuation")
, anyOf keywords'
, tok "\\w+" (Arbitrary "Text")
]
string' :: TokenMatcher
string' =
[ tokNext "\"" (Arbitrary "Literal" :. Arbitrary "String") Pop
, tok "\"\"|`." (Arbitrary "Literal" :. Arbitrary "String" :. Arbitrary "Escape")
, tok "[^\\`\"\\n]+" (Arbitrary "Literal" :. Arbitrary "String")
]
parameters' :: TokenMatcher
parameters' =
[ tokNext "\\)" (Arbitrary "Punctuation") Pop
, tokNext "\\(" (Arbitrary "Punctuation") Push
, anyOf numbers'
, anyOf literals'
, anyOf whitespace'
]
keynames' :: TokenMatcher
keynames' =
[ tokNext "\\[[^\\]]+\\]" (Arbitrary "Keyword") (GoTo keynames')
]
continuation' :: TokenMatcher
continuation' =
[ tokNext "\\n\\)" (Arbitrary "Punctuation") Pop
, tok "\\s[^\\n\\)]+" (Arbitrary "Literal" :. Arbitrary "String")
]
labels' :: TokenMatcher
labels' =
[ tok "(^\\s*)([^:\\s]+?:{1,2})" (ByGroups [(Arbitrary "Text" :. Arbitrary "Whitespace"), (Arbitrary "Name" :. Arbitrary "Label")])
, tok "(^\\s*)(::[]\\w#@$?[]+?::)" (ByGroups [(Arbitrary "Text" :. Arbitrary "Whitespace"), (Arbitrary "Name" :. Arbitrary "Label")])
]
comments' :: TokenMatcher
comments' =
[ tok "^;+.*?$" (Arbitrary "Comment" :. Arbitrary "Single")
, tok "(?<=\\s);+.*?$" (Arbitrary "Comment" :. Arbitrary "Single")
, tok "^/\\*.*?\\n\\*/" (Arbitrary "Comment" :. Arbitrary "Multiline")
, tok "(?<!\\n)/\\*.*?\\n\\*/" (Arbitrary "Error")
]
command' :: TokenMatcher
command' =
[ anyOf comments'
, anyOf whitespace'
, tokNext "^\\(" (Arbitrary "Literal" :. Arbitrary "String") (GoTo continuation')
, tokNext "[^\\n]*?(?=;*|$)" (Arbitrary "Literal" :. Arbitrary "String") Pop
, anyOf numbers'
, anyOf literals'
]
numbers' :: TokenMatcher
numbers' =
[ tok "(\\d+\\.\\d*|\\d*\\.\\d+)([eE][+-]?[0-9]+)?" (Arbitrary "Literal" :. Arbitrary "Number" :. Arbitrary "Float")
, tok "\\d+[eE][+-]?[0-9]+" (Arbitrary "Literal" :. Arbitrary "Number" :. Arbitrary "Float")
, tok "0[0-7]+" (Arbitrary "Literal" :. Arbitrary "Number" :. Arbitrary "Oct")
, tok "0[xX][a-fA-F0-9]+" (Arbitrary "Literal" :. Arbitrary "Number" :. Arbitrary "Hex")
, tok "\\d+L" (Arbitrary "Literal" :. Arbitrary "Number" :. Arbitrary "Integer" :. Arbitrary "Long")
, tok "\\d+" (Arbitrary "Literal" :. Arbitrary "Number" :. Arbitrary "Integer")
]
keywords' :: TokenMatcher
keywords' =
[ tok "(static|global|local)\\b" (Arbitrary "Keyword" :. Arbitrary "Type")
, tok "(if|else|and|or)\\b" (Arbitrary "Keyword" :. Arbitrary "Reserved")
]
directives' :: TokenMatcher
directives' =
[ tok "#\\w+?\\s" (Arbitrary "Keyword")
]
expressions' :: TokenMatcher
expressions' =
[ anyOf comments'
, anyOf whitespace'
, anyOf numbers'
, anyOf literals'
, tokNext "([]\\w#@$?[]+)(\\s*)(\\()" (ByGroups [(Arbitrary "Name" :. Arbitrary "Function"), (Arbitrary "Text" :. Arbitrary "Whitespace"), (Arbitrary "Punctuation")]) (GoTo parameters')
, tok "A_\\w+" (Arbitrary "Name" :. Arbitrary "Builtin")
, tok "%[]\\w#@$?[]+?%" (Arbitrary "Name" :. Arbitrary "Variable")
, tokNext "{" (Arbitrary "Punctuation") (GoTo block')
]
root' :: TokenMatcher
root' =
[ anyOf whitespace'
, tokNext "^\\(" (Arbitrary "Literal" :. Arbitrary "String") (GoTo continuation')
, anyOf comments'
, tokNext "(^\\s*)(\\w+)(\\s*)(=)" (ByGroups [(Arbitrary "Text" :. Arbitrary "Whitespace"), (Arbitrary "Name"), (Arbitrary "Text" :. Arbitrary "Whitespace"), (Arbitrary "Operator")]) (GoTo command')
, tokNext "([\\w#@$?\\[\\]]+)(\\s*)(\\()" (ByGroups [(Arbitrary "Name" :. Arbitrary "Function"), (Arbitrary "Text" :. Arbitrary "Whitespace"), (Arbitrary "Punctuation")]) (GoTo parameters')
, anyOf directives'
, anyOf labels'
, anyOf commands'
, anyOf expressions'
, anyOf numbers'
, anyOf literals'
, anyOf keynames'
, anyOf keywords'
]
block' :: TokenMatcher
block' =
[ anyOf root'
, tokNext "{" (Arbitrary "Punctuation") Push
, tokNext "}" (Arbitrary "Punctuation") Pop
]
whitespace' :: TokenMatcher
whitespace' =
[ tok "[ \\t]+" (Arbitrary "Text" :. Arbitrary "Whitespace")
]