module Text.Highlighter.Lexers.Python (lexer) where import Text.Regex.PCRE.Light import Text.Highlighter.Types lexer :: Lexer lexer = Lexer { lName = "Python" , lAliases = ["python", "py"] , lExtensions = [".py", ".pyw", ".sc", "SConstruct", "SConscript", ".tac"] , lMimetypes = ["text/x-python", "application/x-python"] , lStart = root' , lFlags = [multiline] } tsqs' :: TokenMatcher tsqs' = [ tokNext "'''" (Arbitrary "Literal" :. Arbitrary "String") Pop , anyOf strings' , anyOf nl' ] builtins' :: TokenMatcher builtins' = [ tok "(?>|[-\126+/*%=<>&^|.]" (Arbitrary "Operator") , anyOf keywords' , tokNext "(def)((?:\\s|\\\\\\s)+)" (ByGroups [(Arbitrary "Keyword"), (Arbitrary "Text")]) (GoTo funcname') , tokNext "(class)((?:\\s|\\\\\\s)+)" (ByGroups [(Arbitrary "Keyword"), (Arbitrary "Text")]) (GoTo classname') , tokNext "(from)((?:\\s|\\\\\\s)+)" (ByGroups [(Arbitrary "Keyword" :. Arbitrary "Namespace"), (Arbitrary "Text")]) (GoTo fromimport') , tokNext "(import)((?:\\s|\\\\\\s)+)" (ByGroups [(Arbitrary "Keyword" :. Arbitrary "Namespace"), (Arbitrary "Text")]) (GoTo import') , anyOf builtins' , anyOf backtick' , tokNext "(?:[rR]|[uU][rR]|[rR][uU])\"\"\"" (Arbitrary "Literal" :. Arbitrary "String") (GoTo tdqs') , tokNext "(?:[rR]|[uU][rR]|[rR][uU])'''" (Arbitrary "Literal" :. Arbitrary "String") (GoTo tsqs') , tokNext "(?:[rR]|[uU][rR]|[rR][uU])\"" (Arbitrary "Literal" :. Arbitrary "String") (GoTo dqs') , tokNext "(?:[rR]|[uU][rR]|[rR][uU])'" (Arbitrary "Literal" :. Arbitrary "String") (GoTo sqs') , tokNext "[uU]?\"\"\"" (Arbitrary "Literal" :. Arbitrary "String") (Combined [stringescape', tdqs']) , tokNext "[uU]?'''" (Arbitrary "Literal" :. Arbitrary "String") (Combined [stringescape', tsqs']) , tokNext "[uU]?\"" (Arbitrary "Literal" :. Arbitrary "String") (Combined [stringescape', dqs']) , tokNext "[uU]?'" (Arbitrary "Literal" :. Arbitrary "String") (Combined [stringescape', sqs']) , anyOf name' , anyOf numbers' ] strings' :: TokenMatcher strings' = [ tok "%(\\([a-zA-Z0-9_]+\\))?[-#0 +]*([0-9]+|[*])?(\\.([0-9]+|[*]))?[hlL]?[diouxXeEfFgGcrs%]" (Arbitrary "Literal" :. Arbitrary "String" :. Arbitrary "Interpol") , tok "[^\\\\\\'\"%\\n]+" (Arbitrary "Literal" :. Arbitrary "String") , tok "[\\'\"\\\\]" (Arbitrary "Literal" :. Arbitrary "String") , tok "%" (Arbitrary "Literal" :. Arbitrary "String") ] fromimport' :: TokenMatcher fromimport' = [ tokNext "((?:\\s|\\\\\\s)+)(import)\\b" (ByGroups [(Arbitrary "Text"), (Arbitrary "Keyword" :. Arbitrary "Namespace")]) Pop , tok "[a-zA-Z_.][a-zA-Z0-9_.]*" (Arbitrary "Name" :. Arbitrary "Namespace") ]