module Hakyllbars.Source.Lexer where

import Data.Functor
import Data.Maybe
import Data.Scientific
import Data.String
import Hakyllbars.Source.Util
import Text.Parsec hiding (runParser, token, tokens, (<?>))
import Prelude hiding (lex)

type Lexer a = Parsec String ParserState a

lex :: SourceName -> String -> Either ParseError [Token]
lex :: String -> String -> Either ParseError [Token]
lex = forall s t a.
Stream s Identity t =>
Parsec s ParserState a -> String -> s -> Either ParseError a
runParser forall a b. (a -> b) -> a -> b
$ forall s (m :: * -> *) t u a end.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m end -> ParsecT s u m [a]
manyTill Lexer Token
token forall s (m :: * -> *) t u.
(Stream s m t, Show t) =>
ParsecT s u m ()
eof

token :: Lexer Token
token :: Lexer Token
token =
  forall (m :: * -> *) s.
Monad m =>
ParsecT s ParserState m LexerMode
getLexerMode forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
    --
    LexerMode
BlockMode -> do
      forall t s (m :: * -> *).
(Show t, Stream s m t) =>
String -> ParsecT s ParserState m ()
trace String
"BlockMode"
      Lexer Token
blockToken forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Token
t -> case Token
t of
        TaggedToken TokenTag
TurnOffToken SourcePos
_ -> Token
t forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ forall t s (m :: * -> *).
(Show t, Stream s m t) =>
ParsecT s ParserState m ()
startFenced
        TaggedToken TokenTag
CommentBlockToken SourcePos
_ -> Token
t forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ forall t s (m :: * -> *).
(Show t, Stream s m t) =>
ParsecT s ParserState m ()
startFenced
        TaggedToken TokenTag
CloseBlockToken SourcePos
_ -> Token
t forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ forall t s (m :: * -> *).
(Show t, Stream s m t) =>
ParsecT s ParserState m ()
startText
        Token
_ -> forall (m :: * -> *) a. Monad m => a -> m a
return Token
t
    --
    LexerMode
TextMode -> do
      forall t s (m :: * -> *).
(Show t, Stream s m t) =>
String -> ParsecT s ParserState m ()
trace String
"TextMode"
      forall s (m :: * -> *) t u a.
Stream s m t =>
[ParsecT s u m a] -> ParsecT s u m a
tryOne
        [ do
            forall (f :: * -> *) a. Functor f => f a -> f ()
void forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m a
lookAhead forall a b. (a -> b) -> a -> b
$ forall s (m :: * -> *) t u a.
Stream s m t =>
[ParsecT s u m a] -> ParsecT s u m a
tryOne [forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m ()
spaces forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> ParsecT String ParserState Identity String
trimmingOpen, ParsecT String ParserState Identity String
open]
            forall t s (m :: * -> *).
(Show t, Stream s m t) =>
ParsecT s ParserState m ()
startBlock
            Lexer Token
token,
          Lexer Token
textToken
        ]
    --
    FencedMode {} -> do
      forall t s (m :: * -> *).
(Show t, Stream s m t) =>
String -> ParsecT s ParserState m ()
trace String
"FencedMode"
      Lexer Token
fencedText

startText :: (Show t, Stream s m t) => ParsecT s ParserState m ()
startText :: forall t s (m :: * -> *).
(Show t, Stream s m t) =>
ParsecT s ParserState m ()
startText = forall (m :: * -> *) s.
Monad m =>
LexerMode -> ParsecT s ParserState m ()
putLexerMode LexerMode
TextMode forall t s (m :: * -> *) a.
(Show t, Stream s m t) =>
ParsecT s ParserState m a -> String -> ParsecT s ParserState m a
<?> String
"starting text"

startBlock :: (Show t, Stream s m t) => ParsecT s ParserState m ()
startBlock :: forall t s (m :: * -> *).
(Show t, Stream s m t) =>
ParsecT s ParserState m ()
startBlock = forall (m :: * -> *) s.
Monad m =>
LexerMode -> ParsecT s ParserState m ()
putLexerMode LexerMode
BlockMode forall t s (m :: * -> *) a.
(Show t, Stream s m t) =>
ParsecT s ParserState m a -> String -> ParsecT s ParserState m a
<?> String
"starting block"

startFenced :: (Show t, Stream s m t) => ParsecT s ParserState m ()
startFenced :: forall t s (m :: * -> *).
(Show t, Stream s m t) =>
ParsecT s ParserState m ()
startFenced = forall (m :: * -> *) s.
Monad m =>
LexerMode -> ParsecT s ParserState m ()
putLexerMode (Int -> LexerMode
FencedMode Int
1) forall t s (m :: * -> *) a.
(Show t, Stream s m t) =>
ParsecT s ParserState m a -> String -> ParsecT s ParserState m a
<?> String
"starting fenced text"

illegalState :: (Show t, Stream s m t) => ParsecT s ParserState m a
illegalState :: forall t s (m :: * -> *) a.
(Show t, Stream s m t) =>
ParsecT s ParserState m a
illegalState = forall {s} {b}. ParsecT s ParserState m b
p forall t s (m :: * -> *) a.
(Show t, Stream s m t) =>
ParsecT s ParserState m a -> String -> ParsecT s ParserState m a
<?> String
"illegal state"
  where
    p :: ParsecT s ParserState m b
