highlighter-0.2: src/Text/Highlighter/Lexers/Groff.hs
module Text.Highlighter.Lexers.Groff (lexer) where
import Text.Regex.PCRE.Light
import Text.Highlighter.Types
lexer :: Lexer
lexer = Lexer
{ lName = "Groff"
, lAliases = ["groff", "nroff", "man"]
, lExtensions = [".[1234567]", ".man"]
, lMimetypes = ["application/x-troff", "text/troff"]
, lStart = root'
, lFlags = [multiline]
}
request' :: TokenMatcher
request' =
[ tokNext "\\n" (Arbitrary "Text") Pop
, anyOf escapes'
, tok "\"[^\\n\"]+\"" (Arbitrary "Literal" :. Arbitrary "String" :. Arbitrary "Double")
, tok "\\d+" (Arbitrary "Literal" :. Arbitrary "Number")
, tok "\\S+" (Arbitrary "Literal" :. Arbitrary "String")
, tok "\\s+" (Arbitrary "Text")
]
escapes' :: TokenMatcher
escapes' =
[ tok "\\\\\"[^\\n]*" (Arbitrary "Comment")
, tok "\\\\[fn]\\w" (Arbitrary "Literal" :. Arbitrary "String" :. Arbitrary "Escape")
, tok "\\\\\\(.." (Arbitrary "Literal" :. Arbitrary "String" :. Arbitrary "Escape")
, tok "\\\\.\\[.*\\]" (Arbitrary "Literal" :. Arbitrary "String" :. Arbitrary "Escape")
, tok "\\\\." (Arbitrary "Literal" :. Arbitrary "String" :. Arbitrary "Escape")
, tokNext "\\\\\\n" (Arbitrary "Text") (GoTo request')
]
root' :: TokenMatcher
root' =
[ tokNext "(?i)(\\.)(\\w+)" (ByGroups [(Arbitrary "Text"), (Arbitrary "Keyword")]) (GoTo request')
, tokNext "\\." (Arbitrary "Punctuation") (GoTo request')
, tokNext "[^\\\\\\n]*" (Arbitrary "Text") (GoTo textline')
]
textline' :: TokenMatcher
textline' =
[ anyOf escapes'
, tok "[^\\\\\\n]+" (Arbitrary "Text")
, tokNext "\\n" (Arbitrary "Text") Pop
]