{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE MultiWayIf #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE ScopedTypeVariables #-}

-- | The HTML parser.
module Zenacy.HTML.Internal.Parser
  ( Parser(..)
  , ParserOptions(..)
  , ParserResult(..)
  , parseDocument
  , parseFragment
  ) where

import Zenacy.HTML.Internal.BS
import Zenacy.HTML.Internal.Buffer
import Zenacy.HTML.Internal.Char
import Zenacy.HTML.Internal.Core
import Zenacy.HTML.Internal.DOM
import Zenacy.HTML.Internal.Lexer
import Zenacy.HTML.Internal.Token
import Zenacy.HTML.Internal.Types

import Control.Applicative
  ( liftA
  )
import Control.Monad
  ( when
  , unless
  , void
  )
import Control.Monad.Extra
  ( (||^)
  , (&&^)
  , anyM
  , notM
  , whenM
  , whenJustM
  , unlessM
  )
import Control.Monad.ST
  ( ST
  , runST
  )
import Data.Default
  ( Default(..)
  )
import Data.DList
  ( DList
  )
import qualified Data.DList as D
  ( append
  , empty
  , snoc
  , toList
  )
import Data.IntMap
  ( IntMap
  )
import qualified Data.IntMap as IntMap
  ( findWithDefault
  , lookup
  , insert
  , map
  , mapWithKey
  )
import Data.List
  ( find
  )
import Data.Map
  ( Map
  )
import qualified Data.Map as Map
  ( fromList
  , lookup
  )
import Data.Maybe
  ( fromJust
  , isJust
  , isNothing
  , listToMaybe
  , mapMaybe
  )
import Data.Monoid
  ( (<>)
  )
import Data.Sequence
  ( Seq
  )
import qualified Data.Sequence as Seq
  ( empty
  , fromList
  )
import Data.Set
  ( Set
  )
import qualified Data.Set as Set
  ( fromList
  , member
  , notMember
  , union
  , unions
  )
import Data.STRef
  ( STRef
  , newSTRef
  , readSTRef
  , writeSTRef
  )
import Data.Word
  ( Word8
  )

-- | Parser processing state.
data Parser s = Parser
  { forall s. Parser s -> STRef s (Lexer s)
parserLexer             :: STRef s (Lexer s)
  -- ^ The lexer for token generation.
  , forall s. Parser s -> STRef s DOM
parserDOM               :: STRef s DOM
  -- ^ The parser DOM.
  , forall s. Parser s -> STRef s [DOMID]
parserElementStack      :: STRef s [DOMID]
  -- ^ The element stack (section 12.2.3.2).
  , forall s. Parser s -> STRef s [ParserFormatItem]
parserActiveFormatList  :: STRef s [ParserFormatItem]
  -- ^ The list of action formatting elements (section 12.2.3.3).
  , forall s. Parser s -> STRef s ParserMode
parserInsertionMode     :: STRef s ParserMode
  -- ^ The current insertion mode.
  , forall s. Parser s -> STRef s ParserMode
parserOriginalMode      :: STRef s ParserMode
  -- ^ The original insertion mode.
  , forall s. Parser s -> STRef s [ParserMode]
parserTemplateMode      :: STRef s [ParserMode]
  -- ^ The template insertion mode.
  , forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement    :: STRef s (Maybe DOMID)
  -- ^ The context element.
  , forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement       :: STRef s (Maybe DOMID)
  -- ^ The head element pointer (section 12.2.3.4).
  , forall s. Parser s -> STRef s (Maybe DOMID)
parserFormElement       :: STRef s (Maybe DOMID)
  -- ^ The form element pointer (section 12.2.3.4).
  , forall s. Parser s -> STRef s Bool
parserSelfClosingFlag   :: STRef s Bool
  -- ^ The self closing acknowledges flag.
  , forall s. Parser s -> STRef s Bool
parserFragmentMode      :: STRef s Bool
  -- ^ The flag indicating parser is in fragment mode.
  , forall s. Parser s -> STRef s Bool
parserFosterParenting   :: STRef s Bool
  -- ^ The foster parenting flag.
  , forall s. Parser s -> STRef s Bool
parserFrameSetOK        :: STRef s Bool
  -- ^ The frame-set ok flag (section 12.2.3.5).
  , forall s. Parser s -> STRef s Bool
parserDone              :: STRef s Bool
  -- ^ The parser done flag.
  , forall s. Parser s -> STRef s [Token]
parserTableChars        :: STRef s [Token]
  -- ^ The pending table characters.
  , forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserAdoptionAgency    :: STRef s (ParserAdoptionAgency s)
  -- ^ The adoption agency state.
  , forall s. Parser s -> STRef s (DList BS)
parserErrors            :: STRef s (DList BS)
  -- ^ The parser errors.
  , forall s. Parser s -> STRef s Bool
parserIFrameSrcDoc      :: STRef s Bool
  -- ^ Indicates that the documnet is an iframe srcdoc.
  , forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserTextMap           :: STRef s (IntMap (STRef s (Buffer s)))
  -- ^ Map of buffers for holding dom strings.
  , forall s. Parser s -> Bool
parserLogErrors         :: Bool
  -- ^ Flag to log errors.
  }

-- | Defines the parser mode.
data ParserMode
  = ModeInitial
  | ModeBeforeHtml
  | ModeBeforeHead
  | ModeInHead
  | ModeInHeadNoscript
  | ModeAfterHead
  | ModeInBody
  | ModeText
  | ModeInTable
  | ModeInTableText
  | ModeInCaption
  | ModeInColumnGroup
  | ModeInTableBody
  | ModeInRow
  | ModeInCell
  | ModeInSelect
  | ModeInSelectInTable
  | ModeInTemplate
  | ModeAfterBody
  | ModeInFrameset
  | ModeAfterFrameset
  | ModeAfterAfterBody
  | ModeAfterAfterFrameset
    deriving (ParserMode -> ParserMode -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ParserMode -> ParserMode -> Bool
$c/= :: ParserMode -> ParserMode -> Bool
== :: ParserMode -> ParserMode -> Bool
$c== :: ParserMode -> ParserMode -> Bool
Eq, Eq ParserMode
ParserMode -> ParserMode -> Bool
ParserMode -> ParserMode -> Ordering
ParserMode -> ParserMode -> ParserMode
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: ParserMode -> ParserMode -> ParserMode
$cmin :: ParserMode -> ParserMode -> ParserMode
max :: ParserMode -> ParserMode -> ParserMode
$cmax :: ParserMode -> ParserMode -> ParserMode
>= :: ParserMode -> ParserMode -> Bool
$c>= :: ParserMode -> ParserMode -> Bool
> :: ParserMode -> ParserMode -> Bool
$c> :: ParserMode -> ParserMode -> Bool
<= :: ParserMode -> ParserMode -> Bool
$c<= :: ParserMode -> ParserMode -> Bool
< :: ParserMode -> ParserMode -> Bool
$c< :: ParserMode -> ParserMode -> Bool
compare :: ParserMode -> ParserMode -> Ordering
$ccompare :: ParserMode -> ParserMode -> Ordering
Ord, DOMID -> ParserMode -> ShowS
[ParserMode] -> ShowS
ParserMode -> String
forall a.
(DOMID -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ParserMode] -> ShowS
$cshowList :: [ParserMode] -> ShowS
show :: ParserMode -> String
$cshow :: ParserMode -> String
showsPrec :: DOMID -> ParserMode -> ShowS
$cshowsPrec :: DOMID -> ParserMode -> ShowS
Show)

-- | Parser options type.
data ParserOptions = ParserOptions
  { ParserOptions -> BS
parserOptionInput          :: BS
  -- ^ The input to the lexer.
  , ParserOptions -> Bool
parserOptionLogErrors      :: Bool
  -- ^ Indicates whether warnings are logged.
  , ParserOptions -> Bool
parserOptionIgnoreEntities :: Bool
  -- ^ Indicates that entities should not be tokenized.
  } deriving (ParserOptions -> ParserOptions -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ParserOptions -> ParserOptions -> Bool
$c/= :: ParserOptions -> ParserOptions -> Bool
== :: ParserOptions -> ParserOptions -> Bool
$c== :: ParserOptions -> ParserOptions -> Bool
Eq, Eq ParserOptions
ParserOptions -> ParserOptions -> Bool
ParserOptions -> ParserOptions -> Ordering
ParserOptions -> ParserOptions -> ParserOptions
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: ParserOptions -> ParserOptions -> ParserOptions
$cmin :: ParserOptions -> ParserOptions -> ParserOptions
max :: ParserOptions -> ParserOptions -> ParserOptions
$cmax :: ParserOptions -> ParserOptions -> ParserOptions
>= :: ParserOptions -> ParserOptions -> Bool
$c>= :: ParserOptions -> ParserOptions -> Bool
> :: ParserOptions -> ParserOptions -> Bool
$c> :: ParserOptions -> ParserOptions -> Bool
<= :: ParserOptions -> ParserOptions -> Bool
$c<= :: ParserOptions -> ParserOptions -> Bool
< :: ParserOptions -> ParserOptions -> Bool
$c< :: ParserOptions -> ParserOptions -> Bool
compare :: ParserOptions -> ParserOptions -> Ordering
$ccompare :: ParserOptions -> ParserOptions -> Ordering
Ord, DOMID -> ParserOptions -> ShowS
[ParserOptions] -> ShowS
ParserOptions -> String
forall a.
(DOMID -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ParserOptions] -> ShowS
$cshowList :: [ParserOptions] -> ShowS
show :: ParserOptions -> String
$cshow :: ParserOptions -> String
showsPrec :: DOMID -> ParserOptions -> ShowS
$cshowsPrec :: DOMID -> ParserOptions -> ShowS
Show)

-- | Parser result type.
data ParserResult = ParserResult
  { ParserResult -> DOM
parserResultDOM    :: DOM
  , ParserResult -> [BS]
parserResultErrors :: [BS]
  } deriving (ParserResult -> ParserResult -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ParserResult -> ParserResult -> Bool
$c/= :: ParserResult -> ParserResult -> Bool
== :: ParserResult -> ParserResult -> Bool
$c== :: ParserResult -> ParserResult -> Bool
Eq, Eq ParserResult
ParserResult -> ParserResult -> Bool
ParserResult -> ParserResult -> Ordering
ParserResult -> ParserResult -> ParserResult
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: ParserResult -> ParserResult -> ParserResult
$cmin :: ParserResult -> ParserResult -> ParserResult
max :: ParserResult -> ParserResult -> ParserResult
$cmax :: ParserResult -> ParserResult -> ParserResult
>= :: ParserResult -> ParserResult -> Bool
$c>= :: ParserResult -> ParserResult -> Bool
> :: ParserResult -> ParserResult -> Bool
$c> :: ParserResult -> ParserResult -> Bool
<= :: ParserResult -> ParserResult -> Bool
$c<= :: ParserResult -> ParserResult -> Bool
< :: ParserResult -> ParserResult -> Bool
$c< :: ParserResult -> ParserResult -> Bool
compare :: ParserResult -> ParserResult -> Ordering
$ccompare :: ParserResult -> ParserResult -> Ordering
Ord, DOMID -> ParserResult -> ShowS
[ParserResult] -> ShowS
ParserResult -> String
forall a.
(DOMID -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ParserResult] -> ShowS
$cshowList :: [ParserResult] -> ShowS
show :: ParserResult -> String
$cshow :: ParserResult -> String
showsPrec :: DOMID -> ParserResult -> ShowS
$cshowsPrec :: DOMID -> ParserResult -> ShowS
Show)

-- | Defines an item in the list of active formatting elements.
data ParserFormatItem
  = ParserFormatElement DOMID Token
  | ParserFormatMarker
    deriving (ParserFormatItem -> ParserFormatItem -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ParserFormatItem -> ParserFormatItem -> Bool
$c/= :: ParserFormatItem -> ParserFormatItem -> Bool
== :: ParserFormatItem -> ParserFormatItem -> Bool
$c== :: ParserFormatItem -> ParserFormatItem -> Bool
Eq, Eq ParserFormatItem
ParserFormatItem -> ParserFormatItem -> Bool
ParserFormatItem -> ParserFormatItem -> Ordering
ParserFormatItem -> ParserFormatItem -> ParserFormatItem
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: ParserFormatItem -> ParserFormatItem -> ParserFormatItem
$cmin :: ParserFormatItem -> ParserFormatItem -> ParserFormatItem
max :: ParserFormatItem -> ParserFormatItem -> ParserFormatItem
$cmax :: ParserFormatItem -> ParserFormatItem -> ParserFormatItem
>= :: ParserFormatItem -> ParserFormatItem -> Bool
$c>= :: ParserFormatItem -> ParserFormatItem -> Bool
> :: ParserFormatItem -> ParserFormatItem -> Bool
$c> :: ParserFormatItem -> ParserFormatItem -> Bool
<= :: ParserFormatItem -> ParserFormatItem -> Bool
$c<= :: ParserFormatItem -> ParserFormatItem -> Bool
< :: ParserFormatItem -> ParserFormatItem -> Bool
$c< :: ParserFormatItem -> ParserFormatItem -> Bool
compare :: ParserFormatItem -> ParserFormatItem -> Ordering
$ccompare :: ParserFormatItem -> ParserFormatItem -> Ordering
Ord, DOMID -> ParserFormatItem -> ShowS
[ParserFormatItem] -> ShowS
ParserFormatItem -> String
forall a.
(DOMID -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ParserFormatItem] -> ShowS
$cshowList :: [ParserFormatItem] -> ShowS
show :: ParserFormatItem -> String
$cshow :: ParserFormatItem -> String
showsPrec :: DOMID -> ParserFormatItem -> ShowS
$cshowsPrec :: DOMID -> ParserFormatItem -> ShowS
Show)

-- | Defines element categories.
data ParserElementCategory
  = ElementCategorySpecial
  | ElementCategoryFormatting
  | ElementCategoryOrdinary
    deriving (ParserElementCategory -> ParserElementCategory -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ParserElementCategory -> ParserElementCategory -> Bool
$c/= :: ParserElementCategory -> ParserElementCategory -> Bool
== :: ParserElementCategory -> ParserElementCategory -> Bool
$c== :: ParserElementCategory -> ParserElementCategory -> Bool
Eq, Eq ParserElementCategory
ParserElementCategory -> ParserElementCategory -> Bool
ParserElementCategory -> ParserElementCategory -> Ordering
ParserElementCategory
-> ParserElementCategory -> ParserElementCategory
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: ParserElementCategory
-> ParserElementCategory -> ParserElementCategory
$cmin :: ParserElementCategory
-> ParserElementCategory -> ParserElementCategory
max :: ParserElementCategory
-> ParserElementCategory -> ParserElementCategory
$cmax :: ParserElementCategory
-> ParserElementCategory -> ParserElementCategory
>= :: ParserElementCategory -> ParserElementCategory -> Bool
$c>= :: ParserElementCategory -> ParserElementCategory -> Bool
> :: ParserElementCategory -> ParserElementCategory -> Bool
$c> :: ParserElementCategory -> ParserElementCategory -> Bool
<= :: ParserElementCategory -> ParserElementCategory -> Bool
$c<= :: ParserElementCategory -> ParserElementCategory -> Bool
< :: ParserElementCategory -> ParserElementCategory -> Bool
$c< :: ParserElementCategory -> ParserElementCategory -> Bool
compare :: ParserElementCategory -> ParserElementCategory -> Ordering
$ccompare :: ParserElementCategory -> ParserElementCategory -> Ordering
Ord, DOMID -> ParserElementCategory -> ShowS
[ParserElementCategory] -> ShowS
ParserElementCategory -> String
forall a.
(DOMID -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ParserElementCategory] -> ShowS
$cshowList :: [ParserElementCategory] -> ShowS
show :: ParserElementCategory -> String
$cshow :: ParserElementCategory -> String
showsPrec :: DOMID -> ParserElementCategory -> ShowS
$cshowsPrec :: DOMID -> ParserElementCategory -> ShowS
Show)

-- | Defines detailed information for stack elements.
data ElementDetails = ElementDetails
  { ElementDetails -> DOMID
elementDetailsIndex :: Int
  , ElementDetails -> DOMID
elementDetailsID    :: DOMID
  , ElementDetails -> DOMNode
elementDetailsNode  :: DOMNode
  , ElementDetails -> DOMType
elementDetailsType  :: DOMType
  } deriving (ElementDetails -> ElementDetails -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ElementDetails -> ElementDetails -> Bool
$c/= :: ElementDetails -> ElementDetails -> Bool
== :: ElementDetails -> ElementDetails -> Bool
$c== :: ElementDetails -> ElementDetails -> Bool
Eq, Eq ElementDetails
ElementDetails -> ElementDetails -> Bool
ElementDetails -> ElementDetails -> Ordering
ElementDetails -> ElementDetails -> ElementDetails
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: ElementDetails -> ElementDetails -> ElementDetails
$cmin :: ElementDetails -> ElementDetails -> ElementDetails
max :: ElementDetails -> ElementDetails -> ElementDetails
$cmax :: ElementDetails -> ElementDetails -> ElementDetails
>= :: ElementDetails -> ElementDetails -> Bool
$c>= :: ElementDetails -> ElementDetails -> Bool
> :: ElementDetails -> ElementDetails -> Bool
$c> :: ElementDetails -> ElementDetails -> Bool
<= :: ElementDetails -> ElementDetails -> Bool
$c<= :: ElementDetails -> ElementDetails -> Bool
< :: ElementDetails -> ElementDetails -> Bool
$c< :: ElementDetails -> ElementDetails -> Bool
compare :: ElementDetails -> ElementDetails -> Ordering
$ccompare :: ElementDetails -> ElementDetails -> Ordering
Ord, DOMID -> ElementDetails -> ShowS
[ElementDetails] -> ShowS
ElementDetails -> String
forall a.
(DOMID -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ElementDetails] -> ShowS
$cshowList :: [ElementDetails] -> ShowS
show :: ElementDetails -> String
$cshow :: ElementDetails -> String
showsPrec :: DOMID -> ElementDetails -> ShowS
$cshowsPrec :: DOMID -> ElementDetails -> ShowS
Show)

-- | Default instance for parser options.
instance Default ParserOptions where
  def :: ParserOptions
def = ParserOptions
    { parserOptionInput :: BS
parserOptionInput          = BS
bsEmpty
    , parserOptionLogErrors :: Bool
parserOptionLogErrors      = Bool
False
    , parserOptionIgnoreEntities :: Bool
parserOptionIgnoreEntities = Bool
False
    }

-- | Default instance for parser results.
instance Default ParserResult where
  def :: ParserResult
def = ParserResult
    { parserResultDOM :: DOM
parserResultDOM    = forall a. Default a => a
def
    , parserResultErrors :: [BS]
parserResultErrors = []
    }

-- | Parses an HTML document.
parseDocument :: ParserOptions -> Either BS ParserResult
parseDocument :: ParserOptions -> Either BS ParserResult
parseDocument ParserOptions
x =
  forall a. (forall s. ST s a) -> a
runST forall a b. (a -> b) -> a -> b
$ do
    forall s. ParserOptions -> ST s (Either BS (Parser s))
parserNew ParserOptions
x forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
      Right Parser s
p -> forall a b. b -> Either a b
Right forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s. Parser s -> ST s ParserResult
parserRun Parser s
p
      Left BS
e -> forall a b. a -> Either a b
Left forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (f :: * -> *) a. Applicative f => a -> f a
pure BS
e

-- | Parses an HTML fragment.
parseFragment :: ParserOptions -> Either BS ParserResult
parseFragment :: ParserOptions -> Either BS ParserResult
parseFragment ParserOptions
x = forall a b. a -> Either a b
Left BS
"fragment support not yet implemented"

-- | Makes a new lexer.
parserNew :: ParserOptions -> ST s (Either BS (Parser s))
parserNew :: forall s. ParserOptions -> ST s (Either BS (Parser s))
parserNew o :: ParserOptions
o@ParserOptions{Bool
BS
parserOptionIgnoreEntities :: Bool
parserOptionLogErrors :: Bool
parserOptionInput :: BS
parserOptionIgnoreEntities :: ParserOptions -> Bool
parserOptionLogErrors :: ParserOptions -> Bool
parserOptionInput :: ParserOptions -> BS
..} = do
  Either BS (Lexer s)
a <- forall s. LexerOptions -> ST s (Either BS (Lexer s))
lexerNew forall a. Default a => a
def
    { lexerOptionInput :: BS
lexerOptionInput          = BS
parserOptionInput
    , lexerOptionLogErrors :: Bool
lexerOptionLogErrors      = Bool
parserOptionLogErrors
    , lexerOptionIgnoreEntities :: Bool
lexerOptionIgnoreEntities = Bool
parserOptionIgnoreEntities
    }
  case Either BS (Lexer s)
a of
    Right Lexer s
lex -> forall a b. b -> Either a b
Right forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s. ParserOptions -> Lexer s -> ST s (Parser s)
parserMake ParserOptions
o Lexer s
lex
    Left BS
err  -> forall a b. a -> Either a b
Left forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (f :: * -> *) a. Applicative f => a -> f a
pure BS
err

-- | Makes a new lexer.
parserMake :: ParserOptions -> Lexer s -> ST s (Parser s)
parserMake :: forall s. ParserOptions -> Lexer s -> ST s (Parser s)
parserMake ParserOptions{Bool
BS
parserOptionIgnoreEntities :: Bool
parserOptionLogErrors :: Bool
parserOptionInput :: BS
parserOptionIgnoreEntities :: ParserOptions -> Bool
parserOptionLogErrors :: ParserOptions -> Bool
parserOptionInput :: ParserOptions -> BS
..} Lexer s
lexer = do
  STRef s (Lexer s)
lexerRef <- forall a s. a -> ST s (STRef s a)
newSTRef Lexer s
lexer
  STRef s DOM
dom      <- forall a s. a -> ST s (STRef s a)
newSTRef forall a. Default a => a
def
  STRef s [DOMID]
stack    <- forall a s. a -> ST s (STRef s a)
newSTRef []
  STRef s [ParserFormatItem]
fmtList  <- forall a s. a -> ST s (STRef s a)
newSTRef []
  STRef s ParserMode
insMode  <- forall a s. a -> ST s (STRef s a)
newSTRef ParserMode
ModeInitial
  STRef s ParserMode
orgMode  <- forall a s. a -> ST s (STRef s a)
newSTRef ParserMode
ModeInitial
  STRef s [ParserMode]
tmpMode  <- forall a s. a -> ST s (STRef s a)
newSTRef []
  STRef s (Maybe DOMID)
ctxElem  <- forall a s. a -> ST s (STRef s a)
newSTRef forall a. Maybe a
Nothing
  STRef s (Maybe DOMID)
headElem <- forall a s. a -> ST s (STRef s a)
newSTRef forall a. Maybe a
Nothing
  STRef s (Maybe DOMID)
formElem <- forall a s. a -> ST s (STRef s a)
newSTRef forall a. Maybe a
Nothing
  STRef s Bool
closing  <- forall a s. a -> ST s (STRef s a)
newSTRef Bool
False
  STRef s Bool
fragMode <- forall a s. a -> ST s (STRef s a)
newSTRef Bool
False
  STRef s Bool
foster   <- forall a s. a -> ST s (STRef s a)
newSTRef Bool
False
  STRef s Bool
frameSet <- forall a s. a -> ST s (STRef s a)
newSTRef Bool
True
  STRef s Bool
done     <- forall a s. a -> ST s (STRef s a)
newSTRef Bool
False
  STRef s [Token]
table    <- forall a s. a -> ST s (STRef s a)
newSTRef []
  ParserAdoptionAgency s
aa       <- forall s. ST s (ParserAdoptionAgency s)
defaultAA
  STRef s (ParserAdoptionAgency s)
aaRef    <- forall a s. a -> ST s (STRef s a)
newSTRef ParserAdoptionAgency s
aa
  STRef s (DList BS)
warn     <- forall a s. a -> ST s (STRef s a)
newSTRef forall a. Default a => a
def
  STRef s Bool
iframe   <- forall a s. a -> ST s (STRef s a)
newSTRef Bool
False
  STRef s (IntMap (STRef s (Buffer s)))
textMap  <- forall a s. a -> ST s (STRef s a)
newSTRef forall a. Default a => a
def
  forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ Parser
    { parserLexer :: STRef s (Lexer s)
parserLexer             = STRef s (Lexer s)
lexerRef
    , parserDOM :: STRef s DOM
parserDOM               = STRef s DOM
dom
    , parserElementStack :: STRef s [DOMID]
parserElementStack      = STRef s [DOMID]
stack
    , parserActiveFormatList :: STRef s [ParserFormatItem]
parserActiveFormatList  = STRef s [ParserFormatItem]
fmtList
    , parserInsertionMode :: STRef s ParserMode
parserInsertionMode     = STRef s ParserMode
insMode
    , parserOriginalMode :: STRef s ParserMode
parserOriginalMode      = STRef s ParserMode
orgMode
    , parserTemplateMode :: STRef s [ParserMode]
parserTemplateMode      = STRef s [ParserMode]
tmpMode
    , parserContextElement :: STRef s (Maybe DOMID)
parserContextElement    = STRef s (Maybe DOMID)
ctxElem
    , parserHeadElement :: STRef s (Maybe DOMID)
parserHeadElement       = STRef s (Maybe DOMID)
headElem
    , parserFormElement :: STRef s (Maybe DOMID)
parserFormElement       = STRef s (Maybe DOMID)
formElem
    , parserSelfClosingFlag :: STRef s Bool
parserSelfClosingFlag   = STRef s Bool
closing
    , parserFragmentMode :: STRef s Bool
parserFragmentMode      = STRef s Bool
fragMode
    , parserFosterParenting :: STRef s Bool
parserFosterParenting   = STRef s Bool
foster
    , parserFrameSetOK :: STRef s Bool
parserFrameSetOK        = STRef s Bool
frameSet
    , parserDone :: STRef s Bool
parserDone              = STRef s Bool
done
    , parserTableChars :: STRef s [Token]
parserTableChars        = STRef s [Token]
table
    , parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserAdoptionAgency    = STRef s (ParserAdoptionAgency s)
aaRef
    , parserErrors :: STRef s (DList BS)
parserErrors            = STRef s (DList BS)
warn
    , parserIFrameSrcDoc :: STRef s Bool
parserIFrameSrcDoc      = STRef s Bool
iframe
    , parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserTextMap           = STRef s (IntMap (STRef s (Buffer s)))
textMap
    , parserLogErrors :: Bool
parserLogErrors         = Bool
parserOptionLogErrors
    }

-- | The parser main loop.
parserRun :: Parser s -> ST s ParserResult
parserRun :: forall s. Parser s -> ST s ParserResult
parserRun p :: Parser s
p@Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} = do
  forall s a. STRef s a -> ST s a
rref STRef s Bool
parserDone forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
    Bool
True -> do
      Lexer{Bool
STRef s DOMID
STRef s [Word8]
STRef s (DList BS)
STRef s (Buffer s)
STRef s (TokenBuffer s)
STRef s LexerState
STRef s LexerSkip
BS
lexerCode :: forall s. Lexer s -> STRef s DOMID
lexerErrors :: forall s. Lexer s -> STRef s (DList BS)
lexerSkip :: forall s. Lexer s -> STRef s LexerSkip
lexerReturn :: forall s. Lexer s -> STRef s LexerState
lexerState :: forall s. Lexer s -> STRef s LexerState
lexerLast :: forall s. Lexer s -> STRef s [Word8]
lexerBuffer :: forall s. Lexer s -> STRef s (Buffer s)
lexerToken :: forall s. Lexer s -> STRef s (TokenBuffer s)
lexerOffset :: forall s. Lexer s -> STRef s DOMID
lexerLog :: forall s. Lexer s -> Bool
lexerIgnore :: forall s. Lexer s -> Bool
lexerData :: forall s. Lexer s -> BS
lexerCode :: STRef s DOMID
lexerErrors :: STRef s (DList BS)
lexerSkip :: STRef s LexerSkip
lexerReturn :: STRef s LexerState
lexerState :: STRef s LexerState
lexerLast :: STRef s [Word8]
lexerBuffer :: STRef s (Buffer s)
lexerToken :: STRef s (TokenBuffer s)
lexerOffset :: STRef s DOMID
lexerLog :: Bool
lexerIgnore :: Bool
lexerData :: BS
..} <- forall s a. STRef s a -> ST s a
rref STRef s (Lexer s)
parserLexer
      DList BS
e <- forall a. DList a -> DList a -> DList a
D.append forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s a. STRef s a -> ST s a
rref STRef s (DList BS)
lexerErrors forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall s a. STRef s a -> ST s a
rref STRef s (DList BS)
parserErrors
      DOM
d <- forall s. Parser s -> ST s DOM
textMapDOM Parser s
p
      forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ DOM -> [BS] -> ParserResult
ParserResult DOM
d forall a b. (a -> b) -> a -> b
$ forall a. DList a -> [a]
D.toList DList BS
e
    Bool
False -> do
      Token
t <- forall s a. STRef s a -> ST s a
rref STRef s (Lexer s)
parserLexer forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall s. Lexer s -> ST s Token
lexerNext
      forall s. Parser s -> Token -> ST s ()
selfClosingInit Parser s
p Token
t
      forall s. Parser s -> Token -> ST s ()
dispatchTreeConstruction Parser s
p Token
t
      forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
whenM (forall s. Parser s -> ST s Bool
selfClosingFlag Parser s
p) forall a b. (a -> b) -> a -> b
$
        forall s. Parser s -> Maybe Token -> BS -> ST s ()
parseError Parser s
p (forall a. a -> Maybe a
Just Token
t) BS
"self closing not acknowledged for token"
      forall s. Parser s -> ST s ParserResult
parserRun Parser s
p

-- | Handles tree construction dispatch.
dispatchTreeConstruction :: Parser s -> Token -> ST s ()
dispatchTreeConstruction :: forall s. Parser s -> Token -> ST s ()
dispatchTreeConstruction p :: Parser s
p@Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} Token
t = do
  Bool
e <- forall s. Parser s -> ST s Bool
elementStackEmpty Parser s
p
  Maybe DOMNode
a <- forall s. Parser s -> ST s (Maybe DOMNode)
adjustedCurrentNode Parser s
p
  Bool
b <- forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ case Maybe DOMNode
a of
    Just DOMNode
n -> DOMNode -> Bool
domNodeIsHTML DOMNode
n
      Bool -> Bool -> Bool
|| DOMNode -> Bool
isMathMLIntegrationPoint DOMNode
n
         Bool -> Bool -> Bool
&& Token -> [BS] -> Bool
isTokenStartNotNamed Token
t [BS
"mglyph", BS
"malignmark"]
      Bool -> Bool -> Bool
|| DOMNode -> Bool
isMathMLIntegrationPoint DOMNode
n Bool -> Bool -> Bool
&& Token -> Bool
tokenIsChar Token
t
      Bool -> Bool -> Bool
|| DOMNode -> BS -> Bool
isMathMLElementNamed DOMNode
n BS
"annotation-xml"
         Bool -> Bool -> Bool
&& Token -> [BS] -> Bool
isTokenStartNamed Token
t [BS
"svg"]
      Bool -> Bool -> Bool
|| DOMNode -> Bool
isHtmlIntgrationPoint DOMNode
n Bool -> Bool -> Bool
&& Token -> Bool
tokenIsStart Token
t
      Bool -> Bool -> Bool
|| DOMNode -> Bool
isHtmlIntgrationPoint DOMNode
n Bool -> Bool -> Bool
&& Token -> Bool
tokenIsChar Token
t
    Maybe DOMNode
Nothing -> Bool
False
  if Bool
e Bool -> Bool -> Bool
|| Bool
b Bool -> Bool -> Bool
|| Token -> Bool
tokenIsEOF Token
t
     then forall s. Parser s -> Token -> ST s ()
doHtmlContent Parser s
p Token
t
     else forall s. Parser s -> Token -> ST s ()
doForeignContent Parser s
p Token
t
  where
    tokenIsChar :: Token -> Bool
tokenIsChar TChar {} = Bool
True
    tokenIsChar Token
_ = Bool
False
    tokenIsStart :: Token -> Bool
tokenIsStart TStart {} = Bool
True
    tokenIsStart Token
_ = Bool
False
    tokenIsEOF :: Token -> Bool
tokenIsEOF Token
TEOF = Bool
True
    tokenIsEOF Token
_ = Bool
False

-- | Processes a token as HTML content.
doHtmlContent :: Parser s -> Token -> ST s ()
doHtmlContent :: forall s. Parser s -> Token -> ST s ()
doHtmlContent p :: Parser s
p@Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} Token
t = do
  ParserMode
m <- forall s a. STRef s a -> ST s a
rref STRef s ParserMode
parserInsertionMode
  forall s. ParserMode -> Parser s -> Token -> ST s ()
parserInserter ParserMode
m Parser s
p Token
t

-- | Reprocesses a token.
reprocess :: Parser s -> Token -> ST s ()
reprocess :: forall s. Parser s -> Token -> ST s ()
reprocess = forall s. Parser s -> Token -> ST s ()
doHtmlContent

-- | Gets the inserter for a parser mode.
parserInserter :: ParserMode -> Parser s -> Token -> ST s ()
parserInserter :: forall s. ParserMode -> Parser s -> Token -> ST s ()
parserInserter = \case
  ParserMode
ModeInitial            -> forall s. Parser s -> Token -> ST s ()
doModeInitial
  ParserMode
ModeBeforeHtml         -> forall s. Parser s -> Token -> ST s ()
doModeBeforeHtml
  ParserMode
ModeBeforeHead         -> forall s. Parser s -> Token -> ST s ()
doModeBeforeHead
  ParserMode
ModeInHead             -> forall s. Parser s -> Token -> ST s ()
doModeInHead
  ParserMode
ModeInHeadNoscript     -> forall s. Parser s -> Token -> ST s ()
doModeInHeadNoscript
  ParserMode
ModeAfterHead          -> forall s. Parser s -> Token -> ST s ()
doModeAfterHead
  ParserMode
ModeInBody             -> forall s. Parser s -> Token -> ST s ()
doModeInBody
  ParserMode
ModeText               -> forall s. Parser s -> Token -> ST s ()
doModeText
  ParserMode
ModeInTable            -> forall s. Parser s -> Token -> ST s ()
doModeInTable
  ParserMode
ModeInTableText        -> forall s. Parser s -> Token -> ST s ()
doModeInTableText
  ParserMode
ModeInCaption          -> forall s. Parser s -> Token -> ST s ()
doModeInCaption
  ParserMode
ModeInColumnGroup      -> forall s. Parser s -> Token -> ST s ()
doModeInColumnGroup
  ParserMode
ModeInTableBody        -> forall s. Parser s -> Token -> ST s ()
doModeInTableBody
  ParserMode
ModeInRow              -> forall s. Parser s -> Token -> ST s ()
doModeInRow
  ParserMode
ModeInCell             -> forall s. Parser s -> Token -> ST s ()
doModeInCell
  ParserMode
ModeInSelect           -> forall s. Parser s -> Token -> ST s ()
doModeInSelect
  ParserMode
ModeInSelectInTable    -> forall s. Parser s -> Token -> ST s ()
doModeInSelectInTable
  ParserMode
ModeInTemplate         -> forall s. Parser s -> Token -> ST s ()
doModeInTemplate
  ParserMode
ModeAfterBody          -> forall s. Parser s -> Token -> ST s ()
doModeAfterBody
  ParserMode
ModeInFrameset         -> forall s. Parser s -> Token -> ST s ()
doModeInFrameset
  ParserMode
ModeAfterFrameset      -> forall s. Parser s -> Token -> ST s ()
doModeAfterFrameset
  ParserMode
ModeAfterAfterBody     -> forall s. Parser s -> Token -> ST s ()
doModeAfterAfterBody
  ParserMode
ModeAfterAfterFrameset -> forall s. Parser s -> Token -> ST s ()
doModeAfterAfterFrameset

-- | Handles parse errors.
parseError :: Parser s -> Maybe Token -> BS -> ST s ()
parseError :: forall s. Parser s -> Maybe Token -> BS -> ST s ()
parseError p :: Parser s
p@Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} Maybe Token
t BS
s =
  forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when Bool
parserLogErrors forall a b. (a -> b) -> a -> b
$
    forall s a. STRef s a -> (a -> a) -> ST s ()
uref STRef s (DList BS)
parserErrors forall a b. (a -> b) -> a -> b
$ forall a b c. (a -> b -> c) -> b -> a -> c
flip forall a. DList a -> a -> DList a
D.snoc BS
e
  where
    e :: BS
e = BS
s forall a. Semigroup a => a -> a -> a
<> case Maybe Token
t of
      Just (TDoctype {Bool
Maybe BS
BS
tDoctypeSystem :: Token -> Maybe BS
tDoctypePublic :: Token -> Maybe BS
tDoctypeQuirks :: Token -> Bool
tDoctypeName :: Token -> BS
tDoctypeSystem :: Maybe BS
tDoctypePublic :: Maybe BS
tDoctypeQuirks :: Bool
tDoctypeName :: BS
..}) -> BS
",doctype"
      Just (TStart {Bool
[TAttr]
BS
tStartAttr :: Token -> [TAttr]
tStartClosed :: Token -> Bool
tStartName :: Token -> BS
tStartAttr :: [TAttr]
tStartClosed :: Bool
tStartName :: BS
..})   -> BS
",tag-start," forall a. Semigroup a => a -> a -> a
<> BS
tStartName
      Just (TEnd {BS
tEndName :: Token -> BS
tEndName :: BS
..})     -> BS
",tag-end," forall a. Semigroup a => a -> a -> a
<> BS
tEndName
      Just (TComment {BS
tCommentData :: Token -> BS
tCommentData :: BS
..}) -> BS
",comment"
      Just (TChar {Word8
tCharData :: Token -> Word8
tCharData :: Word8
..})    -> BS
",chr," forall a. Semigroup a => a -> a -> a
<> Word8 -> BS
bsOnly Word8
tCharData
      Just Token
TEOF           -> BS
",eof"
      Maybe Token
Nothing             -> BS
bsEmpty