p = do
      LexerMode
mode <- forall (m :: * -> *) s.
Monad m =>
ParsecT s ParserState m LexerMode
getLexerMode
      forall (m :: * -> *) a. MonadFail m => String -> m a
fail forall a b. (a -> b) -> a -> b
$ String
"Illegal lexer mode: " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show LexerMode
mode

blockToken :: Lexer Token
blockToken :: Lexer Token
blockToken =
  forall s (m :: * -> *) t u a.
Stream s m t =>
[ParsecT s u m a] -> ParsecT s u m a
tryOne
    [ Lexer Token
symbolToken,
      Lexer Token
numberToken,
      Lexer Token
boolToken,
      Lexer Token
endKeyword,
      Lexer Token
elseKeyword,
      Lexer Token
nameToken,
      Lexer Token
stringToken
    ]

textToken :: Lexer Token
textToken :: Lexer Token
textToken = forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m (SourcePos -> a) -> ParsecT s u m a
withPosition (String -> SourcePos -> Token
TextToken forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT String ParserState Identity String
text) forall t s (m :: * -> *) a.
(Show t, Stream s m t) =>
ParsecT s ParserState m a -> String -> ParsecT s ParserState m a
<?> String
"text"

fencedText :: Lexer Token
fencedText :: Lexer Token
fencedText = forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m (SourcePos -> a) -> ParsecT s u m a
withPosition (String -> SourcePos -> Token
TextToken forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> ParsecT String ParserState Identity String
p String
"")
  where
    p :: String -> ParsecT String ParserState Identity String
p String
acc =
      forall s (m :: * -> *) t u a.
Stream s m t =>
[ParsecT s u m a] -> ParsecT s u m a
tryOne
        [ String -> ParsecT String ParserState Identity String
downFence String
acc,
          String -> ParsecT String ParserState Identity String
upFence String
acc,
          String -> ParsecT String ParserState Identity String
fenceText String
acc
        ]
    -- {{
    downFence :: String -> ParsecT String ParserState Identity String
downFence String
acc = do
      forall t s (m :: * -> *).
(Show t, Stream s m t) =>
String -> ParsecT s ParserState m ()
trace String
"downFence"
      String
x <- ParsecT String ParserState Identity String
open
      ParsecT String ParserState Identity ()
downFenceLevel
      String -> ParsecT String ParserState Identity String
p (String
acc forall a. [a] -> [a] -> [a]
++ String
x)
    -- }}
    upFence :: String -> ParsecT String ParserState Identity String
upFence String
acc = do
      forall t s (m :: * -> *).
(Show t, Stream s m t) =>
String -> ParsecT s ParserState m ()
trace String
"upFence"
      forall (f :: * -> *) a. Functor f => f a -> f ()
void forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m a
lookAhead forall a b. (a -> b) -> a -> b
$ forall s (m :: * -> *) t u a.
Stream s m t =>
[ParsecT s u m a] -> ParsecT s u m a
tryOne [ParsecT String ParserState Identity String
trimmingClose, ParsecT String ParserState Identity String
close]
      ParsecT String ParserState Identity Int
upFenceLevel forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
        Int
0 -> do
          forall t s (m :: * -> *).
(Show t, Stream s m t) =>
ParsecT s ParserState m ()
startBlock
          forall (m :: * -> *) a. Monad m => a -> m a
return String
acc
        Int
_ -> do
          String
x <- forall s (m :: * -> *) t u a.
Stream s m t =>
[ParsecT s u m a] -> ParsecT s u m a
tryOne [ParsecT String ParserState Identity String
trimmingClose, ParsecT String ParserState Identity String
close]
          String -> ParsecT String ParserState Identity String
p (String
acc forall a. [a] -> [a] -> [a]
++ String
x)
    -- ...abc...
    fenceText :: String -> ParsecT String ParserState Identity String
fenceText String
acc = do
      forall t s (m :: * -> *).
(Show t, Stream s m t) =>
String -> ParsecT s ParserState m ()
trace String
"fenceText"
      String
t <- ParsecT String ParserState Identity String
text
      String -> ParsecT String ParserState Identity String
p (String
acc forall a. [a] -> [a] -> [a]
++ String
t)
    --
    downFenceLevel :: ParsecT String ParserState Identity ()
downFenceLevel = do
      Int
n <- forall a. Enum a => a -> a
succ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT String ParserState Identity Int
fenceLevel
      forall (m :: * -> *) s.
Monad m =>
LexerMode -> ParsecT s ParserState m ()
putLexerMode forall a b. (a -> b) -> a -> b
$ Int -> LexerMode
FencedMode Int
n
    upFenceLevel :: ParsecT String ParserState Identity Int
upFenceLevel = do
      Int
n <- forall a. Enum a => a -> a
pred forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT String ParserState Identity Int
fenceLevel
      forall (m :: * -> *) s.
