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

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

lexer :: Lexer
lexer = Lexer
    { lName = "Debian Sourcelist"
    , lAliases = ["sourceslist", "sources.list"]
    , lExtensions = ["sources.list"]
    , lMimetypes = []
    , lStart = root'
    , lFlags = [multiline]
    }

distribution' :: TokenMatcher
distribution' =
    [ tokNext "#.*?$" (Arbitrary "Comment") Pop
    , tok "\\$\\(ARCH\\)" (Arbitrary "Name" :. Arbitrary "Variable")
    , tok "[^\\s$[]+" (Arbitrary "Literal" :. Arbitrary "String")
    , tokNext "\\[" (Arbitrary "Literal" :. Arbitrary "String" :. Arbitrary "Other") (GoTo escapedDistribution')
    , tok "\\$" (Arbitrary "Literal" :. Arbitrary "String")
    , tokNext "\\s+" (Arbitrary "Text") (GoTo components')
    ]

root' :: TokenMatcher
root' =
    [ tok "\\s+" (Arbitrary "Text")
    , tok "#.*?$" (Arbitrary "Comment")
    , tokNext "^(deb(?:-src)?)(\\s+)" (ByGroups [(Arbitrary "Keyword"), (Arbitrary "Text")]) (GoTo distribution')
    ]

escapedDistribution' :: TokenMatcher
escapedDistribution' =
    [ tokNext "\\]" (Arbitrary "Literal" :. Arbitrary "String" :. Arbitrary "Other") Pop
    , tok "\\$\\(ARCH\\)" (Arbitrary "Name" :. Arbitrary "Variable")
    , tok "[^\\]$]+" (Arbitrary "Literal" :. Arbitrary "String" :. Arbitrary "Other")
    , tok "\\$" (Arbitrary "Literal" :. Arbitrary "String" :. Arbitrary "Other")
    ]

components' :: TokenMatcher
components' =
    [ tokNext "#.*?$" (Arbitrary "Comment") (PopNum 2)
    , tokNext "$" (Arbitrary "Text") (PopNum 2)
    , tok "\\s+" (Arbitrary "Text")
    , tok "\\S+" (Arbitrary "Keyword" :. Arbitrary "Pseudo")
    ]