module Text.EDE.Internal.Syntax where
import Control.Lens
import Data.HashSet (HashSet)
import qualified Data.HashSet as Set
import Text.EDE.Internal.Types
import Text.Parser.Token.Style
import Text.Trifecta
defaultSyntax :: Syntax
defaultSyntax = Syntax
{ _delimPragma = ("{!", "!}")
, _delimInline = ("{{", "}}")
, _delimComment = ("{#", "#}")
, _delimBlock = ("{%", "%}")
}
alternateSyntax :: Syntax
alternateSyntax = Syntax
{ _delimPragma = ("@!", "!@")
, _delimInline = ("<@", "@>")
, _delimComment = ("@*", "*@")
, _delimBlock = ("@(", ")@")
}
commentStyle :: String -> String -> CommentStyle
commentStyle s e = emptyCommentStyle & commentStart .~ s & commentEnd .~ e
operatorStyle :: TokenParsing m => IdentifierStyle m
operatorStyle = haskellOps & styleLetter .~ oneOf "-+!&|=><"
variableStyle :: TokenParsing m => IdentifierStyle m
variableStyle = keywordStyle & styleName .~ "variable"
keywordStyle :: TokenParsing m => IdentifierStyle m
keywordStyle = haskellIdents
& styleReserved .~ keywordSet
& styleName .~ "keyword"
keywordSet :: HashSet String
keywordSet = Set.fromList
[ "if"
, "elif"
, "else"
, "case"
, "when"
, "for"
, "include"
, "let"
, "endif"
, "endcase"
, "endfor"
, "endlet"
, "in"
, "with"
, "_"
, "."
, "true"
, "false"
]
pragmaStyle :: TokenParsing m => IdentifierStyle m
pragmaStyle = haskellIdents
& styleReserved .~ pragmaSet
& styleName .~ "pragma field"
pragmaSet :: HashSet String
pragmaSet = Set.fromList
[ "pragma"
, "inline"
, "comment"
, "block"
]