Monad m =>
LexerMode -> ParsecT s ParserState m ()
putLexerMode forall a b. (a -> b) -> a -> b
$ Int -> LexerMode
FencedMode Int
n
      forall (m :: * -> *) a. Monad m => a -> m a
return Int
n
    fenceLevel :: ParsecT String ParserState Identity Int
fenceLevel =
      forall (m :: * -> *) s.
Monad m =>
ParsecT s ParserState m LexerMode
getLexerMode forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
        FencedMode Int
n -> forall (m :: * -> *) a. Monad m => a -> m a
return Int
n
        LexerMode
_ -> forall t s (m :: * -> *) a.
(Show t, Stream s m t) =>
ParsecT s ParserState m a
illegalState

text :: Lexer String
text :: ParsecT String ParserState Identity String
text = forall a. Monoid a => [a] -> a
mconcat forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s (m :: * -> *) t u a end.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m end -> ParsecT s u m [a]
manyTill ParsecT String ParserState Identity String
p (forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m a
lookAhead forall a b. (a -> b) -> a -> b
$ forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT String ParserState Identity String
end)
  where
    p :: ParsecT String ParserState Identity String
p =
      forall s (m :: * -> *) t u a.
Stream s m t =>
[ParsecT s u m a] -> ParsecT s u m a
tryOne
        [ forall t s (m :: * -> *) a.
(Show t, Stream s m t) =>
String -> ParsecT s ParserState m a -> ParsecT s ParserState m a
labeled String
"TextString" forall a b. (a -> b) -> a -> b
$ forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many1 (forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
noneOf String
"-{}\\\n\t "),
          forall t s (m :: * -> *) a.
(Show t, Stream s m t) =>
String -> ParsecT s ParserState m a -> ParsecT s ParserState m a
labeled String
"Just '{'" forall a b. (a -> b) -> a -> b
$ ParsecT String ParserState Identity String
openBrace forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* forall s (m :: * -> *) t a u.
(Stream s m t, Show a) =>
ParsecT s u m a -> ParsecT s u m ()
notFollowedBy (forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT String ParserState Identity String
openBrace),
          forall t s (m :: * -> *) a.
(Show t, Stream s m t) =>
String -> ParsecT s ParserState m a -> ParsecT s ParserState m a
labeled String
"Just '}'" forall a b. (a -> b) -> a -> b
$ ParsecT String ParserState Identity String
closeBrace forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* forall s (m :: * -> *) t a u.
(Stream s m t, Show a) =>
ParsecT s u m a -> ParsecT s u m ()
notFollowedBy (forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT String ParserState Identity String
closeBrace),
          forall t s (m :: * -> *) a.
(Show t, Stream s m t) =>
String -> ParsecT s ParserState m a -> ParsecT s ParserState m a
labeled String
"Just '-'" forall a b. (a -> b) -> a -> b
$ forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string String
"-" forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* forall s (m :: * -> *) t a u.
(Stream s m t, Show a) =>
ParsecT s u m a -> ParsecT s u m ()
notFollowedBy (forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT String ParserState Identity String
closeBrace),
          forall t s (m :: * -> *) a.
(Show t, Stream s m t) =>
String -> ParsecT s ParserState m a -> ParsecT s ParserState m a
labeled String
"Just '\\'" forall a b. (a -> b) -> a -> b
$ forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string String
"\\" forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* forall s (m :: * -> *) t a u.
(Stream s m t, Show a) =>
ParsecT s u m a -> ParsecT s u m ()
notFollowedBy (forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT String ParserState Identity String
escapedText),
          forall t s (m :: * -> *) a.
(Show t, Stream s m t) =>
String -> ParsecT s ParserState m a -> ParsecT s ParserState m a
labeled String
"EscapedText" forall a b. (a -> b) -> a -> b
$ forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'\\' forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> ParsecT String ParserState Identity String
escapedText,
          forall t s (m :: * -> *) a.
(Show t, Stream s m t) =>
String -> ParsecT s ParserState m a -> ParsecT s ParserState m a
labeled String
"SpaceString" forall a b. (a -> b) -> a -> b
$ forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many1 forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
space forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* forall s (m :: * -> *) t a u.
(Stream s m t, Show a) =>
ParsecT s u m a -> ParsecT s u m ()
notFollowedBy (forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT String ParserState Identity String
trimmingOpen)
        ]
    escapedText :: ParsecT String ParserState Identity String
escapedText =
      forall s (m :: * -> *) t u a.
Stream s m t =>
[ParsecT s u m a] -> ParsecT s u m a
tryOne
        [ ParsecT String ParserState Identity String
openBrace,
          ParsecT String ParserState Identity String
closeBrace,
          forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string String
"-",
          forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string String
"\\"
        ]
    end :: ParsecT String ParserState Identity String
end =
      forall t s (m :: * -> *) a.
(Show t, Stream s m t) =>
String -> ParsecT s ParserState m a -> ParsecT s ParserState m a
labeled String
"text terminator" forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall s (m :: * -> *) t u a.
Stream s m t =>
[ParsecT s u m a] -> ParsecT s u m a
tryOne forall a b. (a -> b) -> a -> b
$
        [ forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m ()
spaces forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> ParsecT String ParserState Identity String
trimmingOpen,
          ParsecT String ParserState Identity String
trimmingClose,
          ParsecT String ParserState Identity String
open,
          ParsecT String ParserState Identity String
close,
          String
"" forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ forall s (m :: * -> *) t u.
(Stream s m t, Show t) =>
ParsecT s u m ()
eof
        ]

