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

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

lexer :: Lexer
lexer = Lexer
    { lName = "\71\114\111\102\102"
    , lAliases = ["\103\114\111\102\102", "\110\114\111\102\102", "\109\97\110"]
    , lExtensions = ["\46\91\49\50\51\52\53\54\55\93", "\46\109\97\110"]
    , lMimetypes = ["\97\112\112\108\105\99\97\116\105\111\110\47\120\45\116\114\111\102\102", "\116\101\120\116\47\116\114\111\102\102"]
    , lStart = root'
    , lFlags = [multiline]
    }

request' :: TokenMatcher
request' =
    [ tokNext "\92\110" (Arbitrary "\84\101\120\116") Pop
    , anyOf escapes'
    , tok "\34\91\94\92\110\34\93\43\34" (Arbitrary "\76\105\116\101\114\97\108" :. Arbitrary "\83\116\114\105\110\103" :. Arbitrary "\68\111\117\98\108\101")
    , tok "\92\100\43" (Arbitrary "\76\105\116\101\114\97\108" :. Arbitrary "\78\117\109\98\101\114")
    , tok "\92\83\43" (Arbitrary "\76\105\116\101\114\97\108" :. Arbitrary "\83\116\114\105\110\103")
    , tok "\92\115\43" (Arbitrary "\84\101\120\116")
    ]

escapes' :: TokenMatcher
escapes' =
    [ tok "\92\92\34\91\94\92\110\93\42" (Arbitrary "\67\111\109\109\101\110\116")
    , tok "\92\92\91\102\110\93\92\119" (Arbitrary "\76\105\116\101\114\97\108" :. Arbitrary "\83\116\114\105\110\103" :. Arbitrary "\69\115\99\97\112\101")
    , tok "\92\92\92\40\46\46" (Arbitrary "\76\105\116\101\114\97\108" :. Arbitrary "\83\116\114\105\110\103" :. Arbitrary "\69\115\99\97\112\101")
    , tok "\92\92\46\92\91\46\42\92\93" (Arbitrary "\76\105\116\101\114\97\108" :. Arbitrary "\83\116\114\105\110\103" :. Arbitrary "\69\115\99\97\112\101")
    , tok "\92\92\46" (Arbitrary "\76\105\116\101\114\97\108" :. Arbitrary "\83\116\114\105\110\103" :. Arbitrary "\69\115\99\97\112\101")
    , tokNext "\92\92\92\110" (Arbitrary "\84\101\120\116") (GoTo request')
    ]

root' :: TokenMatcher
root' =
    [ tokNext "\40\63\105\41\40\92\46\41\40\92\119\43\41" (ByGroups [(Arbitrary "\84\101\120\116"), (Arbitrary "\75\101\121\119\111\114\100")]) (GoTo request')
    , tokNext "\92\46" (Arbitrary "\80\117\110\99\116\117\97\116\105\111\110") (GoTo request')
    , tokNext "\91\94\92\92\92\110\93\42" (Arbitrary "\84\101\120\116") (GoTo textline')
    ]

textline' :: TokenMatcher
textline' =
    [ anyOf escapes'
    , tok "\91\94\92\92\92\110\93\43" (Arbitrary "\84\101\120\116")
    , tokNext "\92\110" (Arbitrary "\84\101\120\116") Pop
    ]