-- | Detmermines if a token is a start token with a specified name.
isTokenStartNamed :: Token -> [BS] -> Bool
isTokenStartNamed :: Token -> [BS] -> Bool
isTokenStartNamed TStart {Bool
[TAttr]
BS
tStartAttr :: [TAttr]
tStartClosed :: Bool
tStartName :: BS
tStartAttr :: Token -> [TAttr]
tStartClosed :: Token -> Bool
tStartName :: Token -> BS
..} [BS]
names = BS
tStartName forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [BS]
names
isTokenStartNamed Token
_ [BS]
_ = Bool
False

-- | Detmermines if a token is a start token without a specified name.
isTokenStartNotNamed :: Token -> [BS] -> Bool
isTokenStartNotNamed :: Token -> [BS] -> Bool
isTokenStartNotNamed TStart {Bool
[TAttr]
BS
tStartAttr :: [TAttr]
tStartClosed :: Bool
tStartName :: BS
tStartAttr :: Token -> [TAttr]
tStartClosed :: Token -> Bool
tStartName :: Token -> BS
..} [BS]
names = Bool -> Bool
not forall a b. (a -> b) -> a -> b
$ BS
tStartName forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [BS]
names
isTokenStartNotNamed Token
_ [BS]
_ = Bool
False

-- | Detmermines if a token is an end token with a specified name.
isTokenEndNamed :: Token -> [BS] -> Bool
isTokenEndNamed :: Token -> [BS] -> Bool
isTokenEndNamed TEnd {BS
tEndName :: BS
tEndName :: Token -> BS
..} [BS]
names = BS
tEndName forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [BS]
names
isTokenEndNamed Token
_ [BS]
_ = Bool
False

-- | Detmermines if a token is an end token without a specified name.
isTokenEndNotNamed :: Token -> [BS] -> Bool
isTokenEndNotNamed :: Token -> [BS] -> Bool
isTokenEndNotNamed TEnd {BS
tEndName :: BS
tEndName :: Token -> BS
..} [BS]
names = Bool -> Bool
not forall a b. (a -> b) -> a -> b
$ BS
tEndName forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [BS]
names
isTokenEndNotNamed Token
_ [BS]
_ = Bool
False

-- | Determines if a node name matches a name.
elementName :: BS -> DOMNode -> Bool
elementName :: BS -> DOMNode -> Bool
elementName BS
x DOMNode
y = DOMNode -> BS
domNodeElementName DOMNode
y forall a. Eq a => a -> a -> Bool
== BS
x

-- | Determines if a node name does not match a name.
elementNameNot :: BS -> DOMNode -> Bool
elementNameNot :: BS -> DOMNode -> Bool
elementNameNot BS
x = Bool -> Bool
not forall b c a. (b -> c) -> (a -> b) -> a -> c
. BS -> DOMNode -> Bool
elementName BS
x

-- | Determines if a node name is in a set of names.
elementNameIn :: [BS] -> DOMNode -> Bool
elementNameIn :: [BS] -> DOMNode -> Bool
elementNameIn [BS]
x DOMNode
y = DOMNode -> BS
domNodeElementName DOMNode
y forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [BS]
x

-- | Determines if a node name is not in a set of names.
elementNameNotIn :: [BS] -> DOMNode -> Bool
elementNameNotIn :: [BS] -> DOMNode -> Bool
elementNameNotIn [BS]
x = Bool -> Bool
not forall b c a. (b -> c) -> (a -> b) -> a -> c
. [BS] -> DOMNode -> Bool
elementNameIn [BS]
x

-- | Gets the current element stack.
elementStack :: Parser s -> ST s [DOMID]
elementStack :: forall s. Parser s -> ST s [DOMID]
elementStack Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} = forall s a. STRef s a -> ST s a
readSTRef STRef s [DOMID]
parserElementStack

-- | Detmermines if the element stack is empty.
elementStackEmpty :: Parser s -> ST s Bool
elementStackEmpty :: forall s. Parser s -> ST s Bool
elementStackEmpty p :: Parser s
p@Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} = forall (t :: * -> *) a. Foldable t => t a -> Bool
null forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s. Parser s -> ST s [DOMID]
elementStack Parser s
p

-- | Returns the size of the element stack.
elementStackSize :: Parser s -> ST s Int
elementStackSize :: forall s. Parser s -> ST s DOMID
elementStackSize p :: Parser s
p@Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} = forall (t :: * -> *) a. Foldable t => t a -> DOMID
length forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s. Parser s -> ST s [DOMID]
elementStack Parser s
p

-- | Modifies the element stack by applying a function.
elementStackModify :: Parser s -> ([DOMID] -> [DOMID]) -> ST s ()
elementStackModify :: forall s. Parser s -> ([DOMID] -> [DOMID]) -> ST s ()
elementStackModify p :: Parser s
p@Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} [DOMID] -> [DOMID]
f = forall s a. STRef s a -> (a -> a) -> ST s ()
uref STRef s [DOMID]
parserElementStack [DOMID] -> [DOMID]
f

-- | Pushes an element on the element stack.
elementStackPush :: Parser s -> DOMID -> ST s ()
elementStackPush :: forall s. Parser s -> DOMID -> ST s ()
elementStackPush p :: Parser s
p@Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} DOMID
x = forall s. Parser s -> ([DOMID] -> [DOMID]) -> ST s ()
elementStackModify Parser s
p forall a b. (a -> b) -> a -> b
$ (DOMID
xforall a. a -> [a] -> [a]
:)

-- | Pops an element off of the element stack.
elementStackPop :: Parser s -> ST s ()
elementStackPop :: forall s. Parser s -> ST s ()
elementStackPop p :: Parser s
p@Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} = forall s. Parser s -> ([DOMID] -> [DOMID]) -> ST s ()
elementStackModify Parser s
p forall a b. (a -> b) -> a -> b
$ forall a. DOMID -> [a] -> [a]
drop DOMID
1

-- | Pops nodes from the element stack while a predicate is true.
elementStackPopWhile :: Parser s -> (DOMNode -> Bool) -> ST s ()
elementStackPopWhile :: forall s. Parser s -> (DOMNode -> Bool) -> ST s ()
elementStackPopWhile p :: Parser s
p@Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} DOMNode -> Bool
f =
  forall s. Parser s -> ST s (Maybe DOMNode)
currentNode Parser s
p forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
    Just DOMNode
a | DOMNode -> Bool
f DOMNode
a -> forall s. Parser s -> ST s ()
elementStackPop Parser s
p forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> forall s. Parser s -> (DOMNode -> Bool) -> ST s ()
elementStackPopWhile Parser s
p DOMNode -> Bool
f
    Maybe DOMNode
_ -> forall (f :: * -> *) a. Applicative f => a -> f a
pure ()

-- | Pops a nodes from the element stack if a predicate is true.
elementStackPopIf :: Parser s -> (DOMNode -> Bool) -> ST s ()
elementStackPopIf :: forall s. Parser s -> (DOMNode -> Bool) -> ST s ()
elementStackPopIf p :: Parser s
p@Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} DOMNode -> Bool
f =
  forall s. Parser s -> ST s (Maybe DOMNode)
currentNode Parser s
p forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
    Just DOMNode
a | DOMNode -> Bool
f DOMNode
a -> forall s. Parser s -> ST s ()
elementStackPop Parser s
p
    Maybe DOMNode
_ -> forall (f :: * -> *) a. Applicative f => a -> f a
pure ()

-- | Pops elements from the stack until a specified element has been popped.
elementStackPopUntil :: Parser s -> (DOMType -> Bool) -> ST s ()
elementStackPopUntil :: forall s. Parser s -> (DOMType -> Bool) -> ST s ()
elementStackPopUntil p :: Parser s
p@Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} DOMType -> Bool
f = do
  forall s. Parser s -> (DOMNode -> Bool) -> ST s ()
elementStackPopWhile Parser s
p (Bool -> Bool
not forall b c a. (b -> c) -> (a -> b) -> a -> c
. DOMNode -> Bool
g)
  forall s. Parser s -> (DOMNode -> Bool) -> ST s ()
elementStackPopIf Parser s
p DOMNode -> Bool
g
  where
    g :: DOMNode -> Bool
g = DOMType -> Bool
f forall b c a. (b -> c) -> (a -> b) -> a -> c
. DOMNode -> DOMType
domNodeType

-- | Pops elements from the stack until a specified ID has been popped.
elementStackPopUntilID :: Parser s -> DOMID -> ST s ()
elementStackPopUntilID :: forall s. Parser s -> DOMID -> ST s ()
elementStackPopUntilID Parser s
p DOMID
x = forall s. Parser s -> ([DOMID] -> [DOMID]) -> ST s ()
elementStackModify Parser s
p forall a b. (a -> b) -> a -> b
$ forall a. DOMID -> [a] -> [a]
drop DOMID
1 forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. (a -> Bool) -> [a] -> [a]
dropWhile (forall a. Eq a => a -> a -> Bool
/=DOMID
x)

-- | Pops elements from the stack until a specified element has been popped.
elementStackPopUntilType :: Parser s -> DOMType -> ST s ()
elementStackPopUntilType :: forall s. Parser s -> DOMType -> ST s ()
elementStackPopUntilType Parser s
p DOMType
x = forall s. Parser s -> (DOMType -> Bool) -> ST s ()
elementStackPopUntil Parser s
p (forall a. Eq a => a -> a -> Bool
==DOMType
x)

-- | Pops elements from the stack until a specified element has been popped.
elementStackPopUntilTypeIn :: Parser s -> [DOMType] -> ST s ()
elementStackPopUntilTypeIn :: forall s. Parser s -> [DOMType] -> ST s ()
elementStackPopUntilTypeIn Parser s
p [DOMType]
x = forall s. Parser s -> (DOMType -> Bool) -> ST s ()
elementStackPopUntil Parser s
p forall a b. (a -> b) -> a -> b
$ forall a b c. (a -> b -> c) -> b -> a -> c
flip forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem [DOMType]
x

-- | Gets the current element stack as a list of nodes.
elementStackNodes :: Parser s -> ST s [DOMNode]
elementStackNodes :: forall s. Parser s -> ST s [DOMNode]
elementStackNodes Parser s
p = DOM -> [DOMID] -> [DOMNode]
domMapID forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s. Parser s -> ST s DOM
getDOM Parser s
p forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall s. Parser s -> ST s [DOMID]
elementStack Parser s
p

-- | Gets the current element stack as a list of types.
elementStackTypes :: Parser s -> ST s [DOMType]
elementStackTypes :: forall s. Parser s -> ST s [DOMType]
elementStackTypes Parser s
p = forall a b. (a -> b) -> [a] -> [b]
map DOMNode -> DOMType
domNodeType forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s. Parser s -> ST s [DOMNode]
elementStackNodes Parser s
p

-- | Applies a predicate to the element stack and returns whether
-- any element in the stack results in a true predicate.
elementStackAny :: Parser s -> (DOMNode -> Bool) -> ST s Bool
elementStackAny :: forall s. Parser s -> (DOMNode -> Bool) -> ST s Bool
elementStackAny Parser s
p DOMNode -> Bool
f = forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any DOMNode -> Bool
f forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s. Parser s -> ST s [DOMNode]
elementStackNodes Parser s
p

-- | Applies a predicate to the element stack and returns whether
-- all elements in the stack result in a true predicate.
elementStackAll :: Parser s -> (DOMNode -> Bool) -> ST s Bool
elementStackAll :: forall s. Parser s -> (DOMNode -> Bool) -> ST s Bool
elementStackAll Parser s
p DOMNode -> Bool
f = forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all DOMNode -> Bool
f forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s. Parser s -> ST s [DOMNode]
elementStackNodes Parser s
p

-- | Determines if the second element on the stack is a body element.
elementStackHasBody :: Parser s -> ST s Bool
elementStackHasBody :: forall s. Parser s -> ST s Bool
elementStackHasBody Parser s
p =
  forall (f :: * -> *) a b. Applicative f => (a -> b) -> f a -> f b
liftA forall a. [a] -> [a]
reverse (forall s. Parser s -> ST s [DOMType]
elementStackTypes Parser s
p) forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall (f :: * -> *) a. Applicative f => a -> f a
pure forall b c a. (b -> c) -> (a -> b) -> a -> c
. \case
    (DOMType
_:DOMType
x:[DOMType]
_)    -> DOMType
x forall a. Eq a => a -> a -> Bool
== BS -> DOMType
domMakeTypeHTML BS
"body"
    [DOMType]
_otherwise -> Bool
False

-- | Determines if the element stack has a template element.
elementStackHasTemplate :: Parser s -> ST s Bool
elementStackHasTemplate :: forall s. Parser s -> ST s Bool
elementStackHasTemplate Parser s
p = forall s. Parser s -> (DOMNode -> Bool) -> ST s Bool
elementStackAny Parser s
p DOMNode -> Bool
domNodeIsTemplate

-- | Determines if the element stack does not have any template elements.
elementStackMissingTemplate :: Parser s -> ST s Bool
elementStackMissingTemplate :: forall s. Parser s -> ST s Bool
elementStackMissingTemplate Parser s
p = forall s. Parser s -> (DOMNode -> Bool) -> ST s Bool
elementStackAll Parser s
p forall a b. (a -> b) -> a -> b
$ Bool -> Bool
not forall b c a. (b -> c) -> (a -> b) -> a -> c
. DOMNode -> Bool
domNodeIsTemplate

-- | Removes a node ID from the element stack.
elementStackRemove :: Parser s -> DOMID -> ST s ()
elementStackRemove :: forall s. Parser s -> DOMID -> ST s ()
elementStackRemove Parser s
p DOMID
x = forall s. Parser s -> ([DOMID] -> [DOMID]) -> ST s ()
elementStackModify Parser s
p forall a b. (a -> b) -> a -> b
$ forall a. (a -> Bool) -> [a] -> [a]
filter (forall a. Eq a => a -> a -> Bool
/=DOMID
x)

-- | Replaces an ID in the element stack with another ID.
elementStackReplace :: Parser s -> DOMID -> DOMID -> ST s ()
elementStackReplace :: forall s. Parser s -> DOMID -> DOMID -> ST s ()
elementStackReplace Parser s
p DOMID
x DOMID
y =
  forall s. Parser s -> ([DOMID] -> [DOMID]) -> ST s ()
elementStackModify Parser s
p forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map (\DOMID
i -> if DOMID
i forall a. Eq a => a -> a -> Bool
== DOMID
x then DOMID
y else DOMID
i)

-- | Finds the successor for an entry in the element stack.
elementStackSucc :: Parser s -> DOMID -> ST s (Maybe DOMID)
elementStackSucc :: forall s. Parser s -> DOMID -> ST s (Maybe DOMID)
elementStackSucc Parser s
p DOMID
x = forall a. (a -> Bool) -> [a] -> Maybe a
findSucc (forall a. Eq a => a -> a -> Bool
==DOMID
x) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s. Parser s -> ST s [DOMID]
elementStack Parser s
p

-- | Inserts a node before another node in the element stack.
elementStackInsertBefore :: Parser s -> DOMID -> DOMID -> ST s ()
elementStackInsertBefore :: forall s. Parser s -> DOMID -> DOMID -> ST s ()
elementStackInsertBefore Parser s
p DOMID
x DOMID
y = forall s. Parser s -> ([DOMID] -> [DOMID]) -> ST s ()
elementStackModify Parser s
p forall a b. (a -> b) -> a -> b
$ forall a. (a -> Bool) -> a -> [a] -> [a]
insertBefore (forall a. Eq a => a -> a -> Bool
==DOMID
x) DOMID
y

-- | Gets the element stack details.
elementStackDetails :: Parser s -> ST s [ElementDetails]
elementStackDetails :: forall s. Parser s -> ST s [ElementDetails]
elementStackDetails Parser s
p = DOM -> [DOMID] -> [ElementDetails]
g forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s. Parser s -> ST s DOM
getDOM Parser s
p forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall s. Parser s -> ST s [DOMID]
elementStack Parser s
p
  where
    g :: DOM -> [DOMID] -> [ElementDetails]
g DOM
d [DOMID]
x = forall a b. (a -> Maybe b) -> [a] -> [b]
mapMaybe (DOM -> (DOMID, DOMID) -> Maybe ElementDetails
f DOM
d) forall a b. (a -> b) -> a -> b
$ forall a b. [a] -> [b] -> [(a, b)]
zip [DOMID
1..] [DOMID]
x
    f :: DOM -> (DOMID, DOMID) -> Maybe ElementDetails
f DOM
d (DOMID
i, DOMID
x) =
      case DOM -> DOMID -> Maybe DOMNode
domGetNode DOM
d DOMID
x of
        Maybe DOMNode
Nothing -> forall a. Maybe a
Nothing
        Just DOMNode
a -> forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ DOMID -> DOMID -> DOMNode -> DOMType -> ElementDetails
ElementDetails DOMID
i DOMID
x DOMNode
a forall a b. (a -> b) -> a -> b
$ DOMNode -> DOMType
domNodeType DOMNode
a

-- | Finds element stack details.
elementStackFind :: Parser s -> (ElementDetails -> Bool) -> ST s (Maybe ElementDetails)
elementStackFind :: forall s.
Parser s -> (ElementDetails -> Bool) -> ST s (Maybe ElementDetails)
elementStackFind Parser s
p ElementDetails -> Bool
f = forall (f :: * -> *) a b. Applicative f => (a -> b) -> f a -> f b
liftA (forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Maybe a
find ElementDetails -> Bool
f) forall a b. (a -> b) -> a -> b
$ forall s. Parser s -> ST s [ElementDetails]
elementStackDetails Parser s
p

-- | Special element types.
elementTypesSpecial :: Set DOMType
elementTypesSpecial :: Set DOMType
elementTypesSpecial = forall (f :: * -> *) a. (Foldable f, Ord a) => f (Set a) -> Set a
Set.unions
  [ forall a. Ord a => [a] -> Set a
Set.fromList forall a b. (a -> b) -> a -> b
$ [BS] -> [DOMType]
domTypesHTML
    [ BS
"address", BS
"applet", BS
"area", BS
"article", BS
"aside",
      BS
"base", BS
"basefont", BS
"bgsound", BS
"blockquote", BS
"body",
      BS
"br", BS
"button", BS
"caption", BS
"center", BS
"col", BS
"colgroup",
      BS
"dd", BS
"details", BS
"dir", BS
"div", BS
"dl", BS
"dt", BS
"embed",
      BS
"fieldset", BS
"figcaption", BS
"figure", BS
"footer", BS
"form",
      BS
"frame", BS
"frameset", BS
"h1", BS
"h2", BS
"h3", BS
"h4", BS
"h5", BS
"h6",
      BS
"head", BS
"header", BS
"hgroup", BS
"hr", BS
"html", BS
"iframe",
      BS
"img", BS
"input", BS
"isindex", BS
"li", BS
"link", BS
"listing",
      BS
"main", BS
"marquee", BS
"menu", BS
"menuitem", BS
"meta", BS
"nav",
      BS
"noembed", BS
"noframes", BS
"noscript", BS
"object", BS
"ol",
      BS
"p", BS
"param", BS
"plaintext", BS
"pre", BS
"script", BS
"section",
      BS
"select", BS
"source", BS
"style", BS
"summary", BS
"table",
      BS
"tbody", BS
"td", BS
"template", BS
"textarea", BS
"tfoot",
      BS
"th", BS
"thead", BS
"title", BS
"tr", BS
"track", BS
"ul", BS
"wbr" ]
  , forall a. Ord a => [a] -> Set a
Set.fromList forall a b. (a -> b) -> a -> b
$ [BS] -> [DOMType]
domTypesMathML
    [ BS
"mi", BS
"mo", BS
"mn", BS
"ms", BS
"mtext", BS
"annotation-xml" ]
  , forall a. Ord a => [a] -> Set a
Set.fromList forall a b. (a -> b) -> a -> b
$ [BS] -> [DOMType]
domTypesSVG
    [ BS
"foreignObject", BS
"desc", BS
"title" ]
  ]

-- | Formatting element types.
elementTypesFormatting :: Set DOMType
elementTypesFormatting :: Set DOMType
elementTypesFormatting =
  forall a. Ord a => [a] -> Set a
Set.fromList forall a b. (a -> b) -> a -> b
$ [BS] -> [DOMType]
domTypesHTML
  [ BS
"a", BS
"b", BS
"big", BS
"code", BS
"em", BS
"font", BS
"i", BS
"nobr",
    BS
"s", BS
"small", BS
"strike", BS
"strong", BS
"tt", BS
"u"]

-- | Returns the element category for an element type.
elementCategory :: DOMType -> ParserElementCategory
elementCategory :: DOMType -> ParserElementCategory
elementCategory DOMType
x
  | forall a. Ord a => a -> Set a -> Bool
Set.member DOMType
x Set DOMType
elementTypesSpecial = ParserElementCategory
ElementCategorySpecial
  | forall a. Ord a => a -> Set a -> Bool
Set.member DOMType
x Set DOMType
elementTypesFormatting = ParserElementCategory
ElementCategoryFormatting
  | Bool
otherwise = ParserElementCategory
ElementCategoryOrdinary

-- | Detmermines if an element is in the special category.
elementIsSpecial :: DOMType -> Bool
elementIsSpecial :: DOMType -> Bool
elementIsSpecial DOMType
x = DOMType -> ParserElementCategory
elementCategory DOMType
x forall a. Eq a => a -> a -> Bool
== ParserElementCategory
ElementCategorySpecial

-- | Determines if an element is in specific scope.
-- Algorithm from section 12.2.3.2 is specification.
elementInSpecificScope :: Parser s -> Bool -> Set DOMType -> DOMType -> ST s Bool
elementInSpecificScope :: forall s. Parser s -> Bool -> Set DOMType -> DOMType -> ST s Bool
elementInSpecificScope Parser s
p Bool
include Set DOMType
types DOMType
target =
  [DOMType] -> Bool
f forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s. Parser s -> ST s [DOMType]
elementStackTypes Parser s
p
  where
    f :: [DOMType] -> Bool
    f :: [DOMType] -> Bool
f [] = Bool
False
    f (DOMType
x:[DOMType]
xs)
      | DOMType
x forall a. Eq a => a -> a -> Bool
== DOMType
target = Bool
True
      | Bool
include forall a. Eq a => a -> a -> Bool
== Bool
True Bool -> Bool -> Bool
&& forall a. Ord a => a -> Set a -> Bool
Set.member DOMType
x Set DOMType
types forall a. Eq a => a -> a -> Bool
== Bool
True = Bool
False
      | Bool
include forall a. Eq a => a -> a -> Bool
== Bool
False Bool -> Bool -> Bool
&& forall a. Ord a => a -> Set a -> Bool
Set.member DOMType
x Set DOMType
types forall a. Eq a => a -> a -> Bool
== Bool
False = Bool
False
      | Bool
otherwise = [DOMType] -> Bool
f [DOMType]
xs

-- | Default element scopes.
elementScopes :: Set DOMType
elementScopes :: Set DOMType
elementScopes = forall (f :: * -> *) a. (Foldable f, Ord a) => f (Set a) -> Set a
Set.unions
  [ forall a. Ord a => [a] -> Set a
Set.fromList forall a b. (a -> b) -> a -> b
$ [BS] -> [DOMType]
domTypesHTML
    [ BS
"applet", BS
"caption", BS
"html", BS
"table", BS
"td", BS
"th"
    , BS
"marquee", BS
"object", BS
"template" ]
  , forall a. Ord a => [a] -> Set a
Set.fromList forall a b. (a -> b) -> a -> b
$ [BS] -> [DOMType]
domTypesMathML
    [ BS
"mi", BS
"mo", BS
"mn", BS
"ms", BS
"mtext", BS
"annotation-xml" ]
  , forall a. Ord a => [a] -> Set a
Set.fromList forall a b. (a -> b) -> a -> b
$ [BS] -> [DOMType]
domTypesSVG
    [ BS
"foreignObject", BS
"desc", BS
"title" ]
  ]

-- | Determines if an element is in scope.
elementInScope :: Parser s -> DOMType -> ST s Bool
elementInScope :: forall s. Parser s -> DOMType -> ST s Bool
elementInScope Parser s
p = forall s. Parser s -> Bool -> Set DOMType -> DOMType -> ST s Bool
elementInSpecificScope Parser s
p Bool
True Set DOMType
elementScopes

-- | Determines if an element is in list scope.
elementInListScope :: Parser s -> DOMType -> ST s Bool
elementInListScope :: forall s. Parser s -> DOMType -> ST s Bool
elementInListScope Parser s
p =
  forall s. Parser s -> Bool -> Set DOMType -> DOMType -> ST s Bool
elementInSpecificScope Parser s
p Bool
True forall a b. (a -> b) -> a -> b
$
    forall a. Ord a => Set a -> Set a -> Set a
Set.union Set DOMType
elementScopes forall a b. (a -> b) -> a -> b
$ forall a. Ord a => [a] -> Set a
Set.fromList forall a b. (a -> b) -> a -> b
$
      [BS] -> [DOMType]
domTypesHTML [ BS
"ol", BS
"ul" ]

-- | Determines if an element is in button scope.
elementInButtonScope :: Parser s -> DOMType -> ST s Bool
elementInButtonScope :: forall s. Parser s -> DOMType -> ST s Bool
elementInButtonScope Parser s
p =
  forall s. Parser s -> Bool -> Set DOMType -> DOMType -> ST s Bool
elementInSpecificScope Parser s
p Bool
True forall a b. (a -> b) -> a -> b
$
    forall a. Ord a => Set a -> Set a -> Set a
Set.union Set DOMType
elementScopes forall a b. (a -> b) -> a -> b
$ forall a. Ord a => [a] -> Set a
Set.fromList [ BS -> DOMType
domMakeTypeHTML BS
"button" ]

-- | Determines if an element is in table scope.
elementInTableScope :: Parser s -> DOMType -> ST s Bool
elementInTableScope :: forall s. Parser s -> DOMType -> ST s Bool
elementInTableScope Parser s
p =
  forall s. Parser s -> Bool -> Set DOMType -> DOMType -> ST s Bool
elementInSpecificScope Parser s
p Bool
True forall a b. (a -> b) -> a -> b
$
    forall a. Ord a => [a] -> Set a
Set.fromList forall a b. (a -> b) -> a -> b
$ [BS] -> [DOMType]
domTypesHTML [ BS
"html", BS
"table", BS
"template" ]

-- | Determines if an element is in select scope.
elementInSelectScope :: Parser s -> DOMType -> ST s Bool
elementInSelectScope :: forall s. Parser s -> DOMType -> ST s Bool
elementInSelectScope Parser s
p =
  forall s. Parser s -> Bool -> Set DOMType -> DOMType -> ST s Bool
elementInSpecificScope Parser s
p Bool
False forall a b. (a -> b) -> a -> b
$
    forall a. Ord a => [a] -> Set a
Set.fromList forall a b. (a -> b) -> a -> b
$ [BS] -> [DOMType]
domTypesHTML [ BS
"optgroup", BS
"option" ]

-- | Creates a new ID for a node.
newID :: Parser s -> DOMNode -> ST s DOMID
newID :: forall s. Parser s -> DOMNode -> ST s DOMID
newID Parser s
p DOMNode
x = do
  (DOM
d, DOMID
i) <- forall a b c. (a -> b -> c) -> b -> a -> c
flip DOM -> DOMNode -> (DOM, DOMID)
domNewID DOMNode
x forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s. Parser s -> ST s DOM
getDOM Parser s
p
  forall s. Parser s -> DOM -> ST s ()
setDOM Parser s
p DOM
d
  forall (f :: * -> *) a. Applicative f => a -> f a
pure DOMID
i

-- | Converts a node ID to a node.
getNode :: Parser s -> DOMID -> ST s (Maybe DOMNode)
getNode :: forall s. Parser s -> DOMID -> ST s (Maybe DOMNode)
getNode p :: Parser s
p@Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} DOMID
x = forall a b c. (a -> b -> c) -> b -> a -> c
flip DOM -> DOMID -> Maybe DOMNode
domGetNode DOMID
x forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s. Parser s -> ST s DOM
getDOM Parser s
p

-- -- | Gets the element name for a node ID.
nodeElementName :: Parser s -> DOMID -> ST s BS
nodeElementName :: forall s. Parser s -> DOMID -> ST s BS
nodeElementName p :: Parser s
p@Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} DOMID
x = do
  DOM
d <- forall s. Parser s -> ST s DOM
getDOM Parser s
p
  forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ case DOM -> DOMID -> Maybe DOMNode
domGetNode DOM
d DOMID
x of
    Just DOMNode
a -> DOMNode -> BS
domNodeElementName DOMNode
a
    Maybe DOMNode
Nothing -> BS
bsEmpty

-- | Gets the last node ID.
lastNodeID :: Parser s -> ST s (Maybe DOMID)
lastNodeID :: forall s. Parser s -> ST s (Maybe DOMID)
lastNodeID p :: Parser s
p@Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} = forall a. [a] -> Maybe a
listToMaybe forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. [a] -> [a]
reverse forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s. Parser s -> ST s [DOMID]
elementStack Parser s
p

-- | Gets the current node ID.
currentNodeID :: Parser s -> ST s (Maybe DOMID)
currentNodeID :: forall s. Parser s -> ST s (Maybe DOMID)
currentNodeID p :: Parser s
p@Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} = forall a. [a] -> Maybe a
listToMaybe forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s. Parser s -> ST s [DOMID]
elementStack Parser s
p

-- | Gets the current node.
currentNode :: Parser s -> ST s (Maybe DOMNode)
currentNode :: forall s. Parser s -> ST s (Maybe DOMNode)
currentNode Parser s
p = forall s. Parser s -> ST s (Maybe DOMID)
currentNodeID Parser s
p forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall b a. b -> (a -> b) -> Maybe a -> b
maybe (forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a. Maybe a
Nothing) (forall s. Parser s -> DOMID -> ST s (Maybe DOMNode)
getNode Parser s
p)

-- | Determines if the current node has a specified type.
currentNodeHasType :: Parser s -> DOMType -> ST s Bool
currentNodeHasType :: forall s. Parser s -> DOMType -> ST s Bool
currentNodeHasType Parser s
p DOMType
x =
  forall s. Parser s -> ST s (Maybe DOMNode)
currentNode Parser s
p forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall (f :: * -> *) a. Applicative f => a -> f a
pure forall b c a. (b -> c) -> (a -> b) -> a -> c
. \case
    Just DOMNode
a -> DOMNode -> DOMType
domNodeType DOMNode
a forall a. Eq a => a -> a -> Bool
== DOMType
x
    Maybe DOMNode
Nothing -> Bool
False

-- | Determines if the current node has a specified type.
currentNodeHasHTMLType :: Parser s -> BS -> ST s Bool
currentNodeHasHTMLType :: forall s. Parser s -> BS -> ST s Bool
currentNodeHasHTMLType Parser s
p = forall s. Parser s -> DOMType -> ST s Bool
currentNodeHasType Parser s
p forall b c a. (b -> c) -> (a -> b) -> a -> c
. BS -> DOMType
domMakeTypeHTML

-- | Determines if the current node has a specified type.
currentNodeHasTypeIn :: Parser s -> [DOMType] -> ST s Bool
currentNodeHasTypeIn :: forall s. Parser s -> [DOMType] -> ST s Bool
currentNodeHasTypeIn Parser s
p [DOMType]
x =
  forall s. Parser s -> ST s (Maybe DOMNode)
currentNode Parser s
p forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall (f :: * -> *) a. Applicative f => a -> f a
pure forall b c a. (b -> c) -> (a -> b) -> a -> c
. \case
    Just DOMNode
a -> DOMNode -> DOMType
domNodeType DOMNode
a forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [DOMType]
x
    Maybe DOMNode
Nothing -> Bool
False

-- | Determines if the current node has a specified type.
currentNodeHasHTMLTypeIn :: Parser s -> [BS] -> ST s Bool
currentNodeHasHTMLTypeIn :: forall s. Parser s -> [BS] -> ST s Bool
currentNodeHasHTMLTypeIn Parser s
p = forall s. Parser s -> [DOMType] -> ST s Bool
currentNodeHasTypeIn Parser s
p forall b c a. (b -> c) -> (a -> b) -> a -> c
. [BS] -> [DOMType]
domTypesHTML

-- | Gets the adjusted current node ID.
adjustedCurrentNodeID :: Parser s -> ST s (Maybe DOMID)
adjustedCurrentNodeID :: forall s. Parser s -> ST s (Maybe DOMID)
adjustedCurrentNodeID p :: Parser s
p@Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} = do
  Bool
f <- forall s a. STRef s a -> ST s a
rref STRef s Bool
parserFragmentMode
  DOMID
n <- forall s. Parser s -> ST s DOMID
elementStackSize Parser s
p
  if Bool
f Bool -> Bool -> Bool
&& DOMID
n forall a. Eq a => a -> a -> Bool
== DOMID
1
     then forall s a. STRef s a -> ST s a
rref STRef s (Maybe DOMID)
parserContextElement
     else forall s. Parser s -> ST s (Maybe DOMID)
currentNodeID Parser s
p

-- | Gets the adjusted current node.
adjustedCurrentNode :: Parser s -> ST s (Maybe DOMNode)
adjustedCurrentNode :: forall s. Parser s -> ST s (Maybe DOMNode)
adjustedCurrentNode Parser s
p =
  forall s. Parser s -> ST s (Maybe DOMID)
adjustedCurrentNodeID Parser s
p forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall b a. b -> (a -> b) -> Maybe a -> b
maybe (forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a. Maybe a
Nothing) (forall s. Parser s -> DOMID -> ST s (Maybe DOMNode)
getNode Parser s
p)

-- | Determines if a node is a named MathML element.
isMathMLElementNamed :: DOMNode -> BS -> Bool
isMathMLElementNamed :: DOMNode -> BS -> Bool
isMathMLElementNamed DOMNode
x BS
n = DOMNode -> Bool
domNodeIsMathML DOMNode
x Bool -> Bool -> Bool
&& DOMNode -> BS
domElementName DOMNode
x forall a. Eq a => a -> a -> Bool
== BS
n

-- | Determines if a node is a MathML integration point.
isMathMLIntegrationPoint :: DOMNode -> Bool
isMathMLIntegrationPoint :: DOMNode -> Bool
isMathMLIntegrationPoint DOMNode
x
  | DOMNode -> Bool
domNodeIsElement DOMNode
x =
      DOMNode -> Bool
domNodeIsMathML DOMNode
x Bool -> Bool -> Bool
&& forall a. Ord a => a -> Set a -> Bool
Set.member (DOMNode -> BS
domElementName DOMNode
x) Set BS
s
  | Bool
otherwise =
      Bool
False
  where
    s :: Set BS
s = forall a. Ord a => [a] -> Set a
Set.fromList [ BS
"mi", BS
"mo", BS
"mn", BS
"ms", BS
"mtext" ]

-- | Determines if a node is a MathML integration point.
isHtmlIntgrationPoint :: DOMNode -> Bool
isHtmlIntgrationPoint :: DOMNode -> Bool
isHtmlIntgrationPoint DOMNode
x
  | DOMNode -> Bool
domNodeIsElement DOMNode
x = Bool
s Bool -> Bool -> Bool
|| Bool
m
  | Bool
otherwise = Bool
False
  where
    s :: Bool
s = DOMNode -> Bool
domNodeIsSVG DOMNode
x
        Bool -> Bool -> Bool
&& forall a. Ord a => a -> Set a -> Bool
Set.member (DOMNode -> BS
domElementName DOMNode
x) Set BS
s0
    m :: Bool
m = DOMNode -> Bool
domNodeIsMathML DOMNode
x
        Bool -> Bool -> Bool
&& DOMNode -> BS
domElementName DOMNode
x forall a. Eq a => a -> a -> Bool
== BS
"annotation-xml"
        Bool -> Bool -> Bool
&& case DOMNode -> BS -> Maybe DOMAttr
domElementFindAttr DOMNode
x BS
"encoding" of
             Just (DOMAttr BS
n BS
v HTMLAttrNamespace
s) ->
               forall a. Ord a => a -> Set a -> Bool
Set.member (BS -> BS
bsLower BS
v) Set BS
s1
             Maybe DOMAttr
_otherwise -> Bool
False
    s0 :: Set BS
s0 = forall a. Ord a => [a] -> Set a
Set.fromList [ BS
"foreignObject", BS
"desc", BS
"title" ]
    s1 :: Set BS
s1 = forall a. Ord a => [a] -> Set a
Set.fromList [ BS
"text/html", BS
"application/xhtml+xml" ]

-- | Gets the DOM.
getDOM :: Parser s -> ST s DOM
getDOM :: forall s. Parser s -> ST s DOM
getDOM Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} = forall s a. STRef s a -> ST s a
rref STRef s DOM
parserDOM

-- | Sets the DOM.
setDOM :: Parser s -> DOM -> ST s ()
setDOM :: forall s. Parser s -> DOM -> ST s ()
setDOM Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} = forall s a. STRef s a -> a -> ST s ()
wref STRef s DOM
parserDOM

-- | Modifies the DOM.
modifyDOM :: Parser s -> (DOM -> DOM) -> ST s ()
modifyDOM :: forall s. Parser s -> (DOM -> DOM) -> ST s ()
modifyDOM p :: Parser s
p@Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} = forall s a. STRef s a -> (a -> a) -> ST s ()
uref STRef s DOM
parserDOM

-- | Sets the insertion mode.
setMode :: Parser s -> ParserMode -> ST s ()
setMode :: forall s. Parser s -> ParserMode -> ST s ()
setMode Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} = forall s a. STRef s a -> a -> ST s ()
wref STRef s ParserMode
parserInsertionMode

-- | Saves the mode as the original mode.
saveMode :: Parser s -> ST s ()
saveMode :: forall s. Parser s -> ST s ()
saveMode Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} = forall s a. STRef s a -> ST s a
rref STRef s ParserMode
parserInsertionMode forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall s a. STRef s a -> a -> ST s ()
wref STRef s ParserMode
parserOriginalMode

-- | Restore the insertion mode from the saved original mode.
restoreMode :: Parser s -> ST s ()
restoreMode :: forall s. Parser s -> ST s ()
restoreMode Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} = do
  forall s a. STRef s a -> ST s a
rref STRef s ParserMode
parserOriginalMode forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall s a. STRef s a -> a -> ST s ()
wref STRef s ParserMode
parserInsertionMode
  forall s a. STRef s a -> a -> ST s ()
wref STRef s ParserMode
parserOriginalMode ParserMode
ModeInitial