symbolToken :: Lexer Token
symbolToken :: Lexer Token
symbolToken =
  forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m (SourcePos -> a) -> ParsecT s u m a
withPosition forall a b. (a -> b) -> a -> b
$
    forall s (m :: * -> *) t u a.
Stream s m t =>
[ParsecT s u m a] -> ParsecT s u m a
tryOne
      [ forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m ()
spaces
          forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> forall s (m :: * -> *) t u a.
Stream s m t =>
[ParsecT s u m a] -> ParsecT s u m a
tryOne
            [ forall {s} {m :: * -> *}.
Stream s m Char =>
TokenTag -> ParsecT s ParserState m (SourcePos -> Token)
mkTrimmingSymbol TokenTag
TurnOffToken,
              forall {s} {m :: * -> *}.
Stream s m Char =>
TokenTag -> ParsecT s ParserState m (SourcePos -> Token)
mkTrimmingSymbol TokenTag
CommentBlockToken,
              forall {s} {m :: * -> *}.
Stream s m Char =>
TokenTag -> ParsecT s ParserState m (SourcePos -> Token)
mkTrimmingSymbol TokenTag
AltBlockToken forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m ()
spaces,
              forall {s} {m :: * -> *}.
Stream s m Char =>
TokenTag -> ParsecT s ParserState m (SourcePos -> Token)
mkTrimmingSymbol TokenTag
ChromeBlockToken forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m ()
spaces,
              forall {s} {m :: * -> *}.
Stream s m Char =>
TokenTag -> ParsecT s ParserState m (SourcePos -> Token)
mkTrimmingSymbol TokenTag
ExpressionBlockToken forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m ()
spaces
            ],
        forall {s} {m :: * -> *}.
Stream s m Char =>
TokenTag -> ParsecT s ParserState m (SourcePos -> Token)
mkTrimmingSymbol TokenTag
CloseBlockToken forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m ()
spaces,
        --
        forall {s} {m :: * -> *}.
Stream s m Char =>
TokenTag -> ParsecT s ParserState m (SourcePos -> Token)
mkSymbol TokenTag
TurnOffToken,
        forall {s} {m :: * -> *}.
Stream s m Char =>
TokenTag -> ParsecT s ParserState m (SourcePos -> Token)
mkSymbol TokenTag
CommentBlockToken,
        forall {s} {m :: * -> *}.
Stream s m Char =>
TokenTag -> ParsecT s ParserState m (SourcePos -> Token)
mkSymbol TokenTag
AltBlockToken forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m ()
spaces,
        forall {s} {m :: * -> *}.
Stream s m Char =>
TokenTag -> ParsecT s ParserState m (SourcePos -> Token)
mkSymbol TokenTag
ChromeBlockToken forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m ()
spaces,
        forall {s} {m :: * -> *}.
Stream s m Char =>
TokenTag -> ParsecT s ParserState m (SourcePos -> Token)
mkSymbol TokenTag
ExpressionBlockToken forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m ()
spaces,
        forall {s} {m :: * -> *}.
Stream s m Char =>
TokenTag -> ParsecT s ParserState m (SourcePos -> Token)
mkSymbol TokenTag
CloseBlockToken,
        --
        forall {s} {m :: * -> *}.
Stream s m Char =>
TokenTag -> ParsecT s ParserState m (SourcePos -> Token)
mkSymbol TokenTag
OpenBraceToken forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m ()
spaces,
        forall {s} {m :: * -> *}.
Stream s m Char =>
TokenTag -> ParsecT s ParserState m (SourcePos -> Token)
mkSymbol TokenTag
CloseBraceToken forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m ()
spaces,
        forall {s} {m :: * -> *}.
Stream s m Char =>
TokenTag -> ParsecT s ParserState m (SourcePos -> Token)
mkSymbol TokenTag
OpenParenToken forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m ()
spaces,
        forall {s} {m :: * -> *}.
Stream s m Char =>
TokenTag -> ParsecT s ParserState m (SourcePos -> Token)
mkSymbol TokenTag
CloseParenToken forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m ()
spaces,
        forall {s} {m :: * -> *}.
Stream s m Char =>
TokenTag -> ParsecT s ParserState m (SourcePos -> Token)
mkSymbol TokenTag
OpenBracketToken forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m ()
spaces,
        forall {s} {m :: * -> *}.
Stream s m Char =>
TokenTag -> ParsecT s ParserState m (SourcePos -> Token)
mkSymbol TokenTag
CloseBracketToken forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m ()
spaces,
        forall {s} {m :: * -> *}.
Stream s m Char =>
TokenTag -> ParsecT s ParserState m (SourcePos -> Token)
mkSymbol TokenTag
PipeToken forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m ()
spaces,
        forall {s} {m :: * -> *}.
Stream s m Char =>
TokenTag -> ParsecT s ParserState m (SourcePos -> Token)
mkSymbol TokenTag
ColonToken forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m ()
spaces,
        forall {s} {m :: * -> *}.
Stream s m Char =>
TokenTag -> ParsecT s ParserState m (SourcePos -> Token)
mkSymbol TokenTag
DotToken forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m ()
spaces,
        forall {s} {m :: * -> *}.
Stream s m Char =>
TokenTag -> ParsecT s ParserState m (SourcePos -> Token)
mkSymbol TokenTag
CommaToken forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m ()
spaces
      ]
  where
    mkSymbol :: TokenTag -> ParsecT s ParserState m (SourcePos -> Token)
