{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE TupleSections #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE TupleSections #-}
module Scrappy.Elem.TreeElemParser where
import Control.Monad.IO.Class
import Scrappy.Elem.ElemHeadParse (parseOpeningTag, hrefParser', parseOpeningTagDesc, mkAttrsDesc, attrParser)
import Scrappy.Elem.Types (Elem, Attrs, ElemHead, TreeHTML(TreeHTML), HTMLMatcher (IText, Element, Match)
, InnerTextHTMLTree(InnerTextHTMLTree), innerTree, innerText, matches, GroupHtml
, Elem', TreeIndex, attrs, elTag, ShowHTML, showH, _innerTree', matches'
, ElementRep, mkGH, innerText', _innerText, _matches, foldFuncTrup
, UrlPagination(..), enoughMatchesTree, selfClosingTextful, endTag)
import Scrappy.Elem.ChainHTML (someHtml, manyHtml, nl)
import Scrappy.Elem.SimpleElemParser (elemParser)
import Scrappy.Find (findNaive)
import Control.Monad (when)
import Control.Applicative (Alternative, liftA2, many, (<|>), some)
import Text.Parsec (Stream, ParsecT, anyChar, try, parserZero, parserFail, string, parse
, char, noneOf, option, space, alphaNum, notFollowedBy, (<?>), optional, manyTill)
import qualified Data.Map as Map (Map, toList, fromList, adjust)
import Data.Graph (Tree (Node), Forest)
import Data.Tree (rootLabel)
import Text.URI as URI
import Data.Char (digitToInt)
import Data.Maybe (fromMaybe, fromJust)
import Data.List
import Data.Text (Text, splitOn)
skipManyTill :: Alternative m => m a -> m end -> m end
skipManyTill :: forall (m :: * -> *) a end. Alternative m => m a -> m end -> m end
skipManyTill m a
p m end
end = m end
go
where
go :: m end
go = m end
end m end -> m end -> m end
forall a. m a -> m a -> m a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> (m a
p m a -> m end -> m end
forall a b. m a -> m b -> m b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> m end
go)
{-# INLINE skipManyTill #-}
manyTill_ :: ParsecT s u m a -> ParsecT s u m end -> ParsecT s u m ([a], end)
manyTill_ :: forall s u (m :: * -> *) a end.
ParsecT s u m a -> ParsecT s u m end -> ParsecT s u m ([a], end)
manyTill_ ParsecT s u m a
p ParsecT s u m end
end = ParsecT s u m ([a], end)
go
where
go :: ParsecT s u m ([a], end)
go = (([],) (end -> ([a], end))
-> ParsecT s u m end -> ParsecT s u m ([a], end)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m end
end) ParsecT s u m ([a], end)
-> ParsecT s u m ([a], end) -> ParsecT s u m ([a], end)
forall a. ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> (a -> ([a], end) -> ([a], end))
-> ParsecT s u m a
-> ParsecT s u m ([a], end)
-> ParsecT s u m ([a], end)
forall a b c.
(a -> b -> c)
-> ParsecT s u m a -> ParsecT s u m b -> ParsecT s u m c
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 (\a
x ([a]
xs, end
y) -> (a
x a -> [a] -> [a]
forall a. a -> [a] -> [a]
: [a]
xs, end
y)) ParsecT s u m a
p ParsecT s u m ([a], end)
go
data Many a = Many a | One a deriving Int -> Many a -> ShowS
[Many a] -> ShowS
Many a -> String
(Int -> Many a -> ShowS)
-> (Many a -> String) -> ([Many a] -> ShowS) -> Show (Many a)
forall a. Show a => Int -> Many a -> ShowS
forall a. Show a => [Many a] -> ShowS
forall a. Show a => Many a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall a. Show a => Int -> Many a -> ShowS
showsPrec :: Int -> Many a -> ShowS
$cshow :: forall a. Show a => Many a -> String
show :: Many a -> String
$cshowList :: forall a. Show a => [Many a] -> ShowS
showList :: [Many a] -> ShowS
Show
treeLookupIdx :: TreeIndex -> Forest a -> a
treeLookupIdx :: forall a. TreeIndex -> Forest a -> a
treeLookupIdx = TreeIndex -> Forest a -> a
forall a. HasCallStack => a
undefined
treeElemParser :: (Stream s m Char, ShowHTML a) =>
Maybe [Elem]
-> Maybe (ParsecT s u m a)
-> [(String, Maybe String)]
-> ParsecT s u m (TreeHTML a)
treeElemParser :: forall s (m :: * -> *) a u.
(Stream s m Char, ShowHTML a) =>
Maybe [String]
-> Maybe (ParsecT s u m a)
-> [(String, Maybe String)]
-> ParsecT s u m (TreeHTML a)
treeElemParser Maybe [String]
elemOpts Maybe (ParsecT s u m a)
matchh [(String, Maybe String)]
attrsSubset = do
TreeHTML a
e <- Maybe [String]
-> Maybe (ParsecT s u m a)
-> [(String, Maybe String)]
-> ParsecT s u m (TreeHTML a)
forall s (m :: * -> *) a u.
(Stream s m Char, ShowHTML a) =>
Maybe [String]
-> Maybe (ParsecT s u m a)
-> [(String, Maybe String)]
-> ParsecT s u m (TreeHTML a)
treeElemParser' Maybe [String]
elemOpts Maybe (ParsecT s u m a)
matchh [(String, Maybe String)]
attrsSubset
Bool -> ParsecT s u m () -> ParsecT s u m ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when ([a] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length (TreeHTML a -> [a]
forall b. TreeHTML b -> [b]
forall (a :: * -> *) b. ElementRep a => a b -> [b]
matches' TreeHTML a
e) Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< (case Maybe (ParsecT s u m a)
matchh of { Maybe (ParsecT s u m a)
Nothing -> Int
0; Maybe (ParsecT s u m a)
_ -> Int
1 })) (String -> ParsecT s u m ()
forall s u (m :: * -> *) a. String -> ParsecT s u m a
parserFail String
"not enough matches")
TreeHTML a -> ParsecT s u m (TreeHTML a)
forall a. a -> ParsecT s u m a
forall (m :: * -> *) a. Monad m => a -> m a
return TreeHTML a
e
selfClosing :: [String]
selfClosing :: [String]
selfClosing = [String
"area", String
"base", String
"br", String
"col", String
"embed", String
"hr", String
"img", String
"input", String
"link", String
"meta", String
"param", String
"source", String
"track", String
"wbr"]
treeElemParser' :: (Stream s m Char, ShowHTML a) =>
Maybe [Elem]
-> Maybe (ParsecT s u m a)
-> [(String, Maybe String)]
-> ParsecT s u m (TreeHTML a)
treeElemParser' :: forall s (m :: * -> *) a u.
(Stream s m Char, ShowHTML a) =>
Maybe [String]
-> Maybe (ParsecT s u m a)
-> [(String, Maybe String)]
-> ParsecT s u m (TreeHTML a)
treeElemParser' Maybe [String]
elemOpts Maybe (ParsecT s u m a)
matchh [(String, Maybe String)]
attrsSubset = do
(String
elem', Attrs
attrs') <- Maybe [String]
-> [(String, Maybe String)] -> ParsecT s u m (String, Attrs)
forall s (m :: * -> *) u.
Stream s m Char =>
Maybe [String]
-> [(String, Maybe String)] -> ParsecT s u m (String, Attrs)
parseOpeningTag Maybe [String]
elemOpts [(String, Maybe String)]
attrsSubset
case String -> [String] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem String
elem' [String]
selfClosing of
Bool
True -> do
(ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string String
">") ParsecT s u m String
-> ParsecT s u m String -> ParsecT s u m String
forall a. ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string String
"/>")
case Maybe (ParsecT s u m a)
matchh of
Maybe (ParsecT s u m a)
Nothing -> TreeHTML a -> ParsecT s u m (TreeHTML a)
forall a. a -> ParsecT s u m a
forall (m :: * -> *) a. Monad m => a -> m a
return (TreeHTML a -> ParsecT s u m (TreeHTML a))
-> TreeHTML a -> ParsecT s u m (TreeHTML a)
forall a b. (a -> b) -> a -> b
$ String
-> Attrs -> [a] -> String -> Forest (String, Attrs) -> TreeHTML a
forall a.
String
-> Attrs -> [a] -> String -> Forest (String, Attrs) -> TreeHTML a
TreeHTML String
elem' Attrs
attrs' [a]
forall a. Monoid a => a
mempty String
forall a. Monoid a => a
mempty Forest (String, Attrs)
forall a. Monoid a => a
mempty
Just ParsecT s u m a
_ -> ParsecT s u m (TreeHTML a)
forall s u (m :: * -> *) a. ParsecT s u m a
parserZero
Bool
False -> do
(String
inText, [a]
matchBook, Forest (String, Attrs)
treees) <- ([HTMLMatcher TreeHTML a] -> (String, [a], Forest (String, Attrs)))
-> ParsecT s u m [HTMLMatcher TreeHTML a]
-> ParsecT s u m (String, [a], Forest (String, Attrs))
forall a b. (a -> b) -> ParsecT s u m a -> ParsecT s u m b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((HTMLMatcher TreeHTML a
-> (String, [a], Forest (String, Attrs))
-> (String, [a], Forest (String, Attrs)))
-> (String, [a], Forest (String, Attrs))
-> [HTMLMatcher TreeHTML a]
-> (String, [a], Forest (String, Attrs))
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr HTMLMatcher TreeHTML a
-> (String, [a], Forest (String, Attrs))
-> (String, [a], Forest (String, Attrs))
forall a.
ShowHTML a =>
HTMLMatcher TreeHTML a
-> (String, [a], Forest (String, Attrs))
-> (String, [a], Forest (String, Attrs))
foldFuncTrup (String, [a], Forest (String, Attrs))
forall a. Monoid a => a
mempty)
(ParsecT s u m [HTMLMatcher TreeHTML a]
-> ParsecT s u m (String, [a], Forest (String, Attrs)))
-> ParsecT s u m [HTMLMatcher TreeHTML a]
-> ParsecT s u m (String, [a], Forest (String, Attrs))
forall a b. (a -> b) -> a -> b
$ (ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string String
"/>") ParsecT s u m String
-> ParsecT s u m [HTMLMatcher TreeHTML a]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
forall a b. ParsecT s u m a -> ParsecT s u m b -> ParsecT s u m b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> [HTMLMatcher TreeHTML a] -> ParsecT s u m [HTMLMatcher TreeHTML a]
forall a. a -> ParsecT s u m a
forall (m :: * -> *) a. Monad m => a -> m a
return [])
ParsecT s u m [HTMLMatcher TreeHTML a]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
forall a. ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> (ParsecT s u m [HTMLMatcher TreeHTML a]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT s u m [HTMLMatcher TreeHTML a]
-> ParsecT s u m [HTMLMatcher TreeHTML a])
-> ParsecT s u m [HTMLMatcher TreeHTML a]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
forall a b. (a -> b) -> a -> b
$ String
-> Maybe (ParsecT s u m a)
-> ParsecT s u m [HTMLMatcher TreeHTML a]
forall a s (m :: * -> *) u.
(ShowHTML a, Stream s m Char) =>
String
-> Maybe (ParsecT s u m a)
-> ParsecT s u m [HTMLMatcher TreeHTML a]
innerElemParser2 String
elem' Maybe (ParsecT s u m a)
matchh)
ParsecT s u m [HTMLMatcher TreeHTML a]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
forall a. ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> (Maybe (ParsecT s u m a) -> ParsecT s u m [HTMLMatcher TreeHTML a]
forall a s (m :: * -> *) u (e :: * -> *).
(ShowHTML a, Stream s m Char) =>
Maybe (ParsecT s u m a) -> ParsecT s u m [HTMLMatcher e a]
selfClosingTextful Maybe (ParsecT s u m a)
matchh)
TreeHTML a -> ParsecT s u m (TreeHTML a)
forall a. a -> ParsecT s u m a
forall (m :: * -> *) a. Monad m => a -> m a
return (TreeHTML a -> ParsecT s u m (TreeHTML a))
-> TreeHTML a -> ParsecT s u m (TreeHTML a)
forall a b. (a -> b) -> a -> b
$ String
-> Attrs -> [a] -> String -> Forest (String, Attrs) -> TreeHTML a
forall a.
String
-> Attrs -> [a] -> String -> Forest (String, Attrs) -> TreeHTML a
TreeHTML String
elem' Attrs
attrs' [a]
matchBook String
inText Forest (String, Attrs)
treees
innerTreeElemParser :: (ShowHTML a, Stream s m Char) =>
Elem
-> Maybe (ParsecT s u m a)
-> ParsecT s u m (String, [a], [Tree ElemHead])
innerTreeElemParser :: forall a s (m :: * -> *) u.
(ShowHTML a, Stream s m Char) =>
String
-> Maybe (ParsecT s u m a)
-> ParsecT s u m (String, [a], Forest (String, Attrs))
innerTreeElemParser String
elem' Maybe (ParsecT s u m a)
matchh = do
([HTMLMatcher TreeHTML a] -> (String, [a], Forest (String, Attrs)))
-> ParsecT s u m [HTMLMatcher TreeHTML a]
-> ParsecT s u m (String, [a], Forest (String, Attrs))
forall a b. (a -> b) -> ParsecT s u m a -> ParsecT s u m b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((HTMLMatcher TreeHTML a
-> (String, [a], Forest (String, Attrs))
-> (String, [a], Forest (String, Attrs)))
-> (String, [a], Forest (String, Attrs))
-> [HTMLMatcher TreeHTML a]
-> (String, [a], Forest (String, Attrs))
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr HTMLMatcher TreeHTML a
-> (String, [a], Forest (String, Attrs))
-> (String, [a], Forest (String, Attrs))
forall a.
ShowHTML a =>
HTMLMatcher TreeHTML a
-> (String, [a], Forest (String, Attrs))
-> (String, [a], Forest (String, Attrs))
foldFuncTrup (String, [a], Forest (String, Attrs))
forall a. Monoid a => a
mempty)
(ParsecT s u m [HTMLMatcher TreeHTML a]
-> ParsecT s u m (String, [a], Forest (String, Attrs)))
-> ParsecT s u m [HTMLMatcher TreeHTML a]
-> ParsecT s u m (String, [a], Forest (String, Attrs))
forall a b. (a -> b) -> a -> b
$ (ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string String
"/>") ParsecT s u m String
-> ParsecT s u m [HTMLMatcher TreeHTML a]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
forall a b. ParsecT s u m a -> ParsecT s u m b -> ParsecT s u m b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> [HTMLMatcher TreeHTML a] -> ParsecT s u m [HTMLMatcher TreeHTML a]
forall a. a -> ParsecT s u m a
forall (m :: * -> *) a. Monad m => a -> m a
return [])
ParsecT s u m [HTMLMatcher TreeHTML a]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
forall a. ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> (ParsecT s u m [HTMLMatcher TreeHTML a]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT s u m [HTMLMatcher TreeHTML a]
-> ParsecT s u m [HTMLMatcher TreeHTML a])
-> ParsecT s u m [HTMLMatcher TreeHTML a]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
forall a b. (a -> b) -> a -> b
$ String
-> Maybe (ParsecT s u m a)
-> ParsecT s u m [HTMLMatcher TreeHTML a]
forall a s (m :: * -> *) u.
(ShowHTML a, Stream s m Char) =>
String
-> Maybe (ParsecT s u m a)
-> ParsecT s u m [HTMLMatcher TreeHTML a]
innerElemParser2 String
elem' Maybe (ParsecT s u m a)
matchh)
ParsecT s u m [HTMLMatcher TreeHTML a]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
forall a. ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> (Maybe (ParsecT s u m a) -> ParsecT s u m [HTMLMatcher TreeHTML a]
forall a s (m :: * -> *) u (e :: * -> *).
(ShowHTML a, Stream s m Char) =>
Maybe (ParsecT s u m a) -> ParsecT s u m [HTMLMatcher e a]
selfClosingTextful Maybe (ParsecT s u m a)
matchh)
type SubTree a = [Tree a]
treeElemParserSpecific :: (Stream s m Char, ShowHTML a) =>
Maybe (ParsecT s u m a)
-> Elem
-> [(String, String)]
-> SubTree ElemHead
-> ParsecT s u m (TreeHTML a)
treeElemParserSpecific :: forall s (m :: * -> *) a u.
(Stream s m Char, ShowHTML a) =>
Maybe (ParsecT s u m a)
-> String
-> [(String, String)]
-> Forest (String, Attrs)
-> ParsecT s u m (TreeHTML a)
treeElemParserSpecific Maybe (ParsecT s u m a)
match String
elem' [(String, String)]
attrs' Forest (String, Attrs)
subTree = do
(String
tag, Attrs
attrsOut) <- Maybe [String]
-> [(String, String)] -> ParsecT s u m (String, Attrs)
forall s (m :: * -> *) u.
Stream s m Char =>
Maybe [String]
-> [(String, String)] -> ParsecT s u m (String, Attrs)
parseOpeningTagDesc ([String] -> Maybe [String]
forall a. a -> Maybe a
Just [String
elem']) [(String, String)]
attrs'
Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'>'
([a]
matchBook, String
inText, Forest (String, Attrs)
treees) <- Maybe (ParsecT s u m a)
-> String
-> Forest (String, Attrs)
-> ParsecT s u m ([a], String, Forest (String, Attrs))
forall s (m :: * -> *) a u.
(Stream s m Char, ShowHTML a) =>
Maybe (ParsecT s u m a)
-> String
-> Forest (String, Attrs)
-> ParsecT s u m ([a], String, Forest (String, Attrs))
innerParserSpecific Maybe (ParsecT s u m a)
match String
tag Forest (String, Attrs)
subTree
TreeHTML a -> ParsecT s u m (TreeHTML a)
forall a. a -> ParsecT s u m a
forall (m :: * -> *) a. Monad m => a -> m a
return (TreeHTML a -> ParsecT s u m (TreeHTML a))
-> TreeHTML a -> ParsecT s u m (TreeHTML a)
forall a b. (a -> b) -> a -> b
$ String
-> Attrs -> [a] -> String -> Forest (String, Attrs) -> TreeHTML a
forall a.
String
-> Attrs -> [a] -> String -> Forest (String, Attrs) -> TreeHTML a
TreeHTML String
tag Attrs
attrsOut [a]
matchBook String
inText Forest (String, Attrs)
treees
validateGPR :: [Many (Tree ElemHead)] -> ParsecT s u m [HTMLMatcher TreeHTML a]
validateGPR :: forall s u (m :: * -> *) a.
[Many (Tree (String, Attrs))]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
validateGPR [Many (Tree (String, Attrs))]
manyElHeads =
if [Many (Tree (String, Attrs))] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length ((Many (Tree (String, Attrs)) -> Bool)
-> [Many (Tree (String, Attrs))] -> [Many (Tree (String, Attrs))]
forall a. (a -> Bool) -> [a] -> [a]
filter (\case {One Tree (String, Attrs)
a -> Bool
True; Many (Tree (String, Attrs))
_ -> Bool
False}) [Many (Tree (String, Attrs))]
manyElHeads) Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
0 then [HTMLMatcher TreeHTML a] -> ParsecT s u m [HTMLMatcher TreeHTML a]
forall a. a -> ParsecT s u m a
forall (m :: * -> *) a. Monad m => a -> m a
return []
else String -> ParsecT s u m [HTMLMatcher TreeHTML a]
forall s u (m :: * -> *) a. String -> ParsecT s u m a
parserFail String
"promised elements not found"
htmlGenParserRepeat' :: (Stream s m Char, ShowHTML a) =>
String
-> Maybe (ParsecT s u m a)
-> [Many (Tree ElemHead)]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
htmlGenParserRepeat' :: forall s (m :: * -> *) a u.
(Stream s m Char, ShowHTML a) =>
String
-> Maybe (ParsecT s u m a)
-> [Many (Tree (String, Attrs))]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
htmlGenParserRepeat' String
elemTag Maybe (ParsecT s u m a)
match [Many (Tree (String, Attrs))]
manyElHeads =
((String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
endTag String
elemTag) ParsecT s u m String
-> ParsecT s u m [HTMLMatcher TreeHTML a]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
forall a b. ParsecT s u m a -> ParsecT s u m b -> ParsecT s u m b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> [Many (Tree (String, Attrs))]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
forall s u (m :: * -> *) a.
[Many (Tree (String, Attrs))]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
validateGPR [Many (Tree (String, Attrs))]
manyElHeads)
ParsecT s u m [HTMLMatcher TreeHTML a]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
forall a. ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> (HTMLMatcher TreeHTML a
-> [HTMLMatcher TreeHTML a] -> [HTMLMatcher TreeHTML a])
-> ParsecT s u m (HTMLMatcher TreeHTML a)
-> ParsecT s u m [HTMLMatcher TreeHTML a]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
forall a b c.
(a -> b -> c)
-> ParsecT s u m a -> ParsecT s u m b -> ParsecT s u m c
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 (:) ((a -> HTMLMatcher TreeHTML a)
-> ParsecT s u m a -> ParsecT s u m (HTMLMatcher TreeHTML a)
forall a b. (a -> b) -> ParsecT s u m a -> ParsecT s u m b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> HTMLMatcher TreeHTML a
forall (a :: * -> *) b. b -> HTMLMatcher a b
Match (ParsecT s u m a -> ParsecT s u m (HTMLMatcher TreeHTML a))
-> ParsecT s u m a -> ParsecT s u m (HTMLMatcher TreeHTML a)
forall a b. (a -> b) -> a -> b
$ ParsecT s u m a -> ParsecT s u m a
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT s u m a -> Maybe (ParsecT s u m a) -> ParsecT s u m a
forall a. a -> Maybe a -> a
fromMaybe ParsecT s u m a
forall s u (m :: * -> *) a. ParsecT s u m a
parserZero Maybe (ParsecT s u m a)
match)) (String
-> Maybe (ParsecT s u m a)
-> [Many (Tree (String, Attrs))]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
forall s (m :: * -> *) a u.
(Stream s m Char, ShowHTML a) =>
String
-> Maybe (ParsecT s u m a)
-> [Many (Tree (String, Attrs))]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
htmlGenParserRepeat String
elemTag Maybe (ParsecT s u m a)
match [Many (Tree (String, Attrs))]
manyElHeads)
ParsecT s u m [HTMLMatcher TreeHTML a]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
forall a. ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> (HTMLMatcher TreeHTML a
-> [HTMLMatcher TreeHTML a] -> [HTMLMatcher TreeHTML a])
-> ParsecT s u m (HTMLMatcher TreeHTML a)
-> ParsecT s u m [HTMLMatcher TreeHTML a]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
forall a b c.
(a -> b -> c)
-> ParsecT s u m a -> ParsecT s u m b -> ParsecT s u m c
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 (:) ((String -> HTMLMatcher TreeHTML a)
-> ParsecT s u m String -> ParsecT s u m (HTMLMatcher TreeHTML a)
forall a b. (a -> b) -> ParsecT s u m a -> ParsecT s u m b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap String -> HTMLMatcher TreeHTML a
forall (a :: * -> *) b. String -> HTMLMatcher a b
IText (ParsecT s u m String -> ParsecT s u m (HTMLMatcher TreeHTML a))
-> ParsecT s u m String -> ParsecT s u m (HTMLMatcher TreeHTML a)
forall a b. (a -> b) -> a -> b
$ ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
stylingElem) (String
-> Maybe (ParsecT s u m a)
-> [Many (Tree (String, Attrs))]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
forall s (m :: * -> *) a u.
(Stream s m Char, ShowHTML a) =>
String
-> Maybe (ParsecT s u m a)
-> [Many (Tree (String, Attrs))]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
htmlGenParserRepeat String
elemTag Maybe (ParsecT s u m a)
match [Many (Tree (String, Attrs))]
manyElHeads)
ParsecT s u m [HTMLMatcher TreeHTML a]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
forall a. ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ParsecT s u m [HTMLMatcher TreeHTML a]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ((Maybe (ParsecT s u m a)
-> [Many (Tree (String, Attrs))]
-> ParsecT s u m ([Many (Tree (String, Attrs))], TreeHTML a)
forall s (m :: * -> *) a u.
(Stream s m Char, ShowHTML a) =>
Maybe (ParsecT s u m a)
-> [Many (Tree (String, Attrs))]
-> ParsecT s u m ([Many (Tree (String, Attrs))], TreeHTML a)
treeElemParserSpecificContinuous Maybe (ParsecT s u m a)
match [Many (Tree (String, Attrs))]
manyElHeads)
ParsecT s u m ([Many (Tree (String, Attrs))], TreeHTML a)
-> (([Many (Tree (String, Attrs))], TreeHTML a)
-> ParsecT s u m [HTMLMatcher TreeHTML a])
-> ParsecT s u m [HTMLMatcher TreeHTML a]
forall a b.
ParsecT s u m a -> (a -> ParsecT s u m b) -> ParsecT s u m b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (\([Many (Tree (String, Attrs))]
sM, TreeHTML a
a) -> ([HTMLMatcher TreeHTML a] -> [HTMLMatcher TreeHTML a])
-> ParsecT s u m [HTMLMatcher TreeHTML a]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
forall a b. (a -> b) -> ParsecT s u m a -> ParsecT s u m b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((TreeHTML a -> HTMLMatcher TreeHTML a
forall (a :: * -> *) b. a b -> HTMLMatcher a b
Element TreeHTML a
a)HTMLMatcher TreeHTML a
-> [HTMLMatcher TreeHTML a] -> [HTMLMatcher TreeHTML a]
forall a. a -> [a] -> [a]
:) (String
-> Maybe (ParsecT s u m a)
-> [Many (Tree (String, Attrs))]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
forall s (m :: * -> *) a u.
(Stream s m Char, ShowHTML a) =>
String
-> Maybe (ParsecT s u m a)
-> [Many (Tree (String, Attrs))]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
htmlGenParserRepeat String
elemTag Maybe (ParsecT s u m a)
match [Many (Tree (String, Attrs))]
sM)))
ParsecT s u m [HTMLMatcher TreeHTML a]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
forall a. ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> (HTMLMatcher TreeHTML a
-> [HTMLMatcher TreeHTML a] -> [HTMLMatcher TreeHTML a])
-> ParsecT s u m (HTMLMatcher TreeHTML a)
-> ParsecT s u m [HTMLMatcher TreeHTML a]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
forall a b c.
(a -> b -> c)
-> ParsecT s u m a -> ParsecT s u m b -> ParsecT s u m c
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 (:) ((String -> HTMLMatcher TreeHTML a
forall (a :: * -> *) b. String -> HTMLMatcher a b
IText (String -> HTMLMatcher TreeHTML a)
-> (Char -> String) -> Char -> HTMLMatcher TreeHTML a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Char -> ShowS
forall a. a -> [a] -> [a]
:[])) (Char -> HTMLMatcher TreeHTML a)
-> ParsecT s u m Char -> ParsecT s u m (HTMLMatcher TreeHTML a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
anyChar) (String
-> Maybe (ParsecT s u m a)
-> [Many (Tree (String, Attrs))]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
forall s (m :: * -> *) a u.
(Stream s m Char, ShowHTML a) =>
String
-> Maybe (ParsecT s u m a)
-> [Many (Tree (String, Attrs))]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
htmlGenParserRepeat String
elemTag Maybe (ParsecT s u m a)
match [Many (Tree (String, Attrs))]
manyElHeads)
htmlGenParserRepeat :: (Stream s m Char, ShowHTML a) =>
String
-> Maybe (ParsecT s u m a)
-> [Many (Tree ElemHead)]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
htmlGenParserRepeat :: forall s (m :: * -> *) a u.
(Stream s m Char, ShowHTML a) =>
String
-> Maybe (ParsecT s u m a)
-> [Many (Tree (String, Attrs))]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
htmlGenParserRepeat String
elemTag Maybe (ParsecT s u m a)
match [Many (Tree (String, Attrs))]
manyElHeadss =
case [Many (Tree (String, Attrs))]
manyElHeadss of
[] -> do
([HTMLMatcher TreeHTML a]
htMMers, String
_) <- ParsecT s u m (HTMLMatcher TreeHTML a)
-> ParsecT s u m String
-> ParsecT s u m ([HTMLMatcher TreeHTML a], String)
forall s u (m :: * -> *) a end.
ParsecT s u m a -> ParsecT s u m end -> ParsecT s u m ([a], end)
manyTill_ (Maybe (ParsecT s u m a) -> ParsecT s u m (HTMLMatcher TreeHTML a)
forall s (m :: * -> *) a u.
(Stream s m Char, ShowHTML a) =>
Maybe (ParsecT s u m a) -> ParsecT s u m (HTMLMatcher TreeHTML a)
htmlGenParserFlex Maybe (ParsecT s u m a)
match) (String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
endTag String
elemTag)
if [HTMLMatcher TreeHTML a] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length ((HTMLMatcher TreeHTML a -> Bool)
-> [HTMLMatcher TreeHTML a] -> [HTMLMatcher TreeHTML a]
forall a. (a -> Bool) -> [a] -> [a]
filter (\case {Element TreeHTML a
_ -> Bool
True; HTMLMatcher TreeHTML a
_ -> Bool
False}) [HTMLMatcher TreeHTML a]
htMMers) Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
0
then
[HTMLMatcher TreeHTML a] -> ParsecT s u m [HTMLMatcher TreeHTML a]
forall a. a -> ParsecT s u m a
forall (m :: * -> *) a. Monad m => a -> m a
return [HTMLMatcher TreeHTML a]
htMMers
else
String -> ParsecT s u m [HTMLMatcher TreeHTML a]
forall s u (m :: * -> *) a. String -> ParsecT s u m a
parserFail String
"extra elements"
[Many (Tree (String, Attrs))]
manyElHeads ->
(HTMLMatcher TreeHTML a
-> [HTMLMatcher TreeHTML a] -> [HTMLMatcher TreeHTML a])
-> ParsecT s u m (HTMLMatcher TreeHTML a)
-> ParsecT s u m [HTMLMatcher TreeHTML a]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
forall a b c.
(a -> b -> c)
-> ParsecT s u m a -> ParsecT s u m b -> ParsecT s u m c
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 (:) ((a -> HTMLMatcher TreeHTML a)
-> ParsecT s u m a -> ParsecT s u m (HTMLMatcher TreeHTML a)
forall a b. (a -> b) -> ParsecT s u m a -> ParsecT s u m b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> HTMLMatcher TreeHTML a
forall (a :: * -> *) b. b -> HTMLMatcher a b
Match (ParsecT s u m a -> ParsecT s u m (HTMLMatcher TreeHTML a))
-> ParsecT s u m a -> ParsecT s u m (HTMLMatcher TreeHTML a)
forall a b. (a -> b) -> a -> b
$ ParsecT s u m a -> ParsecT s u m a
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT s u m a -> Maybe (ParsecT s u m a) -> ParsecT s u m a
forall a. a -> Maybe a -> a
fromMaybe ParsecT s u m a
forall s u (m :: * -> *) a. ParsecT s u m a
parserZero Maybe (ParsecT s u m a)
match)) (String
-> Maybe (ParsecT s u m a)
-> [Many (Tree (String, Attrs))]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
forall s (m :: * -> *) a u.
(Stream s m Char, ShowHTML a) =>
String
-> Maybe (ParsecT s u m a)
-> [Many (Tree (String, Attrs))]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
htmlGenParserRepeat String
elemTag Maybe (ParsecT s u m a)
match [Many (Tree (String, Attrs))]
manyElHeads)
ParsecT s u m [HTMLMatcher TreeHTML a]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
forall a. ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ParsecT s u m [HTMLMatcher TreeHTML a]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ((Maybe (ParsecT s u m a)
-> [Many (Tree (String, Attrs))]
-> ParsecT s u m ([Many (Tree (String, Attrs))], TreeHTML a)
forall s (m :: * -> *) a u.
(Stream s m Char, ShowHTML a) =>
Maybe (ParsecT s u m a)
-> [Many (Tree (String, Attrs))]
-> ParsecT s u m ([Many (Tree (String, Attrs))], TreeHTML a)
treeElemParserSpecificContinuous Maybe (ParsecT s u m a)
match [Many (Tree (String, Attrs))]
manyElHeads)
ParsecT s u m ([Many (Tree (String, Attrs))], TreeHTML a)
-> (([Many (Tree (String, Attrs))], TreeHTML a)
-> ParsecT s u m [HTMLMatcher TreeHTML a])
-> ParsecT s u m [HTMLMatcher TreeHTML a]
forall a b.
ParsecT s u m a -> (a -> ParsecT s u m b) -> ParsecT s u m b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (\([Many (Tree (String, Attrs))]
sM, TreeHTML a
a) -> ([HTMLMatcher TreeHTML a] -> [HTMLMatcher TreeHTML a])
-> ParsecT s u m [HTMLMatcher TreeHTML a]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
forall a b. (a -> b) -> ParsecT s u m a -> ParsecT s u m b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((TreeHTML a -> HTMLMatcher TreeHTML a
forall (a :: * -> *) b. a b -> HTMLMatcher a b
Element TreeHTML a
a)HTMLMatcher TreeHTML a
-> [HTMLMatcher TreeHTML a] -> [HTMLMatcher TreeHTML a]
forall a. a -> [a] -> [a]
:) (String
-> Maybe (ParsecT s u m a)
-> [Many (Tree (String, Attrs))]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
forall s (m :: * -> *) a u.
(Stream s m Char, ShowHTML a) =>
String
-> Maybe (ParsecT s u m a)
-> [Many (Tree (String, Attrs))]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
htmlGenParserRepeat String
elemTag Maybe (ParsecT s u m a)
match [Many (Tree (String, Attrs))]
sM)))
ParsecT s u m [HTMLMatcher TreeHTML a]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
forall a. ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> (HTMLMatcher TreeHTML a
-> [HTMLMatcher TreeHTML a] -> [HTMLMatcher TreeHTML a])
-> ParsecT s u m (HTMLMatcher TreeHTML a)
-> ParsecT s u m [HTMLMatcher TreeHTML a]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
forall a b c.
(a -> b -> c)
-> ParsecT s u m a -> ParsecT s u m b -> ParsecT s u m c
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 (:) ((Char -> HTMLMatcher TreeHTML a)
-> ParsecT s u m Char -> ParsecT s u m (HTMLMatcher TreeHTML a)
forall a b. (a -> b) -> ParsecT s u m a -> ParsecT s u m b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (String -> HTMLMatcher TreeHTML a
forall (a :: * -> *) b. String -> HTMLMatcher a b
IText (String -> HTMLMatcher TreeHTML a)
-> (Char -> String) -> Char -> HTMLMatcher TreeHTML a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Char -> ShowS
forall a. a -> [a] -> [a]
:[])) (String -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
specificChar' String
elemTag)) (String
-> Maybe (ParsecT s u m a)
-> [Many (Tree (String, Attrs))]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
forall s (m :: * -> *) a u.
(Stream s m Char, ShowHTML a) =>
String
-> Maybe (ParsecT s u m a)
-> [Many (Tree (String, Attrs))]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
htmlGenParserRepeat String
elemTag Maybe (ParsecT s u m a)
match [Many (Tree (String, Attrs))]
manyElHeads)
specificChar :: Stream s m Char => ParsecT s u m Char
specificChar :: forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
specificChar = do
ParsecT s u m Char -> ParsecT s u m ()
forall s (m :: * -> *) t a u.
(Stream s m t, Show a) =>
ParsecT s u m a -> ParsecT s u m ()
notFollowedBy (Maybe [String]
-> [(String, Maybe String)] -> ParsecT s u m (String, Attrs)
forall s (m :: * -> *) u.
Stream s m Char =>
Maybe [String]
-> [(String, Maybe String)] -> ParsecT s u m (String, Attrs)
parseOpeningTag Maybe [String]
forall a. Maybe a
Nothing [] ParsecT s u m (String, Attrs)
-> ParsecT s u m Char -> ParsecT s u m Char
forall a b. ParsecT s u m a -> ParsecT s u m b -> ParsecT s u m b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'>') ParsecT s u m () -> String -> ParsecT s u m ()
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"error on specificChar (tag found)"
ParsecT s u m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
anyChar
treeElemParserSpecificContinuous :: (Stream s m Char, ShowHTML a) => Maybe (ParsecT s u m a)
-> [Many (Tree ElemHead)]
-> ParsecT s u m ([Many (Tree ElemHead)], TreeHTML a)
treeElemParserSpecificContinuous :: forall s (m :: * -> *) a u.
(Stream s m Char, ShowHTML a) =>
Maybe (ParsecT s u m a)
-> [Many (Tree (String, Attrs))]
-> ParsecT s u m ([Many (Tree (String, Attrs))], TreeHTML a)
treeElemParserSpecificContinuous Maybe (ParsecT s u m a)
match [Many (Tree (String, Attrs))]
manyElHeads = do
let
elSet :: [Many (Tree ElemHead)]
elSet :: [Many (Tree (String, Attrs))]
elSet = (Many (Tree (String, Attrs)) -> Bool)
-> [Many (Tree (String, Attrs))] -> [Many (Tree (String, Attrs))]
forall a. (a -> Bool) -> [a] -> [a]
takeTill (\case { One Tree (String, Attrs)
a -> Bool
True; Many (Tree (String, Attrs))
_ -> Bool
False}) [Many (Tree (String, Attrs))]
manyElHeads
(String
e,Attrs
attrs) <- Maybe [String]
-> [(String, Maybe String)] -> ParsecT s u m (String, Attrs)
forall s (m :: * -> *) u.
Stream s m Char =>
Maybe [String]
-> [(String, Maybe String)] -> ParsecT s u m (String, Attrs)
parseOpeningTag ([String] -> Maybe [String]
forall a. a -> Maybe a
Just ([String] -> Maybe [String]) -> [String] -> Maybe [String]
forall a b. (a -> b) -> a -> b
$ (Many (Tree (String, Attrs)) -> String)
-> [Many (Tree (String, Attrs))] -> [String]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((String, Attrs) -> String
forall a b. (a, b) -> a
fst ((String, Attrs) -> String)
-> (Many (Tree (String, Attrs)) -> (String, Attrs))
-> Many (Tree (String, Attrs))
-> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Tree (String, Attrs) -> (String, Attrs)
forall a. Tree a -> a
rootLabel (Tree (String, Attrs) -> (String, Attrs))
-> (Many (Tree (String, Attrs)) -> Tree (String, Attrs))
-> Many (Tree (String, Attrs))
-> (String, Attrs)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Many (Tree (String, Attrs)) -> Tree (String, Attrs)
forall a. Many a -> a
fromMany) [Many (Tree (String, Attrs))]
elSet) []
(Forest (String, Attrs)
innerForest, [Many (Tree (String, Attrs))]
outputStack) <- (String, Attrs)
-> [Many (Tree (String, Attrs))]
-> ParsecT
s u m (Forest (String, Attrs), [Many (Tree (String, Attrs))])
forall s u (m :: * -> *).
(String, Attrs)
-> [Many (Tree (String, Attrs))]
-> ParsecT
s u m (Forest (String, Attrs), [Many (Tree (String, Attrs))])
tryElHeads (String
e,Attrs
attrs) [Many (Tree (String, Attrs))]
elSet
([a]
m, String
inTx, Forest (String, Attrs)
inTr) <- Maybe (ParsecT s u m a)
-> String
-> Forest (String, Attrs)
-> ParsecT s u m ([a], String, Forest (String, Attrs))
forall s (m :: * -> *) a u.
(Stream s m Char, ShowHTML a) =>
Maybe (ParsecT s u m a)
-> String
-> Forest (String, Attrs)
-> ParsecT s u m ([a], String, Forest (String, Attrs))
innerParserSpecific Maybe (ParsecT s u m a)
match String
e Forest (String, Attrs)
innerForest
let
manyElHeads' :: [Many (Tree ElemHead)]
manyElHeads' :: [Many (Tree (String, Attrs))]
manyElHeads' = Int
-> [Many (Tree (String, Attrs))] -> [Many (Tree (String, Attrs))]
forall a. Int -> [a] -> [a]
drop (([Many (Tree (String, Attrs))] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [Many (Tree (String, Attrs))]
manyElHeads) Int -> Int -> Int
forall a. Num a => a -> a -> a
- ([Many (Tree (String, Attrs))] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [Many (Tree (String, Attrs))]
outputStack)) [Many (Tree (String, Attrs))]
manyElHeads
([Many (Tree (String, Attrs))], TreeHTML a)
-> ParsecT s u m ([Many (Tree (String, Attrs))], TreeHTML a)
forall a. a -> ParsecT s u m a
forall (m :: * -> *) a. Monad m => a -> m a
return (([Many (Tree (String, Attrs))], TreeHTML a)
-> ParsecT s u m ([Many (Tree (String, Attrs))], TreeHTML a))
-> ([Many (Tree (String, Attrs))], TreeHTML a)
-> ParsecT s u m ([Many (Tree (String, Attrs))], TreeHTML a)
forall a b. (a -> b) -> a -> b
$ (,) [Many (Tree (String, Attrs))]
manyElHeads' (String
-> Attrs -> [a] -> String -> Forest (String, Attrs) -> TreeHTML a
forall a.
String
-> Attrs -> [a] -> String -> Forest (String, Attrs) -> TreeHTML a
TreeHTML String
e Attrs
attrs [a]
m String
inTx Forest (String, Attrs)
inTr)
treeElemParserContains :: (Stream s m Char, ShowHTML a) => Maybe (ParsecT s u m a)
-> [Many (Tree ElemHead)]
-> ParsecT s u m ([Many (Tree ElemHead)], TreeHTML a)
treeElemParserContains :: forall s (m :: * -> *) a u.
(Stream s m Char, ShowHTML a) =>
Maybe (ParsecT s u m a)
-> [Many (Tree (String, Attrs))]
-> ParsecT s u m ([Many (Tree (String, Attrs))], TreeHTML a)
treeElemParserContains Maybe (ParsecT s u m a)
match [Many (Tree (String, Attrs))]
manyElHeads = do
(String
e,Attrs
ats) <- Maybe [String]
-> [(String, Maybe String)] -> ParsecT s u m (String, Attrs)
forall s (m :: * -> *) u.
Stream s m Char =>
Maybe [String]
-> [(String, Maybe String)] -> ParsecT s u m (String, Attrs)
parseOpeningTag Maybe [String]
forall a. Maybe a
Nothing []
let
elSet :: [Many (Tree (String, Attrs))]
elSet = (Many (Tree (String, Attrs)) -> Bool)
-> [Many (Tree (String, Attrs))] -> [Many (Tree (String, Attrs))]
forall a. (a -> Bool) -> [a] -> [a]
takeTill (\case { One Tree (String, Attrs)
a -> Bool
True; Many (Tree (String, Attrs))
_ -> Bool
False}) [Many (Tree (String, Attrs))]
manyElHeads
case (String, Attrs)
-> [Many (Tree (String, Attrs))]
-> Either
String (Forest (String, Attrs), [Many (Tree (String, Attrs))])
tryElHeads' (String
e, Attrs
ats) [Many (Tree (String, Attrs))]
elSet of
Right (Forest (String, Attrs)
innerForest, [Many (Tree (String, Attrs))]
outputStack) -> do
let
manyElHeads' :: [Many (Tree ElemHead)]
manyElHeads' :: [Many (Tree (String, Attrs))]
manyElHeads' = Int
-> [Many (Tree (String, Attrs))] -> [Many (Tree (String, Attrs))]
forall a. Int -> [a] -> [a]
drop (([Many (Tree (String, Attrs))] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [Many (Tree (String, Attrs))]
manyElHeads) Int -> Int -> Int
forall a. Num a => a -> a -> a
- ([Many (Tree (String, Attrs))] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [Many (Tree (String, Attrs))]
outputStack)) [Many (Tree (String, Attrs))]
manyElHeads
if Forest (String, Attrs)
innerForest Forest (String, Attrs) -> Forest (String, Attrs) -> Bool
forall a. Eq a => a -> a -> Bool
== []
then
do
case String -> [String] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem String
e [String]
selfClosing of
Bool
True -> do
(ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string String
">") ParsecT s u m String
-> ParsecT s u m String -> ParsecT s u m String
forall a. ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string String
"/>")
([Many (Tree (String, Attrs))], TreeHTML a)
-> ParsecT s u m ([Many (Tree (String, Attrs))], TreeHTML a)
forall a. a -> ParsecT s u m a
forall (m :: * -> *) a. Monad m => a -> m a
return (([Many (Tree (String, Attrs))], TreeHTML a)
-> ParsecT s u m ([Many (Tree (String, Attrs))], TreeHTML a))
-> ([Many (Tree (String, Attrs))], TreeHTML a)
-> ParsecT s u m ([Many (Tree (String, Attrs))], TreeHTML a)
forall a b. (a -> b) -> a -> b
$ (,) [Many (Tree (String, Attrs))]
manyElHeads' (String
-> Attrs -> [a] -> String -> Forest (String, Attrs) -> TreeHTML a
forall a.
String
-> Attrs -> [a] -> String -> Forest (String, Attrs) -> TreeHTML a
TreeHTML String
e Attrs
ats [a]
forall a. Monoid a => a
mempty String
forall a. Monoid a => a
mempty Forest (String, Attrs)
forall a. Monoid a => a
mempty)
Bool
False -> do
([a]
m, String
inTx, Forest (String, Attrs)
inTr) <- Maybe (ParsecT s u m a)
-> String
-> Forest (String, Attrs)
-> ParsecT s u m ([a], String, Forest (String, Attrs))
forall s (m :: * -> *) a u.
(Stream s m Char, ShowHTML a) =>
Maybe (ParsecT s u m a)
-> String
-> Forest (String, Attrs)
-> ParsecT s u m ([a], String, Forest (String, Attrs))
innerParserContains Maybe (ParsecT s u m a)
match String
e Forest (String, Attrs)
innerForest
([Many (Tree (String, Attrs))], TreeHTML a)
-> ParsecT s u m ([Many (Tree (String, Attrs))], TreeHTML a)
forall a. a -> ParsecT s u m a
forall (m :: * -> *) a. Monad m => a -> m a
return (([Many (Tree (String, Attrs))], TreeHTML a)
-> ParsecT s u m ([Many (Tree (String, Attrs))], TreeHTML a))
-> ([Many (Tree (String, Attrs))], TreeHTML a)
-> ParsecT s u m ([Many (Tree (String, Attrs))], TreeHTML a)
forall a b. (a -> b) -> a -> b
$ (,) [Many (Tree (String, Attrs))]
manyElHeads' (String
-> Attrs -> [a] -> String -> Forest (String, Attrs) -> TreeHTML a
forall a.
String
-> Attrs -> [a] -> String -> Forest (String, Attrs) -> TreeHTML a
TreeHTML String
e Attrs
ats [a]
m String
inTx Forest (String, Attrs)
inTr)
else
do
([a]
m, String
inTx, Forest (String, Attrs)
inTr) <- Maybe (ParsecT s u m a)
-> String
-> Forest (String, Attrs)
-> ParsecT s u m ([a], String, Forest (String, Attrs))
forall s (m :: * -> *) a u.
(Stream s m Char, ShowHTML a) =>
Maybe (ParsecT s u m a)
-> String
-> Forest (String, Attrs)
-> ParsecT s u m ([a], String, Forest (String, Attrs))
innerParserContains Maybe (ParsecT s u m a)
match String
e Forest (String, Attrs)
innerForest
([Many (Tree (String, Attrs))], TreeHTML a)
-> ParsecT s u m ([Many (Tree (String, Attrs))], TreeHTML a)
forall a. a -> ParsecT s u m a
forall (m :: * -> *) a. Monad m => a -> m a
return (([Many (Tree (String, Attrs))], TreeHTML a)
-> ParsecT s u m ([Many (Tree (String, Attrs))], TreeHTML a))
-> ([Many (Tree (String, Attrs))], TreeHTML a)
-> ParsecT s u m ([Many (Tree (String, Attrs))], TreeHTML a)
forall a b. (a -> b) -> a -> b
$ (,) [Many (Tree (String, Attrs))]
manyElHeads' (String
-> Attrs -> [a] -> String -> Forest (String, Attrs) -> TreeHTML a
forall a.
String
-> Attrs -> [a] -> String -> Forest (String, Attrs) -> TreeHTML a
TreeHTML String
e Attrs
ats [a]
m String
inTx Forest (String, Attrs)
inTr)
Left String
someError -> do
(String
inText, [a]
matchBook, Forest (String, Attrs)
treees) <- String
-> Maybe (ParsecT s u m a)
-> ParsecT s u m (String, [a], Forest (String, Attrs))
forall a s (m :: * -> *) u.
(ShowHTML a, Stream s m Char) =>
String
-> Maybe (ParsecT s u m a)
-> ParsecT s u m (String, [a], Forest (String, Attrs))
innerTreeElemParser String
e Maybe (ParsecT s u m a)
match
([Many (Tree (String, Attrs))], TreeHTML a)
-> ParsecT s u m ([Many (Tree (String, Attrs))], TreeHTML a)
forall a. a -> ParsecT s u m a
forall (m :: * -> *) a. Monad m => a -> m a
return (([Many (Tree (String, Attrs))], TreeHTML a)
-> ParsecT s u m ([Many (Tree (String, Attrs))], TreeHTML a))
-> ([Many (Tree (String, Attrs))], TreeHTML a)
-> ParsecT s u m ([Many (Tree (String, Attrs))], TreeHTML a)
forall a b. (a -> b) -> a -> b
$ (,) [Many (Tree (String, Attrs))]
manyElHeads (String
-> Attrs -> [a] -> String -> Forest (String, Attrs) -> TreeHTML a
forall a.
String
-> Attrs -> [a] -> String -> Forest (String, Attrs) -> TreeHTML a
TreeHTML String
e Attrs
ats [a]
matchBook String
inText Forest (String, Attrs)
treees)
htmlGenParserContains :: (Stream s m Char, ShowHTML a) =>
String
-> Maybe (ParsecT s u m a)
-> [Many (Tree ElemHead)]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
htmlGenParserContains :: forall s (m :: * -> *) a u.
(Stream s m Char, ShowHTML a) =>
String
-> Maybe (ParsecT s u m a)
-> [Many (Tree (String, Attrs))]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
htmlGenParserContains String
elemTag Maybe (ParsecT s u m a)
match [Many (Tree (String, Attrs))]
manyElHeadss =
case [Many (Tree (String, Attrs))]
manyElHeadss of
[] -> do
([HTMLMatcher TreeHTML a]
htMMers, String
_) <- ParsecT s u m (HTMLMatcher TreeHTML a)
-> ParsecT s u m String
-> ParsecT s u m ([HTMLMatcher TreeHTML a], String)
forall s u (m :: * -> *) a end.
ParsecT s u m a -> ParsecT s u m end -> ParsecT s u m ([a], end)
manyTill_ (Maybe (ParsecT s u m a) -> ParsecT s u m (HTMLMatcher TreeHTML a)
forall s (m :: * -> *) a u.
(Stream s m Char, ShowHTML a) =>
Maybe (ParsecT s u m a) -> ParsecT s u m (HTMLMatcher TreeHTML a)
htmlGenParserFlex Maybe (ParsecT s u m a)
match) (String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
endTag String
elemTag)
[HTMLMatcher TreeHTML a] -> ParsecT s u m [HTMLMatcher TreeHTML a]
forall a. a -> ParsecT s u m a
forall (m :: * -> *) a. Monad m => a -> m a
return [HTMLMatcher TreeHTML a]
htMMers
[Many (Tree (String, Attrs))]
manyElHeads ->
(HTMLMatcher TreeHTML a
-> [HTMLMatcher TreeHTML a] -> [HTMLMatcher TreeHTML a])
-> ParsecT s u m (HTMLMatcher TreeHTML a)
-> ParsecT s u m [HTMLMatcher TreeHTML a]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
forall a b c.
(a -> b -> c)
-> ParsecT s u m a -> ParsecT s u m b -> ParsecT s u m c
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 (:) ((a -> HTMLMatcher TreeHTML a)
-> ParsecT s u m a -> ParsecT s u m (HTMLMatcher TreeHTML a)
forall a b. (a -> b) -> ParsecT s u m a -> ParsecT s u m b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> HTMLMatcher TreeHTML a
forall (a :: * -> *) b. b -> HTMLMatcher a b
Match (ParsecT s u m a -> ParsecT s u m (HTMLMatcher TreeHTML a))
-> ParsecT s u m a -> ParsecT s u m (HTMLMatcher TreeHTML a)
forall a b. (a -> b) -> a -> b
$ ParsecT s u m a -> ParsecT s u m a
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT s u m a -> Maybe (ParsecT s u m a) -> ParsecT s u m a
forall a. a -> Maybe a -> a
fromMaybe ParsecT s u m a
forall s u (m :: * -> *) a. ParsecT s u m a
parserZero Maybe (ParsecT s u m a)
match)) (String
-> Maybe (ParsecT s u m a)
-> [Many (Tree (String, Attrs))]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
forall s (m :: * -> *) a u.
(Stream s m Char, ShowHTML a) =>
String
-> Maybe (ParsecT s u m a)
-> [Many (Tree (String, Attrs))]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
htmlGenParserContains String
elemTag Maybe (ParsecT s u m a)
match [Many (Tree (String, Attrs))]
manyElHeads)
ParsecT s u m [HTMLMatcher TreeHTML a]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
forall a. ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> (HTMLMatcher TreeHTML a
-> [HTMLMatcher TreeHTML a] -> [HTMLMatcher TreeHTML a])
-> ParsecT s u m (HTMLMatcher TreeHTML a)
-> ParsecT s u m [HTMLMatcher TreeHTML a]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
forall a b c.
(a -> b -> c)
-> ParsecT s u m a -> ParsecT s u m b -> ParsecT s u m c
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 (:) ((String -> HTMLMatcher TreeHTML a)
-> ParsecT s u m String -> ParsecT s u m (HTMLMatcher TreeHTML a)
forall a b. (a -> b) -> ParsecT s u m a -> ParsecT s u m b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap String -> HTMLMatcher TreeHTML a
forall (a :: * -> *) b. String -> HTMLMatcher a b
IText (ParsecT s u m String -> ParsecT s u m (HTMLMatcher TreeHTML a))
-> ParsecT s u m String -> ParsecT s u m (HTMLMatcher TreeHTML a)
forall a b. (a -> b) -> a -> b
$ ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
stylingElem) (String
-> Maybe (ParsecT s u m a)
-> [Many (Tree (String, Attrs))]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
forall s (m :: * -> *) a u.
(Stream s m Char, ShowHTML a) =>
String
-> Maybe (ParsecT s u m a)
-> [Many (Tree (String, Attrs))]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
htmlGenParserContains String
elemTag Maybe (ParsecT s u m a)
match [Many (Tree (String, Attrs))]
manyElHeads)
ParsecT s u m [HTMLMatcher TreeHTML a]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
forall a. ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ParsecT s u m [HTMLMatcher TreeHTML a]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ((Maybe (ParsecT s u m a)
-> [Many (Tree (String, Attrs))]
-> ParsecT s u m ([Many (Tree (String, Attrs))], TreeHTML a)
forall s (m :: * -> *) a u.
(Stream s m Char, ShowHTML a) =>
Maybe (ParsecT s u m a)
-> [Many (Tree (String, Attrs))]
-> ParsecT s u m ([Many (Tree (String, Attrs))], TreeHTML a)
treeElemParserContains Maybe (ParsecT s u m a)
match [Many (Tree (String, Attrs))]
manyElHeads)
ParsecT s u m ([Many (Tree (String, Attrs))], TreeHTML a)
-> (([Many (Tree (String, Attrs))], TreeHTML a)
-> ParsecT s u m [HTMLMatcher TreeHTML a])
-> ParsecT s u m [HTMLMatcher TreeHTML a]
forall a b.
ParsecT s u m a -> (a -> ParsecT s u m b) -> ParsecT s u m b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (\([Many (Tree (String, Attrs))]
sM, TreeHTML a
a) -> ([HTMLMatcher TreeHTML a] -> [HTMLMatcher TreeHTML a])
-> ParsecT s u m [HTMLMatcher TreeHTML a]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
forall a b. (a -> b) -> ParsecT s u m a -> ParsecT s u m b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((TreeHTML a -> HTMLMatcher TreeHTML a
forall (a :: * -> *) b. a b -> HTMLMatcher a b
Element TreeHTML a
a)HTMLMatcher TreeHTML a
-> [HTMLMatcher TreeHTML a] -> [HTMLMatcher TreeHTML a]
forall a. a -> [a] -> [a]
:) (String
-> Maybe (ParsecT s u m a)
-> [Many (Tree (String, Attrs))]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
forall s (m :: * -> *) a u.
(Stream s m Char, ShowHTML a) =>
String
-> Maybe (ParsecT s u m a)
-> [Many (Tree (String, Attrs))]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
htmlGenParserContains String
elemTag Maybe (ParsecT s u m a)
match [Many (Tree (String, Attrs))]
sM)))
ParsecT s u m [HTMLMatcher TreeHTML a]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
forall a. ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> (HTMLMatcher TreeHTML a
-> [HTMLMatcher TreeHTML a] -> [HTMLMatcher TreeHTML a])
-> ParsecT s u m (HTMLMatcher TreeHTML a)
-> ParsecT s u m [HTMLMatcher TreeHTML a]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
forall a b c.
(a -> b -> c)
-> ParsecT s u m a -> ParsecT s u m b -> ParsecT s u m c
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 (:) ((Char -> HTMLMatcher TreeHTML a)
-> ParsecT s u m Char -> ParsecT s u m (HTMLMatcher TreeHTML a)
forall a b. (a -> b) -> ParsecT s u m a -> ParsecT s u m b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (String -> HTMLMatcher TreeHTML a
forall (a :: * -> *) b. String -> HTMLMatcher a b
IText (String -> HTMLMatcher TreeHTML a)
-> (Char -> String) -> Char -> HTMLMatcher TreeHTML a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Char -> ShowS
forall a. a -> [a] -> [a]
:[])) (ParsecT s u m Char -> ParsecT s u m Char
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT s u m Char -> ParsecT s u m Char)
-> ParsecT s u m Char -> ParsecT s u m Char
forall a b. (a -> b) -> a -> b
$ String -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
specificChar' String
elemTag)) (String
-> Maybe (ParsecT s u m a)
-> [Many (Tree (String, Attrs))]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
forall s (m :: * -> *) a u.
(Stream s m Char, ShowHTML a) =>
String
-> Maybe (ParsecT s u m a)
-> [Many (Tree (String, Attrs))]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
htmlGenParserContains String
elemTag Maybe (ParsecT s u m a)
match [Many (Tree (String, Attrs))]
manyElHeads)
ParsecT s u m [HTMLMatcher TreeHTML a]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
forall a. ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> (String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
endTag String
elemTag
ParsecT s u m String
-> ParsecT s u m [HTMLMatcher TreeHTML a]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
forall a b. ParsecT s u m a -> ParsecT s u m b -> ParsecT s u m b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> case [Many (Tree (String, Attrs))] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length ((Many (Tree (String, Attrs)) -> Bool)
-> [Many (Tree (String, Attrs))] -> [Many (Tree (String, Attrs))]
forall a. (a -> Bool) -> [a] -> [a]
filter (\case {One Tree (String, Attrs)
a -> Bool
True; Many (Tree (String, Attrs))
_ -> Bool
False}) [Many (Tree (String, Attrs))]
manyElHeadss) Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
0 of
Bool
True -> [HTMLMatcher TreeHTML a] -> ParsecT s u m [HTMLMatcher TreeHTML a]
forall a. a -> ParsecT s u m a
forall (m :: * -> *) a. Monad m => a -> m a
return []
Bool
False -> String -> ParsecT s u m [HTMLMatcher TreeHTML a]
forall s u (m :: * -> *) a. String -> ParsecT s u m a
parserFail (String -> ParsecT s u m [HTMLMatcher TreeHTML a])
-> String -> ParsecT s u m [HTMLMatcher TreeHTML a]
forall a b. (a -> b) -> a -> b
$ String
"still havent yielded " String -> ShowS
forall a. Semigroup a => a -> a -> a
<> [Many (Tree (String, Attrs))] -> String
forall a. Show a => a -> String
show [Many (Tree (String, Attrs))]
manyElHeadss)
specificChar' :: Stream s m Char => Elem -> ParsecT s u m Char
specificChar' :: forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
specificChar' String
elemTag = do
ParsecT s u m Char -> ParsecT s u m ()
forall s (m :: * -> *) t a u.
(Stream s m t, Show a) =>
ParsecT s u m a -> ParsecT s u m ()
notFollowedBy (Maybe [String]
-> [(String, Maybe String)] -> ParsecT s u m (String, Attrs)
forall s (m :: * -> *) u.
Stream s m Char =>
Maybe [String]
-> [(String, Maybe String)] -> ParsecT s u m (String, Attrs)
parseOpeningTag Maybe [String]
forall a. Maybe a
Nothing [] ParsecT s u m (String, Attrs)
-> ParsecT s u m Char -> ParsecT s u m Char
forall a b. ParsecT s u m a -> ParsecT s u m b -> ParsecT s u m b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'>') ParsecT s u m () -> String -> ParsecT s u m ()
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"error on specificChar' (tag found)"
ParsecT s u m String -> ParsecT s u m ()
forall s (m :: * -> *) t a u.
(Stream s m t, Show a) =>
ParsecT s u m a -> ParsecT s u m ()
notFollowedBy (String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
endTag String
elemTag)
ParsecT s u m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
anyChar
innerParserContains :: (Stream s m Char, ShowHTML a) =>
Maybe (ParsecT s u m a)
-> Elem
-> SubTree ElemHead
-> ParsecT s u m ([a], String, [Tree ElemHead])
innerParserContains :: forall s (m :: * -> *) a u.
(Stream s m Char, ShowHTML a) =>
Maybe (ParsecT s u m a)
-> String
-> Forest (String, Attrs)
-> ParsecT s u m ([a], String, Forest (String, Attrs))
innerParserContains Maybe (ParsecT s u m a)
match String
tag Forest (String, Attrs)
subTree =
case String -> [String] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem String
tag [String]
selfClosing of
Bool
True -> if Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ Forest (String, Attrs) -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null Forest (String, Attrs)
subTree then ParsecT s u m ([a], String, Forest (String, Attrs))
forall a. HasCallStack => a
undefined else do
(ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string String
">") ParsecT s u m String
-> ParsecT s u m String -> ParsecT s u m String
forall a. ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string String
"/>")
([a], String, Forest (String, Attrs))
-> ParsecT s u m ([a], String, Forest (String, Attrs))
forall a. a -> ParsecT s u m a
forall (m :: * -> *) a. Monad m => a -> m a
return ([a]
forall a. Monoid a => a
mempty, String
forall a. Monoid a => a
mempty, Forest (String, Attrs)
forall a. Monoid a => a
mempty)
Bool
False -> do
Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'>'
[HTMLMatcher TreeHTML a]
x <- String
-> Maybe (ParsecT s u m a)
-> [Many (Tree (String, Attrs))]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
forall s (m :: * -> *) a u.
(Stream s m Char, ShowHTML a) =>
String
-> Maybe (ParsecT s u m a)
-> [Many (Tree (String, Attrs))]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
htmlGenParserContains String
tag Maybe (ParsecT s u m a)
match ([Many (Tree (String, Attrs))] -> [Many (Tree (String, Attrs))]
forall a. [a] -> [a]
reverse ([Many (Tree (String, Attrs))] -> [Many (Tree (String, Attrs))])
-> [Many (Tree (String, Attrs))] -> [Many (Tree (String, Attrs))]
forall a b. (a -> b) -> a -> b
$ Forest (String, Attrs)
-> [Many (Tree (String, Attrs))] -> [Many (Tree (String, Attrs))]
forall a. Eq a => [Tree a] -> [Many (Tree a)] -> [Many (Tree a)]
groupify Forest (String, Attrs)
subTree [])
let
(String
inText, [a]
matchBook, Forest (String, Attrs)
treees) = (HTMLMatcher TreeHTML a
-> (String, [a], Forest (String, Attrs))
-> (String, [a], Forest (String, Attrs)))
-> (String, [a], Forest (String, Attrs))
-> [HTMLMatcher TreeHTML a]
-> (String, [a], Forest (String, Attrs))
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr HTMLMatcher TreeHTML a
-> (String, [a], Forest (String, Attrs))
-> (String, [a], Forest (String, Attrs))
forall a.
ShowHTML a =>
HTMLMatcher TreeHTML a
-> (String, [a], Forest (String, Attrs))
-> (String, [a], Forest (String, Attrs))
foldFuncTrup (String, [a], Forest (String, Attrs))
forall a. Monoid a => a
mempty ([HTMLMatcher TreeHTML a]
x)
([a], String, Forest (String, Attrs))
-> ParsecT s u m ([a], String, Forest (String, Attrs))
forall a. a -> ParsecT s u m a
forall (m :: * -> *) a. Monad m => a -> m a
return ([a]
matchBook, String
inText, Forest (String, Attrs)
treees)
similarTreeH :: (Stream s m Char, ShowHTML a)
=> Maybe (ParsecT s u m a)
-> TreeHTML a
-> ParsecT s u m (TreeHTML a)
similarTreeH :: forall s (m :: * -> *) a u.
(Stream s m Char, ShowHTML a) =>
Maybe (ParsecT s u m a) -> TreeHTML a -> ParsecT s u m (TreeHTML a)
similarTreeH Maybe (ParsecT s u m a)
matchh TreeHTML a
treeH = do
(String
e,Attrs
at) <- Maybe [String]
-> [(String, Maybe String)] -> ParsecT s u m (String, Attrs)
forall s (m :: * -> *) u.
Stream s m Char =>
Maybe [String]
-> [(String, Maybe String)] -> ParsecT s u m (String, Attrs)
parseOpeningTag ([String] -> Maybe [String]
forall a. a -> Maybe a
Just ([String] -> Maybe [String]) -> [String] -> Maybe [String]
forall a b. (a -> b) -> a -> b
$ [TreeHTML a -> String
forall b. TreeHTML b -> String
forall (a :: * -> *) b. ElementRep a => a b -> String
elTag TreeHTML a
treeH]) (((((String, String) -> (String, Maybe String))
-> [(String, String)] -> [(String, Maybe String)]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (((String, String) -> (String, Maybe String))
-> [(String, String)] -> [(String, Maybe String)])
-> ((String -> Maybe String)
-> (String, String) -> (String, Maybe String))
-> (String -> Maybe String)
-> [(String, String)]
-> [(String, Maybe String)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String -> Maybe String)
-> (String, String) -> (String, Maybe String)
forall a b. (a -> b) -> (String, a) -> (String, b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap) String -> Maybe String
forall a. a -> Maybe a
Just) ([(String, String)] -> [(String, Maybe String)])
-> (Attrs -> [(String, String)])
-> Attrs
-> [(String, Maybe String)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Attrs -> [(String, String)]
forall k a. Map k a -> [(k, a)]
Map.toList (Attrs -> [(String, Maybe String)])
-> Attrs -> [(String, Maybe String)]
forall a b. (a -> b) -> a -> b
$ TreeHTML a -> Attrs
forall b. TreeHTML b -> Attrs
forall (a :: * -> *) b. ElementRep a => a b -> Attrs
attrs TreeHTML a
treeH)
Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'>'
(String
inTx, [a]
m, Forest (String, Attrs)
inTr) <-
([HTMLMatcher TreeHTML a] -> (String, [a], Forest (String, Attrs)))
-> ParsecT s u m [HTMLMatcher TreeHTML a]
-> ParsecT s u m (String, [a], Forest (String, Attrs))
forall a b. (a -> b) -> ParsecT s u m a -> ParsecT s u m b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((HTMLMatcher TreeHTML a
-> (String, [a], Forest (String, Attrs))
-> (String, [a], Forest (String, Attrs)))
-> (String, [a], Forest (String, Attrs))
-> [HTMLMatcher TreeHTML a]
-> (String, [a], Forest (String, Attrs))
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr HTMLMatcher TreeHTML a
-> (String, [a], Forest (String, Attrs))
-> (String, [a], Forest (String, Attrs))
forall a.
ShowHTML a =>
HTMLMatcher TreeHTML a
-> (String, [a], Forest (String, Attrs))
-> (String, [a], Forest (String, Attrs))
foldFuncTrup (String, [a], Forest (String, Attrs))
forall a. Monoid a => a
mempty) (String
-> Maybe (ParsecT s u m a)
-> [Many (Tree (String, Attrs))]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
forall s (m :: * -> *) a u.
(Stream s m Char, ShowHTML a) =>
String
-> Maybe (ParsecT s u m a)
-> [Many (Tree (String, Attrs))]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
htmlGenParserContains String
e Maybe (ParsecT s u m a)
matchh (Forest (String, Attrs)
-> [Many (Tree (String, Attrs))] -> [Many (Tree (String, Attrs))]
forall a. Eq a => [Tree a] -> [Many (Tree a)] -> [Many (Tree a)]
groupify (TreeHTML a -> Forest (String, Attrs)
forall a. TreeHTML a -> Forest (String, Attrs)
_innerTree' TreeHTML a
treeH) []))
TreeHTML a -> ParsecT s u m (TreeHTML a)
forall a. a -> ParsecT s u m a
forall (m :: * -> *) a. Monad m => a -> m a
return (TreeHTML a -> ParsecT s u m (TreeHTML a))
-> TreeHTML a -> ParsecT s u m (TreeHTML a)
forall a b. (a -> b) -> a -> b
$ String
-> Attrs -> [a] -> String -> Forest (String, Attrs) -> TreeHTML a
forall a.
String
-> Attrs -> [a] -> String -> Forest (String, Attrs) -> TreeHTML a
TreeHTML String
e Attrs
at [a]
m String
inTx Forest (String, Attrs)
inTr
htmlGroupSimilar :: (Stream s m Char, ShowHTML a)
=> Maybe [Elem]
-> Maybe (ParsecT s u m a)
-> [(String, Maybe String)]
-> ParsecT s u m (GroupHtml TreeHTML a)
htmlGroupSimilar :: forall s (m :: * -> *) a u.
(Stream s m Char, ShowHTML a) =>
Maybe [String]
-> Maybe (ParsecT s u m a)
-> [(String, Maybe String)]
-> ParsecT s u m (GroupHtml TreeHTML a)
htmlGroupSimilar Maybe [String]
elemOpts Maybe (ParsecT s u m a)
matchh [(String, Maybe String)]
attrsSubset =
([TreeHTML a] -> GroupHtml TreeHTML a)
-> ParsecT s u m [TreeHTML a]
-> ParsecT s u m (GroupHtml TreeHTML a)
forall a b. (a -> b) -> ParsecT s u m a -> ParsecT s u m b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap [TreeHTML a] -> GroupHtml TreeHTML a
forall (e :: * -> *) a. ElementRep e => [e a] -> GroupHtml e a
mkGH (ParsecT s u m [TreeHTML a]
-> ParsecT s u m (GroupHtml TreeHTML a))
-> ParsecT s u m [TreeHTML a]
-> ParsecT s u m (GroupHtml TreeHTML a)
forall a b. (a -> b) -> a -> b
$ (do
TreeHTML a
treeH <- Maybe [String]
-> Maybe (ParsecT s u m a)
-> [(String, Maybe String)]
-> ParsecT s u m (TreeHTML a)
forall s (m :: * -> *) a u.
(Stream s m Char, ShowHTML a) =>
Maybe [String]
-> Maybe (ParsecT s u m a)
-> [(String, Maybe String)]
-> ParsecT s u m (TreeHTML a)
treeElemParser Maybe [String]
elemOpts Maybe (ParsecT s u m a)
matchh [(String, Maybe String)]
attrsSubset ParsecT s u m (TreeHTML a)
-> ParsecT s u m () -> ParsecT s u m (TreeHTML a)
forall a b. ParsecT s u m a -> ParsecT s u m b -> ParsecT s u m a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* ParsecT s u m ()
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m ()
nl
[TreeHTML a]
treeHs <- ParsecT s u m (TreeHTML a) -> ParsecT s u m [TreeHTML a]
forall a. ParsecT s u m a -> ParsecT s u m [a]
forall (f :: * -> *) a. Alternative f => f a -> f [a]
some (ParsecT s u m (TreeHTML a) -> ParsecT s u m [TreeHTML a])
-> ParsecT s u m (TreeHTML a) -> ParsecT s u m [TreeHTML a]
forall a b. (a -> b) -> a -> b
$ ParsecT s u m (TreeHTML a) -> ParsecT s u m (TreeHTML a)
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT s u m (TreeHTML a) -> ParsecT s u m (TreeHTML a))
-> ParsecT s u m (TreeHTML a) -> ParsecT s u m (TreeHTML a)
forall a b. (a -> b) -> a -> b
$ Maybe (ParsecT s u m a) -> TreeHTML a -> ParsecT s u m (TreeHTML a)
forall s (m :: * -> *) a u.
(Stream s m Char, ShowHTML a) =>
Maybe (ParsecT s u m a) -> TreeHTML a -> ParsecT s u m (TreeHTML a)
similarTreeH Maybe (ParsecT s u m a)
matchh TreeHTML a
treeH ParsecT s u m (TreeHTML a)
-> ParsecT s u m () -> ParsecT s u m (TreeHTML a)
forall a b. ParsecT s u m a -> ParsecT s u m b -> ParsecT s u m a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* ParsecT s u m ()
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m ()
nl
[TreeHTML a] -> ParsecT s u m [TreeHTML a]
forall a. a -> ParsecT s u m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([TreeHTML a] -> ParsecT s u m [TreeHTML a])
-> [TreeHTML a] -> ParsecT s u m [TreeHTML a]
forall a b. (a -> b) -> a -> b
$ TreeHTML a
treeH TreeHTML a -> [TreeHTML a] -> [TreeHTML a]
forall a. a -> [a] -> [a]
: [TreeHTML a]
treeHs
)
takeTill :: (a -> Bool) -> [a] -> [a]
takeTill :: forall a. (a -> Bool) -> [a] -> [a]
takeTill a -> Bool
_ [] = []
takeTill a -> Bool
f (a
x:[a]
xs) = if a -> Bool
f a
x then a
xa -> [a] -> [a]
forall a. a -> [a] -> [a]
:[] else a
x a -> [a] -> [a]
forall a. a -> [a] -> [a]
: (a -> Bool) -> [a] -> [a]
forall a. (a -> Bool) -> [a] -> [a]
takeTill a -> Bool
f [a]
xs
tryElHeads :: (Elem, Attrs)
-> [Many (Tree ElemHead)]
-> ParsecT s u m ([Tree ElemHead], [Many (Tree ElemHead)])
tryElHeads :: forall s u (m :: * -> *).
(String, Attrs)
-> [Many (Tree (String, Attrs))]
-> ParsecT
s u m (Forest (String, Attrs), [Many (Tree (String, Attrs))])
tryElHeads (String, Attrs)
_ [] = String
-> ParsecT
s u m (Forest (String, Attrs), [Many (Tree (String, Attrs))])
forall s u (m :: * -> *) a. String -> ParsecT s u m a
parserFail String
"none of me opening tags worked laddy"
tryElHeads (String, Attrs)
tagAttrs ((Many (Node (String, Attrs)
label Forest (String, Attrs)
forest)):[Many (Tree (String, Attrs))]
outputStack) =
if (String, Attrs)
tagAttrs (String, Attrs) -> (String, Attrs) -> Bool
forall a. Eq a => a -> a -> Bool
== (String, Attrs)
label
then (Forest (String, Attrs), [Many (Tree (String, Attrs))])
-> ParsecT
s u m (Forest (String, Attrs), [Many (Tree (String, Attrs))])
forall a. a -> ParsecT s u m a
forall (m :: * -> *) a. Monad m => a -> m a
return ((Forest (String, Attrs), [Many (Tree (String, Attrs))])
-> ParsecT
s u m (Forest (String, Attrs), [Many (Tree (String, Attrs))]))
-> (Forest (String, Attrs), [Many (Tree (String, Attrs))])
-> ParsecT
s u m (Forest (String, Attrs), [Many (Tree (String, Attrs))])
forall a b. (a -> b) -> a -> b
$ (Forest (String, Attrs)
forest, (Tree (String, Attrs) -> Many (Tree (String, Attrs))
forall a. a -> Many a
Many ((String, Attrs) -> Forest (String, Attrs) -> Tree (String, Attrs)
forall a. a -> [Tree a] -> Tree a
Node (String, Attrs)
label Forest (String, Attrs)
forest))Many (Tree (String, Attrs))
-> [Many (Tree (String, Attrs))] -> [Many (Tree (String, Attrs))]
forall a. a -> [a] -> [a]
:[Many (Tree (String, Attrs))]
outputStack)
else (String, Attrs)
-> [Many (Tree (String, Attrs))]
-> ParsecT
s u m (Forest (String, Attrs), [Many (Tree (String, Attrs))])
forall s u (m :: * -> *).
(String, Attrs)
-> [Many (Tree (String, Attrs))]
-> ParsecT
s u m (Forest (String, Attrs), [Many (Tree (String, Attrs))])
tryElHeads (String, Attrs)
tagAttrs [Many (Tree (String, Attrs))]
outputStack
tryElHeads (String, Attrs)
tagAttrs ((One (Node (String, Attrs)
label Forest (String, Attrs)
forest)):[Many (Tree (String, Attrs))]
outputStack) =
if (String, Attrs)
tagAttrs (String, Attrs) -> (String, Attrs) -> Bool
forall a. Eq a => a -> a -> Bool
== (String, Attrs)
label
then (Forest (String, Attrs), [Many (Tree (String, Attrs))])
-> ParsecT
s u m (Forest (String, Attrs), [Many (Tree (String, Attrs))])
forall a. a -> ParsecT s u m a
forall (m :: * -> *) a. Monad m => a -> m a
return ((Forest (String, Attrs), [Many (Tree (String, Attrs))])
-> ParsecT
s u m (Forest (String, Attrs), [Many (Tree (String, Attrs))]))
-> (Forest (String, Attrs), [Many (Tree (String, Attrs))])
-> ParsecT
s u m (Forest (String, Attrs), [Many (Tree (String, Attrs))])
forall a b. (a -> b) -> a -> b
$ (Forest (String, Attrs)
forest, [Many (Tree (String, Attrs))]
outputStack)
else String
-> ParsecT
s u m (Forest (String, Attrs), [Many (Tree (String, Attrs))])
forall s u (m :: * -> *) a. String -> ParsecT s u m a
parserFail (String
-> ParsecT
s u m (Forest (String, Attrs), [Many (Tree (String, Attrs))]))
-> String
-> ParsecT
s u m (Forest (String, Attrs), [Many (Tree (String, Attrs))])
forall a b. (a -> b) -> a -> b
$ String
"missing element" String -> ShowS
forall a. Semigroup a => a -> a -> a
<> (String, Attrs) -> String
forall a. Show a => a -> String
show (String, Attrs)
label
tryElHeads' :: (Elem, Attrs)
-> [Many (Tree ElemHead)]
-> Either String ([Tree ElemHead], [Many (Tree ElemHead)])
tryElHeads' :: (String, Attrs)
-> [Many (Tree (String, Attrs))]
-> Either
String (Forest (String, Attrs), [Many (Tree (String, Attrs))])
tryElHeads' (String, Attrs)
_ [] = String
-> Either
String (Forest (String, Attrs), [Many (Tree (String, Attrs))])
forall a b. a -> Either a b
Left String
"none of me opening tags worked laddy"
tryElHeads' (String, Attrs)
tagAttrs ((Many (Node (String, Attrs)
label Forest (String, Attrs)
forest)):[Many (Tree (String, Attrs))]
outputStack) =
if (String, Attrs)
tagAttrs (String, Attrs) -> (String, Attrs) -> Bool
forall a. Eq a => a -> a -> Bool
== (String, Attrs)
label
then (Forest (String, Attrs), [Many (Tree (String, Attrs))])
-> Either
String (Forest (String, Attrs), [Many (Tree (String, Attrs))])
forall a. a -> Either String a
forall (m :: * -> *) a. Monad m => a -> m a
return ((Forest (String, Attrs), [Many (Tree (String, Attrs))])
-> Either
String (Forest (String, Attrs), [Many (Tree (String, Attrs))]))
-> (Forest (String, Attrs), [Many (Tree (String, Attrs))])
-> Either
String (Forest (String, Attrs), [Many (Tree (String, Attrs))])
forall a b. (a -> b) -> a -> b
$ (Forest (String, Attrs)
forest, (Tree (String, Attrs) -> Many (Tree (String, Attrs))
forall a. a -> Many a
Many ((String, Attrs) -> Forest (String, Attrs) -> Tree (String, Attrs)
forall a. a -> [Tree a] -> Tree a
Node (String, Attrs)
label Forest (String, Attrs)
forest))Many (Tree (String, Attrs))
-> [Many (Tree (String, Attrs))] -> [Many (Tree (String, Attrs))]
forall a. a -> [a] -> [a]
:[Many (Tree (String, Attrs))]
outputStack)
else (String, Attrs)
-> [Many (Tree (String, Attrs))]
-> Either
String (Forest (String, Attrs), [Many (Tree (String, Attrs))])
tryElHeads' (String, Attrs)
tagAttrs [Many (Tree (String, Attrs))]
outputStack
tryElHeads' (String, Attrs)
tagAttrs ((One (Node (String, Attrs)
label Forest (String, Attrs)
forest)):[Many (Tree (String, Attrs))]
outputStack) =
if (String, Attrs)
tagAttrs (String, Attrs) -> (String, Attrs) -> Bool
forall a. Eq a => a -> a -> Bool
== (String, Attrs)
label
then (Forest (String, Attrs), [Many (Tree (String, Attrs))])
-> Either
String (Forest (String, Attrs), [Many (Tree (String, Attrs))])
forall a. a -> Either String a
forall (m :: * -> *) a. Monad m => a -> m a
return ((Forest (String, Attrs), [Many (Tree (String, Attrs))])
-> Either
String (Forest (String, Attrs), [Many (Tree (String, Attrs))]))
-> (Forest (String, Attrs), [Many (Tree (String, Attrs))])
-> Either
String (Forest (String, Attrs), [Many (Tree (String, Attrs))])
forall a b. (a -> b) -> a -> b
$ (Forest (String, Attrs)
forest, [Many (Tree (String, Attrs))]
outputStack)
else String
-> Either
String (Forest (String, Attrs), [Many (Tree (String, Attrs))])
forall a b. a -> Either a b
Left (String
-> Either
String (Forest (String, Attrs), [Many (Tree (String, Attrs))]))
-> String
-> Either
String (Forest (String, Attrs), [Many (Tree (String, Attrs))])
forall a b. (a -> b) -> a -> b
$ String
"missing element" String -> ShowS
forall a. Semigroup a => a -> a -> a
<> (String, Attrs) -> String
forall a. Show a => a -> String
show (String, Attrs)
label
innerParserSpecific :: (Stream s m Char, ShowHTML a) =>
Maybe (ParsecT s u m a)
-> Elem
-> SubTree ElemHead
-> ParsecT s u m ([a], String, [Tree ElemHead])
innerParserSpecific :: forall s (m :: * -> *) a u.
(Stream s m Char, ShowHTML a) =>
Maybe (ParsecT s u m a)
-> String
-> Forest (String, Attrs)
-> ParsecT s u m ([a], String, Forest (String, Attrs))
innerParserSpecific Maybe (ParsecT s u m a)
match String
tag Forest (String, Attrs)
subTree =
case String -> [String] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem String
tag [String]
selfClosing of
Bool
True -> if Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ Forest (String, Attrs) -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null Forest (String, Attrs)
subTree then ParsecT s u m ([a], String, Forest (String, Attrs))
forall a. HasCallStack => a
undefined else do
(ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string String
">") ParsecT s u m String
-> ParsecT s u m String -> ParsecT s u m String
forall a. ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string String
"/>")
([a], String, Forest (String, Attrs))
-> ParsecT s u m ([a], String, Forest (String, Attrs))
forall a. a -> ParsecT s u m a
forall (m :: * -> *) a. Monad m => a -> m a
return ([a]
forall a. Monoid a => a
mempty, String
forall a. Monoid a => a
mempty, Forest (String, Attrs)
forall a. Monoid a => a
mempty)
Bool
False -> do
[HTMLMatcher TreeHTML a]
x <- String
-> Maybe (ParsecT s u m a)
-> [Many (Tree (String, Attrs))]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
forall s (m :: * -> *) a u.
(Stream s m Char, ShowHTML a) =>
String
-> Maybe (ParsecT s u m a)
-> [Many (Tree (String, Attrs))]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
htmlGenParserRepeat String
tag Maybe (ParsecT s u m a)
match ([Many (Tree (String, Attrs))] -> [Many (Tree (String, Attrs))]
forall a. [a] -> [a]
reverse ([Many (Tree (String, Attrs))] -> [Many (Tree (String, Attrs))])
-> [Many (Tree (String, Attrs))] -> [Many (Tree (String, Attrs))]
forall a b. (a -> b) -> a -> b
$ Forest (String, Attrs)
-> [Many (Tree (String, Attrs))] -> [Many (Tree (String, Attrs))]
forall a. Eq a => [Tree a] -> [Many (Tree a)] -> [Many (Tree a)]
groupify Forest (String, Attrs)
subTree [])
let
(String
inText, [a]
matchBook, Forest (String, Attrs)
treees) = (HTMLMatcher TreeHTML a
-> (String, [a], Forest (String, Attrs))
-> (String, [a], Forest (String, Attrs)))
-> (String, [a], Forest (String, Attrs))
-> [HTMLMatcher TreeHTML a]
-> (String, [a], Forest (String, Attrs))
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr HTMLMatcher TreeHTML a
-> (String, [a], Forest (String, Attrs))
-> (String, [a], Forest (String, Attrs))
forall a.
ShowHTML a =>
HTMLMatcher TreeHTML a
-> (String, [a], Forest (String, Attrs))
-> (String, [a], Forest (String, Attrs))
foldFuncTrup (String, [a], Forest (String, Attrs))
forall a. Monoid a => a
mempty ([HTMLMatcher TreeHTML a]
x)
([a], String, Forest (String, Attrs))
-> ParsecT s u m ([a], String, Forest (String, Attrs))
forall a. a -> ParsecT s u m a
forall (m :: * -> *) a. Monad m => a -> m a
return ([a]
matchBook, String
inText, Forest (String, Attrs)
treees)
groupify :: Eq a => [Tree a] -> [Many (Tree a)] -> [Many (Tree a)]
groupify :: forall a. Eq a => [Tree a] -> [Many (Tree a)] -> [Many (Tree a)]
groupify [] [Many (Tree a)]
acc = [Many (Tree a)]
acc
groupify (Tree a
tree:[Tree a]
forest) [] = [Tree a] -> [Many (Tree a)] -> [Many (Tree a)]
forall a. Eq a => [Tree a] -> [Many (Tree a)] -> [Many (Tree a)]
groupify [Tree a]
forest (Tree a -> Many (Tree a)
forall a. a -> Many a
One Tree a
treeMany (Tree a) -> [Many (Tree a)] -> [Many (Tree a)]
forall a. a -> [a] -> [a]
:[])
groupify ((Node a
elemHead [Tree a]
subForest):[Tree a]
forest) (Many (Tree a)
mTree:[Many (Tree a)]
acc) =
case Many (Tree a)
mTree of
One (Node a
elemHeadPrev [Tree a]
subForestPrev) ->
if a
elemHead a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
elemHeadPrev
then [Tree a] -> [Many (Tree a)] -> [Many (Tree a)]
forall a. Eq a => [Tree a] -> [Many (Tree a)] -> [Many (Tree a)]
groupify [Tree a]
forest ([Many (Tree a)] -> [Many (Tree a)])
-> [Many (Tree a)] -> [Many (Tree a)]
forall a b. (a -> b) -> a -> b
$ ((Tree a -> Many (Tree a)
forall a. a -> Many a
Many (a -> [Tree a] -> Tree a
forall a. a -> [Tree a] -> Tree a
Node a
elemHeadPrev [Tree a]
subForestPrev))Many (Tree a) -> [Many (Tree a)] -> [Many (Tree a)]
forall a. a -> [a] -> [a]
:[Many (Tree a)]
acc)
else [Tree a] -> [Many (Tree a)] -> [Many (Tree a)]
forall a. Eq a => [Tree a] -> [Many (Tree a)] -> [Many (Tree a)]
groupify [Tree a]
forest ([Many (Tree a)] -> [Many (Tree a)])
-> [Many (Tree a)] -> [Many (Tree a)]
forall a b. (a -> b) -> a -> b
$ ((Tree a -> Many (Tree a)
forall a. a -> Many a
One (a -> [Tree a] -> Tree a
forall a. a -> [Tree a] -> Tree a
Node a
elemHead [Tree a]
subForest)) Many (Tree a) -> [Many (Tree a)] -> [Many (Tree a)]
forall a. a -> [a] -> [a]
: (Tree a -> Many (Tree a)
forall a. a -> Many a
One (a -> [Tree a] -> Tree a
forall a. a -> [Tree a] -> Tree a
Node a
elemHeadPrev [Tree a]
subForestPrev)) Many (Tree a) -> [Many (Tree a)] -> [Many (Tree a)]
forall a. a -> [a] -> [a]
: [Many (Tree a)]
acc)
Many (Node a
elemHeadPrev [Tree a]
subForestPrev) ->
if a
elemHead a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
elemHeadPrev
then [Tree a] -> [Many (Tree a)] -> [Many (Tree a)]
forall a. Eq a => [Tree a] -> [Many (Tree a)] -> [Many (Tree a)]
groupify [Tree a]
forest ((Tree a -> Many (Tree a)
forall a. a -> Many a
Many (a -> [Tree a] -> Tree a
forall a. a -> [Tree a] -> Tree a
Node a
elemHeadPrev [Tree a]
subForestPrev))Many (Tree a) -> [Many (Tree a)] -> [Many (Tree a)]
forall a. a -> [a] -> [a]
:[Many (Tree a)]
acc)
else [Tree a] -> [Many (Tree a)] -> [Many (Tree a)]
forall a. Eq a => [Tree a] -> [Many (Tree a)] -> [Many (Tree a)]
groupify [Tree a]
forest ((Tree a -> Many (Tree a)
forall a. a -> Many a
One (a -> [Tree a] -> Tree a
forall a. a -> [Tree a] -> Tree a
Node a
elemHead [Tree a]
subForest))
Many (Tree a) -> [Many (Tree a)] -> [Many (Tree a)]
forall a. a -> [a] -> [a]
: (Tree a -> Many (Tree a)
forall a. a -> Many a
Many (a -> [Tree a] -> Tree a
forall a. a -> [Tree a] -> Tree a
Node a
elemHeadPrev [Tree a]
subForestPrev))
Many (Tree a) -> [Many (Tree a)] -> [Many (Tree a)]
forall a. a -> [a] -> [a]
: [Many (Tree a)]
acc)
htmlGroup :: (Stream s m Char, ShowHTML a)
=> Maybe [Elem]
-> Maybe (ParsecT s u m a)
-> [(String, Maybe String)]
-> ParsecT s u m (GroupHtml TreeHTML a)
htmlGroup :: forall s (m :: * -> *) a u.
(Stream s m Char, ShowHTML a) =>
Maybe [String]
-> Maybe (ParsecT s u m a)
-> [(String, Maybe String)]
-> ParsecT s u m (GroupHtml TreeHTML a)
htmlGroup Maybe [String]
elemOpts Maybe (ParsecT s u m a)
matchh [(String, Maybe String)]
attrsSubset =
([TreeHTML a] -> GroupHtml TreeHTML a)
-> ParsecT s u m [TreeHTML a]
-> ParsecT s u m (GroupHtml TreeHTML a)
forall a b. (a -> b) -> ParsecT s u m a -> ParsecT s u m b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap [TreeHTML a] -> GroupHtml TreeHTML a
forall (e :: * -> *) a. ElementRep e => [e a] -> GroupHtml e a
mkGH (ParsecT s u m [TreeHTML a]
-> ParsecT s u m (GroupHtml TreeHTML a))
-> ParsecT s u m [TreeHTML a]
-> ParsecT s u m (GroupHtml TreeHTML a)
forall a b. (a -> b) -> a -> b
$ ParsecT s u m [TreeHTML a] -> ParsecT s u m [TreeHTML a]
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (Maybe [String]
-> Maybe (ParsecT s u m a)
-> [(String, Maybe String)]
-> ParsecT s u m (TreeHTML a)
forall s (m :: * -> *) a u.
(Stream s m Char, ShowHTML a) =>
Maybe [String]
-> Maybe (ParsecT s u m a)
-> [(String, Maybe String)]
-> ParsecT s u m (TreeHTML a)
treeElemParser Maybe [String]
elemOpts Maybe (ParsecT s u m a)
matchh [(String, Maybe String)]
attrsSubset
ParsecT s u m (TreeHTML a)
-> (TreeHTML a -> ParsecT s u m [TreeHTML a])
-> ParsecT s u m [TreeHTML a]
forall a b.
ParsecT s u m a -> (a -> ParsecT s u m b) -> ParsecT s u m b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (\TreeHTML a
treeH -> ([TreeHTML a] -> [TreeHTML a])
-> ParsecT s u m [TreeHTML a] -> ParsecT s u m [TreeHTML a]
forall a b. (a -> b) -> ParsecT s u m a -> ParsecT s u m b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (TreeHTML a
treeH TreeHTML a -> [TreeHTML a] -> [TreeHTML a]
forall a. a -> [a] -> [a]
:) (ParsecT s u m (TreeHTML a) -> ParsecT s u m [TreeHTML a]
forall a. ParsecT s u m a -> ParsecT s u m [a]
forall (f :: * -> *) a. Alternative f => f a -> f [a]
some (ParsecT s u m (TreeHTML a) -> ParsecT s u m (TreeHTML a)
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT s u m (TreeHTML a) -> ParsecT s u m (TreeHTML a))
-> ParsecT s u m (TreeHTML a) -> ParsecT s u m (TreeHTML a)
forall a b. (a -> b) -> a -> b
$ Maybe (ParsecT s u m a) -> TreeHTML a -> ParsecT s u m (TreeHTML a)
forall s (m :: * -> *) a u.
(Stream s m Char, ShowHTML a) =>
Maybe (ParsecT s u m a) -> TreeHTML a -> ParsecT s u m (TreeHTML a)
sameTreeH Maybe (ParsecT s u m a)
matchh TreeHTML a
treeH))))
table :: Stream s m Char => ParsecT s u m (GroupHtml TreeHTML String)
table :: forall s (m :: * -> *) u.
Stream s m Char =>
ParsecT s u m (GroupHtml TreeHTML String)
table = Maybe [String]
-> Maybe (ParsecT s u m String)
-> [(String, Maybe String)]
-> ParsecT s u m (GroupHtml TreeHTML String)
forall s (m :: * -> *) a u.
(Stream s m Char, ShowHTML a) =>
Maybe [String]
-> Maybe (ParsecT s u m a)
-> [(String, Maybe String)]
-> ParsecT s u m (GroupHtml TreeHTML a)
htmlGroup ([String] -> Maybe [String]
forall a. a -> Maybe a
Just [String
"tr"]) Maybe (ParsecT s u m String)
forall a. Maybe a
Nothing []
{-# DEPRECATED multiTreeElemHeadParser "use specificContinuous style functions" #-}
multiTreeElemHeadParser :: (Stream s m Char, ShowHTML a) =>
ParsecT s u m a
-> Many (Tree ElemHead)
-> ParsecT s u m [HTMLMatcher TreeHTML a]
multiTreeElemHeadParser :: forall s (m :: * -> *) a u.
(Stream s m Char, ShowHTML a) =>
ParsecT s u m a
-> Many (Tree (String, Attrs))
-> ParsecT s u m [HTMLMatcher TreeHTML a]
multiTreeElemHeadParser ParsecT s u m a
match Many (Tree (String, Attrs))
mTree = case Many (Tree (String, Attrs))
mTree of
Many (Node (String
elem, Attrs
attrs) Forest (String, Attrs)
subTree) ->
(([TreeHTML a] -> [HTMLMatcher TreeHTML a])
-> ParsecT s u m [TreeHTML a]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
forall a b. (a -> b) -> ParsecT s u m a -> ParsecT s u m b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (([TreeHTML a] -> [HTMLMatcher TreeHTML a])
-> ParsecT s u m [TreeHTML a]
-> ParsecT s u m [HTMLMatcher TreeHTML a])
-> ((TreeHTML a -> HTMLMatcher TreeHTML a)
-> [TreeHTML a] -> [HTMLMatcher TreeHTML a])
-> (TreeHTML a -> HTMLMatcher TreeHTML a)
-> ParsecT s u m [TreeHTML a]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (TreeHTML a -> HTMLMatcher TreeHTML a)
-> [TreeHTML a] -> [HTMLMatcher TreeHTML a]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap) TreeHTML a -> HTMLMatcher TreeHTML a
forall (a :: * -> *) b. a b -> HTMLMatcher a b
Element (ParsecT s u m (TreeHTML a) -> ParsecT s u m [TreeHTML a]
forall a. ParsecT s u m a -> ParsecT s u m [a]
forall (f :: * -> *) a. Alternative f => f a -> f [a]
many (ParsecT s u m (TreeHTML a) -> ParsecT s u m (TreeHTML a)
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT s u m (TreeHTML a) -> ParsecT s u m (TreeHTML a))
-> ParsecT s u m (TreeHTML a) -> ParsecT s u m (TreeHTML a)
forall a b. (a -> b) -> a -> b
$ Maybe (ParsecT s u m a)
-> String
-> [(String, String)]
-> Forest (String, Attrs)
-> ParsecT s u m (TreeHTML a)
forall s (m :: * -> *) a u.
(Stream s m Char, ShowHTML a) =>
Maybe (ParsecT s u m a)
-> String
-> [(String, String)]
-> Forest (String, Attrs)
-> ParsecT s u m (TreeHTML a)
treeElemParserSpecific (ParsecT s u m a -> Maybe (ParsecT s u m a)
forall a. a -> Maybe a
Just ParsecT s u m a
match) String
elem (Attrs -> [(String, String)]
forall k a. Map k a -> [(k, a)]
Map.toList Attrs
attrs) Forest (String, Attrs)
subTree ))
One (Node (String
elem, Attrs
attrs) Forest (String, Attrs)
subTree) ->
Maybe (ParsecT s u m a)
-> String
-> [(String, String)]
-> Forest (String, Attrs)
-> ParsecT s u m (TreeHTML a)
forall s (m :: * -> *) a u.
(Stream s m Char, ShowHTML a) =>
Maybe (ParsecT s u m a)
-> String
-> [(String, String)]
-> Forest (String, Attrs)
-> ParsecT s u m (TreeHTML a)
treeElemParserSpecific (ParsecT s u m a -> Maybe (ParsecT s u m a)
forall a. a -> Maybe a
Just ParsecT s u m a
match) String
elem (Attrs -> [(String, String)]
forall k a. Map k a -> [(k, a)]
Map.toList Attrs
attrs) Forest (String, Attrs)
subTree ParsecT s u m (TreeHTML a)
-> (TreeHTML a -> ParsecT s u m [HTMLMatcher TreeHTML a])
-> ParsecT s u m [HTMLMatcher TreeHTML a]
forall a b.
ParsecT s u m a -> (a -> ParsecT s u m b) -> ParsecT s u m b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= [HTMLMatcher TreeHTML a] -> ParsecT s u m [HTMLMatcher TreeHTML a]
forall a. a -> ParsecT s u m a
forall (m :: * -> *) a. Monad m => a -> m a
return ([HTMLMatcher TreeHTML a]
-> ParsecT s u m [HTMLMatcher TreeHTML a])
-> (TreeHTML a -> [HTMLMatcher TreeHTML a])
-> TreeHTML a
-> ParsecT s u m [HTMLMatcher TreeHTML a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (HTMLMatcher TreeHTML a
-> [HTMLMatcher TreeHTML a] -> [HTMLMatcher TreeHTML a])
-> [HTMLMatcher TreeHTML a]
-> HTMLMatcher TreeHTML a
-> [HTMLMatcher TreeHTML a]
forall a b c. (a -> b -> c) -> b -> a -> c
flip (:) [] (HTMLMatcher TreeHTML a -> [HTMLMatcher TreeHTML a])
-> (TreeHTML a -> HTMLMatcher TreeHTML a)
-> TreeHTML a
-> [HTMLMatcher TreeHTML a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TreeHTML a -> HTMLMatcher TreeHTML a
forall (a :: * -> *) b. a b -> HTMLMatcher a b
Element
fromMany :: Many a -> a
fromMany :: forall a. Many a -> a
fromMany (One a
a) = a
a
fromMany (Many a
a) = a
a
stylingTags :: [String]
stylingTags = [String
"abbr", String
"b", String
"big", String
"acronym", String
"dfn", String
"em", String
"font", String
"i", String
"mark", String
"q", String
"small"]
stylingElem :: Stream s m Char => ParsecT s u m String
stylingElem :: forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
stylingElem = do
(String
e,Attrs
_) <- Maybe [String]
-> [(String, Maybe String)] -> ParsecT s u m (String, Attrs)
forall s (m :: * -> *) u.
Stream s m Char =>
Maybe [String]
-> [(String, Maybe String)] -> ParsecT s u m (String, Attrs)
parseOpeningTag ([String] -> Maybe [String]
forall a. a -> Maybe a
Just [String]
stylingTags) []
Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'>'
((String, String) -> String)
-> ParsecT s u m (String, String) -> ParsecT s u m String
forall a b. (a -> b) -> ParsecT s u m a -> ParsecT s u m b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (String, String) -> String
forall a b. (a, b) -> a
fst (ParsecT s u m (String, String) -> ParsecT s u m String)
-> ParsecT s u m (String, String) -> ParsecT s u m String
forall a b. (a -> b) -> a -> b
$ ParsecT s u m Char
-> ParsecT s u m String -> ParsecT s u m (String, String)
forall s u (m :: * -> *) a end.
ParsecT s u m a -> ParsecT s u m end -> ParsecT s u m ([a], end)
manyTill_ ParsecT s u m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
anyChar (String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
endTag String
e)
sameTreeH :: (Stream s m Char, ShowHTML a)
=> Maybe (ParsecT s u m a)
-> TreeHTML a
-> ParsecT s u m (TreeHTML a)
sameTreeH :: forall s (m :: * -> *) a u.
(Stream s m Char, ShowHTML a) =>
Maybe (ParsecT s u m a) -> TreeHTML a -> ParsecT s u m (TreeHTML a)
sameTreeH Maybe (ParsecT s u m a)
matchh TreeHTML a
treeH = Maybe (ParsecT s u m a)
-> String
-> [(String, String)]
-> Forest (String, Attrs)
-> ParsecT s u m (TreeHTML a)
forall s (m :: * -> *) a u.
(Stream s m Char, ShowHTML a) =>
Maybe (ParsecT s u m a)
-> String
-> [(String, String)]
-> Forest (String, Attrs)
-> ParsecT s u m (TreeHTML a)
treeElemParserSpecific Maybe (ParsecT s u m a)
matchh (TreeHTML a -> String
forall b. TreeHTML b -> String
forall (a :: * -> *) b. ElementRep a => a b -> String
elTag TreeHTML a
treeH) (Attrs -> [(String, String)]
forall k a. Map k a -> [(k, a)]
Map.toList (Attrs -> [(String, String)]) -> Attrs -> [(String, String)]
forall a b. (a -> b) -> a -> b
$ TreeHTML a -> Attrs
forall b. TreeHTML b -> Attrs
forall (a :: * -> *) b. ElementRep a => a b -> Attrs
attrs TreeHTML a
treeH) (TreeHTML a -> Forest (String, Attrs)
forall a. TreeHTML a -> Forest (String, Attrs)
_innerTree' TreeHTML a
treeH)
htmlGenParserFlex :: (Stream s m Char, ShowHTML a) =>
Maybe (ParsecT s u m a)
-> ParsecT s u m (HTMLMatcher TreeHTML a)
htmlGenParserFlex :: forall s (m :: * -> *) a u.
(Stream s m Char, ShowHTML a) =>
Maybe (ParsecT s u m a) -> ParsecT s u m (HTMLMatcher TreeHTML a)
htmlGenParserFlex Maybe (ParsecT s u m a)
a = (ParsecT s u m (HTMLMatcher TreeHTML a)
-> ParsecT s u m (HTMLMatcher TreeHTML a)
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (a -> HTMLMatcher TreeHTML a
forall (a :: * -> *) b. b -> HTMLMatcher a b
Match (a -> HTMLMatcher TreeHTML a)
-> ParsecT s u m a -> ParsecT s u m (HTMLMatcher TreeHTML a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (ParsecT s u m a -> Maybe (ParsecT s u m a) -> ParsecT s u m a
forall a. a -> Maybe a -> a
fromMaybe ParsecT s u m a
forall s u (m :: * -> *) a. ParsecT s u m a
parserZero Maybe (ParsecT s u m a)
a)))
ParsecT s u m (HTMLMatcher TreeHTML a)
-> ParsecT s u m (HTMLMatcher TreeHTML a)
-> ParsecT s u m (HTMLMatcher TreeHTML a)
forall a. ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ParsecT s u m (HTMLMatcher TreeHTML a)
-> ParsecT s u m (HTMLMatcher TreeHTML a)
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (TreeHTML a -> HTMLMatcher TreeHTML a
forall (a :: * -> *) b. a b -> HTMLMatcher a b
Element (TreeHTML a -> HTMLMatcher TreeHTML a)
-> ParsecT s u m (TreeHTML a)
-> ParsecT s u m (HTMLMatcher TreeHTML a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe [String]
-> Maybe (ParsecT s u m a)
-> [(String, Maybe String)]
-> ParsecT s u m (TreeHTML a)
forall s (m :: * -> *) a u.
(Stream s m Char, ShowHTML a) =>
Maybe [String]
-> Maybe (ParsecT s u m a)
-> [(String, Maybe String)]
-> ParsecT s u m (TreeHTML a)
treeElemParser Maybe [String]
forall a. Maybe a
Nothing Maybe (ParsecT s u m a)
a [])
ParsecT s u m (HTMLMatcher TreeHTML a)
-> ParsecT s u m (HTMLMatcher TreeHTML a)
-> ParsecT s u m (HTMLMatcher TreeHTML a)
forall a. ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ((String -> HTMLMatcher TreeHTML a
forall (a :: * -> *) b. String -> HTMLMatcher a b
IText (String -> HTMLMatcher TreeHTML a)
-> (Char -> String) -> Char -> HTMLMatcher TreeHTML a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Char -> ShowS
forall a. a -> [a] -> [a]
:[])) (Char -> HTMLMatcher TreeHTML a)
-> ParsecT s u m Char -> ParsecT s u m (HTMLMatcher TreeHTML a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
anyChar)
htmlGenParser :: (Stream s m Char, ShowHTML a)
=> ParsecT s u m a
-> ParsecT s u m (TreeHTML a)
-> ParsecT s u m (HTMLMatcher TreeHTML a)
htmlGenParser :: forall s (m :: * -> *) a u.
(Stream s m Char, ShowHTML a) =>
ParsecT s u m a
-> ParsecT s u m (TreeHTML a)
-> ParsecT s u m (HTMLMatcher TreeHTML a)
htmlGenParser ParsecT s u m a
a ParsecT s u m (TreeHTML a)
parseTreeH = (a -> HTMLMatcher TreeHTML a
forall (a :: * -> *) b. b -> HTMLMatcher a b
Match (a -> HTMLMatcher TreeHTML a)
-> ParsecT s u m a -> ParsecT s u m (HTMLMatcher TreeHTML a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m a -> ParsecT s u m a
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT s u m a
a)
ParsecT s u m (HTMLMatcher TreeHTML a)
-> ParsecT s u m (HTMLMatcher TreeHTML a)
-> ParsecT s u m (HTMLMatcher TreeHTML a)
forall a. ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> (TreeHTML a -> HTMLMatcher TreeHTML a
forall (a :: * -> *) b. a b -> HTMLMatcher a b
Element (TreeHTML a -> HTMLMatcher TreeHTML a)
-> ParsecT s u m (TreeHTML a)
-> ParsecT s u m (HTMLMatcher TreeHTML a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m (TreeHTML a) -> ParsecT s u m (TreeHTML a)
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT s u m (TreeHTML a)
parseTreeH)
ParsecT s u m (HTMLMatcher TreeHTML a)
-> ParsecT s u m (HTMLMatcher TreeHTML a)
-> ParsecT s u m (HTMLMatcher TreeHTML a)
forall a. ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ((Char -> HTMLMatcher TreeHTML a)
-> ParsecT s u m Char -> ParsecT s u m (HTMLMatcher TreeHTML a)
forall a b. (a -> b) -> ParsecT s u m a -> ParsecT s u m b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (String -> HTMLMatcher TreeHTML a
forall (a :: * -> *) b. String -> HTMLMatcher a b
IText (String -> HTMLMatcher TreeHTML a)
-> (Char -> String) -> Char -> HTMLMatcher TreeHTML a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Char -> ShowS
forall a. a -> [a] -> [a]
:[])) ParsecT s u m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
anyChar)
{-# DEPRECATED specificForest "you likely need specificRepetitiveForest" #-}
specificForest :: (Stream s m Char, ShowHTML a) =>
[Tree ElemHead]
-> ParsecT s u m a
-> ParsecT s u m [HTMLMatcher TreeHTML a]
specificForest :: forall s (m :: * -> *) a u.
(Stream s m Char, ShowHTML a) =>
Forest (String, Attrs)
-> ParsecT s u m a -> ParsecT s u m [HTMLMatcher TreeHTML a]
specificForest [] ParsecT s u m a
_ = [HTMLMatcher TreeHTML a] -> ParsecT s u m [HTMLMatcher TreeHTML a]
forall a. a -> ParsecT s u m a
forall (m :: * -> *) a. Monad m => a -> m a
return []
specificForest (Tree (String, Attrs)
x:Forest (String, Attrs)
xs) ParsecT s u m a
match = do
HTMLMatcher TreeHTML a
y <- ParsecT s u m a
-> ParsecT s u m (TreeHTML a)
-> ParsecT s u m (HTMLMatcher TreeHTML a)
forall s (m :: * -> *) a u.
(Stream s m Char, ShowHTML a) =>
ParsecT s u m a
-> ParsecT s u m (TreeHTML a)
-> ParsecT s u m (HTMLMatcher TreeHTML a)
htmlGenParser ParsecT s u m a
match (Tree (String, Attrs)
-> ParsecT s u m a -> ParsecT s u m (TreeHTML a)
forall s (m :: * -> *) a u.
(Stream s m Char, ShowHTML a) =>
Tree (String, Attrs)
-> ParsecT s u m a -> ParsecT s u m (TreeHTML a)
nodeToTreeElemExpr Tree (String, Attrs)
x ParsecT s u m a
match)
[HTMLMatcher TreeHTML a]
ys <- case HTMLMatcher TreeHTML a
y of
Element TreeHTML a
_ -> Forest (String, Attrs)
-> ParsecT s u m a -> ParsecT s u m [HTMLMatcher TreeHTML a]
forall s (m :: * -> *) a u.
(Stream s m Char, ShowHTML a) =>
Forest (String, Attrs)
-> ParsecT s u m a -> ParsecT s u m [HTMLMatcher TreeHTML a]
specificForest Forest (String, Attrs)
xs ParsecT s u m a
match
HTMLMatcher TreeHTML a
_ -> Forest (String, Attrs)
-> ParsecT s u m a -> ParsecT s u m [HTMLMatcher TreeHTML a]
forall s (m :: * -> *) a u.
(Stream s m Char, ShowHTML a) =>
Forest (String, Attrs)
-> ParsecT s u m a -> ParsecT s u m [HTMLMatcher TreeHTML a]
specificForest (Tree (String, Attrs)
xTree (String, Attrs)
-> Forest (String, Attrs) -> Forest (String, Attrs)
forall a. a -> [a] -> [a]
:Forest (String, Attrs)
xs) ParsecT s u m a
match
[HTMLMatcher TreeHTML a] -> ParsecT s u m [HTMLMatcher TreeHTML a]
forall a. a -> ParsecT s u m a
forall (m :: * -> *) a. Monad m => a -> m a
return (HTMLMatcher TreeHTML a
y HTMLMatcher TreeHTML a
-> [HTMLMatcher TreeHTML a] -> [HTMLMatcher TreeHTML a]
forall a. a -> [a] -> [a]
: [HTMLMatcher TreeHTML a]
ys)
nodeToTreeElemExpr :: (Stream s m Char, ShowHTML a) =>
Tree ElemHead
-> ParsecT s u m a
-> ParsecT s u m (TreeHTML a)
nodeToTreeElemExpr :: forall s (m :: * -> *) a u.
(Stream s m Char, ShowHTML a) =>
Tree (String, Attrs)
-> ParsecT s u m a -> ParsecT s u m (TreeHTML a)
nodeToTreeElemExpr (Node (String
elem, Attrs
attrs) Forest (String, Attrs)
subTree) ParsecT s u m a
match =
Maybe (ParsecT s u m a)
-> String
-> [(String, String)]
-> Forest (String, Attrs)
-> ParsecT s u m (TreeHTML a)
forall s (m :: * -> *) a u.
(Stream s m Char, ShowHTML a) =>
Maybe (ParsecT s u m a)
-> String
-> [(String, String)]
-> Forest (String, Attrs)
-> ParsecT s u m (TreeHTML a)
treeElemParserSpecific (ParsecT s u m a -> Maybe (ParsecT s u m a)
forall a. a -> Maybe a
Just ParsecT s u m a
match) String
elem (Attrs -> [(String, String)]
forall k a. Map k a -> [(k, a)]
Map.toList Attrs
attrs) Forest (String, Attrs)
subTree
innerElemParser2 :: (ShowHTML a, Stream s m Char) =>
String
-> Maybe (ParsecT s u m a)
-> ParsecT s u m [HTMLMatcher TreeHTML a]
innerElemParser2 :: forall a s (m :: * -> *) u.
(ShowHTML a, Stream s m Char) =>
String
-> Maybe (ParsecT s u m a)
-> ParsecT s u m [HTMLMatcher TreeHTML a]
innerElemParser2 String
eTag Maybe (ParsecT s u m a)
innerSpec = Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'>'
ParsecT s u m Char
-> ParsecT s u m [HTMLMatcher TreeHTML a]
-> ParsecT s u m [HTMLMatcher TreeHTML a]
forall a b. ParsecT s u m a -> ParsecT s u m b -> ParsecT s u m b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ParsecT s u m (HTMLMatcher TreeHTML a)
-> ParsecT s u m String -> ParsecT s u m [HTMLMatcher TreeHTML a]
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 s u m (HTMLMatcher TreeHTML a)
-> ParsecT s u m (HTMLMatcher TreeHTML a)
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (a -> HTMLMatcher TreeHTML a
forall (a :: * -> *) b. b -> HTMLMatcher a b
Match (a -> HTMLMatcher TreeHTML a)
-> ParsecT s u m a -> ParsecT s u m (HTMLMatcher TreeHTML a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (ParsecT s u m a -> Maybe (ParsecT s u m a) -> ParsecT s u m a
forall a. a -> Maybe a -> a
fromMaybe ParsecT s u m a
forall s u (m :: * -> *) a. ParsecT s u m a
parserZero Maybe (ParsecT s u m a)
innerSpec))
ParsecT s u m (HTMLMatcher TreeHTML a)
-> ParsecT s u m (HTMLMatcher TreeHTML a)
-> ParsecT s u m (HTMLMatcher TreeHTML a)
forall a. ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> (ParsecT s u m (HTMLMatcher TreeHTML a)
-> ParsecT s u m (HTMLMatcher TreeHTML a)
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (String -> HTMLMatcher TreeHTML a
forall (a :: * -> *) b. String -> HTMLMatcher a b
IText (String -> HTMLMatcher TreeHTML a)
-> ParsecT s u m String -> ParsecT s u m (HTMLMatcher TreeHTML a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
stylingElem))
ParsecT s u m (HTMLMatcher TreeHTML a)
-> ParsecT s u m (HTMLMatcher TreeHTML a)
-> ParsecT s u m (HTMLMatcher TreeHTML a)
forall a. ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ParsecT s u m (HTMLMatcher TreeHTML a)
-> ParsecT s u m (HTMLMatcher TreeHTML a)
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (TreeHTML a -> HTMLMatcher TreeHTML a
forall (a :: * -> *) b. a b -> HTMLMatcher a b
Element (TreeHTML a -> HTMLMatcher TreeHTML a)
-> ParsecT s u m (TreeHTML a)
-> ParsecT s u m (HTMLMatcher TreeHTML a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe [String]
-> Maybe (ParsecT s u m a)
-> [(String, Maybe String)]
-> ParsecT s u m (TreeHTML a)
forall s (m :: * -> *) a u.
(Stream s m Char, ShowHTML a) =>
Maybe [String]
-> Maybe (ParsecT s u m a)
-> [(String, Maybe String)]
-> ParsecT s u m (TreeHTML a)
treeElemParser' Maybe [String]
forall a. Maybe a
Nothing Maybe (ParsecT s u m a)
innerSpec [])
ParsecT s u m (HTMLMatcher TreeHTML a)
-> ParsecT s u m (HTMLMatcher TreeHTML a)
-> ParsecT s u m (HTMLMatcher TreeHTML a)
forall a. ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ((String -> HTMLMatcher TreeHTML a
forall (a :: * -> *) b. String -> HTMLMatcher a b
IText (String -> HTMLMatcher TreeHTML a)
-> (Char -> String) -> Char -> HTMLMatcher TreeHTML a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Char -> ShowS
forall a. a -> [a] -> [a]
:[])) (Char -> HTMLMatcher TreeHTML a)
-> ParsecT s u m Char -> ParsecT s u m (HTMLMatcher TreeHTML a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
anyChar)) (ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT s u m String -> ParsecT s u m String)
-> ParsecT s u m String -> ParsecT s u m String
forall a b. (a -> b) -> a -> b
$ String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
endTag String
eTag)
treeElemParserAnyInside :: (Stream s m Char, ShowHTML a) => Maybe (ParsecT s u m a) -> ParsecT s u m (TreeHTML a)
treeElemParserAnyInside :: forall s (m :: * -> *) a u.
(Stream s m Char, ShowHTML a) =>
Maybe (ParsecT s u m a) -> ParsecT s u m (TreeHTML a)
treeElemParserAnyInside Maybe (ParsecT s u m a)
match = Maybe [String]
-> Maybe (ParsecT s u m a)
-> [(String, Maybe String)]
-> ParsecT s u m (TreeHTML a)
forall s (m :: * -> *) a u.
(Stream s m Char, ShowHTML a) =>
Maybe [String]
-> Maybe (ParsecT s u m a)
-> [(String, Maybe String)]
-> ParsecT s u m (TreeHTML a)
treeElemParser Maybe [String]
forall a. Maybe a
Nothing Maybe (ParsecT s u m a)
match []
anyHtmlGroup :: (ShowHTML a, Stream s m Char) => ParsecT s u m (GroupHtml TreeHTML a)
anyHtmlGroup :: forall a s (m :: * -> *) u.
(ShowHTML a, Stream s m Char) =>
ParsecT s u m (GroupHtml TreeHTML a)
anyHtmlGroup = Maybe [String]
-> Maybe (ParsecT s u m a)
-> [(String, Maybe String)]
-> ParsecT s u m (GroupHtml TreeHTML a)
forall s (m :: * -> *) a u.
(Stream s m Char, ShowHTML a) =>
Maybe [String]
-> Maybe (ParsecT s u m a)
-> [(String, Maybe String)]
-> ParsecT s u m (GroupHtml TreeHTML a)
htmlGroup Maybe [String]
forall a. Maybe a
Nothing Maybe (ParsecT s u m a)
forall a. Maybe a
Nothing []
findAllSpaceMutExGroups :: (ShowHTML a, Stream s m Char) => ParsecT s u m (Maybe [GroupHtml TreeHTML a])
findAllSpaceMutExGroups :: forall a s (m :: * -> *) u.
(ShowHTML a, Stream s m Char) =>
ParsecT s u m (Maybe [GroupHtml TreeHTML a])
findAllSpaceMutExGroups = ParsecT s u m (GroupHtml TreeHTML a)
-> ParsecT s u m (Maybe [GroupHtml TreeHTML a])
forall s (m :: * -> *) u a.
Stream s m Char =>
ParsecT s u m a -> ParsecT s u m (Maybe [a])
findNaive ParsecT s u m (GroupHtml TreeHTML a)
forall a s (m :: * -> *) u.
(ShowHTML a, Stream s m Char) =>
ParsecT s u m (GroupHtml TreeHTML a)
anyHtmlGroup
findAllMutExGroups' :: a
findAllMutExGroups' = a
forall a. HasCallStack => a
undefined