-- | Sets the current head element.
setHeadID :: Parser s -> Maybe DOMID -> ST s ()
setHeadID :: forall s. Parser s -> Maybe DOMID -> ST s ()
setHeadID Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} = forall s a. STRef s a -> a -> ST s ()
wref STRef s (Maybe DOMID)
parserHeadElement

-- | Gets the current head element.
getHeadID :: Parser s -> ST s (Maybe DOMID)
getHeadID :: forall s. Parser s -> ST s (Maybe DOMID)
getHeadID Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} = forall s a. STRef s a -> ST s a
rref STRef s (Maybe DOMID)
parserHeadElement

-- | Gets the current head element.
getHeadElement :: Parser s -> ST s (Maybe DOMNode)
getHeadElement :: forall s. Parser s -> ST s (Maybe DOMNode)
getHeadElement Parser s
p = forall s. Parser s -> ST s (Maybe DOMID)
getHeadID Parser s
p forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall b a. b -> (a -> b) -> Maybe a -> b
maybe (forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a. Maybe a
Nothing) (forall s. Parser s -> DOMID -> ST s (Maybe DOMNode)
getNode Parser s
p)

-- | Saves the current node as the head element.
saveHead :: Parser s -> ST s ()
saveHead :: forall s. Parser s -> ST s ()
saveHead Parser s
p = forall s. Parser s -> ST s (Maybe DOMID)
currentNodeID Parser s
p forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall s. Parser s -> Maybe DOMID -> ST s ()
setHeadID Parser s
p

-- | Sets the current form element.
setFormID :: Parser s -> Maybe DOMID -> ST s ()
setFormID :: forall s. Parser s -> Maybe DOMID -> ST s ()
setFormID Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} = forall s a. STRef s a -> a -> ST s ()
wref STRef s (Maybe DOMID)
parserFormElement

-- | Gets the current form element ID.
getFormID :: Parser s -> ST s (Maybe DOMID)
getFormID :: forall s. Parser s -> ST s (Maybe DOMID)
getFormID Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} = forall s a. STRef s a -> ST s a
rref STRef s (Maybe DOMID)
parserFormElement

-- | Gets the current form element.
getFormElement :: Parser s -> ST s (Maybe DOMNode)
getFormElement :: forall s. Parser s -> ST s (Maybe DOMNode)
getFormElement Parser s
p = forall s. Parser s -> ST s (Maybe DOMID)
getFormID Parser s
p forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall b a. b -> (a -> b) -> Maybe a -> b
maybe (forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a. Maybe a
Nothing) (forall s. Parser s -> DOMID -> ST s (Maybe DOMNode)
getNode Parser s
p)

-- | Gets the current form element type.
getFormType :: Parser s -> ST s (Maybe DOMType)
getFormType :: forall s. Parser s -> ST s (Maybe DOMType)
getFormType p :: Parser s
p@Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} =
  forall s. Parser s -> ST s (Maybe DOMNode)
getFormElement Parser s
p forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall (f :: * -> *) a. Applicative f => a -> f a
pure forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall b a. b -> (a -> b) -> Maybe a -> b
maybe forall a. Maybe a
Nothing (forall a. a -> Maybe a
Just forall b c a. (b -> c) -> (a -> b) -> a -> c
. DOMNode -> DOMType
domNodeType)

-- | Saves the current node as the form element.
saveForm :: Parser s -> ST s ()
saveForm :: forall s. Parser s -> ST s ()
saveForm Parser s
p = forall s. Parser s -> ST s (Maybe DOMID)
currentNodeID Parser s
p forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall s. Parser s -> Maybe DOMID -> ST s ()
setFormID Parser s
p

-- | Determines if the form element reference is defined.
formNotNull :: Parser s -> ST s Bool
formNotNull :: forall s. Parser s -> ST s Bool
formNotNull Parser s
p = forall a. Maybe a -> Bool
isJust forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s. Parser s -> ST s (Maybe DOMID)
getFormID Parser s
p

-- | Initializes the self closing flag.
selfClosingInit :: Parser s -> Token -> ST s ()
selfClosingInit :: forall s. Parser s -> Token -> ST s ()
selfClosingInit p :: Parser s
p@Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} Token
t =
  forall s a. STRef s a -> a -> ST s ()
wref STRef s Bool
parserSelfClosingFlag forall a b. (a -> b) -> a -> b
$
    case Token
t of
      TStart {Bool
[TAttr]
BS
tStartAttr :: [TAttr]
tStartClosed :: Bool
tStartName :: BS
tStartAttr :: Token -> [TAttr]
tStartClosed :: Token -> Bool
tStartName :: Token -> BS
..} -> Bool
tStartClosed
      Token
_otherwise -> Bool
False

-- | Acknowledges the parser self closing flag.
selfClosingAcknowledge :: Parser s -> ST s ()
selfClosingAcknowledge :: forall s. Parser s -> ST s ()
selfClosingAcknowledge Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} = forall s a. STRef s a -> a -> ST s ()
wref STRef s Bool
parserSelfClosingFlag Bool
False

-- | Gets the self closing flag.
selfClosingFlag :: Parser s -> ST s Bool
selfClosingFlag :: forall s. Parser s -> ST s Bool
selfClosingFlag Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} = forall s a. STRef s a -> ST s a
rref STRef s Bool
parserSelfClosingFlag

-- | Gets the foster parenting flag.
fosterParenting :: Parser s -> ST s Bool
fosterParenting :: forall s. Parser s -> ST s Bool
fosterParenting Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} = forall s a. STRef s a -> ST s a
rref STRef s Bool
parserFosterParenting

-- | Sets the foster parenting flag.
fosterParentingSet :: Parser s -> ST s ()
fosterParentingSet :: forall s. Parser s -> ST s ()
fosterParentingSet Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} = forall s a. STRef s a -> a -> ST s ()
wref STRef s Bool
parserFosterParenting Bool
True

-- | Clear the foster parenting flag.
fosterParentingClear :: Parser s -> ST s ()
fosterParentingClear :: forall s. Parser s -> ST s ()
fosterParentingClear Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} = forall s a. STRef s a -> a -> ST s ()
wref STRef s Bool
parserFosterParenting Bool
False

-- | Sets the frameset flag to not OK.
frameSetNotOK :: Parser s -> ST s ()
frameSetNotOK :: forall s. Parser s -> ST s ()
frameSetNotOK Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} = forall s a. STRef s a -> a -> ST s ()
wref STRef s Bool
parserFrameSetOK Bool
False

-- | Gets the iframe srcdoc flag.
iframeSrcDoc :: Parser s -> ST s Bool
iframeSrcDoc :: forall s. Parser s -> ST s Bool
iframeSrcDoc Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} = forall s a. STRef s a -> ST s a
rref STRef s Bool
parserIFrameSrcDoc

-- | Sets the done flag.
parserSetDone :: Parser s -> ST s ()
parserSetDone :: forall s. Parser s -> ST s ()
parserSetDone Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} = forall s a. STRef s a -> a -> ST s ()
wref STRef s Bool
parserDone Bool
True

-- | Gets the active format list.
activeFormatList :: Parser s -> ST s [ParserFormatItem]
activeFormatList :: forall s. Parser s -> ST s [ParserFormatItem]
activeFormatList Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} = forall s a. STRef s a -> ST s a
rref STRef s [ParserFormatItem]
parserActiveFormatList

-- | Gets the names of the active format elements.
activeFormatNames :: Parser s -> ST s [BS]
activeFormatNames :: forall s. Parser s -> ST s [BS]
activeFormatNames Parser s
p = do
  DOM
d <- forall s. Parser s -> ST s DOM
getDOM Parser s
p
  forall a b. (a -> b) -> [a] -> [b]
map (DOM -> ParserFormatItem -> BS
f DOM
d) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s. Parser s -> ST s [ParserFormatItem]
activeFormatList Parser s
p
  where f :: DOM -> ParserFormatItem -> BS
f DOM
d ParserFormatItem
ParserFormatMarker = BS
"marker"
        f DOM
d (ParserFormatElement DOMID
i Token
t) =
          DOMNode -> BS
domElementName forall a b. (a -> b) -> a -> b
$ forall a. HasCallStack => Maybe a -> a
fromJust forall a b. (a -> b) -> a -> b
$ DOM -> DOMID -> Maybe DOMNode
domGetNode DOM
d DOMID
i

-- | Adds a marker to the list of active format elements.
activeFormatAddMarker :: Parser s -> ST s ()
activeFormatAddMarker :: forall s. Parser s -> ST s ()
activeFormatAddMarker Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} =
  forall s a. STRef s a -> (a -> a) -> ST s ()
uref STRef s [ParserFormatItem]
parserActiveFormatList (ParserFormatItem
ParserFormatMarkerforall a. a -> [a] -> [a]
:)

-- | Limits matching active format elements up to the first
-- marker to two so that a third can be added (Noah's Ark clause).
activeFormatLimit :: (DOMID -> Bool) -> [ParserFormatItem] -> [ParserFormatItem]
activeFormatLimit :: (DOMID -> Bool) -> [ParserFormatItem] -> [ParserFormatItem]
activeFormatLimit DOMID -> Bool
match [ParserFormatItem]
xs =
  DOMID -> [ParserFormatItem] -> [ParserFormatItem]
f DOMID
0 [ParserFormatItem]
xs
  where
    f :: Int -> [ParserFormatItem] -> [ParserFormatItem]
    f :: DOMID -> [ParserFormatItem] -> [ParserFormatItem]
f DOMID
n [] = []
    f DOMID
n (e :: ParserFormatItem
e@(ParserFormatItem
ParserFormatMarker):[ParserFormatItem]
es) = ParserFormatItem
e forall a. a -> [a] -> [a]
: [ParserFormatItem]
es
    f DOMID
n (e :: ParserFormatItem
e@(ParserFormatElement DOMID
domId Token
_):[ParserFormatItem]
es)
      | DOMID -> Bool
match DOMID
domId = if DOMID
n forall a. Ord a => a -> a -> Bool
< DOMID
2 then ParserFormatItem
e forall a. a -> [a] -> [a]
: DOMID -> [ParserFormatItem] -> [ParserFormatItem]
f (DOMID
n forall a. Num a => a -> a -> a
+ DOMID
1) [ParserFormatItem]
es else DOMID -> [ParserFormatItem] -> [ParserFormatItem]
f DOMID
n [ParserFormatItem]
es
      | Bool
otherwise = ParserFormatItem
e forall a. a -> [a] -> [a]
: DOMID -> [ParserFormatItem] -> [ParserFormatItem]
f DOMID
n [ParserFormatItem]
es

-- | Adds an element to the list of active format elements.
activeFormatAddElement :: Parser s -> Token -> DOMID -> ST s ()
activeFormatAddElement :: forall s. Parser s -> Token -> DOMID -> ST s ()
activeFormatAddElement p :: Parser s
p@Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} Token
t DOMID
x = do
  DOM
d <- forall s. Parser s -> ST s DOM
getDOM Parser s
p
  [ParserFormatItem]
a <- forall s. Parser s -> ST s [ParserFormatItem]
activeFormatList Parser s
p
  forall s a. STRef s a -> a -> ST s ()
wref STRef s [ParserFormatItem]
parserActiveFormatList forall a b. (a -> b) -> a -> b
$
    DOMID -> Token -> ParserFormatItem
ParserFormatElement DOMID
x Token
t forall a. a -> [a] -> [a]
: (DOMID -> Bool) -> [ParserFormatItem] -> [ParserFormatItem]
activeFormatLimit (DOM -> DOMID -> DOMID -> Bool
domMatch DOM
d DOMID
x) [ParserFormatItem]
a

-- | Adds the current node to the list of active format elements.
activeFormatAddCurrentNode :: Parser s -> Token -> ST s ()
activeFormatAddCurrentNode :: forall s. Parser s -> Token -> ST s ()
activeFormatAddCurrentNode p :: Parser s
p@Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} Token
t =
  forall (m :: * -> *) a.
Monad m =>
m (Maybe a) -> (a -> m ()) -> m ()
whenJustM (forall s. Parser s -> ST s (Maybe DOMID)
currentNodeID Parser s
p) forall a b. (a -> b) -> a -> b
$ forall s. Parser s -> Token -> DOMID -> ST s ()
activeFormatAddElement Parser s
p Token
t

-- | Determines if any format elements up to a marker satisfy a predicate.
activeFormatAny :: Parser s -> (DOMNode -> Bool) -> ST s Bool
activeFormatAny :: forall s. Parser s -> (DOMNode -> Bool) -> ST s Bool
activeFormatAny p :: Parser s
p@Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} DOMNode -> Bool
f = do
  DOM
d <- forall s. Parser s -> ST s DOM
getDOM Parser s
p
  [ParserFormatItem]
a <- forall s. Parser s -> ST s [ParserFormatItem]
activeFormatList Parser s
p
  forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$
    ( forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any DOMNode -> Bool
f
    forall b c a. (b -> c) -> (a -> b) -> a -> c
. DOM -> [DOMID] -> [DOMNode]
domMapID DOM
d
    forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a -> Maybe b) -> [a] -> [b]
mapMaybe ParserFormatItem -> Maybe DOMID
g
    forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. (a -> Bool) -> [a] -> [a]
takeWhile (Bool -> Bool
not forall b c a. (b -> c) -> (a -> b) -> a -> c
. ParserFormatItem -> Bool
formatItemIsMarker)
    ) [ParserFormatItem]
a
  where
    g :: ParserFormatItem -> Maybe DOMID
    g :: ParserFormatItem -> Maybe DOMID
g = \case
      ParserFormatElement DOMID
x Token
_ ->
        forall a. a -> Maybe a
Just DOMID
x
      ParserFormatItem
ParserFormatMarker ->
        forall a. Maybe a
Nothing

-- | Determines if the active format list contains an element.
activeFormatContains :: Parser s -> DOMID -> ST s Bool
activeFormatContains :: forall s. Parser s -> DOMID -> ST s Bool
activeFormatContains Parser s
p DOMID
x = forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (DOMID -> ParserFormatItem -> Bool
formatItemHasID DOMID
x) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s. Parser s -> ST s [ParserFormatItem]
activeFormatList Parser s
p

-- | Finds a format item with a specified tag name.
activeFormatFindTag :: Parser s -> BS -> ST s (Maybe ParserFormatItem)
activeFormatFindTag :: forall s. Parser s -> BS -> ST s (Maybe ParserFormatItem)
activeFormatFindTag p :: Parser s
p@Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} BS
x = do
  DOM
d <- forall s. Parser s -> ST s DOM
getDOM Parser s
p
  [ParserFormatItem]
a <- forall s. Parser s -> ST s [ParserFormatItem]
activeFormatList Parser s
p
  forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$
    ( forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Maybe a
find (DOM -> BS -> ParserFormatItem -> Bool
formatItemHasTag DOM
d BS
x)
    forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. (a -> Bool) -> [a] -> [a]
takeWhile (Bool -> Bool
not forall b c a. (b -> c) -> (a -> b) -> a -> c
. ParserFormatItem -> Bool
formatItemIsMarker)
    ) [ParserFormatItem]
a

-- | Finds the token for a node ID.
activeFormatFindToken :: Parser s -> DOMID -> ST s (Maybe Token)
activeFormatFindToken :: forall s. Parser s -> DOMID -> ST s (Maybe Token)
activeFormatFindToken p :: Parser s
p@Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} DOMID
x =
  forall s. Parser s -> ST s [ParserFormatItem]
activeFormatList Parser s
p forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall {f :: * -> *}.
Applicative f =>
[ParserFormatItem] -> f (Maybe Token)
f
  where
    f :: [ParserFormatItem] -> f (Maybe Token)
f [] = forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a. Maybe a
Nothing
    f ((ParserFormatItem
ParserFormatMarker):[ParserFormatItem]
xs) = [ParserFormatItem] -> f (Maybe Token)
f [ParserFormatItem]
xs
    f ((ParserFormatElement DOMID
i Token
t):[ParserFormatItem]
xs)
      | DOMID
x forall a. Eq a => a -> a -> Bool
== DOMID
i = forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ forall a. a -> Maybe a
Just Token
t
      | Bool
otherwise = [ParserFormatItem] -> f (Maybe Token)
f [ParserFormatItem]
xs

-- | Reconstructs the list of active format elements.
activeFormatReconstruct :: Parser s -> ST s ()
activeFormatReconstruct :: forall s. Parser s -> ST s ()
activeFormatReconstruct Parser s
p = do
  [DOMID]
e <- forall s. Parser s -> ST s [DOMID]
elementStack Parser s
p
  [ParserFormatItem]
a <- forall s. Parser s -> ST s [ParserFormatItem]
activeFormatList Parser s
p
  case [ParserFormatItem]
a of
    [] -> forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
    (ParserFormatItem
x:[ParserFormatItem]
xs)
      | [DOMID] -> ParserFormatItem -> Bool
openOrMarker [DOMID]
e ParserFormatItem
x -> forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
      | Bool
otherwise -> do
          let b :: [ParserFormatItem]
b = forall a. [a] -> [a]
reverse forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. (a -> Bool) -> [a] -> [a]
takeWhile (Bool -> Bool
not forall b c a. (b -> c) -> (a -> b) -> a -> c
. [DOMID] -> ParserFormatItem -> Bool
openOrMarker [DOMID]
e) forall a b. (a -> b) -> a -> b
$ [ParserFormatItem]
a
              a' :: [ParserFormatItem]
a' = forall a. DOMID -> [a] -> [a]
drop (forall (t :: * -> *) a. Foldable t => t a -> DOMID
length [ParserFormatItem]
b) [ParserFormatItem]
a
          forall s.
Parser s -> [ParserFormatItem] -> [ParserFormatItem] -> ST s ()
reopen Parser s
p [ParserFormatItem]
b [ParserFormatItem]
a'

-- | Determines is a format item is open.
openOrMarker :: [DOMID] -> ParserFormatItem -> Bool
openOrMarker :: [DOMID] -> ParserFormatItem -> Bool
openOrMarker [DOMID]
x = \case
   ParserFormatItem
ParserFormatMarker -> Bool
True
   ParserFormatElement DOMID
i Token
_ -> DOMID
i forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [DOMID]
x

-- | Reopens a format item.
reopen :: Parser s -> [ParserFormatItem] -> [ParserFormatItem] -> ST s ()
reopen :: forall s.
Parser s -> [ParserFormatItem] -> [ParserFormatItem] -> ST s ()
reopen p :: Parser s
p@Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} [ParserFormatItem]
b [ParserFormatItem]
a =
  case [ParserFormatItem]
b of
    [] ->
      forall s a. STRef s a -> a -> ST s ()
wref STRef s [ParserFormatItem]
parserActiveFormatList [ParserFormatItem]
a
    ((ParserFormatItem
ParserFormatMarker):[ParserFormatItem]
xs) ->
      forall s.
Parser s -> [ParserFormatItem] -> [ParserFormatItem] -> ST s ()
reopen Parser s
p [ParserFormatItem]
xs [ParserFormatItem]
a
    ((ParserFormatElement DOMID
_ Token
t):[ParserFormatItem]
xs) -> do
      forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
      DOMID
i <- forall a. HasCallStack => Maybe a -> a
fromJust forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s. Parser s -> ST s (Maybe DOMID)
currentNodeID Parser s
p
      forall s.
Parser s -> [ParserFormatItem] -> [ParserFormatItem] -> ST s ()
reopen Parser s
p [ParserFormatItem]
xs forall a b. (a -> b) -> a -> b
$ DOMID -> Token -> ParserFormatItem
ParserFormatElement DOMID
i Token
t forall a. a -> [a] -> [a]
: [ParserFormatItem]
a

-- | Clears the list of active format elements up to last marker.
activeFormatClear :: Parser s -> ST s ()
activeFormatClear :: forall s. Parser s -> ST s ()
activeFormatClear Parser s
p =
  forall s.
Parser s -> ([ParserFormatItem] -> [ParserFormatItem]) -> ST s ()
activeFormatModify Parser s
p forall a b. (a -> b) -> a -> b
$ forall a. DOMID -> [a] -> [a]
drop DOMID
1 forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. (a -> Bool) -> [a] -> [a]
dropWhile (Bool -> Bool
not forall b c a. (b -> c) -> (a -> b) -> a -> c
. ParserFormatItem -> Bool
formatItemIsMarker)

-- | Removes a node from the active format element list.
activeFormatRemove :: Parser s -> DOMID -> ST s ()
activeFormatRemove :: forall s. Parser s -> DOMID -> ST s ()
activeFormatRemove Parser s
p DOMID
x =
  forall s.
Parser s -> ([ParserFormatItem] -> [ParserFormatItem]) -> ST s ()
activeFormatModify Parser s
p forall a b. (a -> b) -> a -> b
$ forall a. (a -> Bool) -> [a] -> [a]
filter forall a b. (a -> b) -> a -> b
$ Bool -> Bool
not forall b c a. (b -> c) -> (a -> b) -> a -> c
. DOMID -> ParserFormatItem -> Bool
formatItemHasID DOMID
x

-- | Replaces an ID in the active format list.
activeFormatReplace :: Parser s -> DOMID -> DOMID -> ST s ()
activeFormatReplace :: forall s. Parser s -> DOMID -> DOMID -> ST s ()
activeFormatReplace Parser s
p DOMID
x DOMID
y =
  forall s.
Parser s -> ([ParserFormatItem] -> [ParserFormatItem]) -> ST s ()
activeFormatModify Parser s
p forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map ParserFormatItem -> ParserFormatItem
f
  where
    f :: ParserFormatItem -> ParserFormatItem
f z :: ParserFormatItem
z@(ParserFormatItem
ParserFormatMarker) = ParserFormatItem
z
    f z :: ParserFormatItem
z@(ParserFormatElement DOMID
i Token
t)
      | DOMID
i forall a. Eq a => a -> a -> Bool
== DOMID
x = DOMID -> Token -> ParserFormatItem
ParserFormatElement DOMID
y Token
t
      | Bool
otherwise = ParserFormatItem
z

-- | Modifies the active format list.
activeFormatModify :: Parser s -> ([ParserFormatItem] -> [ParserFormatItem]) -> ST s ()
activeFormatModify :: forall s.
Parser s -> ([ParserFormatItem] -> [ParserFormatItem]) -> ST s ()
activeFormatModify Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} = forall s a. STRef s a -> (a -> a) -> ST s ()
uref STRef s [ParserFormatItem]
parserActiveFormatList

-- | Gets the active format successor for an ID.
activeFormatSucc :: Parser s -> DOMID -> ST s (Maybe DOMID)
activeFormatSucc :: forall s. Parser s -> DOMID -> ST s (Maybe DOMID)
activeFormatSucc Parser s
p DOMID
x =
  [ParserFormatItem] -> Maybe DOMID
f forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s. Parser s -> ST s [ParserFormatItem]
activeFormatList Parser s
p
  where
    f :: [ParserFormatItem] -> Maybe DOMID
f [ParserFormatItem]
a = case forall a. (a -> Bool) -> [a] -> Maybe a
findSucc (DOMID -> ParserFormatItem -> Bool
formatItemHasID DOMID
x) [ParserFormatItem]
a of
      Just (ParserFormatElement DOMID
i Token
_) -> forall a. a -> Maybe a
Just DOMID
i
      Maybe ParserFormatItem
_otherwise -> forall a. Maybe a
Nothing

-- | Inserts an element in the active format list.
activeFormatInsertElement :: Parser s -> DOMID -> Token -> Maybe DOMID -> ST s ()
activeFormatInsertElement :: forall s. Parser s -> DOMID -> Token -> Maybe DOMID -> ST s ()
activeFormatInsertElement Parser s
p DOMID
x Token
t Maybe DOMID
y =
  case Maybe DOMID
y of
    Just DOMID
a -> forall s.
Parser s -> ([ParserFormatItem] -> [ParserFormatItem]) -> ST s ()
activeFormatModify Parser s
p forall a b. (a -> b) -> a -> b
$ forall a. (a -> Bool) -> a -> [a] -> [a]
insertBefore (DOMID -> ParserFormatItem -> Bool
formatItemHasID DOMID
a) ParserFormatItem
e
    Maybe DOMID
Nothing -> forall s.
Parser s -> ([ParserFormatItem] -> [ParserFormatItem]) -> ST s ()
activeFormatModify Parser s
p (forall a. Semigroup a => a -> a -> a
<>[ParserFormatItem
e])
  where
    e :: ParserFormatItem
e = DOMID -> Token -> ParserFormatItem
ParserFormatElement DOMID
x Token
t

-- | Determines if a format item is a marker.
formatItemIsMarker :: ParserFormatItem -> Bool
formatItemIsMarker :: ParserFormatItem -> Bool
formatItemIsMarker ParserFormatItem
ParserFormatMarker = Bool
True
formatItemIsMarker (ParserFormatElement DOMID
_ Token
_) = Bool
False

-- | Determines if a format item has the specified ID.
formatItemHasID :: DOMID -> ParserFormatItem -> Bool
formatItemHasID :: DOMID -> ParserFormatItem -> Bool
formatItemHasID DOMID
x ParserFormatItem
ParserFormatMarker = Bool
False
formatItemHasID DOMID
x (ParserFormatElement DOMID
i Token
_) = DOMID
i forall a. Eq a => a -> a -> Bool
== DOMID
x

-- | Determines if a format item has a certain tag name.
formatItemHasTag :: DOM -> BS -> ParserFormatItem -> Bool
formatItemHasTag :: DOM -> BS -> ParserFormatItem -> Bool
formatItemHasTag DOM
d BS
n ParserFormatItem
ParserFormatMarker = Bool
False
formatItemHasTag DOM
d BS
n (ParserFormatElement DOMID
i Token
_) =
  case DOM -> DOMID -> Maybe DOMNode
domGetNode DOM
d DOMID
i of
    Just DOMNode
x -> DOMNode -> BS
domNodeElementName DOMNode
x forall a. Eq a => a -> a -> Bool
== BS
n
    Maybe DOMNode
Nothing -> Bool
False

-- | Gets the current template insertion mode.
templateModeCurrent :: Parser s -> ST s (Maybe ParserMode)
templateModeCurrent :: forall s. Parser s -> ST s (Maybe ParserMode)
templateModeCurrent p :: Parser s
p@Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} = forall a. [a] -> Maybe a
listToMaybe forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s a. STRef s a -> ST s a
rref STRef s [ParserMode]
parserTemplateMode

-- | Pushes an insertion mode onto the stack of template insertion modes.
templateModePush :: Parser s -> ParserMode -> ST s ()
templateModePush :: forall s. Parser s -> ParserMode -> ST s ()
templateModePush p :: Parser s
p@Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} ParserMode
x = forall s a. STRef s a -> (a -> a) -> ST s ()
uref STRef s [ParserMode]
parserTemplateMode (ParserMode
xforall a. a -> [a] -> [a]
:)

-- | Pops an insertion mode off of the stack of template insertion modes.
templateModePop :: Parser s -> ST s ()
templateModePop :: forall s. Parser s -> ST s ()
templateModePop p :: Parser s
p@Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} =
  forall s a. STRef s a -> ST s a
rref STRef s [ParserMode]
parserTemplateMode forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
    (ParserMode
x:[ParserMode]
xs) -> forall s a. STRef s a -> a -> ST s ()
wref STRef s [ParserMode]
parserTemplateMode [ParserMode]
xs
    []     -> forall s. Parser s -> Maybe Token -> BS -> ST s ()
parseError Parser s
p forall a. Maybe a
Nothing BS
"attempt to pop empty template mode stack"

-- | Gets the current number of template modes.
templateModeCount :: Parser s -> ST s Int
templateModeCount :: forall s. Parser s -> ST s DOMID
templateModeCount p :: Parser s
p@Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} = forall (t :: * -> *) a. Foldable t => t a -> DOMID
length forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s a. STRef s a -> ST s a
rref STRef s [ParserMode]
parserTemplateMode

-- | Gets the appropriate insertion location.
appropriateInsertionLocation :: Parser s -> Maybe DOMID -> ST s DOMPos
appropriateInsertionLocation :: forall s. Parser s -> Maybe DOMID -> ST s DOMPos
appropriateInsertionLocation p :: Parser s
p@Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} Maybe DOMID
override = do
  -- (1) Check for override target.
  DOMID
target <- case Maybe DOMID
override of
    Just DOMID
a -> forall (f :: * -> *) a. Applicative f => a -> f a
pure DOMID
a
    Maybe DOMID
Nothing -> forall b a. b -> (a -> b) -> Maybe a -> b
maybe DOMID
domRoot forall a. a -> a
id forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s. Parser s -> ST s (Maybe DOMID)
currentNodeID Parser s
p
  forall s. Parser s -> DOMID -> ST s (Maybe DOMNode)
getNode Parser s
p DOMID
target forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
    Maybe DOMNode
Nothing ->
      forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ DOMID -> Maybe DOMID -> DOMPos
DOMPos DOMID
domRoot forall a. Maybe a
Nothing
    Just DOMNode
n -> do
      Bool
f <- forall s. Parser s -> ST s Bool
fosterParenting Parser s
p
      -- (2) Determine the adjusted insertion location.
      DOMPos
adjusted <-
        if Bool