mkSymbol TokenTag
t = TokenTag -> SourcePos -> Token
TaggedToken TokenTag
t forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string (TokenTag -> String
tokenTagValue TokenTag
t) forall t s (m :: * -> *) a.
(Show t, Stream s m t) =>
ParsecT s ParserState m a -> String -> ParsecT s ParserState m a
<?> forall a. Show a => a -> String
show TokenTag
t
    mkTrimmingSymbol :: TokenTag -> ParsecT s ParserState m (SourcePos -> Token)
mkTrimmingSymbol TokenTag
t = TokenTag -> SourcePos -> Token
TaggedToken TokenTag
t forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string (TokenTag -> String
trimmingTokenTagValue TokenTag
t) forall t s (m :: * -> *) a.
(Show t, Stream s m t) =>
ParsecT s ParserState m a -> String -> ParsecT s ParserState m a
<?> TokenTag -> String
showTrimmingTokenTag TokenTag
t

boolToken :: Lexer Token
boolToken :: Lexer Token
boolToken = forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m (SourcePos -> a) -> ParsecT s u m a
withPosition (Bool -> SourcePos -> Token
BoolToken forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT String ParserState Identity Bool
value) forall t s (m :: * -> *) a.
(Show t, Stream s m t) =>
ParsecT s ParserState m a -> String -> ParsecT s ParserState m a
<?> String
"BoolToken"
  where
    value :: ParsecT String ParserState Identity Bool
value =
      Bool
True forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ forall s (m :: * -> *) t u a.
Stream s m t =>
[ParsecT s u m a] -> ParsecT s u m a
tryOne [String -> ParsecT String ParserState Identity ()
keyword String
"True", String -> ParsecT String ParserState Identity ()
keyword String
"true"]
        forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> Bool
False forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ forall s (m :: * -> *) t u a.
Stream s m t =>
[ParsecT s u m a] -> ParsecT s u m a
tryOne [String -> ParsecT String ParserState Identity ()
keyword String
"False", String -> ParsecT String ParserState Identity ()
keyword String
"false"]

stringToken :: Lexer Token
stringToken :: Lexer Token
stringToken = forall t s (m :: * -> *) a.
(Show t, Stream s m t) =>
String -> ParsecT s ParserState m a -> ParsecT s ParserState m a
labeled String
"StringToken" forall a b. (a -> b) -> a -> b
$ forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m (SourcePos -> a) -> ParsecT s u m a
withPosition forall a b. (a -> b) -> a -> b
$ (String -> SourcePos -> Token
StringToken forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT String ParserState Identity String
stringChars) forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m ()
spaces
  where
    stringChars :: ParsecT String ParserState Identity String
stringChars =
      forall s (m :: * -> *) t u a.
Stream s m t =>
[ParsecT s u m a] -> ParsecT s u m a
tryOne
        [ forall s (m :: * -> *) t u open close a.
Stream s m t =>
ParsecT s u m open
-> ParsecT s u m close -> ParsecT s u m a -> ParsecT s u m a
between forall {u}. ParsecT String u Identity Char
squote forall {u}. ParsecT String u Identity Char
squote forall a b. (a -> b) -> a -> b
$ forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many (forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
noneOf String
"\\\'\n" forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String ParserState Identity Char
escapeChar),
          forall s (m :: * -> *) t u open close a.
Stream s m t =>
ParsecT s u m open
-> ParsecT s u m close -> ParsecT s u m a -> ParsecT s u m a
between forall {u}. ParsecT String u Identity Char
dquote forall {u}. ParsecT String u Identity Char
dquote forall a b. (a -> b) -> a -> b
$ forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many (forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
noneOf String
"\\\"\n" forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String ParserState Identity Char
escapeChar)
        ]
    squote :: ParsecT String u Identity Char
squote = forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'\''
    dquote :: ParsecT String u Identity Char
dquote = forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'"'
    escapeChar :: ParsecT String ParserState Identity Char
escapeChar =
      forall t s (m :: * -> *) a.
(Show t, Stream s m t) =>
String -> ParsecT s ParserState m a -> ParsecT s ParserState m a
labeled String
"EscapeChar" forall a b. (a -> b) -> a -> b
$
        forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'\\'
          forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> forall s (m :: * -> *) t u a.
Stream s m t =>
[ParsecT s u m a] -> ParsecT s u m a
tryOne
            [ forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'\\',
              forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'\'',
              forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'"',
              forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'n' forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Char
'\n',
              forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
't' forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Char
'\t'
            ]

