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

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

lexer :: Lexer
lexer = Lexer
    { lName = "\84\101\88"
    , lAliases = ["\116\101\120", "\108\97\116\101\120"]
    , lExtensions = ["\46\116\101\120", "\46\97\117\120", "\46\116\111\99"]
    , lMimetypes = ["\116\101\120\116\47\120\45\116\101\120", "\116\101\120\116\47\120\45\108\97\116\101\120"]
    , lStart = root'
    , lFlags = [multiline]
    }

displaymath' :: TokenMatcher
displaymath' =
    [ tokNext "\92\92\92\93" (Arbitrary "\76\105\116\101\114\97\108" :. Arbitrary "\83\116\114\105\110\103") Pop
    , tokNext "\92\36\92\36" (Arbitrary "\76\105\116\101\114\97\108" :. Arbitrary "\83\116\114\105\110\103") Pop
    , tok "\92\36" (Arbitrary "\78\97\109\101" :. Arbitrary "\66\117\105\108\116\105\110")
    , anyOf math'
    ]

general' :: TokenMatcher
general' =
    [ tok "\37\46\42\63\92\110" (Arbitrary "\67\111\109\109\101\110\116")
    , tok "\91\123\125\93" (Arbitrary "\78\97\109\101" :. Arbitrary "\66\117\105\108\116\105\110")
    , tok "\91\38\95\94\93" (Arbitrary "\78\97\109\101" :. Arbitrary "\66\117\105\108\116\105\110")
    ]

command' :: TokenMatcher
command' =
    [ tok "\92\91\46\42\63\92\93" (Arbitrary "\78\97\109\101" :. Arbitrary "\65\116\116\114\105\98\117\116\101")
    , tok "\92\42" (Arbitrary "\75\101\121\119\111\114\100")
    , tokNext "" (Arbitrary "\84\101\120\116") Pop
    ]

inlinemath' :: TokenMatcher
inlinemath' =
    [ tokNext "\92\92\92\41" (Arbitrary "\76\105\116\101\114\97\108" :. Arbitrary "\83\116\114\105\110\103") Pop
    , tokNext "\92\36" (Arbitrary "\76\105\116\101\114\97\108" :. Arbitrary "\83\116\114\105\110\103") Pop
    , anyOf math'
    ]

root' :: TokenMatcher
root' =
    [ tokNext "\92\92\92\91" (Arbitrary "\76\105\116\101\114\97\108" :. Arbitrary "\83\116\114\105\110\103" :. Arbitrary "\66\97\99\107\116\105\99\107") (GoTo displaymath')
    , tokNext "\92\92\92\40" (Arbitrary "\76\105\116\101\114\97\108" :. Arbitrary "\83\116\114\105\110\103") (GoTo inlinemath')
    , tokNext "\92\36\92\36" (Arbitrary "\76\105\116\101\114\97\108" :. Arbitrary "\83\116\114\105\110\103" :. Arbitrary "\66\97\99\107\116\105\99\107") (GoTo displaymath')
    , tokNext "\92\36" (Arbitrary "\76\105\116\101\114\97\108" :. Arbitrary "\83\116\114\105\110\103") (GoTo inlinemath')
    , tokNext "\92\92\40\91\97\45\122\65\45\90\93\43\124\46\41" (Arbitrary "\75\101\121\119\111\114\100") (GoTo command')
    , anyOf general'
    , tok "\91\94\92\92\36\37\38\95\94\123\125\93\43" (Arbitrary "\84\101\120\116")
    ]

math' :: TokenMatcher
math' =
    [ tok "\92\92\40\91\97\45\122\65\45\90\93\43\124\46\41" (Arbitrary "\78\97\109\101" :. Arbitrary "\86\97\114\105\97\98\108\101")
    , anyOf general'
    , tok "\91\48\45\57\93\43" (Arbitrary "\76\105\116\101\114\97\108" :. Arbitrary "\78\117\109\98\101\114")
    , tok "\91\45\61\33\43\42\47\40\41\92\91\92\93\93" (Arbitrary "\79\112\101\114\97\116\111\114")
    , tok "\91\94\61\33\43\42\47\40\41\92\91\92\93\92\92\36\37\38\95\94\123\125\48\45\57\45\93\43" (Arbitrary "\78\97\109\101" :. Arbitrary "\66\117\105\108\116\105\110")
    ]