f Bool -> Bool -> Bool
&& DOMNode -> BS
domNodeElementName DOMNode
n forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem`
          [ BS
"table", BS
"tbody", BS
"tfoot", BS
"thead", BS
"tr" ]
        then do
          -- (2.1) Get last template in element stack.
          Maybe ElementDetails
lastTemplate <- forall s.
Parser s -> (ElementDetails -> Bool) -> ST s (Maybe ElementDetails)
elementStackFind Parser s
p forall a b. (a -> b) -> a -> b
$ \ElementDetails
x ->
            ElementDetails -> DOMType
elementDetailsType ElementDetails
x forall a. Eq a => a -> a -> Bool
== BS -> DOMType
domMakeTypeHTML BS
"template"
          -- (2.2) Get last table in element stack.
          Maybe ElementDetails
lastTable <- forall s.
Parser s -> (ElementDetails -> Bool) -> ST s (Maybe ElementDetails)
elementStackFind Parser s
p forall a b. (a -> b) -> a -> b
$ \ElementDetails
x ->
            ElementDetails -> DOMType
elementDetailsType ElementDetails
x forall a. Eq a => a -> a -> Bool
== BS -> DOMType
domMakeTypeHTML BS
"table"

          -- (2.3) Check for template and no table.
          if | Just (ElementDetails DOMID
i1 DOMID
_ DOMNode
n1 DOMType
_) <- Maybe ElementDetails
lastTemplate
             , Just (ElementDetails DOMID
i2 DOMID
_ DOMNode
_ DOMType
_) <- Maybe ElementDetails
lastTable
             , DOMID
i1 forall a. Ord a => a -> a -> Bool
< DOMID
i2 -> do
                 forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ DOMID -> Maybe DOMID -> DOMPos
DOMPos (DOMNode -> DOMID
domTemplateContents DOMNode
n1) forall a. Maybe a
Nothing

             | Just (ElementDetails DOMID
_ DOMID
_ DOMNode
n1 DOMType
_) <- Maybe ElementDetails
lastTemplate
             , Maybe ElementDetails
Nothing <- Maybe ElementDetails
lastTable -> do
                 forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ DOMID -> Maybe DOMID -> DOMPos
DOMPos (DOMNode -> DOMID
domTemplateContents DOMNode
n1) forall a. Maybe a
Nothing

             | Bool
otherwise -> case Maybe ElementDetails
lastTable of
                 Maybe ElementDetails
Nothing -> do
                   -- (2.4) If no last table then use first element.
                   DOMID
j <- forall a. HasCallStack => Maybe a -> a
fromJust forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s. Parser s -> ST s (Maybe DOMID)
lastNodeID Parser s
p
                   forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ DOMID -> Maybe DOMID -> DOMPos
DOMPos DOMID
j forall a. Maybe a
Nothing
                 Just (ElementDetails DOMID
_ DOMID
x2 DOMNode
n2 DOMType
_) -> do
                   -- (2.5) Check last table parent node.
                   if | DOMNode -> DOMID
domNodeParent DOMNode
n2 forall a. Eq a => a -> a -> Bool
/= DOMID
domNull ->
                          forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ DOMID -> Maybe DOMID -> DOMPos
DOMPos (DOMNode -> DOMID
domNodeParent DOMNode
n2) forall a b. (a -> b) -> a -> b
$ forall a. a -> Maybe a
Just DOMID
x2
                      | Bool
otherwise -> do
                          -- (2.6) Previous element is above last table.
                          DOMID
prev <- forall a. HasCallStack => Maybe a -> a
fromJust forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s. Parser s -> DOMID -> ST s (Maybe DOMID)
elementStackSucc Parser s
p DOMID
x2
                          -- (2.7) Location is after previous element last child.
                          forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ DOMID -> Maybe DOMID -> DOMPos
DOMPos DOMID
prev forall a. Maybe a
Nothing
        else
          forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ DOMID -> Maybe DOMID -> DOMPos
DOMPos DOMID
target forall a. Maybe a
Nothing
      forall s. Parser s -> DOMID -> ST s (Maybe DOMNode)
getNode Parser s
p (DOMPos -> DOMID
domPosParent DOMPos
adjusted) forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
        Just DOMTemplate{DOMID
Seq DOMAttr
HTMLNamespace
domTemplateAttributes :: DOMNode -> Seq DOMAttr
domTemplateNamespace :: DOMNode -> HTMLNamespace
domTemplateParent :: DOMNode -> DOMID
domTemplateID :: DOMNode -> DOMID
domTemplateContents :: DOMID
domTemplateAttributes :: Seq DOMAttr
domTemplateNamespace :: HTMLNamespace
domTemplateParent :: DOMID
domTemplateID :: DOMID
domTemplateContents :: DOMNode -> DOMID
..} ->
          -- (3) Use template contents instead.
          forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ DOMID -> Maybe DOMID -> DOMPos
DOMPos DOMID
domTemplateContents forall a. Maybe a
Nothing
        Maybe DOMNode
_otherwise ->
          -- (4) Return adjusted insertion location.
          forall (f :: * -> *) a. Applicative f => a -> f a
pure DOMPos
adjusted

-- | Gets the appropriate insertion location.
insertionLocation :: Parser s -> ST s DOMPos
insertionLocation :: forall s. Parser s -> ST s DOMPos
insertionLocation Parser s
p = forall s. Parser s -> Maybe DOMID -> ST s DOMPos
appropriateInsertionLocation Parser s
p forall a. Maybe a
Nothing

-- | Creates an element for a token.
-- The standard describes a much more involved process than
-- what is used here (refer to 12.2.5.1).
createElementForToken :: Parser s -> Token -> HTMLNamespace -> ST s DOMID
createElementForToken :: forall s. Parser s -> Token -> HTMLNamespace -> ST s DOMID
createElementForToken Parser s
p Token
t HTMLNamespace
s
  | Token -> BS
tStartName Token
t forall a. Eq a => a -> a -> Bool
== BS
"template" = do
      DOMID
i <- forall s. Parser s -> DOMNode -> ST s DOMID
newID Parser s
p forall a b. (a -> b) -> a -> b
$ DOMNode
domDefaultFragment
      DOMID
j <- forall s. Parser s -> DOMNode -> ST s DOMID
newID Parser s
p forall a b. (a -> b) -> a -> b
$ DOMTemplate
        { domTemplateID :: DOMID
domTemplateID         = DOMID
domNull
        , domTemplateNamespace :: HTMLNamespace
domTemplateNamespace  = HTMLNamespace
s
        , domTemplateAttributes :: Seq DOMAttr
domTemplateAttributes = forall a. Seq a
Seq.empty
        , domTemplateContents :: DOMID
domTemplateContents   = DOMID
i
        , domTemplateParent :: DOMID
domTemplateParent     = DOMID
domNull
        }
      forall s. Parser s -> (DOM -> DOM) -> ST s ()
modifyDOM Parser s
p forall a b. (a -> b) -> a -> b
$ DOMID -> DOMID -> DOM -> DOM
domSetParent DOMID
i DOMID
j
      forall (f :: * -> *) a. Applicative f => a -> f a
pure DOMID
j
  | Bool
otherwise = do
      DOMID
i <- forall s. Parser s -> DOMNode -> ST s DOMID
newID Parser s
p forall a b. (a -> b) -> a -> b
$ DOMElement
        { domElementID :: DOMID
domElementID         = DOMID
domNull
        , domElementName :: BS
domElementName       = Token -> BS
tStartName Token
t
        , domElementNamespace :: HTMLNamespace
domElementNamespace  = HTMLNamespace
s
        , domElementAttributes :: Seq DOMAttr
domElementAttributes = forall a. [a] -> Seq a
Seq.fromList forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map TAttr -> DOMAttr
f (Token -> [TAttr]
tStartAttr Token
t)
        , domElementChildren :: Seq DOMID
domElementChildren   = forall a. Seq a
Seq.empty
        , domElementParent :: DOMID
domElementParent     = DOMID
domNull
        }
      forall (f :: * -> *) a. Applicative f => a -> f a
pure DOMID
i
  where
    f :: TAttr -> DOMAttr
f (TAttr BS
n BS
v HTMLAttrNamespace
s) = BS -> BS -> HTMLAttrNamespace -> DOMAttr
DOMAttr BS
n BS
v HTMLAttrNamespace
s

-- | Inserts a foreign element into the document.
insertForeignElement :: Parser s -> HTMLNamespace -> Token -> ST s ()
insertForeignElement :: forall s. Parser s -> HTMLNamespace -> Token -> ST s ()
insertForeignElement Parser s
p HTMLNamespace
n =
  forall s. (Token -> ST s ()) -> Token -> ST s ()
withStartToken forall a b. (a -> b) -> a -> b
$ \Token
t -> do
    DOMID
i <- forall s. Parser s -> Token -> HTMLNamespace -> ST s DOMID
createElementForToken Parser s
p Token
t HTMLNamespace
n
    DOMPos
x <- forall s. Parser s -> ST s DOMPos
insertionLocation Parser s
p
    forall s. Parser s -> (DOM -> DOM) -> ST s ()
modifyDOM Parser s
p forall a b. (a -> b) -> a -> b
$ DOMPos -> DOMID -> DOM -> DOM
domInsert DOMPos
x DOMID
i
    forall s. Parser s -> DOMID -> ST s ()
elementStackPush Parser s
p DOMID
i

-- | Inserts an HTML element into the document.
insertHtmlElement :: Parser s -> Token -> ST s ()
insertHtmlElement :: forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p = forall s. Parser s -> HTMLNamespace -> Token -> ST s ()
insertForeignElement Parser s
p HTMLNamespace
HTMLNamespaceHTML

-- | Inserts a MathML element into the document.
insertMathMLElement :: Parser s -> Token -> ST s ()
insertMathMLElement :: forall s. Parser s -> Token -> ST s ()
insertMathMLElement Parser s
p = forall s. Parser s -> HTMLNamespace -> Token -> ST s ()
insertForeignElement Parser s
p HTMLNamespace
HTMLNamespaceMathML

-- | Inserts an SVG element into the document.
insertSvgElement :: Parser s -> Token -> ST s ()
insertSvgElement :: forall s. Parser s -> Token -> ST s ()
insertSvgElement Parser s
p = forall s. Parser s -> HTMLNamespace -> Token -> ST s ()
insertForeignElement Parser s
p HTMLNamespace
HTMLNamespaceSVG

-- | Inserts an HTML element into the document.
insertHtmlElementNamed :: Parser s -> BS -> ST s ()
insertHtmlElementNamed :: forall s. Parser s -> BS -> ST s ()
insertHtmlElementNamed Parser s
p BS
x = forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p forall a b. (a -> b) -> a -> b
$ BS -> Bool -> [TAttr] -> Token
TStart BS
x Bool
False []

-- | Adjusts the MathML attributes for a token.
adjustAttrMathML :: Token -> Token
adjustAttrMathML :: Token -> Token
adjustAttrMathML Token
t =
  case Token
t of
    TStart {} -> Token
t { tStartAttr :: [TAttr]
tStartAttr = forall a b. (a -> b) -> [a] -> [b]
map TAttr -> TAttr
f forall a b. (a -> b) -> a -> b
$ Token -> [TAttr]
tStartAttr Token
t }
    Token
_otherwise -> Token
t
  where
    f :: TAttr -> TAttr
f (TAttr BS
n BS
v HTMLAttrNamespace
s) = BS -> BS -> HTMLAttrNamespace -> TAttr
TAttr (forall {a}. (Eq a, IsString a) => a -> a
g BS
n) BS
v HTMLAttrNamespace
s
    g :: a -> a
g a
x = if a
x forall a. Eq a => a -> a -> Bool
== a
"definitionurl" then a
"definitionUrl" else a
x

-- | Adjusts the SVG attributes for a token.
adjustAttrSVG :: Token -> Token
adjustAttrSVG :: Token -> Token
adjustAttrSVG Token
token =
  case Token
token of
    TStart {Bool
[TAttr]
BS
tStartAttr :: [TAttr]
tStartClosed :: Bool
tStartName :: BS
tStartAttr :: Token -> [TAttr]
tStartClosed :: Token -> Bool
tStartName :: Token -> BS
..} ->
      Token
token { tStartAttr :: [TAttr]
tStartAttr = forall a b. (a -> b) -> [a] -> [b]
map TAttr -> TAttr
f [TAttr]
tStartAttr }
    Token
_otherwise ->
      Token
token
  where
    f :: TAttr -> TAttr
f a :: TAttr
a@(TAttr BS
n BS
v HTMLAttrNamespace
s) =
      case forall k a. Ord k => k -> Map k a -> Maybe a
Map.lookup BS
n Map BS BS
svgAttributeMap of
        Just BS
n' -> BS -> BS -> HTMLAttrNamespace -> TAttr
TAttr BS
n' BS
v HTMLAttrNamespace
s
        Maybe BS
Nothing -> TAttr
a

-- | Adjusts the foreign attributes for a token.
adjustAttrForeign :: Token -> Token
adjustAttrForeign :: Token -> Token
adjustAttrForeign Token
token =
  case Token
token of
    TStart {Bool
[TAttr]
BS
tStartAttr :: [TAttr]
tStartClosed :: Bool
tStartName :: BS
tStartAttr :: Token -> [TAttr]
tStartClosed :: Token -> Bool
tStartName :: Token -> BS
..} ->
      Token
token { tStartAttr :: [TAttr]
tStartAttr = forall a b. (a -> b) -> [a] -> [b]
map TAttr -> TAttr
f [TAttr]
tStartAttr }
    Token
_otherwise ->
      Token
token
  where
    f :: TAttr -> TAttr
f a :: TAttr
a@(TAttr BS
n BS
v HTMLAttrNamespace
s) =
      case forall k a. Ord k => k -> Map k a -> Maybe a
Map.lookup BS
n Map BS (BS, HTMLAttrNamespace)
foreignAttributeMap of
        Just (BS
n', HTMLAttrNamespace
s') -> BS -> BS -> HTMLAttrNamespace -> TAttr
TAttr BS
n' BS
v HTMLAttrNamespace
s'
        Maybe (BS, HTMLAttrNamespace)
Nothing -> TAttr
a

-- | Adjusts the element name for an SVG element.
adjustElemSVG :: Token -> Token
adjustElemSVG :: Token -> Token
adjustElemSVG Token
token =
  case Token
token of
    TStart {Bool
[TAttr]
BS
tStartAttr :: [TAttr]
tStartClosed :: Bool
tStartName :: BS
tStartAttr :: Token -> [TAttr]
tStartClosed :: Token -> Bool
tStartName :: Token -> BS
..} ->
      case forall k a. Ord k => k -> Map k a -> Maybe a
Map.lookup BS
tStartName Map BS BS
svgElementMap of
        Just BS
x -> Token
token { tStartName :: BS
tStartName = BS
x }
        Maybe BS
Nothing -> Token
token
    Token
_otherwise ->
      Token
token

-- | Adjustable SVG attribute map.
svgAttributeMap :: Map BS BS
svgAttributeMap :: Map BS BS
svgAttributeMap = forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList
  [ (BS
"attributename", BS
"attributeName")
  , (BS
"attributetype", BS
"attributeType")
  , (BS
"basefrequency", BS
"baseFrequency")
  , (BS
"baseprofile", BS
"baseProfile")
  , (BS
"calcmode", BS
"calcMode")
  , (BS
"clippathunits", BS
"clipPathUnits")
  , (BS
"diffuseconstant", BS
"diffuseConstant")
  , (BS
"edgemode", BS
"edgeMode")
  , (BS
"filterunits", BS
"filterUnits")
  , (BS
"glyphref", BS
"glyphRef")
  , (BS
"gradienttransform", BS
"gradientTransform")
  , (BS
"gradientunits", BS
"gradientUnits")
  , (BS
"kernelmatrix", BS
"kernelMatrix")
  , (BS
"kernelunitlength", BS
"kernelUnitLength")
  , (BS
"keypoints", BS
"keyPoints")
  , (BS
"keysplines", BS
"keySplines")
  , (BS
"keytimes", BS
"keyTimes")
  , (BS
"lengthadjust", BS
"lengthAdjust")
  , (BS
"limitingconeangle", BS
"limitingConeAngle")
  , (BS
"markerheight", BS
"markerHeight")
  , (BS
"markerunits", BS
"markerUnits")
  , (BS
"markerwidth", BS
"markerWidth")
  , (BS
"maskcontentunits", BS
"maskContentUnits")
  , (BS
"maskunits", BS
"maskUnits")
  , (BS
"numoctaves", BS
"numOctaves")
  , (BS
"pathlength", BS
"pathLength")
  , (BS
"patterncontentunits", BS
"patternContentUnits")
  , (BS
"patterntransform", BS
"patternTransform")
  , (BS
"patternunits", BS
"patternUnits")
  , (BS
"pointsatx", BS
"pointsAtX")
  , (BS
"pointsaty", BS
"pointsAtY")
  , (BS
"pointsatz", BS
"pointsAtZ")
  , (BS
"preservealpha", BS
"preserveAlpha")
  , (BS
"preserveaspectratio", BS
"preserveAspectRatio")
  , (BS
"primitiveunits", BS
"primitiveUnits")
  , (BS
"refx", BS
"refX")
  , (BS
"refy", BS
"refY")
  , (BS
"repeatcount", BS
"repeatCount")
  , (BS
"repeatdur", BS
"repeatDur")
  , (BS
"requiredextensions", BS
"requiredExtensions")
  , (BS
"requiredfeatures", BS
"requiredFeatures")
  , (BS
"specularconstant", BS
"specularConstant")
  , (BS
"specularexponent", BS
"specularExponent")
  , (BS
"spreadmethod", BS
"spreadMethod")
  , (BS
"startoffset", BS
"startOffset")
  , (BS
"stddeviation", BS
"stdDeviation")
  , (BS
"stitchtiles", BS
"stitchTiles")
  , (BS
"surfacescale", BS
"surfaceScale")
  , (BS
"systemlanguage", BS
"systemLanguage")
  , (BS
"tablevalues", BS
"tableValues")
  , (BS
"targetx", BS
"targetX")
  , (BS
"targety", BS
"targetY")
  , (BS
"textlength", BS
"textLength")
  , (BS
"viewbox", BS
"viewBox")
  , (BS
"viewtarget", BS
"viewTarget")
  , (BS
"xchannelselector", BS
"xChannelSelector")
  , (BS
"ychannelselector", BS
"yChannelSelector")
  , (BS
"zoomandpan", BS
"zoomAndPan")
  ]

-- | Adjustable SVG element map.
svgElementMap :: Map BS BS
svgElementMap :: Map BS BS
svgElementMap = forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList
  [ (BS
"altglyph", BS
"altGlyph")
  , (BS
"altglyphdef", BS
"altGlyphDef")
  , (BS
"altglyphitem", BS
"altGlyphItem")
  , (BS
"animatecolor", BS
"animateColor")
  , (BS
"animatemotion", BS
"animateMotion")
  , (BS
"animatetransform", BS
"animateTransform")
  , (BS
"clippath", BS
"clipPath")
  , (BS
"feblend", BS
"feBlend")
  , (BS
"fecolormatrix", BS
"feColorMatrix")
  , (BS
"fecomponenttransfer", BS
"feComponentTransfer")
  , (BS
"fecomposite", BS
"feComposite")
  , (BS
"feconvolvematrix", BS
"feConvolveMatrix")
  , (BS
"fediffuselighting", BS
"feDiffuseLighting")
  , (BS
"fedisplacementmap", BS
"feDisplacementMap")
  , (BS
"fedistantlight", BS
"feDistantLight")
  , (BS
"fedropshadow", BS
"feDropShadow")
  , (BS
"feflood", BS
"feFlood")
  , (BS
"fefunca", BS
"feFuncA")
  , (BS
"fefuncb", BS
"feFuncB")
  , (BS
"fefuncg", BS
"feFuncG")
  , (BS
"fefuncr", BS
"feFuncR")
  , (BS
"fegaussianblur", BS
"feGaussianBlur")
  , (BS
"feimage", BS
"feImage")
  , (BS
"femerge", BS
"feMerge")
  , (BS
"femergenode", BS
"feMergeNode")
  , (BS
"femorphology", BS
"feMorphology")
  , (BS
"feoffset", BS
"feOffset")
  , (BS
"fepointlight", BS
"fePointLight")
  , (BS
"fespecularlighting", BS
"feSpecularLighting")
  , (BS
"fespotlight", BS
"feSpotLight")
  , (BS
"fetile", BS
"feTile")
  , (BS
"feturbulence", BS
"feTurbulence")
  , (BS
"foreignobject", BS
"foreignObject")
  , (BS
"glyphref", BS
"glyphRef")
  , (BS
"lineargradient", BS
"linearGradient")
  , (BS
"radialgradient", BS
"radialGradient")
  , (BS
"textpath", BS
"textPath")
  ]

-- | Map of foreign attribute adjustments.
foreignAttributeMap :: Map BS (BS, HTMLAttrNamespace)
foreignAttributeMap :: Map BS (BS, HTMLAttrNamespace)
foreignAttributeMap = forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList
  [ (BS
"xlink:actuate", (BS
"actuate", HTMLAttrNamespace
HTMLAttrNamespaceXLink))
  , (BS
"xlink:arcrole", (BS
"arcrole", HTMLAttrNamespace
HTMLAttrNamespaceXLink))
  , (BS
"xlink:href", (BS
"href", HTMLAttrNamespace
HTMLAttrNamespaceXLink))
  , (BS
"xlink:role", (BS
"role", HTMLAttrNamespace
HTMLAttrNamespaceXLink))
  , (BS
"xlink:show", (BS
"show", HTMLAttrNamespace
HTMLAttrNamespaceXLink))
  , (BS
"xlink:title", (BS
"title", HTMLAttrNamespace
HTMLAttrNamespaceXLink))
  , (BS
"xlink:type", (BS
"type", HTMLAttrNamespace
HTMLAttrNamespaceXLink))
  , (BS
"xml:lang", (BS
"lang", HTMLAttrNamespace
HTMLAttrNamespaceXML))
  , (BS
"xml:space", (BS
"space", HTMLAttrNamespace
HTMLAttrNamespaceXML))
  , (BS
"xmlns", (BS
"xmlns", HTMLAttrNamespace
HTMLAttrNamespaceXMLNS))
  , (BS
"xmlns:xlink", (BS
"xlink", HTMLAttrNamespace
HTMLAttrNamespaceXMLNS))
  ]

-- | Inserts a node as a child of another node.
insertNode :: Parser s -> DOMPos -> DOMID -> ST s ()
insertNode :: forall s. Parser s -> DOMPos -> DOMID -> ST s ()
insertNode p :: Parser s
p@Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} DOMPos
i DOMID
x = forall s. Parser s -> (DOM -> DOM) -> ST s ()
modifyDOM Parser s
p forall a b. (a -> b) -> a -> b
$ DOMPos -> DOMID -> DOM -> DOM
domInsert DOMPos
i DOMID
x

-- | Inserts a new node as a child of another node.
insertNewNode :: Parser s -> DOMPos -> DOMNode -> ST s DOMID
insertNewNode :: forall s. Parser s -> DOMPos -> DOMNode -> ST s DOMID
insertNewNode p :: Parser s
p@Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} DOMPos
i DOMNode
x = do
  DOM
d <- forall s. Parser s -> ST s DOM
getDOM Parser s
p
  let (DOM
d', DOMID
j) = DOMPos -> DOMNode -> DOM -> (DOM, DOMID)
domInsertNew DOMPos
i DOMNode
x DOM
d
  forall s. Parser s -> DOM -> ST s ()
setDOM Parser s
p DOM
d'
  forall (f :: * -> *) a. Applicative f => a -> f a
pure DOMID
j

-- | Inserts a node as a child of the document.
insertDocumentNode :: Parser s -> DOMID -> ST s ()
insertDocumentNode :: forall s. Parser s -> DOMID -> ST s ()
insertDocumentNode p :: Parser s
p@Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} = forall s. Parser s -> DOMPos -> DOMID -> ST s ()
insertNode Parser s
p DOMPos
domRootPos

-- | Inserts a new node as a child of the document.
insertNewDocumentNode :: Parser s -> DOMNode -> ST s ()
insertNewDocumentNode :: forall s. Parser s -> DOMNode -> ST s ()
insertNewDocumentNode p :: Parser s
p@Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} = forall (f :: * -> *) a. Functor f => f a -> f ()
void forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall s. Parser s -> DOMPos -> DOMNode -> ST s DOMID
insertNewNode Parser s
p DOMPos
domRootPos

-- | Makes a comment node.
commentMake :: Parser s -> Token -> ST s DOMNode
commentMake :: forall s. Parser s -> Token -> ST s DOMNode
commentMake p :: Parser s
p@Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} Token
t =
  forall (f :: * -> *) a. Applicative f => a -> f a
pure DOMComment
    { domCommentID :: DOMID
domCommentID     = DOMID
domNull
    , domCommentData :: BS
domCommentData   = Token -> BS
tCommentData Token
t
    , domCommentParent :: DOMID
domCommentParent = DOMID
domNull
    }

-- | Makes a document type node.
doctypeMake :: Parser s -> Token -> ST s DOMNode
doctypeMake :: forall s. Parser s -> Token -> ST s DOMNode
doctypeMake p :: Parser s
p@Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} = forall (f :: * -> *) a. Applicative f => a -> f a
pure forall b c a. (b -> c) -> (a -> b) -> a -> c
. \case
  TDoctype {Bool
Maybe BS
BS
tDoctypeSystem :: Maybe BS
tDoctypePublic :: Maybe BS
tDoctypeQuirks :: Bool
tDoctypeName :: BS
tDoctypeSystem :: Token -> Maybe BS
tDoctypePublic :: Token -> Maybe BS
tDoctypeQuirks :: Token -> Bool
tDoctypeName :: Token -> BS
..} ->
    DOMDoctype
      { domDoctypeID :: DOMID
domDoctypeID       = DOMID
domNull
      , domDoctypeName :: BS
domDoctypeName     = BS
tDoctypeName
      , domDoctypePublicID :: Maybe BS
domDoctypePublicID = Maybe BS
tDoctypePublic
      , domDoctypeSystemID :: Maybe BS
domDoctypeSystemID = Maybe BS
tDoctypeSystem
      , domDoctypeParent :: DOMID
domDoctypeParent   = DOMID
domNull
      }
  Token
_otherwise ->
    DOMNode
domDefaultDoctype

-- | Inserts a new comment in the document.
insertComment :: Parser s -> Token -> ST s ()
insertComment :: forall s. Parser s -> Token -> ST s ()
insertComment p :: Parser s
p@Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} Token
t =
  forall s. Parser s -> ST s DOMPos
insertionLocation Parser s
p forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \DOMPos
x ->
    forall s. Parser s -> Token -> ST s DOMNode
commentMake Parser s
p Token
t forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall (f :: * -> *) a. Functor f => f a -> f ()
void forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall s. Parser s -> DOMPos -> DOMNode -> ST s DOMID
insertNewNode Parser s
p DOMPos
x

-- | Inserts a new comment as child of the document node.
insertDocComment :: Parser s -> Token -> ST s ()
insertDocComment :: forall s. Parser s -> Token -> ST s ()
insertDocComment p :: Parser s
p@Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} Token
t =
  forall s. Parser s -> Token -> ST s DOMNode
commentMake Parser s
p Token
t forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall (f :: * -> *) a. Functor f => f a -> f ()
void forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall s. Parser s -> DOMPos -> DOMNode -> ST s DOMID
insertNewNode Parser s
p DOMPos
domRootPos

-- | Inserts a new character in the document.
insertChar :: Parser s -> Token -> ST s ()
insertChar :: forall s. Parser s -> Token -> ST s ()
insertChar p :: Parser s
p@Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} =
  forall s. (Word8 -> ST s ()) -> Token -> ST s ()
withCharToken forall a b. (a -> b) -> a -> b
$ \Word8
w -> do
    DOMPos
pos <- forall s. Parser s -> ST s DOMPos
insertionLocation Parser s
p
    let i :: DOMID
i = DOMPos -> DOMID
domPosParent DOMPos
pos
    forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (DOMID
i forall a. Eq a => a -> a -> Bool
/= DOMID
domRoot) forall a b. (a -> b) -> a -> b
$ do
      DOM
d <- forall s. Parser s -> ST s DOM
getDOM Parser s
p
      case DOM -> DOMID -> Maybe DOMID
domLastChild DOM
d DOMID
i of
        Maybe DOMID
Nothing -> do
          DOMID
j <- forall s. Parser s -> DOMPos -> DOMNode -> ST s DOMID
insertNewNode Parser s
p DOMPos
pos DOMNode
domDefaultText
          forall s. Parser s -> DOMID -> Word8 -> ST s ()
textMapAppend Parser s
p DOMID
j Word8
w
        Just DOMID
x ->
          case DOM -> DOMID -> Maybe DOMNode
domGetNode DOM
d DOMID
x of
            Just n :: DOMNode
n@DOMText{DOMID
BS
domTextData :: DOMNode -> BS
domTextParent :: DOMNode -> DOMID
domTextID :: DOMNode -> DOMID
domTextData :: BS
domTextParent :: DOMID
domTextID :: DOMID
..} ->
              forall s. Parser s -> DOMID -> Word8 -> ST s ()
textMapAppend Parser s
p DOMID
domTextID Word8
w
            Just DOMNode
n -> do
              DOMID
j <- forall s. Parser s -> DOMPos -> DOMNode -> ST s DOMID
insertNewNode Parser s
p DOMPos
pos DOMNode
domDefaultText
              forall s. Parser s -> DOMID -> Word8 -> ST s ()
textMapAppend Parser s
p DOMID
j Word8
w
            Maybe DOMNode
Nothing ->
              forall s. Parser s -> Maybe Token -> BS -> ST s ()
parseError Parser s
p forall a. Maybe a
Nothing forall a b. (a -> b) -> a -> b
$ BS
"insert char bad id: " forall a. Semigroup a => a -> a -> a
<> String -> BS
bcPack (forall a. Show a => a -> String
show DOMID
x)

-- | Appends a word to a text node buffer.
textMapAppend :: Parser s -> DOMID -> Word8 -> ST s ()
textMapAppend :: forall s. Parser s -> DOMID -> Word8 -> ST s ()
textMapAppend Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} DOMID
i Word8
w = do
  IntMap (STRef s (Buffer s))
m <- forall s a. STRef s a -> ST s a
rref STRef s (IntMap (STRef s (Buffer s)))
parserTextMap
  case forall a. DOMID -> IntMap a -> Maybe a
IntMap.lookup DOMID
i IntMap (STRef s (Buffer s))
m of
    Just STRef s (Buffer s)
b ->
      forall s. Word8 -> STRef s (Buffer s) -> ST s ()
bufferAppend Word8
w STRef s (Buffer s)
b
    Maybe (STRef s (Buffer s))
Nothing -> do
      STRef s (Buffer s)
b <- forall s. ST s (STRef s (Buffer s))
bufferNew
      forall s. Word8 -> STRef s (Buffer s) -> ST s ()
bufferAppend Word8
w STRef s (Buffer s)
b
      forall s a. STRef s a -> a -> ST s ()
wref STRef s (IntMap (STRef s (Buffer s)))
parserTextMap forall a b. (a -> b) -> a -> b
$ forall a. DOMID -> a -> IntMap a -> IntMap a
IntMap.insert DOMID
i STRef s (Buffer s)
b IntMap (STRef s (Buffer s))
m

-- | Finds a buffered string in the text map.
textMapLookup :: Parser s -> DOMID -> ST s BS
textMapLookup :: forall s. Parser s -> DOMID -> ST s BS
textMapLookup Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} DOMID
i = do
  IntMap (STRef s (Buffer s))
m <- forall s a. STRef s a -> ST s a
rref STRef s (IntMap (STRef s (Buffer s)))
parserTextMap
  case forall a. DOMID -> IntMap a -> Maybe a
IntMap.lookup DOMID
i IntMap (STRef s (Buffer s))
m of
    Just STRef s (Buffer s)
b  -> forall s. STRef s (Buffer s) -> ST s BS
bufferPack STRef s (Buffer s)
b
    Maybe (STRef s (Buffer s))
Nothing -> forall (f :: * -> *) a. Applicative f => a -> f a
pure BS
bsEmpty

-- | Returns a dom with the text nodes populated with text values.
textMapDOM :: Parser s -> ST s DOM
textMapDOM :: forall s. Parser s -> ST s DOM
textMapDOM p :: Parser s
p@Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} = do
  DOM{DOMID
DOMMap
domNextID :: DOM -> DOMID
domNodes :: DOM -> DOMMap
domNextID :: DOMID
domNodes :: DOMMap
..} <- forall s. Parser s -> ST s DOM
getDOM Parser s
p
  IntMap BS
m <- forall s a. STRef s a -> ST s a
rref STRef s (IntMap (STRef s (Buffer s)))
parserTextMap forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM forall s. STRef s (Buffer s) -> ST s BS
bufferPack
  let f :: DOMID -> BS
f DOMID
x = forall a. a -> DOMID -> IntMap a -> a
IntMap.findWithDefault BS
bsEmpty DOMID
x IntMap BS
m
      a :: DOMMap
a = forall a b c. (a -> b -> c) -> b -> a -> c
flip forall a b. (DOMID -> a -> b) -> IntMap a -> IntMap b
IntMap.mapWithKey DOMMap
domNodes forall a b. (a -> b) -> a -> b
$ \DOMID
i DOMNode
n ->
             case DOMNode
n of
               DOMText{} -> DOMNode
n { domTextData :: BS
domTextData = DOMID -> BS
f DOMID
i }
               DOMNode
_otherwise -> DOMNode
n
  forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ DOMMap -> DOMID -> DOM
DOM DOMMap
a DOMID
domNextID

-- | Invokes processing for a start tag token token.
withStartToken :: (Token -> ST s ()) -> Token -> ST s ()
withStartToken :: forall s. (Token -> ST s ()) -> Token -> ST s ()
withStartToken Token -> ST s ()
f = \case
  t :: Token
t@TStart {} -> Token -> ST s ()
f Token
t
  Token
_otherwise -> forall (f :: * -> *) a. Applicative f => a -> f a
pure ()

-- -- | Invokes processing for a character token.
withCharToken :: (Word8 -> ST s ()) -> Token -> ST s ()
withCharToken :: forall s. (Word8 -> ST s ()) -> Token -> ST s ()
withCharToken Word8 -> ST s ()
f = \case
  TChar Word8
w    -> Word8 -> ST s ()
f Word8
w
  Token
_otherwise -> forall (f :: * -> *) a. Applicative f => a -> f a
pure ()

-- | Updates the parser lexer using a combinator.
parserLexerUpdate :: Parser s -> (Lexer s -> ST s ()) -> ST s ()
parserLexerUpdate :: forall s. Parser s -> (Lexer s -> ST s ()) -> ST s ()
parserLexerUpdate Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} Lexer s -> ST s ()
f = forall s a. STRef s a -> ST s a
rref STRef s (Lexer s)
parserLexer forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Lexer s -> ST s ()
f

-- | Sets the lexer to skip next linefeed.
parserSkipNextLF :: Parser s -> ST s ()
parserSkipNextLF :: forall s. Parser s -> ST s ()
parserSkipNextLF Parser s
p = forall s. Parser s -> (Lexer s -> ST s ()) -> ST s ()
parserLexerUpdate Parser s
p forall s. Lexer s -> ST s ()
lexerSkipNextLF

-- | Sets the lexer to RCDATA mode.
parserSetRCDATA :: Parser s -> ST s ()
parserSetRCDATA :: forall s. Parser s -> ST s ()
parserSetRCDATA Parser s
p = forall s. Parser s -> (Lexer s -> ST s ()) -> ST s ()
parserLexerUpdate Parser s
p forall s. Lexer s -> ST s ()
lexerSetRCDATA

-- | Sets the lexer to raw text mode.
parserSetRAWTEXT :: Parser s -> ST s ()
parserSetRAWTEXT :: forall s. Parser s -> ST s ()
parserSetRAWTEXT Parser s
p = forall s. Parser s -> (Lexer s -> ST s ()) -> ST s ()
parserLexerUpdate Parser s
p forall s. Lexer s -> ST s ()
lexerSetRAWTEXT

-- | Sets the lexer to plaintext mode.
parserSetPLAINTEXT :: Parser s -> ST s ()
parserSetPLAINTEXT :: forall s. Parser s -> ST s ()
parserSetPLAINTEXT Parser s
p = forall s. Parser s -> (Lexer s -> ST s ()) -> ST s ()
parserLexerUpdate Parser s
p forall s. Lexer s -> ST s ()
lexerSetPLAINTEXT

-- | Sets the lexer to script data mode.
parserSetScriptData :: Parser s -> ST s ()
parserSetScriptData :: forall s. Parser s -> ST s ()
parserSetScriptData Parser s
p = forall s. Parser s -> (Lexer s -> ST s ()) -> ST s ()
parserLexerUpdate Parser s
p forall s. Lexer s -> ST s ()
lexerSetScriptData

-- | Inserts an RCDATA text element.
insertElementRCDATA :: Parser s -> Token -> ST s ()
insertElementRCDATA :: forall s. Parser s -> Token -> ST s ()
insertElementRCDATA Parser s
p Token
t = do
  forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
  forall s. Parser s -> ST s ()
parserSetRCDATA Parser s
p
  forall s. Parser s -> ST s ()
saveMode Parser s
p
  forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeText

-- | Inserts a raw text element.
insertElementRAWTEXT :: Parser s -> Token -> ST s ()
insertElementRAWTEXT :: forall s. Parser s -> Token -> ST s ()
insertElementRAWTEXT Parser s
p Token
t = do
  forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
  forall s. Parser s -> ST s ()
parserSetRAWTEXT Parser s
p
  forall s. Parser s -> ST s ()
saveMode Parser s
p
  forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeText

-- | Generates the implied end tags.
generateImpliedEndTags :: Parser s -> ST s ()
generateImpliedEndTags :: forall s. Parser s -> ST s ()
generateImpliedEndTags Parser s
p = forall s. Parser s -> BS -> ST s ()
generateImpliedEndTagsExcept Parser s
p BS
bsEmpty

-- | Generates the implied end tags with an exception.
generateImpliedEndTagsExcept :: Parser s -> BS -> ST s ()
generateImpliedEndTagsExcept :: forall s. Parser s -> BS -> ST s ()
generateImpliedEndTagsExcept Parser s
p BS
x =
  forall s. Parser s -> (DOMNode -> Bool) -> ST s ()
elementStackPopWhile Parser s
p forall a b. (a -> b) -> a -> b
$ [BS] -> DOMNode -> Bool
elementNameIn forall a b. (a -> b) -> a -> b
$
    forall a. (a -> Bool) -> [a] -> [a]
filter (forall a. Eq a => a -> a -> Bool
/=BS
x) [ BS
"dd", BS
"dt", BS
"li", BS
"menuitem", BS
"optgroup",
                   BS
"option", BS
"p", BS
"rb", BS
"rp", BS
"rt", BS
"rtc" ]

-- | Generates the implied end tags.
generateImpliedEndTagsThoroughly :: Parser s -> ST s ()
generateImpliedEndTagsThoroughly :: forall s. Parser s -> ST s ()
generateImpliedEndTagsThoroughly Parser s
p =
  forall s. Parser s -> (DOMNode -> Bool) -> ST s ()
elementStackPopWhile Parser s
p forall a b. (a -> b) -> a -> b
$ [BS] -> DOMNode -> Bool
elementNameIn
    [ BS
"caption", BS
"colgroup", BS
"dd", BS
"dt", BS
"li", BS
"optgroup",
      BS
"option", BS
"p", BS
"rb", BS
"rp", BS
"rt", BS
"rtc",
      BS
"tbody", BS
"td", BS
"tfoot", BS
"th", BS
"thead", BS
"tr" ]

-- | Resets the insertion mode appropriately.
resetInsertionMode :: Parser s -> ST s ()
resetInsertionMode :: forall s. Parser s -> ST s ()
resetInsertionMode p :: Parser s
p@Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} =
  forall s. Parser s -> ST s [DOMNode]
elementStackNodes Parser s
p forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= [DOMNode] -> ST s ()
f
  where
    f :: [DOMNode] -> ST s ()
f [] = forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
    f (DOMNode
x:[DOMNode]
xs) = do
      DOMNode
x' <- ST s DOMNode
node
      case (DOMNode -> BS
domNodeElementName DOMNode
x', Bool
lastNode) of
        (BS
"select", Bool
_)   -> [DOMNode] -> ST s ()
g (DOMNode
x'forall a. a -> [a] -> [a]
:[DOMNode]
xs)
        (BS
"td", Bool
False)   -> forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInCell
        (BS
"th", Bool
False)   -> forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInCell
        (BS
"tr", Bool
_)       -> forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInRow
        (BS
"tbody", Bool
_)    -> forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInTableBody
        (BS
"thead", Bool
_)    -> forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInTableBody
        (BS
"tfoot", Bool
_)    -> forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInTableBody
        (BS
"caption", Bool
_)  -> forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInCaption
        (BS
"colgroup", Bool
_) -> forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInColumnGroup
        (BS
"table", Bool
_)    -> forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInTable
        (BS
"head", Bool
False) -> forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInHead
        (BS
"body", Bool
_)     -> forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInBody
        (BS
"frameset", Bool
_) -> forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInFrameset
        (BS
"template", Bool
_) -> forall s. Parser s -> ST s (Maybe ParserMode)
templateModeCurrent Parser s
p forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
                             Just ParserMode
m  -> forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
m
                             Maybe ParserMode
Nothing -> forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
        (BS
"html", Bool
_)     -> forall s. Parser s -> ST s (Maybe DOMID)
getHeadID Parser s
p forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
                             Maybe DOMID
Nothing -> forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeBeforeHead
                             Just DOMID
_  -> forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeAfterHead
        (BS
_, Bool
True)       -> forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInBody
        (BS
_, Bool
False)      -> [DOMNode] -> ST s ()
f [DOMNode]
xs
      where
        lastNode :: Bool
lastNode = forall (t :: * -> *) a. Foldable t => t a -> DOMID
length [DOMNode]
xs forall a. Eq a => a -> a -> Bool
== DOMID
0
        node :: ST s DOMNode
node = do
          Bool
a <- forall s a. STRef s a -> ST s a
rref STRef s Bool
parserFragmentMode
          Maybe DOMID
c <- forall s a. STRef s a -> ST s a
rref STRef s (Maybe DOMID)
parserContextElement
          Maybe DOMNode
n <- forall s. Parser s -> DOMID -> ST s (Maybe DOMNode)
getNode Parser s
p forall a b. (a -> b) -> a -> b
$ forall a. HasCallStack => Maybe a -> a
fromJust Maybe DOMID
c
          forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$
            if Bool
lastNode Bool -> Bool -> Bool
&& Bool
a Bool -> Bool -> Bool
&& forall a. Maybe a -> Bool
isJust Maybe DOMID
c
               then forall a. HasCallStack => Maybe a -> a
fromJust forall a b. (a -> b) -> a -> b
$ Maybe DOMNode
n
               else DOMNode
x

    g :: [DOMNode] -> ST s ()
g (DOMNode
x:[]) =
      forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInSelect
    g (DOMNode
x:DOMNode
y:[DOMNode]
ys) =
      case DOMNode -> BS
domNodeElementName DOMNode
y of
        BS
"template" -> forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInSelect
        BS
"table"    -> forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInSelectInTable
        BS
_otherwise -> [DOMNode] -> ST s ()
g (DOMNode
yforall a. a -> [a] -> [a]
:[DOMNode]
ys)

-- | Closes a P element.
closeElementP :: Parser s -> ST s ()
closeElementP :: forall s. Parser s -> ST s ()
closeElementP Parser s
p = do
  let t :: DOMType
t = BS -> DOMType
domMakeTypeHTML BS
"p"
  forall s. Parser s -> BS -> ST s ()
generateImpliedEndTagsExcept Parser s
p BS
"p"
  forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
unlessM (forall s. Parser s -> DOMType -> ST s Bool
currentNodeHasType Parser s
p DOMType
t) forall a b. (a -> b) -> a -> b
$
    forall s. Parser s -> Maybe Token -> BS -> ST s ()
parseError Parser s
p forall a. Maybe a
Nothing BS
"current node not p when closing p element"
  forall s. Parser s -> DOMType -> ST s ()
elementStackPopUntilType Parser s
p DOMType
t

-- | Defines the adoption agency state.
data ParserAdoptionAgency s = ParserAdoptionAgency
  { forall s. ParserAdoptionAgency s -> BS
aaSubject            :: BS
  , forall s. ParserAdoptionAgency s -> DOMID
aaOuterLoopCount     :: Int
  , forall s. ParserAdoptionAgency s -> DOMID
aaInnerLoopCount     :: Int
  , forall s. ParserAdoptionAgency s -> DOMID
aaNode               :: DOMID
  , forall s. ParserAdoptionAgency s -> DOMID
aaLastNode           :: DOMID
  , forall s. ParserAdoptionAgency s -> DOMID
aaNextNode           :: DOMID
  , forall s. ParserAdoptionAgency s -> DOMID
aaFormattingElement  :: DOMID
  , forall s. ParserAdoptionAgency s -> DOMID
aaCommonAncestor     :: DOMID
  , forall s. ParserAdoptionAgency s -> DOMID
aaFurthestBlock      :: DOMID
  , forall s. ParserAdoptionAgency s -> Maybe DOMID
aaBookmark           :: (Maybe DOMID)
  , forall s. ParserAdoptionAgency s -> ST s ()
aaAnyOtherEndTag     :: ST s ()
  }

-- | Defines the default adoption agency state.
defaultAA :: ST s (ParserAdoptionAgency s)
defaultAA :: forall s. ST s (ParserAdoptionAgency s)
defaultAA =
  forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ ParserAdoptionAgency
    { aaSubject :: BS
aaSubject            = BS
bsEmpty
    , aaOuterLoopCount :: DOMID
aaOuterLoopCount     = DOMID
0
    , aaInnerLoopCount :: DOMID
aaInnerLoopCount     = DOMID
0
    , aaNode :: DOMID
aaNode               = DOMID
domNull
    , aaLastNode :: DOMID
aaLastNode           = DOMID
domNull
    , aaNextNode :: DOMID
aaNextNode           = DOMID
domNull
    , aaFormattingElement :: DOMID
aaFormattingElement  = DOMID
domNull
    , aaCommonAncestor :: DOMID
aaCommonAncestor     = DOMID
domNull
    , aaFurthestBlock :: DOMID
aaFurthestBlock      = DOMID
domNull
    , aaBookmark :: Maybe DOMID
aaBookmark           = forall a. Maybe a
Nothing
    , aaAnyOtherEndTag :: ST s ()
aaAnyOtherEndTag     = forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
    }

-- | Modifies the adoption agency state.
modifyAA :: Parser s -> (ParserAdoptionAgency s -> ParserAdoptionAgency s) -> ST s ()
modifyAA :: forall s.
Parser s
-> (ParserAdoptionAgency s -> ParserAdoptionAgency s) -> ST s ()
modifyAA Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} = forall s a. STRef s a -> (a -> a) -> ST s ()
uref STRef s (ParserAdoptionAgency s)
parserAdoptionAgency

-- | Gets the adoption agency state.
getAA :: Parser s -> ST s (ParserAdoptionAgency s)
getAA :: forall s. Parser s -> ST s (ParserAdoptionAgency s)
getAA Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} = forall s a. STRef s a -> ST s a
rref STRef s (ParserAdoptionAgency s)
parserAdoptionAgency

-- | Gets a field from the adoption agency state.
getsAA :: Parser s -> (ParserAdoptionAgency s -> a) -> ST s a
getsAA :: forall s a. Parser s -> (ParserAdoptionAgency s -> a) -> ST s a
getsAA Parser s
p ParserAdoptionAgency s -> a
f = ParserAdoptionAgency s -> a
f forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s. Parser s -> ST s (ParserAdoptionAgency s)
getAA Parser s
p

-- | Runs the adoption agency algorithm.
adoptionAgencyRun :: Parser s -> BS -> ST s () -> ST s ()
adoptionAgencyRun :: forall s. Parser s -> BS -> ST s () -> ST s ()
adoptionAgencyRun p :: Parser s
p@Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} BS
subject ST s ()
anyOther = do
  Bool
a <- forall s. Parser s -> DOMType -> ST s Bool
currentNodeHasType Parser s
p forall a b. (a -> b) -> a -> b
$ BS -> DOMType
domMakeTypeHTML BS
subject
  Bool
b <- forall s. Parser s -> ST s (Maybe DOMID)
currentNodeID Parser s
p forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
    Just DOMID
i -> forall (m :: * -> *). Functor m => m Bool -> m Bool
notM forall a b. (a -> b) -> a -> b
$ forall s. Parser s -> DOMID -> ST s Bool
activeFormatContains Parser s
p DOMID
i
    Maybe DOMID
Nothing -> forall (f :: * -> *) a. Applicative f => a -> f a
pure Bool
True
  forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless (Bool
a Bool -> Bool -> Bool
&& Bool
b) forall a b. (a -> b) -> a -> b
$ do
    ParserAdoptionAgency s
aa <- forall s. ST s (ParserAdoptionAgency s)
defaultAA
    forall s.
Parser s
-> (ParserAdoptionAgency s -> ParserAdoptionAgency s) -> ST s ()
modifyAA Parser s
p forall a b. (a -> b) -> a -> b
$ forall a b. a -> b -> a
const ParserAdoptionAgency s
aa
      { aaSubject :: BS
aaSubject        = BS
subject
      , aaAnyOtherEndTag :: ST s ()
aaAnyOtherEndTag = ST s ()
anyOther
      }
    forall s. Parser s -> ST s ()
adoptionAgencyOuterLoop Parser s
p

-- | Runs the outer loop portion of the adoption agency algorithm.
adoptionAgencyOuterLoop :: Parser s -> ST s ()
adoptionAgencyOuterLoop :: forall s. Parser s -> ST s ()
adoptionAgencyOuterLoop Parser s
p = do
  DOMID
i <- forall s a. Parser s -> (ParserAdoptionAgency s -> a) -> ST s a
getsAA Parser s
p forall s. ParserAdoptionAgency s -> DOMID
aaOuterLoopCount
  -- (3) Check outer loop counter.
  forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (DOMID
i forall a. Ord a => a -> a -> Bool
< DOMID
8) forall a b. (a -> b) -> a -> b
$ do
    -- (4) Increment outer loop counter.
    forall s.
Parser s
-> (ParserAdoptionAgency s -> ParserAdoptionAgency s) -> ST s ()
modifyAA Parser s
p forall a b. (a -> b) -> a -> b
$ \ParserAdoptionAgency s
a -> ParserAdoptionAgency s
a { aaOuterLoopCount :: DOMID
aaOuterLoopCount = forall s. ParserAdoptionAgency s -> DOMID
aaOuterLoopCount ParserAdoptionAgency s
a forall a. Num a => a -> a -> a
+ DOMID
1 }
    -- (5) Find the formatting element.
    forall (f :: * -> *) a b. Applicative f => (a -> b) -> f a -> f b
liftA forall s. ParserAdoptionAgency s -> BS
aaSubject (forall s. Parser s -> ST s (ParserAdoptionAgency s)
getAA Parser s
p) forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall s. Parser s -> BS -> ST s (Maybe ParserFormatItem)
activeFormatFindTag Parser s
p forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
      Maybe ParserFormatItem
Nothing -> do
        ST s ()
doAnyOtherEndTag <- forall s a. Parser s -> (ParserAdoptionAgency s -> a) -> ST s a
getsAA Parser s
p forall s. ParserAdoptionAgency s -> ST s ()
aaAnyOtherEndTag
        ST s ()
doAnyOtherEndTag
      Just (ParserFormatElement DOMID
fe Token
t) -> do
        forall s.
Parser s
-> (ParserAdoptionAgency s -> ParserAdoptionAgency s) -> ST s ()
modifyAA Parser s
p forall a b. (a -> b) -> a -> b
$ \ParserAdoptionAgency s
a -> ParserAdoptionAgency s
a { aaFormattingElement :: DOMID
aaFormattingElement = DOMID
fe }
        -- Geting formatting node
        DOMNode
x <- forall a. HasCallStack => Maybe a -> a
fromJust forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s. Parser s -> DOMID -> ST s (Maybe DOMNode)
getNode Parser s
p DOMID
fe
        let name :: BS
name = DOMNode -> BS
domElementName DOMNode
x
        -- (6) Check if formatting element is not in element stack.
        (forall s. Parser s -> (DOMNode -> Bool) -> ST s Bool
elementStackAny Parser s
p (forall a. Eq a => a -> a -> Bool
(==) DOMID
fe forall b c a. (b -> c) -> (a -> b) -> a -> c
. DOMNode -> DOMID
domNodeID)) forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
          Bool
False -> do
            forall s. Parser s -> Maybe Token -> BS -> ST s ()
parseError Parser s
p forall a. Maybe a
Nothing forall a b. (a -> b) -> a -> b
$
              BS
"element stack missing " forall a. Semigroup a => a -> a -> a
<> BS
name
              forall a. Semigroup a => a -> a -> a
<> BS
"(ID:" forall a. Semigroup a => a -> a -> a
<> String -> BS
bcPack (forall a. Show a => a -> String
show DOMID
fe) forall a. Semigroup a => a -> a -> a
<> BS
") during adoption"
            forall s. Parser s -> DOMID -> ST s ()
activeFormatRemove Parser s
p DOMID
fe
          Bool
True ->
            -- (7) Check if formatting element is not in scope.
            (forall s. Parser s -> DOMType -> ST s Bool
elementInScope Parser s
p forall a b. (a -> b) -> a -> b
$ DOMNode -> DOMType
domNodeType DOMNode
x) forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
              Bool
False ->
                forall s. Parser s -> Maybe Token -> BS -> ST s ()
parseError Parser s
p forall a. Maybe a
Nothing forall a b. (a -> b) -> a -> b
$
                  BS
"element " forall a. Semigroup a => a -> a -> a
<> BS
name forall a. Semigroup a => a -> a -> a
<> BS
" not in scope during adoption"
              Bool
True -> do
                -- (8) Check if formatting element is not current node.
                forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
unlessM (forall b a. b -> (a -> b) -> Maybe a -> b
maybe Bool
False (forall a. Eq a => a -> a -> Bool
==DOMID
fe) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s. Parser s -> ST s (Maybe DOMID)
currentNodeID Parser s
p) forall a b. (a -> b) -> a -> b
$
                  forall s. Parser s -> Maybe Token -> BS -> ST s ()
parseError Parser s
p forall a. Maybe a
Nothing forall a b. (a -> b) -> a -> b
$ BS
"element " forall a. Semigroup a => a -> a -> a
<> BS
name
                    forall a. Semigroup a => a -> a -> a
<> BS
" is not the current ID during adoption"
                -- (9) Find the furthest block.
                DOM
d <- forall s. Parser s -> ST s DOM
getDOM Parser s
p
                [DOMID] -> Maybe DOMID
f <- forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Maybe a
find forall a b. (a -> b) -> a -> b
$ DOMType -> Bool
elementIsSpecial
                  forall b c a. (b -> c) -> (a -> b) -> a -> c
. DOMNode -> DOMType
domNodeType forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. HasCallStack => Maybe a -> a
fromJust forall b c a. (b -> c) -> (a -> b) -> a -> c
. DOM -> DOMID -> Maybe DOMNode
domGetNode DOM
d
                forall (f :: * -> *) a b. Applicative f => (a -> b) -> f a -> f b
liftA ([DOMID] -> Maybe DOMID
f forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. [a] -> [a]
reverse forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. (a -> Bool) -> [a] -> [a]
takeWhile (forall a. Eq a => a -> a -> Bool
/=DOMID
fe)) (forall s. Parser s -> ST s [DOMID]
elementStack Parser s
p) forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
                  Maybe DOMID
Nothing -> do
                    -- (10) There was no furthest block.
                    forall s. Parser s -> DOMID -> ST s ()
elementStackPopUntilID Parser s
p DOMID
fe
                    forall s. Parser s -> DOMID -> ST s ()
activeFormatRemove Parser s
p DOMID
fe
                  Just DOMID
fb -> do
                    -- (11) Find the common ancestor.
                    DOMID
ca <- forall a. HasCallStack => Maybe a -> a
fromJust forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s. Parser s -> DOMID -> ST s (Maybe DOMID)
elementStackSucc Parser s
p DOMID
fe
                    -- (12) Bookmark notes position of formatting element.
                    Maybe DOMID
bm <- forall s. Parser s -> DOMID -> ST s (Maybe DOMID)
activeFormatSucc Parser s
p DOMID
fe
                    forall s.
Parser s
-> (ParserAdoptionAgency s -> ParserAdoptionAgency s) -> ST s ()
modifyAA Parser s
p forall a b. (a -> b) -> a -> b
$ \ParserAdoptionAgency s
a -> ParserAdoptionAgency s
a
                      { aaNode :: DOMID
aaNode = DOMID
fb
                      , aaLastNode :: DOMID
aaLastNode = DOMID
fb
                      , aaCommonAncestor :: DOMID
aaCommonAncestor = DOMID
ca
                      , aaFurthestBlock :: DOMID
aaFurthestBlock = DOMID
fb
                      , aaBookmark :: Maybe DOMID
aaBookmark = Maybe DOMID
bm
                      }
                    forall s. Parser s -> ST s ()
adoptionAgencyInnerLoop Parser s
p

-- | Runs the inner loop portion of the adoption agency algorithm.
adoptionAgencyInnerLoop :: Parser s -> ST s ()
adoptionAgencyInnerLoop :: forall s. Parser s -> ST s ()
adoptionAgencyInnerLoop Parser s
p = do
  -- (13.2) Increment inner loop counter.
  forall s.
Parser s
-> (ParserAdoptionAgency s -> ParserAdoptionAgency s) -> ST s ()
modifyAA Parser s
p forall a b. (a -> b) -> a -> b
$ \ParserAdoptionAgency s
a -> ParserAdoptionAgency s
a { aaInnerLoopCount :: DOMID
aaInnerLoopCount = forall s. ParserAdoptionAgency s -> DOMID
aaInnerLoopCount ParserAdoptionAgency s
a forall a. Num a => a -> a -> a
+ DOMID
1 }
  -- (13.3) Move to the next node.
  DOMID
n <- forall s a. Parser s -> (ParserAdoptionAgency s -> a) -> ST s a
getsAA Parser s
p forall s. ParserAdoptionAgency s -> DOMID
aaNode
  DOMID
m <- forall s a. Parser s -> (ParserAdoptionAgency s -> a) -> ST s a
getsAA Parser s
p forall s. ParserAdoptionAgency s -> DOMID
aaNextNode
  DOMID
node <- forall b a. b -> (a -> b) -> Maybe a -> b
maybe DOMID
m forall a. a -> a
id forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s. Parser s -> DOMID -> ST s (Maybe DOMID)
elementStackSucc Parser s
p DOMID
n
  -- (13.4) Check if node is the formatting element.
  DOMID
f <- forall s a. Parser s -> (ParserAdoptionAgency s -> a) -> ST s a
getsAA Parser s
p forall s. ParserAdoptionAgency s -> DOMID
aaFormattingElement
  if DOMID
node forall a. Eq a => a -> a -> Bool
== DOMID
f
     then forall s. Parser s -> ST s ()
adoptionAgencyPostLoop Parser s
p
     else do
       -- (13.5) Check the inner loop counter.
       DOMID
ic <- forall s a. Parser s -> (ParserAdoptionAgency s -> a) -> ST s a
getsAA Parser s
p forall s. ParserAdoptionAgency s -> DOMID
aaInnerLoopCount
       Bool
ac <- forall s. Parser s -> DOMID -> ST s Bool
activeFormatContains Parser s
p DOMID
node
       forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (DOMID
ic forall a. Ord a => a -> a -> Bool
> DOMID
3 Bool -> Bool -> Bool
&& Bool
ac) forall a b. (a -> b) -> a -> b
$ forall s. Parser s -> DOMID -> ST s ()
activeFormatRemove Parser s
p DOMID
node
       -- (13.6) Check if node is in the active format list.
       forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
unlessM (forall s. Parser s -> DOMID -> ST s Bool
activeFormatContains Parser s
p DOMID
node) forall a b. (a -> b) -> a -> b
$ do
         DOMID
m <- forall a. HasCallStack => Maybe a -> a
fromJust forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s. Parser s -> DOMID -> ST s (Maybe DOMID)
elementStackSucc Parser s
p DOMID
node
         forall s.
Parser s
-> (ParserAdoptionAgency s -> ParserAdoptionAgency s) -> ST s ()
modifyAA Parser s
p forall a b. (a -> b) -> a -> b
$ \ParserAdoptionAgency s
a -> ParserAdoptionAgency s
a { aaNextNode :: DOMID
aaNextNode = DOMID
m }
         forall s. Parser s -> DOMID -> ST s ()
elementStackRemove Parser s
p DOMID
node
         forall s. Parser s -> ST s ()
adoptionAgencyInnerLoop Parser s
p
       -- (13.7) Create an element for the token for node.
       Token
t <- forall a. HasCallStack => Maybe a -> a
fromJust forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s. Parser s -> DOMID -> ST s (Maybe Token)
activeFormatFindToken Parser s
p DOMID
node
       DOMID
e <- forall s. Parser s -> Token -> HTMLNamespace -> ST s DOMID
createElementForToken Parser s
p Token
t HTMLNamespace
HTMLNamespaceHTML
       DOMID
c <- forall s a. Parser s -> (ParserAdoptionAgency s -> a) -> ST s a
getsAA Parser s
p forall s. ParserAdoptionAgency s -> DOMID
aaCommonAncestor
       forall s. Parser s -> (DOM -> DOM) -> ST s ()
modifyDOM Parser s
p forall a b. (a -> b) -> a -> b
$ DOMID -> DOMID -> DOM -> DOM
domAppend DOMID
c DOMID
e
       forall s. Parser s -> DOMID -> DOMID -> ST s ()
activeFormatReplace Parser s
p DOMID
node DOMID
e
       forall s. Parser s -> DOMID -> DOMID -> ST s ()
elementStackReplace Parser s
p DOMID
node DOMID
e
       forall s.
Parser s
-> (ParserAdoptionAgency s -> ParserAdoptionAgency s) -> ST s ()
modifyAA Parser s
p forall a b. (a -> b) -> a -> b
$ \ParserAdoptionAgency s
a -> ParserAdoptionAgency s
a { aaNode :: DOMID
aaNode = DOMID
e }
       -- (13.8) Check if node is the furthest block.
       DOMID
x <- forall s a. Parser s -> (ParserAdoptionAgency s -> a) -> ST s a
getsAA Parser s
p forall s. ParserAdoptionAgency s -> DOMID
aaLastNode
       DOMID
b <- forall s a. Parser s -> (ParserAdoptionAgency s -> a) -> ST s a
getsAA Parser s
p forall s. ParserAdoptionAgency s -> DOMID
aaFurthestBlock
       forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (DOMID
x forall a. Eq a => a -> a -> Bool
== DOMID
b) forall a b. (a -> b) -> a -> b
$ do
         Maybe DOMID
bm <- forall s. Parser s -> DOMID -> ST s (Maybe DOMID)
activeFormatSucc Parser s
p DOMID
e
         forall s.
Parser s
-> (ParserAdoptionAgency s -> ParserAdoptionAgency s) -> ST s ()
modifyAA Parser s
p forall a b. (a -> b) -> a -> b
$ \ParserAdoptionAgency s
a -> ParserAdoptionAgency s
a { aaBookmark :: Maybe DOMID
aaBookmark = Maybe DOMID
bm }
       -- (13.9) Insert last node into node.
       forall s. Parser s -> (DOM -> DOM) -> ST s ()
modifyDOM Parser s
p forall a b. (a -> b) -> a -> b
$ DOMID -> DOMID -> DOM -> DOM
domMove DOMID
x DOMID
e
       -- (13.10) Set last node to be node.
       forall s.
Parser s
-> (ParserAdoptionAgency s -> ParserAdoptionAgency s) -> ST s ()
modifyAA Parser s
p forall a b. (a -> b) -> a -> b
$ \ParserAdoptionAgency s
a -> ParserAdoptionAgency s
a { aaLastNode :: DOMID
aaLastNode = DOMID
e }
       -- (13.11) Repeat inner loop.
       forall s. Parser s -> ST s ()
adoptionAgencyInnerLoop Parser s
p

-- | Runs the post-loop portion of the adoption agency algorithm.
adoptionAgencyPostLoop :: Parser s -> ST s ()
adoptionAgencyPostLoop :: forall s. Parser s -> ST s ()
adoptionAgencyPostLoop Parser s
p = do
  -- (14) Insert last node with common ancestor as target.
  DOMID
c <- forall s a. Parser s -> (ParserAdoptionAgency s -> a) -> ST s a
getsAA Parser s
p forall s. ParserAdoptionAgency s -> DOMID
aaCommonAncestor
  DOMID
n <- forall s a. Parser s -> (ParserAdoptionAgency s -> a) -> ST s a
getsAA Parser s
p forall s. ParserAdoptionAgency s -> DOMID
aaLastNode
  DOMPos
i <- forall s. Parser s -> Maybe DOMID -> ST s DOMPos
appropriateInsertionLocation Parser s
p forall a b. (a -> b) -> a -> b
$ forall a. a -> Maybe a
Just DOMID
c
  forall s. Parser s -> (DOM -> DOM) -> ST s ()
modifyDOM Parser s
p forall a b. (a -> b) -> a -> b
$ DOMID -> DOMID -> DOM -> DOM
domMove DOMID
n forall a b. (a -> b) -> a -> b
$ DOMPos -> DOMID
domPosParent DOMPos
i
  -- (15) Create element for token.
  DOMID
f <- forall s a. Parser s -> (ParserAdoptionAgency s -> a) -> ST s a
getsAA Parser s
p forall s. ParserAdoptionAgency s -> DOMID
aaFormattingElement
  Token
t <- forall a. HasCallStack => Maybe a -> a
fromJust forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s. Parser s -> DOMID -> ST s (Maybe Token)
activeFormatFindToken Parser s
p DOMID
f
  DOMID
e <- forall s. Parser s -> Token -> HTMLNamespace -> ST s DOMID
createElementForToken Parser s
p Token
t HTMLNamespace
HTMLNamespaceHTML
  -- (16) Move furthest block children to new element.
  DOMID
b <- forall s a. Parser s -> (ParserAdoptionAgency s -> a) -> ST s a
getsAA Parser s
p forall s. ParserAdoptionAgency s -> DOMID
aaFurthestBlock
  forall s. Parser s -> (DOM -> DOM) -> ST s ()
modifyDOM Parser s
p forall a b. (a -> b) -> a -> b
$ DOMID -> DOMID -> DOM -> DOM
domMoveChildren DOMID
b DOMID
e
  -- (17) Append new element to furthest block.
  forall s. Parser s -> (DOM -> DOM) -> ST s ()
modifyDOM Parser s
p forall a b. (a -> b) -> a -> b
$ DOMID -> DOMID -> DOM -> DOM
domAppend DOMID
b DOMID
e
  -- (18) Remove formatting element and insert new element.
  forall s. Parser s -> DOMID -> ST s ()
activeFormatRemove Parser s
p DOMID
f
  forall s a. Parser s -> (ParserAdoptionAgency s -> a) -> ST s a
getsAA Parser s
p forall s. ParserAdoptionAgency s -> Maybe DOMID
aaBookmark forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall s. Parser s -> DOMID -> Token -> Maybe DOMID -> ST s ()
activeFormatInsertElement Parser s
p DOMID
e Token
t
  -- (19) Remove formatting element and insert new element.
  forall s. Parser s -> DOMID -> ST s ()
elementStackRemove Parser s
p DOMID
f
  forall s. Parser s -> DOMID -> DOMID -> ST s ()
elementStackInsertBefore Parser s
p DOMID
b DOMID
e
  -- (20) Jump back to outer loop.
  forall s. Parser s -> ST s ()
adoptionAgencyOuterLoop Parser s
p

-- | Initializes the pending table characters.
pendingTableCharInit :: Parser s -> ST s ()
pendingTableCharInit :: forall s. Parser s -> ST s ()
pendingTableCharInit Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} = forall s a. STRef s a -> a -> ST s ()
wref STRef s [Token]
parserTableChars []

-- | Appends a character to the pending table characters.
pendingTableCharAppend :: Parser s -> Token -> ST s ()
pendingTableCharAppend :: forall s. Parser s -> Token -> ST s ()
pendingTableCharAppend Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} Token
t = forall s a. STRef s a -> (a -> a) -> ST s ()
uref STRef s [Token]
parserTableChars (forall a. Semigroup a => a -> a -> a
<>[Token
t])

-- | Gets the pending table characters.
pendingTableChars :: Parser s -> ST s [Token]
pendingTableChars :: forall s. Parser s -> ST s [Token]
pendingTableChars Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} = forall s a. STRef s a -> ST s a
rref STRef s [Token]
parserTableChars

-- | Checks the DOCTYPE token for validity.
doctypeTokenCheck :: Parser s -> Token -> ST s ()
doctypeTokenCheck :: forall s. Parser s -> Token -> ST s ()
doctypeTokenCheck parser :: Parser s
parser@Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} t :: Token
t@(TDoctype BS
n Bool
q Maybe BS
p Maybe BS
s) =
  forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (BS
n forall a. Eq a => a -> a -> Bool
/= BS
"html"
    Bool -> Bool -> Bool
|| Maybe BS
p forall a. Eq a => a -> a -> Bool
/= forall a. Maybe a
Nothing
    Bool -> Bool -> Bool
|| Maybe BS
s forall a. Eq a => a -> a -> Bool
/= forall a. Maybe a
Nothing Bool -> Bool -> Bool
&& Maybe BS
s forall a. Eq a => a -> a -> Bool
/= forall a. a -> Maybe a
Just BS
"about:legacy-compat") forall a b. (a -> b) -> a -> b
$
    forall s. Parser s -> Maybe Token -> BS -> ST s ()
parseError Parser s
parser (forall a. a -> Maybe a
Just Token
t) BS
"doctype error"

-- | Determines if the doctype token represents quirks mode.
tokenQuirks :: Token -> Bool
tokenQuirks :: Token -> Bool
tokenQuirks (TDoctype BS
n Bool
True Maybe BS
p Maybe BS
s) = Bool
True
tokenQuirks (TDoctype BS
n Bool
False Maybe BS
p Maybe BS
s) =
  forall (t :: * -> *). Foldable t => t Bool -> Bool
or
  [ BS
n forall a. Eq a => a -> a -> Bool
/= BS
"html"
  , Maybe BS -> BS -> Bool
idMatch Maybe BS
p BS
"-//W3O//DTD W3 HTML Strict 3.0//EN//"
  , Maybe BS -> BS -> Bool
idMatch Maybe BS
p BS
"-/W3C/DTD HTML 4.0 Transitional/EN"
  , Maybe BS -> BS -> Bool
idMatch Maybe BS
p BS
"HTML"
  , Maybe BS -> BS -> Bool
idMatch Maybe BS
s BS
"http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd"
  , Maybe BS -> [BS] -> Bool
anyPrefix Maybe BS
p [BS]
publicIdPrefix
  , forall (t :: * -> *). Foldable t => t Bool -> Bool
and
    [ Maybe BS
s forall a. Eq a => a -> a -> Bool
== forall a. Maybe a
Nothing
    , Maybe BS -> [BS] -> Bool
anyPrefix Maybe BS
p
      [ BS
"-//W3C//DTD HTML 4.01 Frameset//"
      , BS
"-//W3C//DTD HTML 4.01 Transitional//"
      ]
    ]
  ]

-- | Public ID prefixes.
publicIdPrefix :: [BS]
publicIdPrefix :: [BS]
publicIdPrefix =
  [ BS
"+//Silmaril//dtd html Pro v0r11 19970101//"
  , BS
"-//AS//DTD HTML 3.0 asWedit + extensions//"
  , BS
"-//AdvaSoft Ltd//DTD HTML 3.0 asWedit + extensions//"
  , BS
"-//IETF//DTD HTML 2.0 Level 1//"
  , BS
"-//IETF//DTD HTML 2.0 Level 2//"
  , BS
"-//IETF//DTD HTML 2.0 Strict Level 1//"
  , BS
"-//IETF//DTD HTML 2.0 Strict Level 2//"
  , BS
"-//IETF//DTD HTML 2.0 Strict//"
  , BS
"-//IETF//DTD HTML 2.0//"
  , BS
"-//IETF//DTD HTML 2.1E//"
  , BS
"-//IETF//DTD HTML 3.0//"
  , BS
"-//IETF//DTD HTML 3.2 Final//"
  , BS
"-//IETF//DTD HTML 3.2//"
  , BS
"-//IETF//DTD HTML 3//"
  , BS
"-//IETF//DTD HTML Level 0//"
  , BS
"-//IETF//DTD HTML Level 1//"
  , BS
"-//IETF//DTD HTML Level 2//"
  , BS
"-//IETF//DTD HTML Level 3//"
  , BS
"-//IETF//DTD HTML Strict Level 0//"
  , BS
"-//IETF//DTD HTML Strict Level 1//"
  , BS
"-//IETF//DTD HTML Strict Level 2//"
  , BS
"-//IETF//DTD HTML Strict Level 3//"
  , BS
"-//IETF//DTD HTML Strict//"
  , BS
"-//IETF//DTD HTML//"
  , BS
"-//Metrius//DTD Metrius Presentational//"
  , BS
"-//Microsoft//DTD Internet Explorer 2.0 HTML Strict//"
  , BS
"-//Microsoft//DTD Internet Explorer 2.0 HTML//"
  , BS
"-//Microsoft//DTD Internet Explorer 2.0 Tables//"
  , BS
"-//Microsoft//DTD Internet Explorer 3.0 HTML Strict//"
  , BS
"-//Microsoft//DTD Internet Explorer 3.0 HTML//"
  , BS
"-//Microsoft//DTD Internet Explorer 3.0 Tables//"
  , BS
"-//Netscape Comm. Corp.//DTD HTML//"
  , BS
"-//Netscape Comm. Corp.//DTD Strict HTML//"
  , BS
"-//O'Reilly and Associates//DTD HTML 2.0//"
  , BS
"-//O'Reilly and Associates//DTD HTML Extended 1.0//"
  , BS
"-//O'Reilly and Associates//DTD HTML Extended Relaxed 1.0//"
  , BS
"-//SQ//DTD HTML 2.0 HoTMetaL + extensions//"
  , BS
"-//SoftQuad Software//DTD HoTMetaL PRO 6.0::19990601::extensions to HTML 4.0//"
  , BS
"-//SoftQuad//DTD HoTMetaL PRO 4.0::19971010::extensions to HTML 4.0//"
  , BS
"-//Spyglass//DTD HTML 2.0 Extended//"
  , BS
"-//Sun Microsystems Corp.//DTD HotJava HTML//"
  , BS
"-//Sun Microsystems Corp.//DTD HotJava Strict HTML//"
  , BS
"-//W3C//DTD HTML 3 1995-03-24//"
  , BS
"-//W3C//DTD HTML 3.2 Draft//"
  , BS
"-//W3C//DTD HTML 3.2 Final//"
  , BS
"-//W3C//DTD HTML 3.2//"
  , BS
"-//W3C//DTD HTML 3.2S Draft//"
  , BS
"-//W3C//DTD HTML 4.0 Frameset//"
  , BS
"-//W3C//DTD HTML 4.0 Transitional//"
  , BS
"-//W3C//DTD HTML Experimental 19960712//"
  , BS
"-//W3C//DTD HTML Experimental 970421//"
  , BS
"-//W3C//DTD W3 HTML//"
  , BS
"-//W3O//DTD W3 HTML 3.0//"
  , BS
"-//WebTechs//DTD Mozilla HTML 2.0//"
  , BS
"-//WebTechs//DTD Mozilla HTML//"
  ]

-- | Determines if the doctype token represents limited quirks mode.
tokenLimitedQuirks :: Token -> Bool
tokenLimitedQuirks :: Token -> Bool
tokenLimitedQuirks TDoctype {Bool
Maybe BS
BS
tDoctypeSystem :: Maybe BS
tDoctypePublic :: Maybe BS
tDoctypeQuirks :: Bool
tDoctypeName :: BS
tDoctypeSystem :: Token -> Maybe BS
tDoctypePublic :: Token -> Maybe BS
tDoctypeQuirks :: Token -> Bool
tDoctypeName :: Token -> BS
..} =
  forall (t :: * -> *). Foldable t => t Bool -> Bool
or
  [ Maybe BS -> [BS] -> Bool
anyPrefix Maybe BS
tDoctypePublic
    [ BS
"-//W3C//DTD XHTML 1.0 Frameset//"
    , BS
"-//W3C//DTD XHTML 1.0 Transitional//"
    ]
  , forall (t :: * -> *). Foldable t => t Bool -> Bool
and
    [ forall a. Maybe a -> Bool
isJust Maybe BS
tDoctypeSystem
    , Maybe BS -> [BS] -> Bool
anyPrefix Maybe BS
tDoctypePublic
      [ BS
"-//W3C//DTD HTML 4.01 Frameset//"
      , BS
"-//W3C//DTD HTML 4.01 Transitional//"
      ]
    ]
  ]

-- | Determines if a DOCTYPE ID matches a value.
idMatch :: Maybe BS -> BS -> Bool
idMatch :: Maybe BS -> BS -> Bool
idMatch (Just BS
x) BS
y = BS -> BS
bsLower BS
x forall a. Eq a => a -> a -> Bool
== BS -> BS
bsLower BS
y
idMatch Maybe BS
Nothing BS
y = Bool
False

-- | Determines if a text has any prefix from a list.
anyPrefix :: Maybe BS -> [BS] -> Bool
anyPrefix :: Maybe BS -> [BS] -> Bool
anyPrefix (Just BS
x) [BS]
ys = forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (\BS
y -> BS
y BS -> BS -> Bool
`bsPrefixCI` BS
x) [BS]
ys
anyPrefix Maybe BS
Nothing [BS]
ys = Bool
False

-- | Handle the initial insertion mode.
doModeInitial :: Parser s -> Token -> ST s ()
doModeInitial :: forall s. Parser s -> Token -> ST s ()
doModeInitial p :: Parser s
p@Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} Token
t =
  case Token
t of
    TChar {Word8
tCharData :: Word8
tCharData :: Token -> Word8
..} | Word8 -> Bool
chrWhitespace Word8
tCharData -> do
      forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
    TComment {} -> do
      forall s. Parser s -> Token -> ST s ()
insertDocComment Parser s
p Token
t
    TDoctype {} -> do
      forall s. Parser s -> Token -> ST s ()
doctypeTokenCheck Parser s
p Token
t
      forall s. Parser s -> Token -> ST s DOMNode
doctypeMake Parser s
p Token
t forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall s. Parser s -> DOMNode -> ST s ()
insertNewDocumentNode Parser s
p
      Bool
iframe <- forall s. Parser s -> ST s Bool
iframeSrcDoc Parser s
p
      forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Bool -> Bool
not Bool
iframe Bool -> Bool -> Bool
&& Token -> Bool
tokenQuirks Token
t) forall a b. (a -> b) -> a -> b
$ do
        forall s. Parser s -> (DOM -> DOM) -> ST s ()
modifyDOM Parser s
p forall a b. (a -> b) -> a -> b
$ DOMQuirks -> DOM -> DOM
domQuirksSet DOMQuirks
DOMQuirksMode
      forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Bool -> Bool
not Bool
iframe Bool -> Bool -> Bool
&& Token -> Bool
tokenLimitedQuirks Token
t) forall a b. (a -> b) -> a -> b
$ do
        forall s. Parser s -> (DOM -> DOM) -> ST s ()
modifyDOM Parser s
p forall a b. (a -> b) -> a -> b
$ DOMQuirks -> DOM -> DOM
domQuirksSet DOMQuirks
DOMQuirksLimited
      forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeBeforeHtml
    Token
_otherwise -> do
      forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
whenM (forall (m :: * -> *). Functor m => m Bool -> m Bool
notM forall a b. (a -> b) -> a -> b
$ forall s. Parser s -> ST s Bool
iframeSrcDoc Parser s
p) forall a b. (a -> b) -> a -> b
$ do
        forall s. Parser s -> Maybe Token -> BS -> ST s ()
parseError Parser s
p (forall a. a -> Maybe a
Just Token
t) BS
"initial unexpected token"
        forall s. Parser s -> (DOM -> DOM) -> ST s ()
modifyDOM Parser s
p forall a b. (a -> b) -> a -> b
$ DOMQuirks -> DOM -> DOM
domQuirksSet DOMQuirks
DOMQuirksMode
      forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeBeforeHtml
      forall s. Parser s -> Token -> ST s ()
reprocess Parser s
p Token
t

-- | Handle the before html insertion mode.
doModeBeforeHtml :: Parser s -> Token -> ST s ()
doModeBeforeHtml :: forall s. Parser s -> Token -> ST s ()
doModeBeforeHtml p :: Parser s
p@Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} Token
t =
  case Token
t of
    TDoctype {} ->
      forall s. Parser s -> Maybe Token -> BS -> ST s ()
parseError Parser s
p (forall a. a -> Maybe a
Just Token
t) BS
"before html doctype"
    TComment {} ->
      forall s. Parser s -> Token -> ST s ()
insertDocComment Parser s
p Token
t
    TChar {Word8
tCharData :: Word8
tCharData :: Token -> Word8
..} | Word8 -> Bool
chrWhitespace Word8
tCharData ->
      forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
    TStart { tStartName :: Token -> BS
tStartName = BS
"html" } -> do
      forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
      forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeBeforeHead
    TEnd { tEndName :: Token -> BS
tEndName = BS
x }
      | forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem BS
x [ BS
"head", BS
"body", BS
"html", BS
"br" ] -> do
          forall s. Parser s -> BS -> ST s ()
insertHtmlElementNamed Parser s
p BS
"html"
          forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeBeforeHead
          forall s. Parser s -> Token -> ST s ()
reprocess Parser s
p Token
t
    TEnd {} ->
      forall s. Parser s -> Maybe Token -> BS -> ST s ()
parseError Parser s
p (forall a. a -> Maybe a
Just Token
t) BS
"before html end tag"
    Token
_otherwise -> do
      forall s. Parser s -> BS -> ST s ()
insertHtmlElementNamed Parser s
p BS
"html"
      forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeBeforeHead
      forall s. Parser s -> Token -> ST s ()
reprocess Parser s
p Token
t

-- | Handle the before head insertion mode.
doModeBeforeHead :: Parser s -> Token -> ST s ()
doModeBeforeHead :: forall s. Parser s -> Token -> ST s ()
doModeBeforeHead p :: Parser s
p@Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} Token
t =
  case Token
t of
    TChar {Word8
tCharData :: Word8
tCharData :: Token -> Word8
..} | Word8 -> Bool
chrWhitespace Word8
tCharData ->
      forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
    TComment {} ->
      forall s. Parser s -> Token -> ST s ()
insertComment Parser s
p Token
t
    TDoctype {} ->
      forall s. Parser s -> Maybe Token -> BS -> ST s ()
parseError Parser s
p (forall a. a -> Maybe a
Just Token
t) BS
"before head doctype"
    TStart { tStartName :: Token -> BS
tStartName = BS
"html" } ->
      forall s. Parser s -> Token -> ST s ()
doModeInBody Parser s
p Token
t
    TStart { tStartName :: Token -> BS
tStartName = BS
"head" } -> do
      forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
      forall s. Parser s -> ST s ()
saveHead Parser s
p
      forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInHead
    TEnd { tEndName :: Token -> BS
tEndName = BS
x }
      | forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem BS
x [ BS
"head", BS
"body", BS
"html", BS
"br" ] -> do
          forall s. Parser s -> BS -> ST s ()
insertHtmlElementNamed Parser s
p BS
"head"
          forall s. Parser s -> ST s ()
saveHead Parser s
p
          forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInHead
          forall s. Parser s -> Token -> ST s ()
reprocess Parser s
p Token
t
    TEnd {} ->
      forall s. Parser s -> Maybe Token -> BS -> ST s ()
parseError Parser s
p (forall a. a -> Maybe a
Just Token
t) BS
"before head end tag"
    Token
_otherwise -> do
      forall s. Parser s -> BS -> ST s ()
insertHtmlElementNamed Parser s
p BS
"head"
      forall s. Parser s -> ST s ()
saveHead Parser s
p
      forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInHead
      forall s. Parser s -> Token -> ST s ()
reprocess Parser s
p Token
t

-- | Handles the in-head parser mode.
doModeInHead :: Parser s -> Token -> ST s ()
doModeInHead :: forall s. Parser s -> Token -> ST s ()
doModeInHead p :: Parser s
p@Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} Token
t =
  case Token
t of
    TChar {Word8
tCharData :: Word8
tCharData :: Token -> Word8
..} | Word8 -> Bool
chrWhitespace Word8
tCharData ->
      forall s. Parser s -> Token -> ST s ()
insertChar Parser s
p Token
t
    TComment {} ->
      forall s. Parser s -> Token -> ST s ()
insertComment Parser s
p Token
t
    TDoctype {} ->
      BS -> ST s ()
warn BS
"doctype"
    TStart { tStartName :: Token -> BS
tStartName = BS
"html" } ->
      forall s. Parser s -> Token -> ST s ()
doModeInBody Parser s
p Token
t
    TStart { tStartName :: Token -> BS
tStartName = BS
x }
      | forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem BS
x [ BS
"base", BS
"basefont", BS
"bgsound", BS
"link" ] -> do
          forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
          forall s. Parser s -> ST s ()
elementStackPop Parser s
p
          forall s. Parser s -> ST s ()
selfClosingAcknowledge Parser s
p
    TStart { tStartName :: Token -> BS
tStartName = BS
"meta" } -> do
      forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
      forall s. Parser s -> ST s ()
elementStackPop Parser s
p
      forall s. Parser s -> ST s ()
selfClosingAcknowledge Parser s
p
      -- The standard normally requires running the encoding determination
      -- algorithm here, but we should not need it since the content should
      -- be known to be UTF-16.
    TStart { tStartName :: Token -> BS
tStartName = BS
"title" } ->
      forall s. Parser s -> Token -> ST s ()
insertElementRCDATA Parser s
p Token
t
    TStart { tStartName :: Token -> BS
tStartName = BS
"noframes" } ->
      forall s. Parser s -> Token -> ST s ()
insertElementRAWTEXT Parser s
p Token
t
    TStart { tStartName :: Token -> BS
tStartName = BS
"style" } ->
      forall s. Parser s -> Token -> ST s ()
insertElementRAWTEXT Parser s
p Token
t
    TStart { tStartName :: Token -> BS
tStartName = BS
"noscript" } -> do
      forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
      forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInHeadNoscript
    TStart { tStartName :: Token -> BS
tStartName = BS
"script" } -> do
      forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
      forall s. Parser s -> ST s ()
parserSetScriptData Parser s
p
      forall s. Parser s -> ST s ()
saveMode Parser s
p
      forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeText
    TEnd { tEndName :: Token -> BS
tEndName = BS
"head" } -> do
      forall s. Parser s -> ST s ()
elementStackPop Parser s
p
      forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeAfterHead
    TEnd { tEndName :: Token -> BS
tEndName = BS
x }
      | forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem BS
x [ BS
"body", BS
"html", BS
"br" ] -> do
          forall s. Parser s -> ST s ()
elementStackPop Parser s
p
          forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeAfterHead
          forall s. Parser s -> Token -> ST s ()
reprocess Parser s
p Token
t
    TStart { tStartName :: Token -> BS
tStartName = BS
"template" } -> do
      forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
      forall s. Parser s -> ST s ()
activeFormatAddMarker Parser s
p
      forall s. Parser s -> ST s ()
frameSetNotOK Parser s
p
      forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInTemplate
      forall s. Parser s -> ParserMode -> ST s ()
templateModePush Parser s
p ParserMode
ModeInTemplate
    TEnd { tEndName :: Token -> BS
tEndName = x :: BS
x@BS
"template" } -> do
      let a :: DOMType
a = BS -> DOMType
domMakeTypeHTML BS
x
      -- Make sure a template element is on the stack.
      forall s. Parser s -> ST s Bool
elementStackHasTemplate Parser s
p forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
        Bool
False ->
          BS -> ST s ()
warn BS
"template start tag missing"
        Bool
True -> do
          -- (1) Generate implied end tags thoroughly.
          forall s. Parser s -> ST s ()
generateImpliedEndTagsThoroughly Parser s
p
          -- (2) Make sure template is the current node.
          forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
unlessM (forall s. Parser s -> DOMType -> ST s Bool
currentNodeHasType Parser s
p DOMType
a) forall a b. (a -> b) -> a -> b
$
            forall s. Parser s -> Maybe Token -> BS -> ST s ()
parseError Parser s
p forall a. Maybe a
Nothing BS
"template not current node"
          -- (3) Pop elements until a template has been popped.
          forall s. Parser s -> DOMType -> ST s ()
elementStackPopUntilType Parser s
p DOMType
a
          -- (4) Clear list of active formatting elements up to last marker.
          forall s. Parser s -> ST s ()
activeFormatClear Parser s
p
          -- (5) Pop the current template insertion mode.
          forall s. Parser s -> ST s ()
templateModePop Parser s
p
          -- (6) Reset the insertion mode appropriately.
          forall s. Parser s -> ST s ()
resetInsertionMode Parser s
p
    TStart { tStartName :: Token -> BS
tStartName = BS
"head" } ->
      BS -> ST s ()
warn BS
"head"
    TEnd {} ->
      BS -> ST s ()
warn BS
"unexpected end tag"
    Token
_otherwise -> do
      forall s. Parser s -> ST s ()
elementStackPop Parser s
p
      forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeAfterHead
      forall s. Parser s -> Token -> ST s ()
reprocess Parser s
p Token
t
  where
    warn :: BS -> ST s ()
warn BS
x = forall s. Parser s -> Maybe Token -> BS -> ST s ()
parseError Parser s
p (forall a. a -> Maybe a
Just Token
t) forall a b. (a -> b) -> a -> b
$ BS
"in head " forall a. Semigroup a => a -> a -> a
<> BS
x

-- | Handles the in head no script parser mode.
doModeInHeadNoscript :: Parser s -> Token -> ST s ()
doModeInHeadNoscript :: forall s. Parser s -> Token -> ST s ()
doModeInHeadNoscript p :: Parser s
p@Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} Token
t =
  case Token
t of
    TDoctype {} ->
      BS -> ST s ()
warn BS
"doctype"
    TStart { tStartName :: Token -> BS
tStartName = BS
"html" } ->
      forall s. Parser s -> Token -> ST s ()
doModeInBody Parser s
p Token
t
    TEnd { tEndName :: Token -> BS
tEndName = BS
"noscript" } -> do
      forall s. Parser s -> ST s ()
elementStackPop Parser s
p
      forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInHead
    TChar {Word8
tCharData :: Word8
tCharData :: Token -> Word8
..} | Word8 -> Bool
chrWhitespace Word8
tCharData ->
      forall s. Parser s -> Token -> ST s ()
doModeInHead Parser s
p Token
t
    TComment {} ->
      forall s. Parser s -> Token -> ST s ()
doModeInHead Parser s
p Token
t
    TStart { tStartName :: Token -> BS
tStartName = BS
x }
      | forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem BS
x [ BS
"basefont", BS
"bgsound", BS
"link",
                 BS
"meta", BS
"noframes", BS
"style" ] ->
          forall s. Parser s -> Token -> ST s ()
doModeInHead Parser s
p Token
t
    TEnd { tEndName :: Token -> BS
tEndName = BS
"br" } -> do
      BS -> ST s ()
warn BS
"br"
      forall s. Parser s -> ST s ()
elementStackPop Parser s
p
      forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInHead
      forall s. Parser s -> Token -> ST s ()
reprocess Parser s
p Token
t
    TStart { tStartName :: Token -> BS
tStartName = BS
"head" } ->
      BS -> ST s ()
warn BS
"head"
    TStart { tStartName :: Token -> BS
tStartName = BS
"noscript" } ->
      BS -> ST s ()
warn BS
"noscript"
    TEnd {} ->
      BS -> ST s ()
warn BS
"end tag"
    Token
_otherwise -> do
      BS -> ST s ()
warn BS
"bad token"
      forall s. Parser s -> ST s ()
elementStackPop Parser s
p
      forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInHead
      forall s. Parser s -> Token -> ST s ()
reprocess Parser s
p Token
t
  where
    warn :: BS -> ST s ()
warn BS
x = forall s. Parser s -> Maybe Token -> BS -> ST s ()
parseError Parser s
p (forall a. a -> Maybe a
Just Token
t) forall a b. (a -> b) -> a -> b
$ BS
"in head noscript " forall a. Semigroup a => a -> a -> a
<> BS
x

-- | Handles the after head parser mode.
doModeAfterHead :: Parser s -> Token -> ST s ()
doModeAfterHead :: forall s. Parser s -> Token -> ST s ()
doModeAfterHead p :: Parser s
p@Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} Token
t =
  case Token
t of
    TChar {Word8
tCharData :: Word8
tCharData :: Token -> Word8
..} | Word8 -> Bool
chrWhitespace Word8
tCharData ->
      forall s. Parser s -> Token -> ST s ()
insertChar Parser s
p Token
t
    TComment {} ->
      forall s. Parser s -> Token -> ST s ()
insertComment Parser s
p Token
t
    TDoctype {} ->
      forall s. Parser s -> Maybe Token -> BS -> ST s ()
parseError Parser s
p (forall a. a -> Maybe a
Just Token
t) BS
"after head doctype"
    TStart { tStartName :: Token -> BS
tStartName = BS
"html" } ->
      forall s. Parser s -> Token -> ST s ()
doModeInBody Parser s
p Token
t
    TStart { tStartName :: Token -> BS
tStartName = BS
"body" } -> do
      forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
      forall s. Parser s -> ST s ()
frameSetNotOK Parser s
p
      forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInBody
    TStart { tStartName :: Token -> BS
tStartName = BS
"frameset" } -> do
      forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
      forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInFrameset
    TStart { tStartName :: Token -> BS
tStartName = BS
x }
      | forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem BS
x
        [ BS
"base"
        , BS
"basefont"
        , BS
"bgsound"
        , BS
"link"
        , BS
"meta"
        , BS
"noframes"
        , BS
"script"
        , BS
"style"
        , BS
"template"
        , BS
"title"
        , BS
"head"
        ] -> do
          forall s. Parser s -> Maybe Token -> BS -> ST s ()
parseError Parser s
p (forall a. a -> Maybe a
Just Token
t) BS
"after head bad start tag"
          forall s. Parser s -> ST s (Maybe DOMID)
getHeadID Parser s
p forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
            Just DOMID
h -> do
              forall s. Parser s -> DOMID -> ST s ()
elementStackPush Parser s
p DOMID
h
              forall s. Parser s -> Token -> ST s ()
doModeInHead Parser s
p Token
t
              forall s. Parser s -> DOMID -> ST s ()
elementStackRemove Parser s
p DOMID
h
            Maybe DOMID
Nothing -> do
              -- TODO: might need an error in this case.
              forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
    TEnd { tEndName :: Token -> BS
tEndName = BS
"template" } ->
      forall s. Parser s -> Token -> ST s ()
doModeInHead Parser s
p Token
t
    TEnd { tEndName :: Token -> BS
tEndName = BS
x }
      | forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem BS
x
        [ BS
"body"
        , BS
"html"
        , BS
"br"
        ] -> do
          forall s. Parser s -> BS -> ST s ()
insertHtmlElementNamed Parser s
p BS
"body"
          forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInBody
          forall s. Parser s -> Token -> ST s ()
reprocess Parser s
p Token
t
    TStart { tStartName :: Token -> BS
tStartName = BS
"head" } ->
      forall s. Parser s -> Maybe Token -> BS -> ST s ()
parseError Parser s
p (forall a. a -> Maybe a
Just Token
t) BS
"after head head"
    TEnd {} ->
      forall s. Parser s -> Maybe Token -> BS -> ST s ()
parseError Parser s
p (forall a. a -> Maybe a
Just Token
t) BS
"after head end tag"
    Token
_otherwise -> do
      forall s. Parser s -> BS -> ST s ()
insertHtmlElementNamed Parser s
p BS
"body"
      forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInBody
      forall s. Parser s -> Token -> ST s ()
reprocess Parser s
p Token
t

-- | Handles the in body parser mode.
doModeInBody :: Parser s -> Token -> ST s ()
doModeInBody :: forall s. Parser s -> Token -> ST s ()
doModeInBody p :: Parser s
p@Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} Token
t =
  case Token
t of
    TChar {Word8
tCharData :: Word8
tCharData :: Token -> Word8
..} | Word8 -> Bool
chrWhitespace Word8
tCharData -> do
      forall s. Parser s -> ST s ()
activeFormatReconstruct Parser s
p
      forall s. Parser s -> Token -> ST s ()
insertChar Parser s
p Token
t
    TChar {} -> do
      forall s. Parser s -> ST s ()
activeFormatReconstruct Parser s
p
      forall s. Parser s -> Token -> ST s ()
insertChar Parser s
p Token
t
      forall s. Parser s -> ST s ()
frameSetNotOK Parser s
p
    TComment {} ->
      forall s. Parser s -> Token -> ST s ()
insertComment Parser s
p Token
t
    TDoctype {} ->
      BS -> ST s ()
warn BS
"doctype"
    TStart { tStartName :: Token -> BS
tStartName = x :: BS
x@BS
"html" } -> do
      BS -> ST s ()
warn BS
x
      forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
unlessM (forall s. Parser s -> ST s Bool
elementStackHasTemplate Parser s
p) forall a b. (a -> b) -> a -> b
$ do
        forall s. Parser s -> ST s (Maybe DOMID)
lastNodeID Parser s
p forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
          Just DOMID
i -> do
            forall s. Parser s -> (DOM -> DOM) -> ST s ()
modifyDOM Parser s
p forall a b. (a -> b) -> a -> b
$ DOMID -> Seq DOMAttr -> DOM -> DOM
domAttrMerge DOMID
i forall a b. (a -> b) -> a -> b
$ forall a. [a] -> Seq a
Seq.fromList forall a b. (a -> b) -> a -> b
$
              forall a b. (a -> b) -> [a] -> [b]
map (\(TAttr BS
n BS
v HTMLAttrNamespace
s) -> BS -> BS -> HTMLAttrNamespace -> DOMAttr
DOMAttr BS
n BS
v HTMLAttrNamespace
s) forall a b. (a -> b) -> a -> b
$ Token -> [TAttr]
tStartAttr Token
t
          Maybe DOMID
Nothing -> do
            -- TODO: consider an error for this case
            forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
    TStart { tStartName :: Token -> BS
tStartName = BS
x }
      | forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem BS
x
        [ BS
"base"
        , BS
"basefont"
        , BS
"bgsound"
        , BS
"link"
        , BS
"meta"
        , BS
"noframes"
        , BS
"script"
        , BS
"style"
        , BS
"template"
        , BS
"title"
        ] ->
          forall s. Parser s -> Token -> ST s ()
doModeInHead Parser s
p Token
t
    TEnd { tEndName :: Token -> BS
tEndName = BS
"template" } ->
      forall s. Parser s -> Token -> ST s ()
doModeInHead Parser s
p Token
t
    TStart { tStartName :: Token -> BS
tStartName = x :: BS
x@BS
"body" } -> do
      BS -> ST s ()
warn BS
x
      forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
unlessM (forall (m :: * -> *). Functor m => m Bool -> m Bool
notM (forall s. Parser s -> ST s Bool
elementStackHasBody Parser s
p)
        forall (m :: * -> *). Monad m => m Bool -> m Bool -> m Bool
||^ forall (f :: * -> *) a b. Applicative f => (a -> b) -> f a -> f b
liftA (forall a. Eq a => a -> a -> Bool
==DOMID
1) (forall s. Parser s -> ST s DOMID
elementStackSize Parser s
p)
        forall (m :: * -> *). Monad m => m Bool -> m Bool -> m Bool
||^ (forall s. Parser s -> ST s Bool
elementStackHasTemplate Parser s
p)) forall a b. (a -> b) -> a -> b
$ do
          forall s. Parser s -> ST s ()
frameSetNotOK Parser s
p
          Maybe DOMID
y <- forall a. [a] -> Maybe a
listToMaybe forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. DOMID -> [a] -> [a]
drop DOMID
1 forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. [a] -> [a]
reverse forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s. Parser s -> ST s [DOMID]
elementStack Parser s
p
          case Maybe DOMID
y of
            Just DOMID
i -> do
              forall s. Parser s -> (DOM -> DOM) -> ST s ()
modifyDOM Parser s
p forall a b. (a -> b) -> a -> b
$ DOMID -> Seq DOMAttr -> DOM -> DOM
domAttrMerge DOMID
i forall a b. (a -> b) -> a -> b
$ forall a. [a] -> Seq a
Seq.fromList forall a b. (a -> b) -> a -> b
$
                forall a b. (a -> b) -> [a] -> [b]
map (\(TAttr BS
n BS
v HTMLAttrNamespace
s) -> BS -> BS -> HTMLAttrNamespace -> DOMAttr
DOMAttr BS
n BS
v HTMLAttrNamespace
s) forall a b. (a -> b) -> a -> b
$ Token -> [TAttr]
tStartAttr Token
t
            Maybe DOMID
Nothing -> do
              forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
    TStart { tStartName :: Token -> BS
tStartName = x :: BS
x@BS
"frameset" } -> do
      BS -> ST s ()
warn BS
x
      forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
unlessM (forall (f :: * -> *) a b. Applicative f => (a -> b) -> f a -> f b
liftA (forall a. Eq a => a -> a -> Bool
==DOMID
1) (forall s. Parser s -> ST s DOMID
elementStackSize Parser s
p)
        forall (m :: * -> *). Monad m => m Bool -> m Bool -> m Bool
||^ forall (m :: * -> *). Functor m => m Bool -> m Bool
notM (forall s. Parser s -> ST s Bool
elementStackHasBody Parser s
p)
        forall (m :: * -> *). Monad m => m Bool -> m Bool -> m Bool
||^ forall (m :: * -> *). Functor m => m Bool -> m Bool
notM (forall s a. STRef s a -> ST s a
rref STRef s Bool
parserFrameSetOK)) forall a b. (a -> b) -> a -> b
$ do
          Maybe DOMNode
y <- forall a. [a] -> Maybe a
listToMaybe forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. DOMID -> [a] -> [a]
drop DOMID
1 forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. [a] -> [a]
reverse forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s. Parser s -> ST s [DOMNode]
elementStackNodes Parser s
p
          case Maybe DOMNode
y of
            Just DOMNode
n -> do
              forall s. Parser s -> (DOM -> DOM) -> ST s ()
modifyDOM Parser s
p forall a b. (a -> b) -> a -> b
$ DOMID -> DOMID -> DOM -> DOM
domRemoveChild (DOMNode -> DOMID
domNodeParent DOMNode
n) forall a b. (a -> b) -> a -> b
$ DOMNode -> DOMID
domNodeID DOMNode
n
              forall s. Parser s -> (DOMNode -> Bool) -> ST s ()
elementStackPopWhile Parser s
p forall a b. (a -> b) -> a -> b
$ \DOMNode
n ->
                DOMNode -> DOMType
domNodeType DOMNode
n forall a. Eq a => a -> a -> Bool
/= BS -> DOMType
domMakeTypeHTML BS
"html"
              forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
              forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInFrameset
            Maybe DOMNode
Nothing -> do
              forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
    Token
TEOF -> do
      DOMID
n <- forall s. Parser s -> ST s DOMID
templateModeCount Parser s
p
      if DOMID
n forall a. Ord a => a -> a -> Bool
> DOMID
0
      then forall s. Parser s -> Token -> ST s ()
doModeInTemplate Parser s
p Token
t
      else do
        forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
whenM (forall s. Parser s -> (DOMNode -> Bool) -> ST s Bool
elementStackAny Parser s
p forall a b. (a -> b) -> a -> b
$ [BS] -> DOMNode -> Bool
elementNameNotIn
          [BS
"dd", BS
"dt", BS
"li", BS
"menuitem", BS
"optgroup",
           BS
"option", BS
"p", BS
"rb", BS
"rp", BS
"rt", BS
"rtc",
           BS
"tbody", BS
"td", BS
"tfoot", BS
"th", BS
"thead", BS
"tr",
           BS
"body", BS
"html"]) forall a b. (a -> b) -> a -> b
$
          BS -> ST s ()
warn BS
"bad element on stack"
        forall s. Parser s -> ST s ()
parserSetDone Parser s
p
    TEnd { tEndName :: Token -> BS
tEndName = x :: BS
x@BS
"body" } -> do
      let a :: DOMType
a = BS -> DOMType
domMakeTypeHTML BS
x
      forall s. Parser s -> DOMType -> ST s Bool
elementInScope Parser s
p DOMType
a forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
        Bool
False ->
          BS -> ST s ()
warn BS
"no body element in scope"
        Bool
True -> do
          forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
whenM (forall s. Parser s -> (DOMNode -> Bool) -> ST s Bool
elementStackAny Parser s
p forall a b. (a -> b) -> a -> b
$ [BS] -> DOMNode -> Bool
elementNameNotIn
            [BS
"dd", BS
"dt", BS
"li", BS
"menuitem", BS
"optgroup",
             BS
"option", BS
"p", BS
"rb", BS
"rp", BS
"rt", BS
"rtc",
             BS
"tbody", BS
"td", BS
"tfoot", BS
"th", BS
"thead", BS
"tr",
             BS
"body", BS
"html"]) forall a b. (a -> b) -> a -> b
$
            BS -> ST s ()
warn BS
"bad element on stack"
          forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeAfterBody
    TEnd { tEndName :: Token -> BS
tEndName = x :: BS
x@BS
"html" } -> do
      let a :: DOMType
a = BS -> DOMType
domMakeTypeHTML BS
x
      forall s. Parser s -> DOMType -> ST s Bool
elementInScope Parser s
p DOMType
a forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
        Bool
False ->
          BS -> ST s ()
warn BS
"no body element in scope"
        Bool
True -> do
          forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
whenM (forall s. Parser s -> (DOMNode -> Bool) -> ST s Bool
elementStackAny Parser s
p forall a b. (a -> b) -> a -> b
$ [BS] -> DOMNode -> Bool
elementNameNotIn
            [BS
"dd", BS
"dt", BS
"li", BS
"menuitem", BS
"optgroup",
             BS
"option", BS
"p", BS
"rb", BS
"rp", BS
"rt", BS
"rtc",
             BS
"tbody", BS
"td", BS
"tfoot", BS
"th", BS
"thead", BS
"tr",
             BS
"body", BS
"html"]) forall a b. (a -> b) -> a -> b
$
            BS -> ST s ()
warn BS
"bad element on stack"
          forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeAfterBody
          forall s. Parser s -> Token -> ST s ()
reprocess Parser s
p Token
t
    TStart { tStartName :: Token -> BS
tStartName = BS
x } | forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem BS
x
      [BS
"address", BS
"article", BS
"aside", BS
"blockquote",
       BS
"center", BS
"details", BS
"dialog", BS
"dir", BS
"div", BS
"dl",
       BS
"fieldset", BS
"figcaption", BS
"figure", BS
"footer", BS
"header",
       BS
"hgroup", BS
"main", BS
"nav", BS
"ol", BS
"p", BS
"section",
       BS
"summary", BS
"ul"] -> do
      ST s ()
closeP
      forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
    TStart { tStartName :: Token -> BS
tStartName = BS
"menu" } -> do
      ST s ()
closeP
      ST s ()
popMenuitem
      forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
    TStart { tStartName :: Token -> BS
tStartName = BS
x }
      | forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem BS
x [BS
"h1", BS
"h2", BS
"h3", BS
"h4", BS
"h5", BS
"h6"] -> do
        ST s ()
closeP
        forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
whenM (forall s. Parser s -> [DOMType] -> ST s Bool
currentNodeHasTypeIn Parser s
p forall a b. (a -> b) -> a -> b
$ [BS] -> [DOMType]
domTypesHTML
          [BS
"h1", BS
"h2", BS
"h3", BS
"h4", BS
"h5", BS
"h6"]) forall a b. (a -> b) -> a -> b
$ do
          BS -> ST s ()
warn BS
"bad header tag on stack"
          forall s. Parser s -> ST s ()
elementStackPop Parser s
p
        forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
    TStart { tStartName :: Token -> BS
tStartName = BS
x } | forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem BS
x [BS
"pre", BS
"listing"] -> do
      ST s ()
closeP
      forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
      forall s. Parser s -> ST s ()
parserSkipNextLF Parser s
p
      forall s. Parser s -> ST s ()
frameSetNotOK Parser s
p
    TStart { tStartName :: Token -> BS
tStartName = BS
"form" } -> do
      (forall s. Parser s -> ST s Bool
formNotNull Parser s
p forall (m :: * -> *). Monad m => m Bool -> m Bool -> m Bool
&&^ forall s. Parser s -> ST s Bool
elementStackMissingTemplate Parser s
p) forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
        Bool
True ->
          BS -> ST s ()
warn BS
"form without template"
        Bool
False -> do
          ST s ()
closeP
          forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
          forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
whenM (forall s. Parser s -> ST s Bool
elementStackMissingTemplate Parser s
p) forall a b. (a -> b) -> a -> b
$ forall s. Parser s -> ST s ()
saveForm Parser s
p
    TStart { tStartName :: Token -> BS
tStartName = x :: BS
x@BS
"li" } -> do
      let a :: DOMType
a = BS -> DOMType
domMakeTypeHTML BS
x
          s :: Set DOMType
s = forall a. Ord a => [a] -> Set a
Set.fromList forall a b. (a -> b) -> a -> b
$ [BS] -> [DOMType]
domTypesHTML [ BS
"address", BS
"div", BS
"p" ]
          f :: [DOMType] -> ST s ()
f [] = forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
          f (DOMType
y:[DOMType]
ys)
            | DOMType
y forall a. Eq a => a -> a -> Bool
== DOMType
a = do
                forall s. Parser s -> BS -> ST s ()
generateImpliedEndTagsExcept Parser s
p BS
x
                forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
unlessM (forall s. Parser s -> DOMType -> ST s Bool
currentNodeHasType Parser s
p DOMType
a) forall a b. (a -> b) -> a -> b
$
                  BS -> ST s ()
warn BS
"current node is not li"
                forall s. Parser s -> DOMType -> ST s ()
elementStackPopUntilType Parser s
p DOMType
a
            | DOMType -> Bool
elementIsSpecial DOMType
y Bool -> Bool -> Bool
&& forall a. Ord a => a -> Set a -> Bool
Set.notMember DOMType
y Set DOMType
s = forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
            | Bool
otherwise = [DOMType] -> ST s ()
f [DOMType]
ys
      forall s. Parser s -> ST s ()
frameSetNotOK Parser s
p
      forall s. Parser s -> ST s [DOMType]
elementStackTypes Parser s
p forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= [DOMType] -> ST s ()
f
      ST s ()
closeP
      forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
    TStart { tStartName :: Token -> BS
tStartName = BS
x } | forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem BS
x [BS
"dd", BS
"dt"] -> do
      let dd :: DOMType
dd = BS -> DOMType
domMakeTypeHTML BS
"dd"
          dt :: DOMType
dt = BS -> DOMType
domMakeTypeHTML BS
"dt"
          s :: Set DOMType
s = forall a. Ord a => [a] -> Set a
Set.fromList forall a b. (a -> b) -> a -> b
$ [BS] -> [DOMType]
domTypesHTML [ BS
"address", BS
"div", BS
"p" ]
          f :: [DOMType] -> ST s ()
f [] = forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
          f (DOMType
y:[DOMType]
ys)
            | DOMType
y forall a. Eq a => a -> a -> Bool
== DOMType
dd Bool -> Bool -> Bool
|| DOMType
y forall a. Eq a => a -> a -> Bool
== DOMType
dt = do
                forall s. Parser s -> BS -> ST s ()
generateImpliedEndTagsExcept Parser s
p forall a b. (a -> b) -> a -> b
$ DOMType -> BS
domTypeName DOMType
y
                forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
unlessM (forall s. Parser s -> DOMType -> ST s Bool
currentNodeHasType Parser s
p DOMType
y) forall a b. (a -> b) -> a -> b
$
                  BS -> ST s ()
warn BS
"current node is not dd or dt"
                forall s. Parser s -> DOMType -> ST s ()
elementStackPopUntilType Parser s
p DOMType
y
            | DOMType -> Bool
elementIsSpecial DOMType
y Bool -> Bool -> Bool
&& forall a. Ord a => a -> Set a -> Bool
Set.notMember DOMType
y Set DOMType
s = forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
            | Bool
otherwise = [DOMType] -> ST s ()
f [DOMType]
ys
      forall s. Parser s -> ST s ()
frameSetNotOK Parser s
p
      forall s. Parser s -> ST s [DOMType]
elementStackTypes Parser s
p forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= [DOMType] -> ST s ()
f
      ST s ()
closeP
      forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
    TStart { tStartName :: Token -> BS
tStartName = BS
"plaintext" } -> do
      ST s ()
closeP
      forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
      forall s. Parser s -> ST s ()
parserSetPLAINTEXT Parser s
p
    TStart { tStartName :: Token -> BS
tStartName = x :: BS
x@BS
"button" } -> do
      let a :: DOMType
a = BS -> DOMType
domMakeTypeHTML BS
x
      forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
whenM (forall s. Parser s -> DOMType -> ST s Bool
elementInScope Parser s
p DOMType
a) forall a b. (a -> b) -> a -> b
$ do
        BS -> ST s ()
warn BS
"button element in scope"
        forall s. Parser s -> ST s ()
generateImpliedEndTags Parser s
p
        forall s. Parser s -> DOMType -> ST s ()
elementStackPopUntilType Parser s
p DOMType
a
      forall s. Parser s -> ST s ()
activeFormatReconstruct Parser s
p
      forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
      forall s. Parser s -> ST s ()
frameSetNotOK Parser s
p
    TEnd { tEndName :: Token -> BS
tEndName = BS
x }
      | forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem BS
x [BS
"address", BS
"article", BS
"aside", BS
"blockquote", BS
"button",
                BS
"center", BS
"details", BS
"dialog", BS
"dir", BS
"div", BS
"dl",
                BS
"fieldset", BS
"figcaption", BS
"figure", BS
"footer", BS
"header",
                BS
"hgroup", BS
"listing", BS
"main", BS
"menu", BS
"nav", BS
"ol",
                BS
"pre", BS
"section", BS
"summary", BS
"ul"] -> do
          let a :: DOMType
a = BS -> DOMType
domMakeTypeHTML BS
x
          forall s. Parser s -> DOMType -> ST s Bool
elementInScope Parser s
p DOMType
a forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
            Bool
False ->
              BS -> ST s ()
warn BS
"element not in scope"
            Bool
True -> do
              forall s. Parser s -> ST s ()
generateImpliedEndTags Parser s
p
              forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
unlessM (forall s. Parser s -> DOMType -> ST s Bool
currentNodeHasType Parser s
p DOMType
a) forall a b. (a -> b) -> a -> b
$
                BS -> ST s ()
warn BS
"current node wrong type"
              forall s. Parser s -> DOMType -> ST s ()
elementStackPopUntilType Parser s
p DOMType
a
    TEnd { tEndName :: Token -> BS
tEndName = x :: BS
x@BS
"form" } ->
      forall s. Parser s -> ST s Bool
elementStackHasTemplate Parser s
p forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
        Bool
False -> do
          forall s. Parser s -> ST s (Maybe DOMID)
getFormID Parser s
p forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
            Maybe DOMID
Nothing ->
              BS -> ST s ()
warn BS
"form not defined"
            Just DOMID
n -> do
              DOMType
a <- forall a. HasCallStack => Maybe a -> a
fromJust forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s. Parser s -> ST s (Maybe DOMType)
getFormType Parser s
p
              forall s. Parser s -> Maybe DOMID -> ST s ()
setFormID Parser s
p forall a. Maybe a
Nothing
              forall s. Parser s -> DOMType -> ST s Bool
elementInScope Parser s
p DOMType
a forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
                Bool
False ->
                  BS -> ST s ()
warn BS
"form not in scope"
                Bool
True -> do
                  forall s. Parser s -> ST s ()
generateImpliedEndTags Parser s
p
                  forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
unlessM (forall (f :: * -> *) a b. Applicative f => (a -> b) -> f a -> f b
liftA (forall a. Eq a => a -> a -> Bool
==(forall a. a -> Maybe a
Just DOMID
n)) (forall s. Parser s -> ST s (Maybe DOMID)
currentNodeID Parser s
p)) forall a b. (a -> b) -> a -> b
$
                    BS -> ST s ()
warn BS
"current node is wrong node"
                  forall s. Parser s -> DOMID -> ST s ()
elementStackRemove Parser s
p DOMID
n
        Bool
True -> do
          let a :: DOMType
a = BS -> DOMType
domMakeTypeHTML BS
x
          forall s. Parser s -> DOMType -> ST s Bool
elementInScope Parser s
p DOMType
a forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
            Bool
False ->
              BS -> ST s ()
warn BS
"form not in scope"
            Bool
True -> do
              forall s. Parser s -> ST s ()
generateImpliedEndTags Parser s
p
              forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
unlessM (forall s. Parser s -> DOMType -> ST s Bool
currentNodeHasType Parser s
p DOMType
a) forall a b. (a -> b) -> a -> b
$
                BS -> ST s ()
warn BS
"current node is not a form"
              forall s. Parser s -> DOMType -> ST s ()
elementStackPopUntilType Parser s
p DOMType
a
    TEnd { tEndName :: Token -> BS
tEndName = x :: BS
x@BS
"p" } -> do
      let a :: DOMType
a = BS -> DOMType
domMakeTypeHTML BS
x
      forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
unlessM (forall s. Parser s -> DOMType -> ST s Bool
elementInButtonScope Parser s
p DOMType
a) forall a b. (a -> b) -> a -> b
$ do
        BS -> ST s ()
warn BS
"no p in button scope"
        forall s. Parser s -> BS -> ST s ()
insertHtmlElementNamed Parser s
p BS
x
      forall s. Parser s -> ST s ()
closeElementP Parser s
p
    TEnd { tEndName :: Token -> BS
tEndName = x :: BS
x@BS
"li" } -> do
      let a :: DOMType
a = BS -> DOMType
domMakeTypeHTML BS
x
      forall s. Parser s -> DOMType -> ST s Bool
elementInListScope Parser s
p DOMType
a forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
        Bool
False ->
          BS -> ST s ()
warn BS
"no li in list scope"
        Bool
True -> do
          forall s. Parser s -> BS -> ST s ()
generateImpliedEndTagsExcept Parser s
p BS
x
          forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
unlessM (forall s. Parser s -> DOMType -> ST s Bool
currentNodeHasType Parser s
p DOMType
a) forall a b. (a -> b) -> a -> b
$
            BS -> ST s ()
warn BS
"current node not an li element"
          forall s. Parser s -> DOMType -> ST s ()
elementStackPopUntilType Parser s
p DOMType
a
    TEnd { tEndName :: Token -> BS
tEndName = BS
x } | forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem BS
x [BS
"dd", BS
"dt"] -> do
      let a :: DOMType
a = BS -> DOMType
domMakeTypeHTML BS
x
      forall s. Parser s -> DOMType -> ST s Bool
elementInListScope Parser s
p DOMType
a forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
        Bool
False ->
          BS -> ST s ()
warn BS
"no dd or dt in list scope"
        Bool
True -> do
          forall s. Parser s -> BS -> ST s ()
generateImpliedEndTagsExcept Parser s
p BS
x
          forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
unlessM (forall s. Parser s -> DOMType -> ST s Bool
currentNodeHasType Parser s
p DOMType
a) forall a b. (a -> b) -> a -> b
$
            BS -> ST s ()
warn BS
"current not is not a dd or dt"
          forall s. Parser s -> DOMType -> ST s ()
elementStackPopUntilType Parser s
p DOMType
a
    TEnd { tEndName :: Token -> BS
tEndName = BS
x }
      | forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem BS
x [BS
"h1", BS
"h2", BS
"h3", BS
"h4", BS
"h5", BS
"h6"] -> do
          let h :: [DOMType]
h = [BS] -> [DOMType]
domTypesHTML [BS
"h1", BS
"h2", BS
"h3", BS
"h4", BS
"h5", BS
"h6"]
          forall (m :: * -> *) a. Monad m => (a -> m Bool) -> [a] -> m Bool
anyM (forall s. Parser s -> DOMType -> ST s Bool
elementInScope Parser s
p) [DOMType]
h forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
            Bool
False ->
              BS -> ST s ()
warn BS
"header element not in scope"
            Bool
True -> do
              forall s. Parser s -> ST s ()
generateImpliedEndTags Parser s
p
              forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
unlessM (forall s. Parser s -> DOMType -> ST s Bool
currentNodeHasType Parser s
p forall a b. (a -> b) -> a -> b
$ BS -> DOMType
domMakeTypeHTML BS
x) forall a b. (a -> b) -> a -> b
$
                BS -> ST s ()
warn BS
"current node not a header type"
              forall s. Parser s -> [DOMType] -> ST s ()
elementStackPopUntilTypeIn Parser s
p [DOMType]
h
    TEnd { tEndName :: Token -> BS
tEndName = BS
"sarcasm" } ->
      ST s ()
doAnyOtherEndTag
    TStart { tStartName :: Token -> BS
tStartName = x :: BS
x@BS
"a" } -> do
      let a :: DOMType
a = BS -> DOMType
domMakeTypeHTML BS
x
      forall s. Parser s -> BS -> ST s (Maybe ParserFormatItem)
activeFormatFindTag Parser s
p BS
x forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
        Maybe ParserFormatItem
Nothing -> forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
        Just (ParserFormatElement DOMID
i Token
_) -> do
          BS -> ST s ()
warn BS
"active format already has anchor"
          BS -> ST s ()
runAA BS
x
          forall s. Parser s -> DOMID -> ST s ()
elementStackRemove Parser s
p DOMID
i
          forall s. Parser s -> DOMID -> ST s ()
activeFormatRemove Parser s
p DOMID
i
      forall s. Parser s -> ST s ()
activeFormatReconstruct Parser s
p
      forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
      forall s. Parser s -> Token -> ST s ()
activeFormatAddCurrentNode Parser s
p Token
t
    TStart { tStartName :: Token -> BS
tStartName = BS
x } | forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem BS
x
      [BS
"b", BS
"big", BS
"code", BS
"em", BS
"font", BS
"i", BS
"s",
       BS
"small", BS
"strike", BS
"strong", BS
"tt", BS
"u"] -> do
      forall s. Parser s -> ST s ()
activeFormatReconstruct Parser s
p
      forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
      forall s. Parser s -> Token -> ST s ()
activeFormatAddCurrentNode Parser s
p Token
t
    TStart { tStartName :: Token -> BS
tStartName = x :: BS
x@BS
"nobr" } -> do
      let a :: DOMType
a = BS -> DOMType
domMakeTypeHTML BS
x
      forall s. Parser s -> ST s ()
activeFormatReconstruct Parser s
p
      forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
whenM (forall s. Parser s -> DOMType -> ST s Bool
elementInScope Parser s
p DOMType
a) forall a b. (a -> b) -> a -> b
$ do
        BS -> ST s ()
warn BS
"nobr tag when nobr element already in scope"
        BS -> ST s ()
runAA BS
x
        forall s. Parser s -> ST s ()
activeFormatReconstruct Parser s
p
      forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
      forall s. Parser s -> Token -> ST s ()
activeFormatAddCurrentNode Parser s
p Token
t
    TEnd { tEndName :: Token -> BS
tEndName = BS
x } | forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem BS
x
      [BS
"a", BS
"b", BS
"big", BS
"code", BS
"em", BS
"font", BS
"i", BS
"nobr",
       BS
"s", BS
"small", BS
"strike", BS
"strong", BS
"tt", BS
"u"] ->
      BS -> ST s ()
runAA BS
x
    TStart { tStartName :: Token -> BS
tStartName = BS
x } | forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem BS
x
      [BS
"applet", BS
"marquee", BS
"object"] -> do
      forall s. Parser s -> ST s ()
activeFormatReconstruct Parser s
p
      forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
      forall s. Parser s -> ST s ()
activeFormatAddMarker Parser s
p
      forall s. Parser s -> ST s ()
frameSetNotOK Parser s
p
    TEnd { tEndName :: Token -> BS
tEndName = BS
x } | forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem BS
x
      [BS
"applet", BS
"marquee", BS
"object"] -> do
      let a :: DOMType
a = BS -> DOMType
domMakeTypeHTML BS
x
      forall s. Parser s -> DOMType -> ST s Bool
elementInScope Parser s
p DOMType
a forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
        Bool
False ->
          BS -> ST s ()
warn BS
"element scope missing"
        Bool
True -> do
          forall s. Parser s -> ST s ()
generateImpliedEndTags Parser s
p
          forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
unlessM (forall s. Parser s -> DOMType -> ST s Bool
currentNodeHasType Parser s
p DOMType
a) forall a b. (a -> b) -> a -> b
$
            BS -> ST s ()
warn BS
"current node is wring type"
          forall s. Parser s -> DOMType -> ST s ()
elementStackPopUntilType Parser s
p DOMType
a
          forall s. Parser s -> ST s ()
activeFormatClear Parser s
p
    TStart { tStartName :: Token -> BS
tStartName = BS
"table" } -> do
      DOMQuirks
q <- DOM -> DOMQuirks
domQuirksGet forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s. Parser s -> ST s DOM
getDOM Parser s
p
      forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (DOMQuirks
q forall a. Eq a => a -> a -> Bool
/= DOMQuirks
DOMQuirksMode) ST s ()
closeP
      forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
      forall s. Parser s -> ST s ()
frameSetNotOK Parser s
p
      forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInTable
    TEnd { tEndName :: Token -> BS
tEndName = BS
"br" } -> do
      BS -> ST s ()
warn BS
"br end tag"
      forall s. Parser s -> ST s ()
activeFormatReconstruct Parser s
p
      forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p forall a b. (a -> b) -> a -> b
$ BS -> Bool -> [TAttr] -> Token
TStart BS
"br" Bool
False []
      forall s. Parser s -> ST s ()
elementStackPop Parser s
p
      forall s. Parser s -> ST s ()
selfClosingAcknowledge Parser s
p
      forall s. Parser s -> ST s ()
frameSetNotOK Parser s
p
    TStart { tStartName :: Token -> BS
tStartName = BS
x } | forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem BS
x
      [BS
"area", BS
"br", BS
"embed", BS
"img", BS
"keygen", BS
"wbr"] -> do
      forall s. Parser s -> ST s ()
activeFormatReconstruct Parser s
p
      forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
      forall s. Parser s -> ST s ()
elementStackPop Parser s
p
      forall s. Parser s -> ST s ()
selfClosingAcknowledge Parser s
p
      forall s. Parser s -> ST s ()
frameSetNotOK Parser s
p
    TStart { tStartName :: Token -> BS
tStartName = BS
"input" } -> do
      forall s. Parser s -> ST s ()
activeFormatReconstruct Parser s
p
      forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
      forall s. Parser s -> ST s ()
elementStackPop Parser s
p
      forall s. Parser s -> ST s ()
selfClosingAcknowledge Parser s
p
      case BS -> Token -> Maybe BS
tokenGetAttrVal BS
"type" Token
t of
        Just BS
v -> forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (BS -> BS
bsLower BS
v forall a. Eq a => a -> a -> Bool
/= BS
"hidden") forall a b. (a -> b) -> a -> b
$ forall s. Parser s -> ST s ()
frameSetNotOK Parser s
p
        Maybe BS
Nothing -> forall s. Parser s -> ST s ()
frameSetNotOK Parser s
p
    TStart { tStartName :: Token -> BS
tStartName = BS
x } | forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem BS
x
      [BS
"param", BS
"source", BS
"track"] -> do
      forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
      forall s. Parser s -> ST s ()
elementStackPop Parser s
p
      forall s. Parser s -> ST s ()
selfClosingAcknowledge Parser s
p
    TStart { tStartName :: Token -> BS
tStartName = BS
"hr" } -> do
      ST s ()
closeP
      ST s ()
popMenuitem
      forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
      forall s. Parser s -> ST s ()
elementStackPop Parser s
p
      forall s. Parser s -> ST s ()
selfClosingAcknowledge Parser s
p
      forall s. Parser s -> ST s ()
frameSetNotOK Parser s
p
    TStart { tStartName :: Token -> BS
tStartName = BS
"image" } -> do
      BS -> ST s ()
warn BS
"image"
      let t' :: Token
t' = Token
t { tStartName :: BS
tStartName = BS
"img" }
      forall s. Parser s -> Token -> ST s ()
reprocess Parser s
p Token
t'
    TStart { tStartName :: Token -> BS
tStartName = BS
"textarea" } -> do
      forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
      forall s. Parser s -> ST s ()
parserSkipNextLF Parser s
p
      forall s. Parser s -> ST s ()
parserSetRCDATA Parser s
p
      forall s. Parser s -> ST s ()
saveMode Parser s
p
      forall s. Parser s -> ST s ()
frameSetNotOK Parser s
p
      forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeText
    TStart { tStartName :: Token -> BS
tStartName = BS
"xmp" } -> do
      ST s ()
closeP
      forall s. Parser s -> ST s ()
activeFormatReconstruct Parser s
p
      forall s. Parser s -> ST s ()
frameSetNotOK Parser s
p
      forall s. Parser s -> Token -> ST s ()
insertElementRAWTEXT Parser s
p Token
t
    TStart { tStartName :: Token -> BS
tStartName = BS
"iframe" } -> do
      forall s. Parser s -> ST s ()
frameSetNotOK Parser s
p
      forall s. Parser s -> Token -> ST s ()
insertElementRAWTEXT Parser s
p Token
t
    TStart { tStartName :: Token -> BS
tStartName = BS
"noembed" } ->
      forall s. Parser s -> Token -> ST s ()
insertElementRAWTEXT Parser s
p Token
t
    TStart { tStartName :: Token -> BS
tStartName = BS
"select" } -> do
      forall s. Parser s -> ST s ()
activeFormatReconstruct Parser s
p
      forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
      forall s. Parser s -> ST s ()
frameSetNotOK Parser s
p
      Set ParserMode
s <- forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ forall a. Ord a => [a] -> Set a
Set.fromList
        [ ParserMode
ModeInTable, ParserMode
ModeInCaption, ParserMode
ModeInTableBody,
          ParserMode
ModeInRow, ParserMode
ModeInCell ]
      forall s a. STRef s a -> ST s a
rref STRef s ParserMode
parserInsertionMode forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \ParserMode
x -> forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p forall a b. (a -> b) -> a -> b
$
        if forall a. Ord a => a -> Set a -> Bool
Set.member ParserMode
x Set ParserMode
s
           then ParserMode
ModeInSelectInTable
           else ParserMode
ModeInSelect
    TStart { tStartName :: Token -> BS
tStartName = BS
x } | forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem BS
x
      [BS
"optgroup", BS
"option"] -> do
      forall s. Parser s -> (DOMNode -> Bool) -> ST s ()
elementStackPopIf Parser s
p forall a b. (a -> b) -> a -> b
$ BS -> DOMNode -> Bool
elementName BS
"option"
      forall s. Parser s -> ST s ()
activeFormatReconstruct Parser s
p
      forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
    TStart { tStartName :: Token -> BS
tStartName = BS
"menuitem" } -> do
      ST s ()
popMenuitem
      forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
    TStart { tStartName :: Token -> BS
tStartName = BS
x } | forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem BS
x [BS
"rb", BS
"rtc"] -> do
      let a :: DOMType
a = BS -> DOMType
domMakeTypeHTML BS
"ruby"
      forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
whenM (forall s. Parser s -> DOMType -> ST s Bool
elementInScope Parser s
p DOMType
a) forall a b. (a -> b) -> a -> b
$ do
        forall s. Parser s -> ST s ()
generateImpliedEndTags Parser s
p
        forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
unlessM (forall s. Parser s -> DOMType -> ST s Bool
currentNodeHasType Parser s
p DOMType
a) forall a b. (a -> b) -> a -> b
$
          BS -> ST s ()
warn BS
"ruby element not in scope"
      forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
    TStart { tStartName :: Token -> BS
tStartName = BS
x } | forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem BS
x [BS
"rp", BS
"rt"] -> do
      let a :: DOMType
a = BS -> DOMType
domMakeTypeHTML BS
"ruby"
          b :: DOMType
b = BS -> DOMType
domMakeTypeHTML BS
"rtc"
      forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
whenM (forall s. Parser s -> DOMType -> ST s Bool
elementInScope Parser s
p DOMType
a) forall a b. (a -> b) -> a -> b
$ do
        forall s. Parser s -> BS -> ST s ()
generateImpliedEndTagsExcept Parser s
p BS
"rtc"
        forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
unlessM (forall s. Parser s -> DOMType -> ST s Bool
currentNodeHasType Parser s
p DOMType
a forall (m :: * -> *). Monad m => m Bool -> m Bool -> m Bool
||^ forall s. Parser s -> DOMType -> ST s Bool
currentNodeHasType Parser s
p DOMType
b) forall a b. (a -> b) -> a -> b
$
          BS -> ST s ()
warn BS
"ruby or rtc element not in scope"
      forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
    TStart { tStartName :: Token -> BS
tStartName = BS
"math" } -> do
      forall s. Parser s -> ST s ()
activeFormatReconstruct Parser s
p
      forall s. Parser s -> Token -> ST s ()
insertMathMLElement Parser s
p forall b c a. (b -> c) -> (a -> b) -> a -> c
. Token -> Token
adjustAttrForeign forall b c a. (b -> c) -> (a -> b) -> a -> c
. Token -> Token
adjustAttrMathML forall a b. (a -> b) -> a -> b
$ Token
t
      forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Token -> Bool
tStartClosed Token
t) forall a b. (a -> b) -> a -> b
$ do
        forall s. Parser s -> ST s ()
elementStackPop Parser s
p
        forall s. Parser s -> ST s ()
selfClosingAcknowledge Parser s
p
    TStart { tStartName :: Token -> BS
tStartName = BS
"svg" } -> do
      forall s. Parser s -> ST s ()
activeFormatReconstruct Parser s
p
      forall s. Parser s -> Token -> ST s ()
insertSvgElement Parser s
p forall b c a. (b -> c) -> (a -> b) -> a -> c
. Token -> Token
adjustAttrForeign forall b c a. (b -> c) -> (a -> b) -> a -> c
. Token -> Token
adjustAttrSVG forall a b. (a -> b) -> a -> b
$ Token
t
      forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Token -> Bool
tStartClosed Token
t) forall a b. (a -> b) -> a -> b
$ do
        forall s. Parser s -> ST s ()
elementStackPop Parser s
p
        forall s. Parser s -> ST s ()
selfClosingAcknowledge Parser s
p
    TStart { tStartName :: Token -> BS
tStartName = BS
x } | forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem BS
x
      [BS
"caption", BS
"col", BS
"colgroup", BS
"frame", BS
"head",
       BS
"tbody", BS
"td", BS
"tfoot", BS
"th", BS
"thead", BS
"tr"] ->
      BS -> ST s ()
warn BS
"bad start token"
    TStart {} -> do
      forall s. Parser s -> ST s ()
activeFormatReconstruct Parser s
p
      forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
    TEnd {} ->
      ST s ()
doAnyOtherEndTag
  where
    closeP :: ST s ()
closeP = do
      let a :: DOMType
a = BS -> DOMType
domMakeTypeHTML BS
"p"
      forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
whenM (forall s. Parser s -> DOMType -> ST s Bool
elementInButtonScope Parser s
p DOMType
a) forall a b. (a -> b) -> a -> b
$ forall s. Parser s -> ST s ()
closeElementP Parser s
p
    popMenuitem :: ST s ()
popMenuitem =
      forall s. Parser s -> (DOMNode -> Bool) -> ST s ()
elementStackPopIf Parser s
p forall a b. (a -> b) -> a -> b
$ BS -> DOMNode -> Bool
elementName BS
"menuitem"
    runAA :: BS -> ST s ()
runAA =
      forall a b c. (a -> b -> c) -> b -> a -> c
flip (forall s. Parser s -> BS -> ST s () -> ST s ()
adoptionAgencyRun Parser s
p) ST s ()
doAnyOtherEndTag
    doAnyOtherEndTag :: ST s ()
doAnyOtherEndTag =
      forall s. Parser s -> ST s [DOMType]
elementStackTypes Parser s
p forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= [DOMType] -> ST s ()
f
      where
        n :: BS
n = Token -> BS
tEndName Token
t
        a :: DOMType
a = BS -> DOMType
domMakeTypeHTML BS
n
        f :: [DOMType] -> ST s ()
f [] = forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
        f (DOMType
x:[DOMType]
xs)
          | DOMType
x forall a. Eq a => a -> a -> Bool
== DOMType
a = do
              forall s. Parser s -> BS -> ST s ()
generateImpliedEndTagsExcept Parser s
p BS
n
              forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
unlessM (forall s. Parser s -> DOMType -> ST s Bool
currentNodeHasType Parser s
p DOMType
x) forall a b. (a -> b) -> a -> b
$
                BS -> ST s ()
warn BS
"current node has wrong type"
              forall s. Parser s -> ST s ()
elementStackPop Parser s
p
          | DOMType -> Bool
elementIsSpecial DOMType
x = do
              BS -> ST s ()
warn BS
"special element in stack"
          | Bool
otherwise = [DOMType] -> ST s ()
f [DOMType]
xs
    warn :: BS -> ST s ()
warn BS
x =
      forall s. Parser s -> Maybe Token -> BS -> ST s ()
parseError Parser s
p (forall a. a -> Maybe a
Just Token
t) forall a b. (a -> b) -> a -> b
$ BS
"in body " forall a. Semigroup a => a -> a -> a
<> BS
x

-- | Handle the text insertion mode.
doModeText :: Parser s -> Token -> ST s ()
doModeText :: forall s. Parser s -> Token -> ST s ()
doModeText p :: Parser s
p@Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} Token
t =
  case Token
t of
    TChar {} ->
      forall s. Parser s -> Token -> ST s ()
insertChar Parser s
p Token
t
    Token
TEOF -> do
      forall s. Parser s -> Maybe Token -> BS -> ST s ()
parseError Parser s
p (forall a. a -> Maybe a
Just Token
t) BS
"text eof"
      forall s. Parser s -> ST s ()
elementStackPop Parser s
p
      forall s. Parser s -> ST s ()
restoreMode Parser s
p
      forall s. Parser s -> Token -> ST s ()
reprocess Parser s
p Token
t
    TEnd { tEndName :: Token -> BS
tEndName = BS
"script" } -> do
      forall s. Parser s -> ST s ()
elementStackPop Parser s
p
      forall s. Parser s -> ST s ()
restoreMode Parser s
p
      -- The standard explains how to execute the script
      -- at this point, but we are just parsing.
    Token
_otherwise -> do
      forall s. Parser s -> ST s ()
elementStackPop Parser s
p
      forall s. Parser s -> ST s ()
restoreMode Parser s
p

-- | Handle the in-table insertion mode.
doModeInTable :: Parser s -> Token -> ST s ()
doModeInTable :: forall s. Parser s -> Token -> ST s ()
doModeInTable p :: Parser s
p@Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} Token
t =
  case Token
t of
    TChar {} -> do
      Bool
a <- forall s. Parser s -> [DOMType] -> ST s Bool
currentNodeHasTypeIn Parser s
p forall a b. (a -> b) -> a -> b
$ [BS] -> [DOMType]
domTypesHTML
        [BS
"table", BS
"tbody", BS
"tfoot", BS
"thead", BS
"tr"]
      if Bool
a
      then do
        forall s. Parser s -> ST s ()
pendingTableCharInit Parser s
p
        forall s. Parser s -> ST s ()
saveMode Parser s
p
        forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInTableText
        forall s. Parser s -> Token -> ST s ()
reprocess Parser s
p Token
t
      else do
        -- Because of the way the check is implmented, perform the
        -- steps for anything else here.
        ST s ()
anythingElse
    TComment {} ->
      forall s. Parser s -> Token -> ST s ()
insertComment Parser s
p Token
t
    TDoctype {} ->
      BS -> ST s ()
warn BS
"doctype"
    TStart { tStartName :: Token -> BS
tStartName = BS
"caption" } -> do
      ST s ()
clearToTableContext
      forall s. Parser s -> ST s ()
activeFormatAddMarker Parser s
p
      forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
      forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInCaption
    TStart { tStartName :: Token -> BS
tStartName = BS
"colgroup" } -> do
      ST s ()
clearToTableContext
      forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
      forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInColumnGroup
    TStart { tStartName :: Token -> BS
tStartName = x :: BS
x@BS
"col" } -> do
      ST s ()
clearToTableContext
      forall s. Parser s -> BS -> ST s ()
insertHtmlElementNamed Parser s
p BS
x
      forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInColumnGroup
      forall s. Parser s -> Token -> ST s ()
reprocess Parser s
p Token
t
    TStart { tStartName :: Token -> BS
tStartName = BS
x } | forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem BS
x
      [BS
"tbody", BS
"tfoot", BS
"thead"] -> do
      ST s ()
clearToTableContext
      forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
      forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInTableBody
    TStart { tStartName :: Token -> BS
tStartName = BS
x } | forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem BS
x
      [BS
"td", BS
"th", BS
"tr"] -> do
      ST s ()
clearToTableContext
      forall s. Parser s -> BS -> ST s ()
insertHtmlElementNamed Parser s
p BS
"tbody"
      forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInTableBody
      forall s. Parser s -> Token -> ST s ()
reprocess Parser s
p Token
t
    TStart { tStartName :: Token -> BS
tStartName = x :: BS
x@BS
"table" } -> do
      BS -> ST s ()
warn BS
"table start tag"
      let a :: DOMType
a = BS -> DOMType
domMakeTypeHTML BS
x
      forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
unlessM (forall s. Parser s -> DOMType -> ST s Bool
elementInTableScope Parser s
p DOMType
a) forall a b. (a -> b) -> a -> b
$ do
        forall s. Parser s -> DOMType -> ST s ()
elementStackPopUntilType Parser s
p DOMType
a
        forall s. Parser s -> ST s ()
resetInsertionMode Parser s
p
        forall s. Parser s -> Token -> ST s ()
reprocess Parser s
p Token
t
    TEnd { tEndName :: Token -> BS
tEndName = x :: BS
x@BS
"table" } -> do
      let a :: DOMType
a = BS -> DOMType
domMakeTypeHTML BS
x
      forall s. Parser s -> DOMType -> ST s Bool
elementInTableScope Parser s
p DOMType
a forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
        Bool
False ->
          BS -> ST s ()
warn BS
"no table in scope"
        Bool
True -> do
          forall s. Parser s -> DOMType -> ST s ()
elementStackPopUntilType Parser s
p DOMType
a
          forall s. Parser s -> ST s ()
resetInsertionMode Parser s
p
    TStart { tStartName :: Token -> BS
tStartName = BS
x } | forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem BS
x
      [BS
"body", BS
"caption", BS
"col", BS
"colgroup", BS
"html",
       BS
"tbody", BS
"td", BS
"tfoot", BS
"th", BS
"thead", BS
"tr"] ->
      BS -> ST s ()
warn BS
"unexpected start tag"
    TStart { tStartName :: Token -> BS
tStartName = BS
x } | forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem BS
x
     [BS
"style", BS
"script", BS
"template"] ->
      forall s. Parser s -> Token -> ST s ()
doModeInHead Parser s
p Token
t
    TEnd { tEndName :: Token -> BS
tEndName = BS
"template" } ->
      forall s. Parser s -> Token -> ST s ()
doModeInHead Parser s
p Token
t
    TStart { tStartName :: Token -> BS
tStartName = BS
"input" } -> do
      if case BS -> Token -> Maybe TAttr
tokenGetAttr BS
"type" Token
t of
        Maybe TAttr
Nothing -> Bool
True
        Just TAttr
a -> BS -> BS
bsLower (TAttr -> BS
tAttrName TAttr
a) forall a. Eq a => a -> a -> Bool
/= BS
"hidden"
      then ST s ()
anythingElse
      else do
        BS -> ST s ()
warn BS
"hidden input"
        forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
        forall s. Parser s -> ST s ()
elementStackPop Parser s
p
        forall s. Parser s -> ST s ()
selfClosingAcknowledge Parser s
p
    TStart { tStartName :: Token -> BS
tStartName = BS
"form" } -> do
      BS -> ST s ()
warn BS
"form start tag"
      forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
unlessM (forall s. Parser s -> ST s Bool
elementStackHasTemplate Parser s
p forall (m :: * -> *). Monad m => m Bool -> m Bool -> m Bool
||^ forall s. Parser s -> ST s Bool
formNotNull Parser s
p) forall a b. (a -> b) -> a -> b
$ do
        forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
        forall s. Parser s -> ST s ()
saveForm Parser s
p
        forall s. Parser s -> ST s ()
elementStackPop Parser s
p
    Token
TEOF ->
      forall s. Parser s -> Token -> ST s ()
doModeInBody Parser s
p Token
t
    Token
_otherwise ->
      ST s ()
anythingElse
  where
    clearToTableContext :: ST s ()
clearToTableContext =
      forall s. Parser s -> (DOMNode -> Bool) -> ST s ()
elementStackPopWhile Parser s
p forall a b. (a -> b) -> a -> b
$ \DOMNode
x -> Bool -> Bool
not forall a b. (a -> b) -> a -> b
$ forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem (DOMNode -> DOMType
domNodeType DOMNode
x) forall a b. (a -> b) -> a -> b
$
        [BS] -> [DOMType]
domTypesHTML [BS
"table", BS
"template", BS
"html"]
    anythingElse :: ST s ()
anythingElse = do
      BS -> ST s ()
warn BS
"unexpected token"
      forall s. Parser s -> ST s ()
fosterParentingSet Parser s
p
      forall s. Parser s -> Token -> ST s ()
doModeInBody Parser s
p Token
t
      forall s. Parser s -> ST s ()
fosterParentingClear Parser s
p
    warn :: BS -> ST s ()
warn BS
x =
      forall s. Parser s -> Maybe Token -> BS -> ST s ()
parseError Parser s
p (forall a. a -> Maybe a
Just Token
t) forall a b. (a -> b) -> a -> b
$ BS
"in table " forall a. Semigroup a => a -> a -> a
<> BS
x

-- | Handle the in-table-text insertion mode.
doModeInTableText :: Parser s -> Token -> ST s ()
doModeInTableText :: forall s. Parser s -> Token -> ST s ()
doModeInTableText p :: Parser s
p@Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} Token
t =
  case Token
t of
    TChar {} ->
      forall s. Parser s -> Token -> ST s ()
pendingTableCharAppend Parser s
p Token
t
    Token
_otherwise -> do
      [Token]
a <- forall s. Parser s -> ST s [Token]
pendingTableChars Parser s
p
      if forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (Bool -> Bool
not forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word8 -> Bool
chrWhitespace forall b c a. (b -> c) -> (a -> b) -> a -> c
. Token -> Word8
tCharData) [Token]
a
      then do
        BS -> ST s ()
warn BS
"unexpected character"
        forall s. Parser s -> ST s ()
fosterParentingSet Parser s
p
        forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (forall s. Parser s -> Token -> ST s ()
doModeInBody Parser s
p) [Token]
a
        forall s. Parser s -> ST s ()
fosterParentingClear Parser s
p
      else do
        forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (forall s. Parser s -> Token -> ST s ()
insertChar Parser s
p) [Token]
a
      forall s. Parser s -> ST s ()
restoreMode Parser s
p
      forall s. Parser s -> Token -> ST s ()
reprocess Parser s
p Token
t
  where
    warn :: BS -> ST s ()
warn BS
x =
      forall s. Parser s -> Maybe Token -> BS -> ST s ()
parseError Parser s
p (forall a. a -> Maybe a
Just Token
t) forall a b. (a -> b) -> a -> b
$ BS
"in table text " forall a. Semigroup a => a -> a -> a
<> BS
x

-- | Handle the in-caption insertion mode.
doModeInCaption :: Parser s -> Token -> ST s ()
doModeInCaption :: forall s. Parser s -> Token -> ST s ()
doModeInCaption p :: Parser s
p@Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} Token
t =
  case Token
t of
    TEnd { tEndName :: Token -> BS
tEndName = x :: BS
x@BS
"caption" } ->
      ST s ()
processCaption
    TStart { tStartName :: Token -> BS
tStartName = BS
x } | forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem BS
x
      [BS
"caption", BS
"col", BS
"colgroup",
       BS
"tbody", BS
"td", BS
"tfoot", BS
"th", BS
"thead", BS
"tr"] -> do
      ST s ()
processCaption
      forall s. Parser s -> Token -> ST s ()
reprocess Parser s
p Token
t
    TEnd { tEndName :: Token -> BS
tEndName = BS
"table" } -> do
      ST s ()
processCaption
      forall s. Parser s -> Token -> ST s ()
reprocess Parser s
p Token
t
    TEnd { tEndName :: Token -> BS
tEndName = BS
x } | forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem BS
x
      [BS
"body", BS
"col", BS
"colgroup", BS
"html",
       BS
"tbody", BS
"td", BS
"tfoot", BS
"th", BS
"thead", BS
"tr"] ->
      BS -> ST s ()
warn BS
"unexpected end tag"
    Token
_otherwise ->
      forall s. Parser s -> Token -> ST s ()
doModeInBody Parser s
p Token
t
  where
    processCaption :: ST s ()
processCaption = do
      let a :: DOMType
a = BS -> DOMType
domMakeTypeHTML BS
"caption"
      forall s. Parser s -> DOMType -> ST s Bool
elementInTableScope Parser s
p DOMType
a forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
        Bool
False ->
          BS -> ST s ()
warn BS
"no caption in table scope"
        Bool
True -> do
          forall s. Parser s -> ST s ()
generateImpliedEndTags Parser s
p
          forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
unlessM (forall s. Parser s -> DOMType -> ST s Bool
currentNodeHasType Parser s
p DOMType
a) forall a b. (a -> b) -> a -> b
$
            BS -> ST s ()
warn BS
"current node is not a caption"
          forall s. Parser s -> DOMType -> ST s ()
elementStackPopUntilType Parser s
p DOMType
a
          forall s. Parser s -> ST s ()
activeFormatClear Parser s
p
          forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInTable
    warn :: BS -> ST s ()
warn BS
x =
      forall s. Parser s -> Maybe Token -> BS -> ST s ()
parseError Parser s
p (forall a. a -> Maybe a
Just Token
t) forall a b. (a -> b) -> a -> b
$ BS
"in caption " forall a. Semigroup a => a -> a -> a
<> BS
x

-- | Handle the in-column-group insertion mode.
doModeInColumnGroup :: Parser s -> Token -> ST s ()
doModeInColumnGroup :: forall s. Parser s -> Token -> ST s ()
doModeInColumnGroup p :: Parser s
p@Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} Token
t =
  case Token
t of
    TChar {Word8
tCharData :: Word8
tCharData :: Token -> Word8
..} | Word8 -> Bool
chrWhitespace Word8
tCharData ->
      forall s. Parser s -> Token -> ST s ()
insertChar Parser s
p Token
t
    TComment {} ->
      forall s. Parser s -> Token -> ST s ()
insertComment Parser s
p Token
t
    TDoctype {} ->
      BS -> ST s ()
warn BS
"doctype"
    TStart { tStartName :: Token -> BS
tStartName = BS
"html" } ->
      forall s. Parser s -> Token -> ST s ()
doModeInBody Parser s
p Token
t
    TStart { tStartName :: Token -> BS
tStartName = BS
"col" } -> do
      forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
      forall s. Parser s -> ST s ()
elementStackPop Parser s
p
      forall s. Parser s -> ST s ()
selfClosingAcknowledge Parser s
p
    TEnd { tEndName :: Token -> BS
tEndName = x :: BS
x@BS
"colgroup" } -> do
      let a :: DOMType
a = BS -> DOMType
domMakeTypeHTML BS
x
      forall s. Parser s -> DOMType -> ST s Bool
currentNodeHasType Parser s
p DOMType
a forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
        Bool
False ->
          BS -> ST s ()
warn BS
"current node not colgroup end"
        Bool
True -> do
          forall s. Parser s -> ST s ()
elementStackPop Parser s
p
          forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInTable
    TEnd { tEndName :: Token -> BS
tEndName = BS
"col" } ->
      BS -> ST s ()
warn BS
"col end tag"
    TStart { tStartName :: Token -> BS
tStartName = BS
"template" } ->
      forall s. Parser s -> Token -> ST s ()
doModeInHead Parser s
p Token
t
    TEnd { tEndName :: Token -> BS
tEndName = BS
"template" } ->
      forall s. Parser s -> Token -> ST s ()
doModeInHead Parser s
p Token
t
    Token
TEOF ->
      forall s. Parser s -> Token -> ST s ()
doModeInBody Parser s
p Token
t
    Token
_otherwise -> do
      let a :: DOMType
a = BS -> DOMType
domMakeTypeHTML BS
"colgroup"
      forall s. Parser s -> DOMType -> ST s Bool
currentNodeHasType Parser s
p DOMType
a forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
        Bool
False ->
          BS -> ST s ()
warn BS
"current node not colgroup end"
        Bool
True -> do
          forall s. Parser s -> ST s ()
elementStackPop Parser s
p
          forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInTable
          forall s. Parser s -> Token -> ST s ()
reprocess Parser s
p Token
t
  where
    warn :: BS -> ST s ()
warn BS
x =
      forall s. Parser s -> Maybe Token -> BS -> ST s ()
parseError Parser s
p (forall a. a -> Maybe a
Just Token
t) forall a b. (a -> b) -> a -> b
$ BS
"in column group " forall a. Semigroup a => a -> a -> a
<> BS
x

-- | Handle the in-table-body insertion mode.
doModeInTableBody :: Parser s -> Token -> ST s ()
doModeInTableBody :: forall s. Parser s -> Token -> ST s ()
doModeInTableBody p :: Parser s
p@Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} Token
t =
  case Token
t of
    TStart { tStartName :: Token -> BS
tStartName = BS
"tr" } -> do
      ST s ()
clearToTableBodyContext
      forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
      forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInRow
    TStart { tStartName :: Token -> BS
tStartName = BS
x } | forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem BS
x [BS
"th", BS
"td"] -> do
      BS -> ST s ()
warn BS
"th or td missing tr"
      ST s ()
clearToTableBodyContext
      forall s. Parser s -> BS -> ST s ()
insertHtmlElementNamed Parser s
p BS
"tr"
      forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInRow
      forall s. Parser s -> Token -> ST s ()
reprocess Parser s
p Token
t
    TEnd { tEndName :: Token -> BS
tEndName = BS
x } | forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem BS
x
      [BS
"tbody", BS
"tfoot", BS
"thead"] -> do
      let a :: DOMType
a = BS -> DOMType
domMakeTypeHTML BS
x
      forall s. Parser s -> DOMType -> ST s Bool
elementInTableScope Parser s
p DOMType
a forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
        Bool
False ->
          BS -> ST s ()
warn BS
"element not in table scope"
        Bool
True -> do
          ST s ()
clearToTableBodyContext
          forall s. Parser s -> ST s ()
elementStackPop Parser s
p
          forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInTable
    TStart { tStartName :: Token -> BS
tStartName = BS
x } | forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem BS
x
      [BS
"caption", BS
"col", BS
"colgroup", BS
"tbody", BS
"tfoot", BS
"thead"] ->
      ST s ()
processElements
    TEnd { tEndName :: Token -> BS
tEndName = BS
"table" } ->
      ST s ()
processElements
    TEnd { tEndName :: Token -> BS
tEndName = BS
x } | forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem BS
x
      [BS
"body", BS
"caption", BS
"col", BS
"colgroup", BS
"html", BS
"td", BS
"th", BS
"tr"] ->
      BS -> ST s ()
warn BS
"unexpected end tag"
    Token
_otherwise ->
      forall s. Parser s -> Token -> ST s ()
doModeInTable Parser s
p Token
t
  where
    processElements :: ST s ()
processElements = do
      forall (m :: * -> *) a. Monad m => (a -> m Bool) -> [a] -> m Bool
anyM (forall s. Parser s -> DOMType -> ST s Bool
elementInTableScope Parser s
p forall b c a. (b -> c) -> (a -> b) -> a -> c
. BS -> DOMType
domMakeTypeHTML)
        [BS
"tbody", BS
"tfoot", BS
"thead"] forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
        Bool
False ->
          BS -> ST s ()
warn BS
"element not in table scope"
        Bool
True -> do
          ST s ()
clearToTableBodyContext
          forall s. Parser s -> ST s ()
elementStackPop Parser s
p
          forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInTable
          forall s. Parser s -> Token -> ST s ()
reprocess Parser s
p Token
t
    clearToTableBodyContext :: ST s ()
clearToTableBodyContext =
      forall s. Parser s -> (DOMNode -> Bool) -> ST s ()
elementStackPopWhile Parser s
p forall a b. (a -> b) -> a -> b
$ \DOMNode
x -> Bool -> Bool
not forall a b. (a -> b) -> a -> b
$ forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem (DOMNode -> DOMType
domNodeType DOMNode
x) forall a b. (a -> b) -> a -> b
$
        [BS] -> [DOMType]
domTypesHTML [BS
"tbody", BS
"tfoot", BS
"thead", BS
"template", BS
"html"]
    warn :: BS -> ST s ()
warn BS
x =
      forall s. Parser s -> Maybe Token -> BS -> ST s ()
parseError Parser s
p (forall a. a -> Maybe a
Just Token
t) forall a b. (a -> b) -> a -> b
$ BS
"in table body " forall a. Semigroup a => a -> a -> a
<> BS
x

-- | Handle the in-row insertion mode.
doModeInRow :: Parser s -> Token -> ST s ()
doModeInRow :: forall s. Parser s -> Token -> ST s ()
doModeInRow p :: Parser s
p@Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} Token
t =
  case Token
t of
    TStart { tStartName :: Token -> BS
tStartName = BS
x } | forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem BS
x [BS
"th", BS
"td"] -> do
      ST s ()
clearToTableRowContext
      forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
      forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInCell
      forall s. Parser s -> ST s ()
activeFormatAddMarker Parser s
p
    TEnd { tEndName :: Token -> BS
tEndName = BS
"tr" } ->
      ST s ()
processTr
    TStart { tStartName :: Token -> BS
tStartName = BS
x } | forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem BS
x
      [BS
"caption", BS
"col", BS
"colgroup", BS
"tbody", BS
"tfoot", BS
"thead", BS
"tr"] -> do
      ST s ()
processTr
      forall s. Parser s -> Token -> ST s ()
reprocess Parser s
p Token
t
    TEnd { tEndName :: Token -> BS
tEndName = BS
"table" } -> do
      ST s ()
processTr
      forall s. Parser s -> Token -> ST s ()
reprocess Parser s
p Token
t
    TEnd { tEndName :: Token -> BS
tEndName = BS
x } | forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem BS
x
      [BS
"tbody", BS
"tfoot", BS
"thead"] -> do
      let a :: DOMType
a = BS -> DOMType
domMakeTypeHTML BS
x
          b :: DOMType
b = BS -> DOMType
domMakeTypeHTML BS
"tr"
      forall s. Parser s -> DOMType -> ST s Bool
elementInTableScope Parser s
p DOMType
a forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
        Bool
False ->
          BS -> ST s ()
warn BS
"element not in table scope"
        Bool
True ->
          forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
whenM (forall s. Parser s -> DOMType -> ST s Bool
elementInTableScope Parser s
p DOMType
b) forall a b. (a -> b) -> a -> b
$ do
            ST s ()
clearToTableRowContext
            forall s. Parser s -> ST s ()
elementStackPop Parser s
p
            forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInTableBody
            forall s. Parser s -> Token -> ST s ()
reprocess Parser s
p Token
t
    TEnd { tEndName :: Token -> BS
tEndName = BS
x } | forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem BS
x
      [BS
"body", BS
"caption", BS
"col", BS
"colgroup", BS
"html", BS
"td", BS
"th"] ->
      BS -> ST s ()
warn BS
"unexpected end tag"
    Token
_otherwise ->
      forall s. Parser s -> Token -> ST s ()
doModeInTable Parser s
p Token
t
  where
    processTr :: ST s ()
processTr = do
      let a :: DOMType
a = BS -> DOMType
domMakeTypeHTML BS
"tr"
      forall s. Parser s -> DOMType -> ST s Bool
elementInTableScope Parser s
p DOMType
a forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
        Bool
False ->
          BS -> ST s ()
warn BS
"element not in table scope"
        Bool
True -> do
          ST s ()
clearToTableRowContext
          forall s. Parser s -> ST s ()
elementStackPop Parser s
p
          forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInTableBody
    clearToTableRowContext :: ST s ()
clearToTableRowContext =
      forall s. Parser s -> (DOMNode -> Bool) -> ST s ()
elementStackPopWhile Parser s
p forall a b. (a -> b) -> a -> b
$ \DOMNode
x -> Bool -> Bool
not forall a b. (a -> b) -> a -> b
$ forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem (DOMNode -> DOMType
domNodeType DOMNode
x) forall a b. (a -> b) -> a -> b
$
        [BS] -> [DOMType]
domTypesHTML [BS
"tr", BS
"template", BS
"html"]
    warn :: BS -> ST s ()
warn BS
x =
      forall s. Parser s -> Maybe Token -> BS -> ST s ()
parseError Parser s
p (forall a. a -> Maybe a
Just Token
t) forall a b. (a -> b) -> a -> b
$ BS
"in row " forall a. Semigroup a => a -> a -> a
<> BS
x

-- | Handle the in-cell insertion mode.
doModeInCell :: Parser s -> Token -> ST s ()
doModeInCell :: forall s. Parser s -> Token -> ST s ()
doModeInCell p :: Parser s
p@Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} Token
t =
  case Token
t of
    TEnd { tEndName :: Token -> BS
tEndName = BS
x } | forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem BS
x [BS
"td", BS
"th"] -> do
      let a :: DOMType
a = BS -> DOMType
domMakeTypeHTML BS
x
      forall s. Parser s -> DOMType -> ST s Bool
elementInTableScope Parser s
p DOMType
a forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
        Bool
False ->
          BS -> ST s ()
warn BS
"element not in table scope"
        Bool
True -> do
          forall s. Parser s -> ST s ()
generateImpliedEndTags Parser s
p
          forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
unlessM (forall s. Parser s -> DOMType -> ST s Bool
currentNodeHasType Parser s
p DOMType
a) forall a b. (a -> b) -> a -> b
$
            BS -> ST s ()
warn forall a b. (a -> b) -> a -> b
$ BS
"current node not " forall a. Semigroup a => a -> a -> a
<> BS
x
          forall s. Parser s -> DOMType -> ST s ()
elementStackPopUntilType Parser s
p DOMType
a
          forall s. Parser s -> ST s ()
activeFormatClear Parser s
p
          forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInRow
    TStart { tStartName :: Token -> BS
tStartName = BS
x } | forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem BS
x
      [BS
"caption", BS
"col", BS
"colgroup",
       BS
"tbody", BS
"td", BS
"tfoot", BS
"th", BS
"thead", BS
"tr"] -> do
      forall (m :: * -> *) a. Monad m => (a -> m Bool) -> [a] -> m Bool
anyM (forall s. Parser s -> DOMType -> ST s Bool
elementInTableScope Parser s
p forall b c a. (b -> c) -> (a -> b) -> a -> c
. BS -> DOMType
domMakeTypeHTML) [BS
"td", BS
"th"] forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
        Bool
False ->
          BS -> ST s ()
warn BS
"td or th not in table scope"
        Bool
True -> do
          ST s ()
closeCell
          forall s. Parser s -> Token -> ST s ()
reprocess Parser s
p Token
t
    TEnd { tEndName :: Token -> BS
tEndName = BS
x } | forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem BS
x
      [BS
"body", BS
"caption", BS
"col", BS
"colgroup", BS
"html"] ->
      BS -> ST s ()
warn BS
"unexpected end tag"
    TEnd { tEndName :: Token -> BS
tEndName = BS
x } | forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem BS
x
      [BS
"table", BS
"tbody", BS
"tfoot", BS
"thead", BS
"tr"] -> do
      let a :: DOMType
a = BS -> DOMType
domMakeTypeHTML BS
x
      forall s. Parser s -> DOMType -> ST s Bool
elementInTableScope Parser s
p DOMType
a forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
        Bool
False ->
          BS -> ST s ()
warn BS
"element not in table scope"
        Bool
True -> do
          ST s ()
closeCell
          forall s. Parser s -> Token -> ST s ()
reprocess Parser s
p Token
t
    Token
_otherwise ->
      forall s. Parser s -> Token -> ST s ()
doModeInBody Parser s
p Token
t
  where
    closeCell :: ST s ()
closeCell = do
      let a :: [DOMType]
a = [BS] -> [DOMType]
domTypesHTML [BS
"td", BS
"th"]
      forall s. Parser s -> ST s ()
generateImpliedEndTags Parser s
p
      forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
unlessM (forall s. Parser s -> [DOMType] -> ST s Bool
currentNodeHasTypeIn Parser s
p [DOMType]
a) forall a b. (a -> b) -> a -> b
$
        BS -> ST s ()
warn BS
"current node is not td or th"
      forall s. Parser s -> [DOMType] -> ST s ()
elementStackPopUntilTypeIn Parser s
p [DOMType]
a
      forall s. Parser s -> ST s ()
activeFormatClear Parser s
p
      forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInRow
    warn :: BS -> ST s ()
warn BS
x =
      forall s. Parser s -> Maybe Token -> BS -> ST s ()
parseError Parser s
p (forall a. a -> Maybe a
Just Token
t) forall a b. (a -> b) -> a -> b
$ BS
"in cell " forall a. Semigroup a => a -> a -> a
<> BS
x

-- | Handle the in-select insertion mode.
doModeInSelect :: Parser s -> Token -> ST s ()
doModeInSelect :: forall s. Parser s -> Token -> ST s ()
doModeInSelect p :: Parser s
p@Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} Token
t =
  case Token
t of
    TChar {} ->
      forall s. Parser s -> Token -> ST s ()
insertChar Parser s
p Token
t
    TComment {} ->
      forall s. Parser s -> Token -> ST s ()
insertComment Parser s
p Token
t
    TDoctype {} ->
      BS -> ST s ()
warn BS
"doctype"
    TStart { tStartName :: Token -> BS
tStartName = BS
"html" } ->
      forall s. Parser s -> Token -> ST s ()
doModeInBody Parser s
p Token
t
    TStart { tStartName :: Token -> BS
tStartName = x :: BS
x@BS
"option" } -> do
      forall s. Parser s -> (DOMNode -> Bool) -> ST s ()
elementStackPopIf Parser s
p forall a b. (a -> b) -> a -> b
$ BS -> DOMNode -> Bool
elementName BS
x
      forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
    TStart { tStartName :: Token -> BS
tStartName = x :: BS
x@BS
"optgroup" } -> do
      forall s. Parser s -> (DOMNode -> Bool) -> ST s ()
elementStackPopIf Parser s
p forall a b. (a -> b) -> a -> b
$ BS -> DOMNode -> Bool
elementName BS
"option"
      forall s. Parser s -> (DOMNode -> Bool) -> ST s ()
elementStackPopIf Parser s
p forall a b. (a -> b) -> a -> b
$ BS -> DOMNode -> Bool
elementName BS
x
      forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
    TEnd { tEndName :: Token -> BS
tEndName = x :: BS
x@BS
"optgroup" } -> do
      let a :: DOMType
a = BS -> DOMType
domMakeTypeHTML BS
"option"
          b :: DOMType
b = BS -> DOMType
domMakeTypeHTML BS
x
      [DOMType]
y <- forall a. DOMID -> [a] -> [a]
take DOMID
2 forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s. Parser s -> ST s [DOMType]
elementStackTypes Parser s
p
      forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when ([DOMType]
y forall a. Eq a => a -> a -> Bool
== [DOMType
a,DOMType
b]) forall a b. (a -> b) -> a -> b
$ forall s. Parser s -> ST s ()
elementStackPop Parser s
p
      forall s. Parser s -> DOMType -> ST s Bool
currentNodeHasType Parser s
p DOMType
b forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
        Bool
False ->
          BS -> ST s ()
warn forall a b. (a -> b) -> a -> b
$ BS
"current node not " forall a. Semigroup a => a -> a -> a
<> BS
x
        Bool
True ->
          forall s. Parser s -> ST s ()
elementStackPop Parser s
p
    TEnd { tEndName :: Token -> BS
tEndName = x :: BS
x@BS
"option" } -> do
      forall s. Parser s -> DOMType -> ST s Bool
currentNodeHasType Parser s
p (BS -> DOMType
domMakeTypeHTML BS
x) forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
        Bool
False ->
          BS -> ST s ()
warn forall a b. (a -> b) -> a -> b
$ BS
"current node not " forall a. Semigroup a => a -> a -> a
<> BS
x
        Bool
True ->
          forall s. Parser s -> ST s ()
elementStackPop Parser s
p
    TEnd { tEndName :: Token -> BS
tEndName = x :: BS
x@BS
"select" } -> do
      let a :: DOMType
a = BS -> DOMType
domMakeTypeHTML BS
x
      forall s. Parser s -> DOMType -> ST s Bool
elementInSelectScope Parser s
p DOMType
a forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
        Bool
False ->
          BS -> ST s ()
warn BS
"no select in select scope"
        Bool
True -> do
          forall s. Parser s -> DOMType -> ST s ()
elementStackPopUntilType Parser s
p DOMType
a
          forall s. Parser s -> ST s ()
resetInsertionMode Parser s
p
    TStart { tStartName :: Token -> BS
tStartName = x :: BS
x@BS
"select" } -> do
      BS -> ST s ()
warn BS
"unexpected start tag"
      let a :: DOMType
a = BS -> DOMType
domMakeTypeHTML BS
x
      forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
whenM (forall s. Parser s -> DOMType -> ST s Bool
elementInSelectScope Parser s
p DOMType
a) forall a b. (a -> b) -> a -> b
$ do
        forall s. Parser s -> DOMType -> ST s ()
elementStackPopUntilType Parser s
p DOMType
a
        forall s. Parser s -> ST s ()
resetInsertionMode Parser s
p
    TStart { tStartName :: Token -> BS
tStartName = BS
x } | forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem BS
x
      [BS
"input", BS
"keygen", BS
"textarea"] -> do
      BS -> ST s ()
warn BS
"unexpected start tag"
      let a :: DOMType
a = BS -> DOMType
domMakeTypeHTML BS
x
      forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
whenM (forall s. Parser s -> DOMType -> ST s Bool
elementInSelectScope Parser s
p DOMType
a) forall a b. (a -> b) -> a -> b
$ do
        forall s. Parser s -> DOMType -> ST s ()
elementStackPopUntilType Parser s
p DOMType
a
        forall s. Parser s -> ST s ()
resetInsertionMode Parser s
p
        forall s. Parser s -> Token -> ST s ()
reprocess Parser s
p Token
t
    TStart { tStartName :: Token -> BS
tStartName = BS
x } | forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem BS
x
     [BS
"script", BS
"template"] ->
      forall s. Parser s -> Token -> ST s ()
doModeInHead Parser s
p Token
t
    TEnd { tEndName :: Token -> BS
tEndName = BS
"template" } ->
      forall s. Parser s -> Token -> ST s ()
doModeInHead Parser s
p Token
t
    Token
TEOF ->
      forall s. Parser s -> Token -> ST s ()
doModeInBody Parser s
p Token
t
    Token
_otherwise ->
      BS -> ST s ()
warn BS
"unexpected token"
  where
    warn :: BS -> ST s ()
warn BS
x =
      forall s. Parser s -> Maybe Token -> BS -> ST s ()
parseError Parser s
p (forall a. a -> Maybe a
Just Token
t) forall a b. (a -> b) -> a -> b
$ BS
"in select " forall a. Semigroup a => a -> a -> a
<> BS
x

-- | Handle the in-select-in-table insertion mode.
doModeInSelectInTable :: Parser s -> Token -> ST s ()
doModeInSelectInTable :: forall s. Parser s -> Token -> ST s ()
doModeInSelectInTable p :: Parser s
p@Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} Token
t =
  case Token
t of
    TStart { tStartName :: Token -> BS
tStartName = BS
x } | forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem BS
x
      [BS
"caption", BS
"table", BS
"tbody", BS
"tfoot",
       BS
"thead", BS
"tr", BS
"td", BS
"th"] -> do
      BS -> ST s ()
warn BS
"unexpected start tag"
      forall s. Parser s -> DOMType -> ST s ()
elementStackPopUntilType Parser s
p forall a b. (a -> b) -> a -> b
$ BS -> DOMType
domMakeTypeHTML BS
"select"
      forall s. Parser s -> ST s ()
resetInsertionMode Parser s
p
      forall s. Parser s -> Token -> ST s ()
reprocess Parser s
p Token
t
    TEnd { tEndName :: Token -> BS
tEndName = BS
x } | forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem BS
x
      [BS
"caption", BS
"table", BS
"tbody", BS
"tfoot",
       BS
"thead", BS
"tr", BS
"td", BS
"th"] -> do
      BS -> ST s ()
warn BS
"unexpected end tag"
      forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
whenM (forall s. Parser s -> DOMType -> ST s Bool
elementInTableScope Parser s
p forall a b. (a -> b) -> a -> b
$ BS -> DOMType
domMakeTypeHTML BS
x) forall a b. (a -> b) -> a -> b
$ do
        forall s. Parser s -> DOMType -> ST s ()
elementStackPopUntilType Parser s
p forall a b. (a -> b) -> a -> b
$ BS -> DOMType
domMakeTypeHTML BS
"select"
        forall s. Parser s -> ST s ()
resetInsertionMode Parser s
p
        forall s. Parser s -> Token -> ST s ()
reprocess Parser s
p Token
t
    Token
_otherwise ->
      forall s. Parser s -> Token -> ST s ()
doModeInSelect Parser s
p Token
t
  where
    warn :: BS -> ST s ()
warn BS
x =
      forall s. Parser s -> Maybe Token -> BS -> ST s ()
parseError Parser s
p (forall a. a -> Maybe a
Just Token
t) forall a b. (a -> b) -> a -> b
$ BS
"in select in table " forall a. Semigroup a => a -> a -> a
<> BS
x

-- | Handle the in-template insertion mode.
doModeInTemplate :: Parser s -> Token -> ST s ()
doModeInTemplate :: forall s. Parser s -> Token -> ST s ()
doModeInTemplate p :: Parser s
p@Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} Token
t =
  case Token
t of
    TChar {} ->
      forall s. Parser s -> Token -> ST s ()
doModeInBody Parser s
p Token
t
    TComment {} ->
      forall s. Parser s -> Token -> ST s ()
doModeInBody Parser s
p Token
t
    TDoctype {} ->
      forall s. Parser s -> Token -> ST s ()
doModeInBody Parser s
p Token
t
    TStart { tStartName :: Token -> BS
tStartName = BS
x } | forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem BS
x
      [BS
"base", BS
"basefont", BS
"bgsound", BS
"link", BS
"meta",
       BS
"noframes", BS
"script", BS
"style", BS
"template", BS
"title"] ->
      forall s. Parser s -> Token -> ST s ()
doModeInHead Parser s
p Token
t
    TEnd { tEndName :: Token -> BS
tEndName = BS
"template" } ->
      forall s. Parser s -> Token -> ST s ()
doModeInHead Parser s
p Token
t
    TStart { tStartName :: Token -> BS
tStartName = BS
x } | forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem BS
x
      [BS
"caption", BS
"col", BS
"tbody", BS
"tfoot", BS
"thead"] -> do
      forall s. Parser s -> ST s ()
templateModePop Parser s
p
      forall s. Parser s -> ParserMode -> ST s ()
templateModePush Parser s
p ParserMode
ModeInTable
      forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInTable
      forall s. Parser s -> Token -> ST s ()
reprocess Parser s
p Token
t
    TStart { tStartName :: Token -> BS
tStartName = BS
"col" } -> do
      forall s. Parser s -> ST s ()
templateModePop Parser s
p
      forall s. Parser s -> ParserMode -> ST s ()
templateModePush Parser s
p ParserMode
ModeInColumnGroup
      forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInColumnGroup
      forall s. Parser s -> Token -> ST s ()
reprocess Parser s
p Token
t
    TStart { tStartName :: Token -> BS
tStartName = BS
"tr" } -> do
      forall s. Parser s -> ST s ()
templateModePop Parser s
p
      forall s. Parser s -> ParserMode -> ST s ()
templateModePush Parser s
p ParserMode
ModeInTableBody
      forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInTableBody
      forall s. Parser s -> Token -> ST s ()
reprocess Parser s
p Token
t
    TStart { tStartName :: Token -> BS
tStartName = BS
x } | forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem BS
x [BS
"td", BS
"th"] -> do
      forall s. Parser s -> ST s ()
templateModePop Parser s
p
      forall s. Parser s -> ParserMode -> ST s ()
templateModePush Parser s
p ParserMode
ModeInRow
      forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInRow
      forall s. Parser s -> Token -> ST s ()
reprocess Parser s
p Token
t
    TStart {} -> do
      forall s. Parser s -> ST s ()
templateModePop Parser s
p
      forall s. Parser s -> ParserMode -> ST s ()
templateModePush Parser s
p ParserMode
ModeInBody
      forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInBody
      forall s. Parser s -> Token -> ST s ()
reprocess Parser s
p Token
t
    TEnd {} ->
      BS -> ST s ()
warn BS
"unexpected end tag"
    Token
TEOF ->
      forall s. Parser s -> ST s Bool
elementStackMissingTemplate Parser s
p forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
        Bool
True ->
          forall s. Parser s -> ST s ()
parserSetDone Parser s
p
        Bool
False -> do
          BS -> ST s ()
warn BS
"template on stack"
          forall s. Parser s -> ST s ()
activeFormatClear Parser s
p
          forall s. Parser s -> ST s ()
templateModePop Parser s
p
          forall s. Parser s -> ST s ()
resetInsertionMode Parser s
p
          forall s. Parser s -> Token -> ST s ()
reprocess Parser s
p Token
t
  where
    warn :: BS -> ST s ()
warn BS
x =
      forall s. Parser s -> Maybe Token -> BS -> ST s ()
parseError Parser s
p (forall a. a -> Maybe a
Just Token
t) forall a b. (a -> b) -> a -> b
$ BS
"in template " forall a. Semigroup a => a -> a -> a
<> BS
x

-- | Handle the after-body insertion mode.
doModeAfterBody :: Parser s -> Token -> ST s ()
doModeAfterBody :: forall s. Parser s -> Token -> ST s ()
doModeAfterBody p :: Parser s
p@Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} Token
t =
  case Token
t of
    TChar {Word8
tCharData :: Word8
tCharData :: Token -> Word8
..} | Word8 -> Bool
chrWhitespace Word8
tCharData ->
      forall s. Parser s -> Token -> ST s ()
doModeInBody Parser s
p Token
t
    TComment {} -> do
      DOMPos
x <- DOMID -> DOMPos
domPos forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. HasCallStack => Maybe a -> a
fromJust forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s. Parser s -> ST s (Maybe DOMID)
lastNodeID Parser s
p
      forall s. Parser s -> Token -> ST s DOMNode
commentMake Parser s
p Token
t forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall (f :: * -> *) a. Functor f => f a -> f ()
void forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall s. Parser s -> DOMPos -> DOMNode -> ST s DOMID
insertNewNode Parser s
p DOMPos
x
    TDoctype {} ->
      BS -> ST s ()
warn BS
"doctype"
    TStart { tStartName :: Token -> BS
tStartName = BS
"html" } ->
      forall s. Parser s -> Token -> ST s ()
doModeInBody Parser s
p Token
t
    TEnd { tEndName :: Token -> BS
tEndName = BS
"html" } ->
      forall s a. STRef s a -> ST s a
rref STRef s Bool
parserFragmentMode forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
        Bool
True ->
          BS -> ST s ()
warn BS
"html end tag"
        Bool
False ->
          forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeAfterAfterBody
    Token
TEOF ->
      forall s. Parser s -> ST s ()
parserSetDone Parser s
p
    Token
_otherwise -> do
      BS -> ST s ()
warn BS
"unexpected token"
      forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInBody
      forall s. Parser s -> Token -> ST s ()
reprocess Parser s
p Token
t
  where
    warn :: BS -> ST s ()
warn BS
x =
      forall s. Parser s -> Maybe Token -> BS -> ST s ()
parseError Parser s
p (forall a. a -> Maybe a
Just Token
t) forall a b. (a -> b) -> a -> b
$ BS
"after body " forall a. Semigroup a => a -> a -> a
<> BS
x

-- | Handle the in-frameset insertion mode.
doModeInFrameset :: Parser s -> Token -> ST s ()
doModeInFrameset :: forall s. Parser s -> Token -> ST s ()
doModeInFrameset p :: Parser s
p@Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} Token
t =
  case Token
t of
    TChar {Word8
tCharData :: Word8
tCharData :: Token -> Word8
..} | Word8 -> Bool
chrWhitespace Word8
tCharData ->
      forall s. Parser s -> Token -> ST s ()
insertChar Parser s
p Token
t
    TComment {} ->
      forall s. Parser s -> Token -> ST s ()
insertComment Parser s
p Token
t
    TDoctype {} ->
      BS -> ST s ()
warn BS
"doctype"
    TStart { tStartName :: Token -> BS
tStartName = BS
"html" } ->
      forall s. Parser s -> Token -> ST s ()
doModeInBody Parser s
p Token
t
    TStart { tStartName :: Token -> BS
tStartName = BS
"frameset" } ->
      forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
    TEnd { tEndName :: Token -> BS
tEndName = BS
"frameset" } -> do
      forall s. Parser s -> BS -> ST s Bool
currentNodeHasHTMLType Parser s
p BS
"html" forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
        Bool
True ->
          BS -> ST s ()
warn BS
"current node is html"
        Bool
False -> do
          forall s. Parser s -> ST s ()
elementStackPop Parser s
p
          forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
whenM (forall (m :: * -> *). Functor m => m Bool -> m Bool
notM (forall s a. STRef s a -> ST s a
rref STRef s Bool
parserFragmentMode) forall (m :: * -> *). Monad m => m Bool -> m Bool -> m Bool
&&^
            forall (m :: * -> *). Functor m => m Bool -> m Bool
notM (forall s. Parser s -> BS -> ST s Bool
currentNodeHasHTMLType Parser s
p BS
"frameset")) forall a b. (a -> b) -> a -> b
$
            forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeAfterFrameset
    TStart { tStartName :: Token -> BS
tStartName = BS
"frame" } -> do
      forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
      forall s. Parser s -> ST s ()
elementStackPop Parser s
p
      forall s. Parser s -> ST s ()
selfClosingAcknowledge Parser s
p
    TStart { tStartName :: Token -> BS
tStartName = BS
"noframes" } ->
      forall s. Parser s -> Token -> ST s ()
doModeInHead Parser s
p Token
t
    Token
TEOF -> do
      forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
unlessM (forall s. Parser s -> BS -> ST s Bool
currentNodeHasHTMLType Parser s
p BS
"html") forall a b. (a -> b) -> a -> b
$
        BS -> ST s ()
warn BS
"current node is not html"
      forall s. Parser s -> ST s ()
parserSetDone Parser s
p
    Token
_ ->
      BS -> ST s ()
warn BS
"unexpected token"
  where
    warn :: BS -> ST s ()
warn BS
x =
      forall s. Parser s -> Maybe Token -> BS -> ST s ()
parseError Parser s
p (forall a. a -> Maybe a
Just Token
t) forall a b. (a -> b) -> a -> b
$ BS
"in frameset " forall a. Semigroup a => a -> a -> a
<> BS
x

-- | Handle the after-frameset insertion mode.
doModeAfterFrameset :: Parser s -> Token -> ST s ()
doModeAfterFrameset :: forall s. Parser s -> Token -> ST s ()
doModeAfterFrameset p :: Parser s
p@Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} Token
t =
  case Token
t of
    TChar {Word8
tCharData :: Word8
tCharData :: Token -> Word8
..} | Word8 -> Bool
chrWhitespace Word8
tCharData ->
      forall s. Parser s -> Token -> ST s ()
insertChar Parser s
p Token
t
    TComment {} ->
      forall s. Parser s -> Token -> ST s ()
insertComment Parser s
p Token
t
    TDoctype {} ->
      BS -> ST s ()
warn BS
"doctype"
    TStart { tStartName :: Token -> BS
tStartName = BS
"html" } ->
      forall s. Parser s -> Token -> ST s ()
doModeInBody Parser s
p Token
t
    TEnd { tEndName :: Token -> BS
tEndName = BS
"html" } ->
      forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeAfterAfterFrameset
    TStart { tStartName :: Token -> BS
tStartName = BS
"noframes" } ->
      forall s. Parser s -> Token -> ST s ()
doModeInHead Parser s
p Token
t
    Token
TEOF ->
      forall s. Parser s -> ST s ()
parserSetDone Parser s
p
    Token
_ ->
      BS -> ST s ()
warn BS
"unexpected token"
    where
      warn :: BS -> ST s ()
warn BS
x =
        forall s. Parser s -> Maybe Token -> BS -> ST s ()
parseError Parser s
p (forall a. a -> Maybe a
Just Token
t) forall a b. (a -> b) -> a -> b
$ BS
"after frameset " forall a. Semigroup a => a -> a -> a
<> BS
x

-- | Handle the after-after-body insertion mode.
doModeAfterAfterBody :: Parser s -> Token -> ST s ()
doModeAfterAfterBody :: forall s. Parser s -> Token -> ST s ()
doModeAfterAfterBody p :: Parser s
p@Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} Token
t =
  case Token
t of
    TComment {} ->
      forall s. Parser s -> Token -> ST s ()
insertDocComment Parser s
p Token
t
    TDoctype {} ->
      forall s. Parser s -> Token -> ST s ()
doModeInBody Parser s
p Token
t
    TChar {Word8
tCharData :: Word8
tCharData :: Token -> Word8
..} | Word8 -> Bool
chrWhitespace Word8
tCharData ->
      forall s. Parser s -> Token -> ST s ()
doModeInBody Parser s
p Token
t
    TStart { tStartName :: Token -> BS
tStartName = BS
"html" } ->
      forall s. Parser s -> Token -> ST s ()
doModeInBody Parser s
p Token
t
    Token
TEOF ->
      forall s. Parser s -> ST s ()
parserSetDone Parser s
p
    Token
_otherwise -> do
      BS -> ST s ()
warn BS
"unexpected token"
      forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInBody
      forall s. Parser s -> Token -> ST s ()
reprocess Parser s
p Token
t
    where
      warn :: BS -> ST s ()
warn BS
x =
        forall s. Parser s -> Maybe Token -> BS -> ST s ()
parseError Parser s
p (forall a. a -> Maybe a
Just Token
t) forall a b. (a -> b) -> a -> b
$ BS
"after after body " forall a. Semigroup a => a -> a -> a
<> BS
x

-- | Handle the after-after-frameset insertion mode.
doModeAfterAfterFrameset :: Parser s -> Token -> ST s ()
doModeAfterAfterFrameset :: forall s. Parser s -> Token -> ST s ()
doModeAfterAfterFrameset p :: Parser s
p@Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} Token
t =
  case Token
t of
    TComment {} ->
      forall s. Parser s -> Token -> ST s ()
insertDocComment Parser s
p Token
t
    TDoctype {} ->
      forall s. Parser s -> Token -> ST s ()
doModeInBody Parser s
p Token
t
    TChar {Word8
tCharData :: Word8
tCharData :: Token -> Word8
..} | Word8 -> Bool
chrWhitespace Word8
tCharData ->
      forall s. Parser s -> Token -> ST s ()
doModeInBody Parser s
p Token
t
    TStart { tStartName :: Token -> BS
tStartName = BS
"html" } ->
      forall s. Parser s -> Token -> ST s ()
doModeInBody Parser s
p Token
t
    Token
TEOF ->
      forall s. Parser s -> ST s ()
parserSetDone Parser s
p
    TStart { tStartName :: Token -> BS
tStartName = BS
"noframes" } ->
      forall s. Parser s -> Token -> ST s ()
doModeInHead Parser s
p Token
t
    Token
_otherwise -> do
      BS -> ST s ()
warn BS
"unexpected token"
    where
      warn :: BS -> ST s ()
warn BS
x =
        forall s. Parser s -> Maybe Token -> BS -> ST s ()
parseError Parser s
p (forall a. a -> Maybe a
Just Token
t) forall a b. (a -> b) -> a -> b
$ BS
"after after frameset " forall a. Semigroup a => a -> a -> a
<> BS
x

-- | Handle foreign content.
doForeignContent :: Parser s -> Token -> ST s ()
doForeignContent :: forall s. Parser s -> Token -> ST s ()
doForeignContent p :: Parser s
p@Parser {Bool
STRef s Bool
STRef s [DOMID]
STRef s [Token]
STRef s [ParserFormatItem]
STRef s [ParserMode]
STRef s (Maybe DOMID)
STRef s (IntMap (STRef s (Buffer s)))
STRef s (DList BS)
STRef s (Lexer s)
STRef s DOM
STRef s (ParserAdoptionAgency s)
STRef s ParserMode
parserLogErrors :: Bool
parserTextMap :: STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: STRef s Bool
parserErrors :: STRef s (DList BS)
parserAdoptionAgency :: STRef s (ParserAdoptionAgency s)
parserTableChars :: STRef s [Token]
parserDone :: STRef s Bool
parserFrameSetOK :: STRef s Bool
parserFosterParenting :: STRef s Bool
parserFragmentMode :: STRef s Bool
parserSelfClosingFlag :: STRef s Bool
parserFormElement :: STRef s (Maybe DOMID)
parserHeadElement :: STRef s (Maybe DOMID)
parserContextElement :: STRef s (Maybe DOMID)
parserTemplateMode :: STRef s [ParserMode]
parserOriginalMode :: STRef s ParserMode
parserInsertionMode :: STRef s ParserMode
parserActiveFormatList :: STRef s [ParserFormatItem]
parserElementStack :: STRef s [DOMID]
parserDOM :: STRef s DOM
parserLexer :: STRef s (Lexer s)
parserLogErrors :: forall s. Parser s -> Bool
parserTextMap :: forall s. Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserIFrameSrcDoc :: forall s. Parser s -> STRef s Bool
parserErrors :: forall s. Parser s -> STRef s (DList BS)
parserAdoptionAgency :: forall s. Parser s -> STRef s (ParserAdoptionAgency s)
parserTableChars :: forall s. Parser s -> STRef s [Token]
parserDone :: forall s. Parser s -> STRef s Bool
parserFrameSetOK :: forall s. Parser s -> STRef s Bool
parserFosterParenting :: forall s. Parser s -> STRef s Bool
parserFragmentMode :: forall s. Parser s -> STRef s Bool
parserSelfClosingFlag :: forall s. Parser s -> STRef s Bool
parserFormElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserHeadElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserContextElement :: forall s. Parser s -> STRef s (Maybe DOMID)
parserTemplateMode :: forall s. Parser s -> STRef s [ParserMode]
parserOriginalMode :: forall s. Parser s -> STRef s ParserMode
parserInsertionMode :: forall s. Parser s -> STRef s ParserMode
parserActiveFormatList :: forall s. Parser s -> STRef s [ParserFormatItem]
parserElementStack :: forall s. Parser s -> STRef s [DOMID]
parserDOM :: forall s. Parser s -> STRef s DOM
parserLexer :: forall s. Parser s -> STRef s (Lexer s)
..} Token
t =
  case Token
t of
    TChar {Word8
tCharData :: Word8
tCharData :: Token -> Word8
..} | Word8 -> Bool
chrWhitespace Word8
tCharData ->
      forall s. Parser s -> Token -> ST s ()
insertChar Parser s
p Token
t
    TChar {} -> do
      forall s. Parser s -> Token -> ST s ()
insertChar Parser s
p Token
t
      forall s. Parser s -> ST s ()
frameSetNotOK Parser s
p
    TComment {} ->
      forall s. Parser s -> Token -> ST s ()
insertComment Parser s
p Token
t
    TDoctype {} ->
      BS -> ST s ()
warn BS
"doctype"
    TStart { tStartName :: Token -> BS
tStartName = BS
x } | forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem BS
x
      [BS
"b", BS
"big", BS
"blockquote", BS
"body", BS
"br", BS
"center",
       BS
"code", BS
"dd", BS
"div", BS
"dl", BS
"dt", BS
"em", BS
"embed",
       BS
"h1", BS
"h2", BS
"h3", BS
"h4", BS
"h5", BS
"h6", BS
"head",
       BS
"hr", BS
"i", BS
"img", BS
"li", BS
"listing", BS
"menu",
       BS
"meta", BS
"nobr", BS
"ol", BS
"p", BS
"pre", BS
"ruby", BS
"s",
       BS
"small", BS
"span", BS
"strong", BS
"strike", BS
"sub",
       BS
"sup", BS
"table", BS
"tt", BS
"u", BS
"ul", BS
"var"]
      Bool -> Bool -> Bool
|| BS
x forall a. Eq a => a -> a -> Bool
== BS
"font" Bool -> Bool -> Bool
&&
         forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (forall a b c. (a -> b -> c) -> b -> a -> c
flip BS -> Token -> Bool
tokenHasAttr Token
t) [BS
"color",BS
"face",BS
"size"] -> do
      BS -> ST s ()
warn BS
"unexpected start tag"
      forall s a. STRef s a -> ST s a
rref STRef s Bool
parserFragmentMode forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
        Bool
True ->
          ST s ()
anyOtherStartTag
        Bool
False -> do
          forall s. Parser s -> ST s ()
elementStackPop Parser s
p
          forall s. Parser s -> (DOMNode -> Bool) -> ST s ()
elementStackPopWhile Parser s
p forall a b. (a -> b) -> a -> b
$ \DOMNode
n ->
            Bool -> Bool
not (DOMNode -> Bool
isMathMLIntegrationPoint DOMNode
n
                 Bool -> Bool -> Bool
|| DOMNode -> Bool
isHtmlIntgrationPoint DOMNode
n
                 Bool -> Bool -> Bool
|| DOMNode -> Bool
domNodeIsHTML DOMNode
n)
          forall s. Parser s -> Token -> ST s ()
reprocess Parser s
p Token
t
    TStart {} ->
      ST s ()
anyOtherStartTag
    TEnd {} -> do
      let s :: BS
s = BS
"script"
          a :: DOMType
a = BS -> DOMType
domMakeTypeSVG BS
s
          n :: BS
n = Token -> BS
tEndName Token
t
      Bool
svg <- forall b a. b -> (a -> b) -> Maybe a -> b
maybe Bool
False (forall a. Eq a => a -> a -> Bool
(==) DOMType
a forall b c a. (b -> c) -> (a -> b) -> a -> c
. DOMNode -> DOMType
domNodeType) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s. Parser s -> ST s (Maybe DOMNode)
currentNode Parser s
p
      if BS
n forall a. Eq a => a -> a -> Bool
== BS
s Bool -> Bool -> Bool
&& Bool
svg
      then ST s ()
doScriptEndTag
      else do
        DOMNode
node <- forall a. HasCallStack => Maybe a -> a
fromJust forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s. Parser s -> ST s (Maybe DOMNode)
currentNode Parser s
p
        let h :: DOMNode -> BS
h = BS -> BS
bsLower forall b c a. (b -> c) -> (a -> b) -> a -> c
. DOMNode -> BS
domNodeElementName
            nodeName :: BS
nodeName = DOMNode -> BS
h DOMNode
node
        forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (BS
nodeName forall a. Eq a => a -> a -> Bool
/= BS
n) forall a b. (a -> b) -> a -> b
$
          BS -> ST s ()
warn forall a b. (a -> b) -> a -> b
$
            BS
"bad end tag in foreign content ("
            forall a. Semigroup a => a -> a -> a
<> BS
nodeName forall a. Semigroup a => a -> a -> a
<> BS
" /= " forall a. Semigroup a => a -> a -> a
<> String -> BS
bcPack (forall a. Show a => a -> String
show BS
n) forall a. Semigroup a => a -> a -> a
<> BS
")"
        let f :: [DOMNode] -> ST s ()
f (DOMNode
x:[]) = forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
            f (DOMNode
x:DOMNode
y:[DOMNode]
ys)
              | DOMNode -> BS
h DOMNode
x forall a. Eq a => a -> a -> Bool
== BS
n =
                  forall s. Parser s -> DOMID -> ST s ()
elementStackPopUntilID Parser s
p forall a b. (a -> b) -> a -> b
$ DOMNode -> DOMID
domNodeID DOMNode
node
              | DOMNode -> Bool
domNodeIsHTML DOMNode
y =
                  forall s. Parser s -> Token -> ST s ()
doHtmlContent Parser s
p Token
t
              | Bool
otherwise =
                  [DOMNode] -> ST s ()
f (DOMNode
yforall a. a -> [a] -> [a]
:[DOMNode]
ys)
        forall s. Parser s -> ST s [DOMNode]
elementStackNodes Parser s
p forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= [DOMNode] -> ST s ()
f
  where
    anyOtherStartTag :: ST s ()
anyOtherStartTag = do
      (Token
t', HTMLNamespace
n) <- forall s. Parser s -> ST s (Maybe DOMNode)
adjustedCurrentNode Parser s
p forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
        Just DOMNode
a
          | DOMNode -> Bool
domNodeIsMathML DOMNode
a ->
              forall (f :: * -> *) a. Applicative f => a -> f a
pure ( Token -> Token
adjustAttrMathML Token
t
                   , DOMNode -> HTMLNamespace
domNodeElementNamespace DOMNode
a
                   )
          | DOMNode -> Bool
domNodeIsSVG DOMNode
a ->
              forall (f :: * -> *) a. Applicative f => a -> f a
pure ( Token -> Token
adjustElemSVG forall a b. (a -> b) -> a -> b
$ Token -> Token
adjustAttrSVG Token
t
                   , DOMNode -> HTMLNamespace
domNodeElementNamespace DOMNode
a
                   )
        Maybe DOMNode
Nothing ->
          forall (f :: * -> *) a. Applicative f => a -> f a
pure (Token
t, HTMLNamespace
HTMLNamespaceHTML)
      forall s. Parser s -> HTMLNamespace -> Token -> ST s ()
insertForeignElement Parser s
p HTMLNamespace
n forall a b. (a -> b) -> a -> b
$ Token -> Token
adjustAttrForeign Token
t'
      forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Token -> Bool
tStartClosed Token
t) forall a b. (a -> b) -> a -> b
$ do
        Bool
svg <- forall b a. b -> (a -> b) -> Maybe a -> b
maybe Bool
False DOMNode -> Bool
domNodeIsSVG forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s. Parser s -> ST s (Maybe DOMNode)
currentNode Parser s
p
        if Token -> BS
tStartName Token
t forall a. Eq a => a -> a -> Bool
== BS
"script" Bool -> Bool -> Bool
&& Bool
svg
        then do
          forall s. Parser s -> ST s ()
selfClosingAcknowledge Parser s
p
          ST s ()
doScriptEndTag
        else do
          forall s. Parser s -> ST s ()
elementStackPop Parser s
p
          forall s. Parser s -> ST s ()
selfClosingAcknowledge Parser s
p
    doScriptEndTag :: ST s ()
doScriptEndTag = do
      forall s. Parser s -> ST s ()
elementStackPop Parser s
p
    warn :: BS -> ST s ()
warn BS
x =
      forall s. Parser s -> Maybe Token -> BS -> ST s ()
parseError Parser s
p (forall a. a -> Maybe a
Just Token
t) forall a b. (a -> b) -> a -> b
$ BS
"foreign content " forall a. Semigroup a => a -> a -> a
<> BS
x