numberToken :: Lexer Token
numberToken :: Lexer Token
numberToken = forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m (SourcePos -> a) -> ParsecT s u m a
withPosition (ParsecT String ParserState Identity (SourcePos -> Token)
numberToken' forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m ()
spaces)
  where
    numberToken' :: ParsecT String ParserState Identity (SourcePos -> Token)
numberToken' = do
      String
value <- ParsecT String ParserState Identity String
ints forall a. Semigroup a => a -> a -> a
<> forall s (m :: * -> *) t a u.
Stream s m t =>
a -> ParsecT s u m a -> ParsecT s u m a
option String
"" ParsecT String ParserState Identity String
doubles
      forall s (m :: * -> *) t a u.
(Stream s m t, Show a) =>
ParsecT s u m a -> ParsecT s u m ()
notFollowedBy ParsecT String ParserState Identity Char
badChars
      case (forall a. Read a => String -> a
read String
value :: Scientific) of
        Scientific
n | Scientific -> Bool
isInteger Scientific
n -> forall t s (m :: * -> *) a.
(Show t, Stream s m t) =>
String -> ParsecT s ParserState m a -> ParsecT s ParserState m a
labeled String
"IntToken" forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (m :: * -> *) a. Monad m => a -> m a
return forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> SourcePos -> Token
IntToken forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. HasCallStack => Maybe a -> a
fromJust forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall i. (Integral i, Bounded i) => Scientific -> Maybe i
toBoundedInteger forall a b. (a -> b) -> a -> b
$ Scientific
n
        Scientific
n | Bool
otherwise -> forall t s (m :: * -> *) a.
(Show t, Stream s m t) =>
String -> ParsecT s ParserState m a -> ParsecT s ParserState m a
labeled String
"DoubleToken" forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (m :: * -> *) a. Monad m => a -> m a
return forall b c a. (b -> c) -> (a -> b) -> a -> c
. Double -> SourcePos -> Token
DoubleToken forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. RealFloat a => Scientific -> a
toRealFloat forall a b. (a -> b) -> a -> b
$ Scientific
n

    ints :: ParsecT String ParserState Identity String
ints = forall t s (m :: * -> *) a.
(Show t, Stream s m t) =>
String -> ParsecT s ParserState m a -> ParsecT s ParserState m a
labeled String
"IntegerDigits" forall a b. (a -> b) -> a -> b
$ ParsecT String ParserState Identity String
justZero forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ((:) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT String ParserState Identity Char
nonZero forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
digit)
    justZero :: ParsecT String ParserState Identity String
justZero = forall t s (m :: * -> *) a.
(Show t, Stream s m t) =>
String -> ParsecT s ParserState m a -> ParsecT s ParserState m a
labeled String
"JustZero" forall a b. (a -> b) -> a -> b
$ forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string String
"0" forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* forall s (m :: * -> *) t a u.
(Stream s m t, Show a) =>
ParsecT s u m a -> ParsecT s u m ()
notFollowedBy ParsecT String ParserState Identity Char
nonZero
    nonZero :: ParsecT String ParserState Identity Char
nonZero = forall t s (m :: * -> *) a.
(Show t, Stream s m t) =>
String -> ParsecT s ParserState m a -> ParsecT s ParserState m a
labeled String
"NonZeroDigit" forall a b. (a -> b) -> a -> b
$ forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
oneOf [Char
'1' .. Char
'9']
    doubles :: ParsecT String ParserState Identity String
doubles = forall t s (m :: * -> *) a.
(Show t, Stream s m t) =>
String -> ParsecT s ParserState m a -> ParsecT s ParserState m a
labeled String
"DoubleDigits" forall a b. (a -> b) -> a -> b
$ forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string String
"." forall a. Semigroup a => a -> a -> a
<> forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many1 forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
digit
    badChars :: ParsecT String ParserState Identity Char
badChars = forall t s (m :: * -> *) a.
(Show t, Stream s m t) =>
String -> ParsecT s ParserState m a -> ParsecT s ParserState m a
labeled String
"BadNumberChar" forall a b. (a -> b) -> a -> b
$ forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
oneOf String
"_." forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
alphaNum

nameToken :: Lexer Token
nameToken :: Lexer Token
nameToken = forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m (SourcePos -> a) -> ParsecT s u m a
withPosition forall a b. (a -> b) -> a -> b
$ (String -> SourcePos -> Token
NameToken forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT String ParserState Identity String
name forall t s (m :: * -> *) a.
(Show t, Stream s m t) =>
ParsecT s ParserState m a -> String -> ParsecT s ParserState m a
<?> String
"NameToken") forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m ()
spaces

endKeyword :: Lexer Token
endKeyword :: Lexer Token
endKeyword = forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m (SourcePos -> a) -> ParsecT s u m a
withPosition do
  String -> ParsecT String ParserState Identity ()
keyword (TokenTag -> String
tokenTagValue TokenTag
EndToken)
  forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ TokenTag -> SourcePos -> Token
TaggedToken TokenTag
EndToken

