1 {-# LANGUAGE FlexibleContexts #-}
2 {-# LANGUAGE OverloadedStrings #-}
3 {-# LANGUAGE Rank2Types #-}
4 {-# LANGUAGE TypeFamilies #-}
5 module Language.TCT.Read.Elem where
7 import Control.Applicative (Applicative(..), Alternative(..))
8 import Control.Monad ((>>))
10 import Data.Char (Char)
11 import Data.Eq (Eq(..))
12 import Data.Function (($))
13 import Data.Functor ((<$>))
14 import Data.Semigroup (Semigroup(..))
15 import Data.String (String)
16 import Data.Text (Text)
17 import Text.Show (Show(..))
18 import qualified Data.Char as Char
19 import qualified Data.Text as Text
20 import qualified Text.Megaparsec as P
21 import qualified Data.Text.Lazy as TL
23 import Language.TCT.Elem
26 -- | Convenient alias.
29 , P.ShowErrorComponent e
36 , P.ShowErrorComponent e
39 , P.ShowToken (P.Token s)
41 ) => String -> P.ParsecT e s m a -> P.ParsecT e s m a
42 -- pdbg m p = P.dbg m p
46 p_Attrs :: Parser e s [(White,Attr)]
47 p_Attrs = P.many $ P.try $ (,) <$> p_Spaces <*> p_Attr
48 p_Attr :: Parser e s Attr
49 p_Attr = P.try p_Attr_Eq <|> p_Attr_Word
50 p_Spaces :: Parser e s White
51 p_Spaces = Text.pack <$> P.some (P.satisfy Char.isSpace)
52 p_Attr_Eq :: Parser e s Attr
54 (\n (o,v,c) -> Attr (TL.toStrict n) ("="<>o) v c)
58 p_Attr_Word :: Parser e s Attr
60 (\(o,v,c) -> Attr "" o v c)
62 p_Attr_Value :: Parser e s (Text,Text,Text)
64 p_Attr_Value_Quote '\'' <|>
65 p_Attr_Value_Quote '"' <|>
67 p_Attr_Value_Quote :: Char -> Parser e s (Text,Text,Text)
68 p_Attr_Value_Quote q =
69 (\o v c -> (Text.singleton o, Text.pack v, Text.singleton c))
72 P.notFollowedBy (P.string "/>") >>
73 P.satisfy (\c -> Char.isPrint c && c /= '>' && c/=q))
75 p_Attr_Value_Word :: Parser e s (Text,Text,Text)
77 (\v -> ("", Text.pack v, ""))
78 <$> P.many (P.satisfy Char.isAlphaNum)
80 p_Word :: Parser e s TL.Text
81 p_Word = pdbg "Word" $
84 <*> P.option "" (p_plain <|> p_hyphen)
88 <$> (TL.pack <$> P.some (P.satisfy (\c -> c=='_' || c=='-')))
92 <$> P.some (P.satisfy $ \c ->