elseKeyword :: Lexer Token
elseKeyword :: Lexer Token
elseKeyword = forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m (SourcePos -> a) -> ParsecT s u m a
withPosition do
  String -> ParsecT String ParserState Identity ()
keyword (TokenTag -> String
tokenTagValue TokenTag
ElseToken)
  forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ TokenTag -> SourcePos -> Token
TaggedToken TokenTag
ElseToken

keyword :: String -> Lexer ()
keyword :: String -> ParsecT String ParserState Identity ()
keyword String
s = forall t s (m :: * -> *) a.
(Show t, Stream s m t) =>
String -> ParsecT s ParserState m a -> ParsecT s ParserState m a
labeled (String
"Keyword " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show String
s) do
  () forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string String
s forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* forall s (m :: * -> *) t a u.
(Stream s m t, Show a) =>
ParsecT s u m a -> ParsecT s u m ()
notFollowedBy ParsecT String ParserState Identity Char
nameRest forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m ()
spaces

name :: Lexer String
name :: ParsecT String ParserState Identity String
name = forall t s (m :: * -> *) a.
(Show t, Stream s m t) =>
String -> ParsecT s ParserState m a -> ParsecT s ParserState m a
labeled String
"NameValue" do
  (:) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT String ParserState Identity Char
nameStart forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many ParsecT String ParserState Identity Char
nameRest

nameStart :: Lexer Char
nameStart :: ParsecT String ParserState Identity Char
nameStart = forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
oneOf (Char
'_' forall a. a -> [a] -> [a]
: [Char
'a' .. Char
'z'])

nameRest :: Lexer Char
nameRest :: ParsecT String ParserState Identity Char
nameRest = forall s (m :: * -> *) t u a.
Stream s m t =>
[ParsecT s u m a] -> ParsecT s u m a
tryOne [ParsecT String ParserState Identity Char
nameStart, forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
alphaNum]

data Token
  = TaggedToken TokenTag SourcePos
  | BoolToken Bool SourcePos
  | NameToken String SourcePos
  | StringToken String SourcePos
  | IntToken Int SourcePos
  | DoubleToken Double SourcePos
  | TextToken String SourcePos
  deriving (Token -> Token -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Token -> Token -> Bool
$c/= :: Token -> Token -> Bool
== :: Token -> Token -> Bool
$c== :: Token -> Token -> Bool
Eq)

instance Show Token where
  show :: Token -> String
show Token
t = case Token
t of
    TaggedToken TokenTag
tt SourcePos
_ -> forall a. Show a => a -> String
show TokenTag
tt
    BoolToken Bool
b SourcePos
_ -> String
"Bool " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show Bool
b
    NameToken String
s SourcePos
_ -> String
"Name " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show String
s
    StringToken String
s SourcePos
_ -> String
"String " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show String
s
    IntToken Int
n SourcePos
_ -> String
"Int " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show Int
n
    DoubleToken Double
x SourcePos
_ -> String
"Double " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show Double
x
    TextToken String
s SourcePos
_ -> String
"Text " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show String
s

getTokenPos :: Token -> SourcePos
getTokenPos :: Token -> SourcePos
getTokenPos = \case
  TaggedToken TokenTag
_ SourcePos
pos -> SourcePos
pos
  BoolToken Bool
_ SourcePos
pos -> SourcePos
pos
  NameToken String
_ SourcePos
pos -> SourcePos
pos
  StringToken String
_ SourcePos
pos -> SourcePos
pos
  IntToken Int
_ SourcePos
pos -> SourcePos
pos
  DoubleToken Double
_ SourcePos
pos -> SourcePos
pos
  TextToken String
_ SourcePos
pos -> SourcePos
pos

data TokenTag
  = ExpressionBlockToken
  | CommentBlockToken
  | AltBlockToken
  | ChromeBlockToken
  | CloseBlockToken
  | OpenParenToken
  | CloseParenToken
  | OpenBraceToken
  | CloseBraceToken
  | OpenBracketToken
  | CloseBracketToken
  | PipeToken
  | CommaToken
  | DotToken
  | ColonToken
  | EndToken
  | ElseToken
  | TurnOffToken
  deriving (TokenTag -> TokenTag -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: TokenTag -> TokenTag -> Bool
$c/= :: TokenTag -> TokenTag -> Bool
== :: TokenTag -> TokenTag -> Bool
$c== :: TokenTag -> TokenTag -> Bool
Eq)

tokenTagName :: TokenTag -> String
tokenTagName :: TokenTag -> String
tokenTagName = \case
  TokenTag
ExpressionBlockToken -> String
"ExpressionBlock"
  TokenTag
CommentBlockToken -> String
"CommentBlock"
  TokenTag
AltBlockToken -> String
"AltBlock"
  TokenTag
ChromeBlockToken -> String
"ChromeBlock"
  TokenTag
CloseBlockToken -> String
"CloseBlock"
  TokenTag
OpenParenToken -> String
"OpenParen"
  TokenTag
CloseParenToken -> String
"CloseParen"
  TokenTag
OpenBracketToken -> String
"OpenBracket"
  TokenTag
CloseBracketToken -> String
"CloseBracket"
  TokenTag
OpenBraceToken -> String
"OpenBrace"
  TokenTag
CloseBraceToken -> String
"CloseBrace"
  TokenTag
PipeToken -> String
"PipeToken"
  TokenTag
CommaToken -> String
"CommaToken"
  TokenTag
DotToken -> String
"DotToken"
  TokenTag
ColonToken -> String
"ColonToken"
  TokenTag
EndToken -> String
"EndToken"
  TokenTag
ElseToken -> String
"ElseToken"
  TokenTag
TurnOffToken -> String
"TurnOff"

tokenTagValue :: TokenTag -> String
tokenTagValue :: TokenTag -> String
tokenTagValue = \case
  TokenTag
ExpressionBlockToken -> String
"{{"
  TokenTag
CommentBlockToken -> String
"{{!"
  TokenTag
AltBlockToken -> String
"{{#"
  TokenTag
ChromeBlockToken -> String
"{{@"
  TokenTag
CloseBlockToken -> String
"}}"
  TokenTag
OpenParenToken -> String
"("
  TokenTag
CloseParenToken -> String
")"
  TokenTag
OpenBraceToken -> String
"{"
  TokenTag
CloseBraceToken -> String
"}"
  TokenTag
OpenBracketToken -> String
"["
  TokenTag
CloseBracketToken -> String
"]"
  TokenTag
PipeToken -> String
"|"
  TokenTag
CommaToken -> String
","
  TokenTag
DotToken -> String
"."
  TokenTag
ColonToken -> String
":"
  TokenTag
EndToken -> String
"end"
  TokenTag
ElseToken -> String
"else"
  TokenTag
TurnOffToken -> String
"{{*"

tokenTagParser :: TokenTag -> Lexer String
tokenTagParser :: TokenTag -> ParsecT String ParserState Identity String
tokenTagParser TokenTag
tag = forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string (TokenTag -> String
tokenTagValue TokenTag
tag) forall t s (m :: * -> *) a.
(Show t, Stream s m t) =>
ParsecT s ParserState m a -> String -> ParsecT s ParserState m a
<?> forall a. Show a => a -> String
show TokenTag
tag

trimmingTokenTagValue :: TokenTag -> String
trimmingTokenTagValue :: TokenTag -> String
trimmingTokenTagValue = \case
  TokenTag
ExpressionBlockToken -> String
"{{-"
  TokenTag
CommentBlockToken -> String
"{{-!"
  TokenTag
AltBlockToken -> String
"{{-#"
  TokenTag
ChromeBlockToken -> String
"{{-@"
  TokenTag
CloseBlockToken -> String
"-}}"
  TokenTag
TurnOffToken -> String
"{{-*"
  TokenTag
t -> TokenTag -> String
tokenTagValue TokenTag
t

trimmingTokenTagParser :: TokenTag -> Lexer String
trimmingTokenTagParser :: TokenTag -> ParsecT String ParserState Identity String
trimmingTokenTagParser TokenTag
tag = forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string (TokenTag -> String
trimmingTokenTagValue TokenTag
tag) forall t s (m :: * -> *) a.
(Show t, Stream s m t) =>
ParsecT s ParserState m a -> String -> ParsecT s ParserState m a
<?> TokenTag -> String
showTrimmingTokenTag TokenTag
tag

showTrimmingTokenTag :: TokenTag -> String
showTrimmingTokenTag :: TokenTag -> String
showTrimmingTokenTag TokenTag
t = TokenTag -> String
tokenTagName TokenTag
t forall a. [a] -> [a] -> [a]
++ String
" " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show (TokenTag -> String
trimmingTokenTagValue TokenTag
t)

open :: Lexer String
open :: ParsecT String ParserState Identity String
open = TokenTag -> ParsecT String ParserState Identity String
tokenTagParser TokenTag
ExpressionBlockToken

close :: Lexer String
close :: ParsecT String ParserState Identity String
close = TokenTag -> ParsecT String ParserState Identity String
tokenTagParser TokenTag
CloseBlockToken

trimmingOpen :: Lexer String
trimmingOpen :: ParsecT String ParserState Identity String
trimmingOpen = TokenTag -> ParsecT String ParserState Identity String
trimmingTokenTagParser TokenTag
ExpressionBlockToken

trimmingClose :: Lexer String
trimmingClose :: ParsecT String ParserState Identity String
trimmingClose = TokenTag -> ParsecT String ParserState Identity String
trimmingTokenTagParser TokenTag
CloseBlockToken

openBrace :: Lexer String
openBrace :: ParsecT String ParserState Identity String
openBrace = TokenTag -> ParsecT String ParserState Identity String
tokenTagParser TokenTag
OpenBraceToken

closeBrace :: Lexer String
closeBrace :: ParsecT String ParserState Identity String
closeBrace = TokenTag -> ParsecT String ParserState Identity String
tokenTagParser TokenTag
CloseBraceToken

instance Show TokenTag where
  show :: TokenTag -> String
show TokenTag
t = TokenTag -> String
tokenTagName TokenTag
t forall a. [a] -> [a] -> [a]
++ String
" " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show (TokenTag -> String
tokenTagValue TokenTag
t)