{-# 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
  ( 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
  { Parser s -> STRef s (Lexer s)
parserLexer             :: STRef s (Lexer s)
  -- ^ The lexer for token generation.
  , Parser s -> STRef s DOM
parserDOM               :: STRef s DOM
  -- ^ The parser DOM.
  , Parser s -> STRef s [DOMID]
parserElementStack      :: STRef s [DOMID]
  -- ^ The element stack (section 12.2.3.2).
  , Parser s -> STRef s [ParserFormatItem]
parserActiveFormatList  :: STRef s [ParserFormatItem]
  -- ^ The list of action formatting elements (section 12.2.3.3).
  , Parser s -> STRef s ParserMode
parserInsertionMode     :: STRef s ParserMode
  -- ^ The current insertion mode.
  , Parser s -> STRef s ParserMode
parserOriginalMode      :: STRef s ParserMode
  -- ^ The original insertion mode.
  , Parser s -> STRef s [ParserMode]
parserTemplateMode      :: STRef s [ParserMode]
  -- ^ The template insertion mode.
  , Parser s -> STRef s (Maybe DOMID)
parserContextElement    :: STRef s (Maybe DOMID)
  -- ^ The context element.
  , Parser s -> STRef s (Maybe DOMID)
parserHeadElement       :: STRef s (Maybe DOMID)
  -- ^ The head element pointer (section 12.2.3.4).
  , Parser s -> STRef s (Maybe DOMID)
parserFormElement       :: STRef s (Maybe DOMID)
  -- ^ The form element pointer (section 12.2.3.4).
  , Parser s -> STRef s Bool
parserSelfClosingFlag   :: STRef s Bool
  -- ^ The self closing acknowledges flag.
  , Parser s -> STRef s Bool
parserFragmentMode      :: STRef s Bool
  -- ^ The flag indicating parser is in fragment mode.
  , Parser s -> STRef s Bool
parserFosterParenting   :: STRef s Bool
  -- ^ The foster parenting flag.
  , Parser s -> STRef s Bool
parserFrameSetOK        :: STRef s Bool
  -- ^ The frame-set ok flag (section 12.2.3.5).
  , Parser s -> STRef s Bool
parserDone              :: STRef s Bool
  -- ^ The parser done flag.
  , Parser s -> STRef s [Token]
parserTableChars        :: STRef s [Token]
  -- ^ The pending table characters.
  , Parser s -> STRef s (ParserAdoptionAgency s)
parserAdoptionAgency    :: STRef s (ParserAdoptionAgency s)
  -- ^ The adoption agency state.
  , Parser s -> STRef s (DList BS)
parserErrors            :: STRef s (DList BS)
  -- ^ The parser errors.
  , Parser s -> STRef s Bool
parserIFrameSrcDoc      :: STRef s Bool
  -- ^ Indicates that the documnet is an iframe srcdoc.
  , Parser s -> STRef s (IntMap (STRef s (Buffer s)))
parserTextMap           :: STRef s (IntMap (STRef s (Buffer s)))
  -- ^ Map of buffers for holding dom strings.
  , 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
(ParserMode -> ParserMode -> Bool)
-> (ParserMode -> ParserMode -> Bool) -> Eq ParserMode
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
Eq ParserMode
-> (ParserMode -> ParserMode -> Ordering)
-> (ParserMode -> ParserMode -> Bool)
-> (ParserMode -> ParserMode -> Bool)
-> (ParserMode -> ParserMode -> Bool)
-> (ParserMode -> ParserMode -> Bool)
-> (ParserMode -> ParserMode -> ParserMode)
-> (ParserMode -> ParserMode -> ParserMode)
-> Ord 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
$cp1Ord :: Eq ParserMode
Ord, DOMID -> ParserMode -> ShowS
[ParserMode] -> ShowS
ParserMode -> String
(DOMID -> ParserMode -> ShowS)
-> (ParserMode -> String)
-> ([ParserMode] -> ShowS)
-> Show ParserMode
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
(ParserOptions -> ParserOptions -> Bool)
-> (ParserOptions -> ParserOptions -> Bool) -> Eq ParserOptions
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
Eq ParserOptions
-> (ParserOptions -> ParserOptions -> Ordering)
-> (ParserOptions -> ParserOptions -> Bool)
-> (ParserOptions -> ParserOptions -> Bool)
-> (ParserOptions -> ParserOptions -> Bool)
-> (ParserOptions -> ParserOptions -> Bool)
-> (ParserOptions -> ParserOptions -> ParserOptions)
-> (ParserOptions -> ParserOptions -> ParserOptions)
-> Ord 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
$cp1Ord :: Eq ParserOptions
Ord, DOMID -> ParserOptions -> ShowS
[ParserOptions] -> ShowS
ParserOptions -> String
(DOMID -> ParserOptions -> ShowS)
-> (ParserOptions -> String)
-> ([ParserOptions] -> ShowS)
-> Show ParserOptions
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
(ParserResult -> ParserResult -> Bool)
-> (ParserResult -> ParserResult -> Bool) -> Eq ParserResult
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
Eq ParserResult
-> (ParserResult -> ParserResult -> Ordering)
-> (ParserResult -> ParserResult -> Bool)
-> (ParserResult -> ParserResult -> Bool)
-> (ParserResult -> ParserResult -> Bool)
-> (ParserResult -> ParserResult -> Bool)
-> (ParserResult -> ParserResult -> ParserResult)
-> (ParserResult -> ParserResult -> ParserResult)
-> Ord 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
$cp1Ord :: Eq ParserResult
Ord, DOMID -> ParserResult -> ShowS
[ParserResult] -> ShowS
ParserResult -> String
(DOMID -> ParserResult -> ShowS)
-> (ParserResult -> String)
-> ([ParserResult] -> ShowS)
-> Show ParserResult
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
(ParserFormatItem -> ParserFormatItem -> Bool)
-> (ParserFormatItem -> ParserFormatItem -> Bool)
-> Eq ParserFormatItem
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
Eq ParserFormatItem
-> (ParserFormatItem -> ParserFormatItem -> Ordering)
-> (ParserFormatItem -> ParserFormatItem -> Bool)
-> (ParserFormatItem -> ParserFormatItem -> Bool)
-> (ParserFormatItem -> ParserFormatItem -> Bool)
-> (ParserFormatItem -> ParserFormatItem -> Bool)
-> (ParserFormatItem -> ParserFormatItem -> ParserFormatItem)
-> (ParserFormatItem -> ParserFormatItem -> ParserFormatItem)
-> Ord 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
$cp1Ord :: Eq ParserFormatItem
Ord, DOMID -> ParserFormatItem -> ShowS
[ParserFormatItem] -> ShowS
ParserFormatItem -> String
(DOMID -> ParserFormatItem -> ShowS)
-> (ParserFormatItem -> String)
-> ([ParserFormatItem] -> ShowS)
-> Show ParserFormatItem
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
(ParserElementCategory -> ParserElementCategory -> Bool)
-> (ParserElementCategory -> ParserElementCategory -> Bool)
-> Eq ParserElementCategory
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
Eq ParserElementCategory
-> (ParserElementCategory -> ParserElementCategory -> Ordering)
-> (ParserElementCategory -> ParserElementCategory -> Bool)
-> (ParserElementCategory -> ParserElementCategory -> Bool)
-> (ParserElementCategory -> ParserElementCategory -> Bool)
-> (ParserElementCategory -> ParserElementCategory -> Bool)
-> (ParserElementCategory
    -> ParserElementCategory -> ParserElementCategory)
-> (ParserElementCategory
    -> ParserElementCategory -> ParserElementCategory)
-> Ord 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
$cp1Ord :: Eq ParserElementCategory
Ord, DOMID -> ParserElementCategory -> ShowS
[ParserElementCategory] -> ShowS
ParserElementCategory -> String
(DOMID -> ParserElementCategory -> ShowS)
-> (ParserElementCategory -> String)
-> ([ParserElementCategory] -> ShowS)
-> Show ParserElementCategory
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
(ElementDetails -> ElementDetails -> Bool)
-> (ElementDetails -> ElementDetails -> Bool) -> Eq ElementDetails
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
Eq ElementDetails
-> (ElementDetails -> ElementDetails -> Ordering)
-> (ElementDetails -> ElementDetails -> Bool)
-> (ElementDetails -> ElementDetails -> Bool)
-> (ElementDetails -> ElementDetails -> Bool)
-> (ElementDetails -> ElementDetails -> Bool)
-> (ElementDetails -> ElementDetails -> ElementDetails)
-> (ElementDetails -> ElementDetails -> ElementDetails)
-> Ord 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
$cp1Ord :: Eq ElementDetails
Ord, DOMID -> ElementDetails -> ShowS
[ElementDetails] -> ShowS
ElementDetails -> String
(DOMID -> ElementDetails -> ShowS)
-> (ElementDetails -> String)
-> ([ElementDetails] -> ShowS)
-> Show ElementDetails
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 :: BS -> Bool -> Bool -> ParserOptions
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 :: DOM -> [BS] -> ParserResult
ParserResult
    { parserResultDOM :: DOM
parserResultDOM    = DOM
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 s. ST s (Either BS ParserResult)) -> Either BS ParserResult
forall a. (forall s. ST s a) -> a
runST ((forall s. ST s (Either BS ParserResult))
 -> Either BS ParserResult)
-> (forall s. ST s (Either BS ParserResult))
-> Either BS ParserResult
forall a b. (a -> b) -> a -> b
$ do
    ParserOptions -> ST s (Either BS (Parser s))
forall s. ParserOptions -> ST s (Either BS (Parser s))
parserNew ParserOptions
x ST s (Either BS (Parser s))
-> (Either BS (Parser s) -> ST s (Either BS ParserResult))
-> ST s (Either BS ParserResult)
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
      Right Parser s
p -> ParserResult -> Either BS ParserResult
forall a b. b -> Either a b
Right (ParserResult -> Either BS ParserResult)
-> ST s ParserResult -> ST s (Either BS ParserResult)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser s -> ST s ParserResult
forall s. Parser s -> ST s ParserResult
parserRun Parser s
p
      Left BS
e -> BS -> Either BS ParserResult
forall a b. a -> Either a b
Left (BS -> Either BS ParserResult)
-> ST s BS -> ST s (Either BS ParserResult)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> BS -> ST s BS
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 = BS -> Either BS ParserResult
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 :: 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 <- LexerOptions -> ST s (Either BS (Lexer s))
forall s. LexerOptions -> ST s (Either BS (Lexer s))
lexerNew LexerOptions
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 -> Parser s -> Either BS (Parser s)
forall a b. b -> Either a b
Right (Parser s -> Either BS (Parser s))
-> ST s (Parser s) -> ST s (Either BS (Parser s))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParserOptions -> Lexer s -> ST s (Parser s)
forall s. ParserOptions -> Lexer s -> ST s (Parser s)
parserMake ParserOptions
o Lexer s
lex
    Left BS
err  -> BS -> Either BS (Parser s)
forall a b. a -> Either a b
Left (BS -> Either BS (Parser s))
-> ST s BS -> ST s (Either BS (Parser s))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> BS -> ST s BS
forall (f :: * -> *) a. Applicative f => a -> f a
pure BS
err

-- | Makes a new lexer.
parserMake :: ParserOptions -> Lexer s -> ST s (Parser s)
parserMake :: 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 <- Lexer s -> ST s (STRef s (Lexer s))
forall a s. a -> ST s (STRef s a)
newSTRef Lexer s
lexer
  STRef s DOM
dom      <- DOM -> ST s (STRef s DOM)
forall a s. a -> ST s (STRef s a)
newSTRef DOM
forall a. Default a => a
def
  STRef s [DOMID]
stack    <- [DOMID] -> ST s (STRef s [DOMID])
forall a s. a -> ST s (STRef s a)
newSTRef []
  STRef s [ParserFormatItem]
fmtList  <- [ParserFormatItem] -> ST s (STRef s [ParserFormatItem])
forall a s. a -> ST s (STRef s a)
newSTRef []
  STRef s ParserMode
insMode  <- ParserMode -> ST s (STRef s ParserMode)
forall a s. a -> ST s (STRef s a)
newSTRef ParserMode
ModeInitial
  STRef s ParserMode
orgMode  <- ParserMode -> ST s (STRef s ParserMode)
forall a s. a -> ST s (STRef s a)
newSTRef ParserMode
ModeInitial
  STRef s [ParserMode]
tmpMode  <- [ParserMode] -> ST s (STRef s [ParserMode])
forall a s. a -> ST s (STRef s a)
newSTRef []
  STRef s (Maybe DOMID)
ctxElem  <- Maybe DOMID -> ST s (STRef s (Maybe DOMID))
forall a s. a -> ST s (STRef s a)
newSTRef Maybe DOMID
forall a. Maybe a
Nothing
  STRef s (Maybe DOMID)
headElem <- Maybe DOMID -> ST s (STRef s (Maybe DOMID))
forall a s. a -> ST s (STRef s a)
newSTRef Maybe DOMID
forall a. Maybe a
Nothing
  STRef s (Maybe DOMID)
formElem <- Maybe DOMID -> ST s (STRef s (Maybe DOMID))
forall a s. a -> ST s (STRef s a)
newSTRef Maybe DOMID
forall a. Maybe a
Nothing
  STRef s Bool
closing  <- Bool -> ST s (STRef s Bool)
forall a s. a -> ST s (STRef s a)
newSTRef Bool
False
  STRef s Bool
fragMode <- Bool -> ST s (STRef s Bool)
forall a s. a -> ST s (STRef s a)
newSTRef Bool
False
  STRef s Bool
foster   <- Bool -> ST s (STRef s Bool)
forall a s. a -> ST s (STRef s a)
newSTRef Bool
False
  STRef s Bool
frameSet <- Bool -> ST s (STRef s Bool)
forall a s. a -> ST s (STRef s a)
newSTRef Bool
True
  STRef s Bool
done     <- Bool -> ST s (STRef s Bool)
forall a s. a -> ST s (STRef s a)
newSTRef Bool
False
  STRef s [Token]
table    <- [Token] -> ST s (STRef s [Token])
forall a s. a -> ST s (STRef s a)
newSTRef []
  ParserAdoptionAgency s
aa       <- ST s (ParserAdoptionAgency s)
forall s. ST s (ParserAdoptionAgency s)
defaultAA
  STRef s (ParserAdoptionAgency s)
aaRef    <- ParserAdoptionAgency s -> ST s (STRef s (ParserAdoptionAgency s))
forall a s. a -> ST s (STRef s a)
newSTRef ParserAdoptionAgency s
aa
  STRef s (DList BS)
warn     <- DList BS -> ST s (STRef s (DList BS))
forall a s. a -> ST s (STRef s a)
newSTRef DList BS
forall a. Default a => a
def
  STRef s Bool
iframe   <- Bool -> ST s (STRef s Bool)
forall a s. a -> ST s (STRef s a)
newSTRef Bool
False
  STRef s (IntMap (STRef s (Buffer s)))
textMap  <- IntMap (STRef s (Buffer s))
-> ST s (STRef s (IntMap (STRef s (Buffer s))))
forall a s. a -> ST s (STRef s a)
newSTRef IntMap (STRef s (Buffer s))
forall a. Default a => a
def
  Parser s -> ST s (Parser s)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Parser s -> ST s (Parser s)) -> Parser s -> ST s (Parser s)
forall a b. (a -> b) -> a -> b
$ Parser :: forall s.
STRef s (Lexer s)
-> STRef s DOM
-> STRef s [DOMID]
-> STRef s [ParserFormatItem]
-> STRef s ParserMode
-> STRef s ParserMode
-> STRef s [ParserMode]
-> STRef s (Maybe DOMID)
-> STRef s (Maybe DOMID)
-> STRef s (Maybe DOMID)
-> STRef s Bool
-> STRef s Bool
-> STRef s Bool
-> STRef s Bool
-> STRef s Bool
-> STRef s [Token]
-> STRef s (ParserAdoptionAgency s)
-> STRef s (DList BS)
-> STRef s Bool
-> STRef s (IntMap (STRef s (Buffer s)))
-> Bool
-> Parser s
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 :: 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
  STRef s Bool -> ST s Bool
forall s a. STRef s a -> ST s a
rref STRef s Bool
parserDone ST s Bool -> (Bool -> ST s ParserResult) -> ST s ParserResult
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
..} <- STRef s (Lexer s) -> ST s (Lexer s)
forall s a. STRef s a -> ST s a
rref STRef s (Lexer s)
parserLexer
      DList BS
e <- DList BS -> DList BS -> DList BS
forall a. DList a -> DList a -> DList a
D.append (DList BS -> DList BS -> DList BS)
-> ST s (DList BS) -> ST s (DList BS -> DList BS)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> STRef s (DList BS) -> ST s (DList BS)
forall s a. STRef s a -> ST s a
rref STRef s (DList BS)
lexerErrors ST s (DList BS -> DList BS) -> ST s (DList BS) -> ST s (DList BS)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> STRef s (DList BS) -> ST s (DList BS)
forall s a. STRef s a -> ST s a
rref STRef s (DList BS)
parserErrors
      DOM
d <- Parser s -> ST s DOM
forall s. Parser s -> ST s DOM
textMapDOM Parser s
p
      ParserResult -> ST s ParserResult
forall (f :: * -> *) a. Applicative f => a -> f a
pure (ParserResult -> ST s ParserResult)
-> ParserResult -> ST s ParserResult
forall a b. (a -> b) -> a -> b
$ DOM -> [BS] -> ParserResult
ParserResult DOM
d ([BS] -> ParserResult) -> [BS] -> ParserResult
forall a b. (a -> b) -> a -> b
$ DList BS -> [BS]
forall a. DList a -> [a]
D.toList DList BS
e
    Bool
False -> do
      Token
t <- STRef s (Lexer s) -> ST s (Lexer s)
forall s a. STRef s a -> ST s a
rref STRef s (Lexer s)
parserLexer ST s (Lexer s) -> (Lexer s -> ST s Token) -> ST s Token
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Lexer s -> ST s Token
forall s. Lexer s -> ST s Token
lexerNext
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
selfClosingInit Parser s
p Token
t
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
dispatchTreeConstruction Parser s
p Token
t
      ST s Bool -> ST s () -> ST s ()
forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
whenM (Parser s -> ST s Bool
forall s. Parser s -> ST s Bool
selfClosingFlag Parser s
p) (ST s () -> ST s ()) -> ST s () -> ST s ()
forall a b. (a -> b) -> a -> b
$
        Parser s -> Maybe Token -> BS -> ST s ()
forall s. Parser s -> Maybe Token -> BS -> ST s ()
parseError Parser s
p (Token -> Maybe Token
forall a. a -> Maybe a
Just Token
t) BS
"self closing not acknowledged for token"
      Parser s -> ST s ParserResult
forall s. Parser s -> ST s ParserResult
parserRun Parser s
p

-- | Handles tree construction dispatch.
dispatchTreeConstruction :: Parser s -> Token -> ST s ()
dispatchTreeConstruction :: 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 <- Parser s -> ST s Bool
forall s. Parser s -> ST s Bool
elementStackEmpty Parser s
p
  Maybe DOMNode
a <- Parser s -> ST s (Maybe DOMNode)
forall s. Parser s -> ST s (Maybe DOMNode)
adjustedCurrentNode Parser s
p
  Bool
b <- Bool -> ST s Bool
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Bool -> ST s Bool) -> Bool -> ST s Bool
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 Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
doHtmlContent Parser s
p Token
t
     else Parser s -> Token -> ST s ()
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 :: 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 <- STRef s ParserMode -> ST s ParserMode
forall s a. STRef s a -> ST s a
rref STRef s ParserMode
parserInsertionMode
  ParserMode -> Parser s -> Token -> ST s ()
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 :: Parser s -> Token -> ST s ()
reprocess = Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
doHtmlContent

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

-- | Handles parse errors.
parseError :: Parser s -> Maybe Token -> BS -> ST s ()
parseError :: 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 =
  Bool -> ST s () -> ST s ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when Bool
parserLogErrors (ST s () -> ST s ()) -> ST s () -> ST s ()
forall a b. (a -> b) -> a -> b
$
    STRef s (DList BS) -> (DList BS -> DList BS) -> ST s ()
forall s a. STRef s a -> (a -> a) -> ST s ()
uref STRef s (DList BS)
parserErrors ((DList BS -> DList BS) -> ST s ())
-> (DList BS -> DList BS) -> ST s ()
forall a b. (a -> b) -> a -> b
$ (DList BS -> BS -> DList BS) -> BS -> DList BS -> DList BS
forall a b c. (a -> b -> c) -> b -> a -> c
flip DList BS -> BS -> DList BS
forall a. DList a -> a -> DList a
D.snoc BS
e
  where
    e :: BS
e = BS
s BS -> BS -> BS
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," BS -> BS -> BS
forall a. Semigroup a => a -> a -> a
<> BS
tStartName
      Just (TEnd {BS
tEndName :: Token -> BS
tEndName :: BS
..})     -> BS
",tag-end," BS -> BS -> BS
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," BS -> BS -> BS
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 BS -> [BS] -> Bool
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 (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ BS
tStartName BS -> [BS] -> Bool
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 BS -> [BS] -> Bool
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 (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ BS
tEndName BS -> [BS] -> Bool
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 BS -> BS -> Bool
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 (Bool -> Bool) -> (DOMNode -> Bool) -> DOMNode -> Bool
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 BS -> [BS] -> Bool
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 (Bool -> Bool) -> (DOMNode -> Bool) -> DOMNode -> Bool
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 :: 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)
..} = STRef s [DOMID] -> ST s [DOMID]
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 :: 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)
..} = [DOMID] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null ([DOMID] -> Bool) -> ST s [DOMID] -> ST s Bool
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser s -> ST s [DOMID]
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 :: 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)
..} = [DOMID] -> DOMID
forall (t :: * -> *) a. Foldable t => t a -> DOMID
length ([DOMID] -> DOMID) -> ST s [DOMID] -> ST s DOMID
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser s -> ST s [DOMID]
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 :: 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 = STRef s [DOMID] -> ([DOMID] -> [DOMID]) -> ST s ()
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 :: 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 = Parser s -> ([DOMID] -> [DOMID]) -> ST s ()
forall s. Parser s -> ([DOMID] -> [DOMID]) -> ST s ()
elementStackModify Parser s
p (([DOMID] -> [DOMID]) -> ST s ())
-> ([DOMID] -> [DOMID]) -> ST s ()
forall a b. (a -> b) -> a -> b
$ (DOMID
xDOMID -> [DOMID] -> [DOMID]
forall a. a -> [a] -> [a]
:)

-- | Pops an element off of the element stack.
elementStackPop :: Parser s -> ST s ()
elementStackPop :: 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)
..} = Parser s -> ([DOMID] -> [DOMID]) -> ST s ()
forall s. Parser s -> ([DOMID] -> [DOMID]) -> ST s ()
elementStackModify Parser s
p (([DOMID] -> [DOMID]) -> ST s ())
-> ([DOMID] -> [DOMID]) -> ST s ()
forall a b. (a -> b) -> a -> b
$ DOMID -> [DOMID] -> [DOMID]
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 :: 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 =
  Parser s -> ST s (Maybe DOMNode)
forall s. Parser s -> ST s (Maybe DOMNode)
currentNode Parser s
p ST s (Maybe DOMNode) -> (Maybe DOMNode -> ST s ()) -> ST s ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
    Just DOMNode
a | DOMNode -> Bool
f DOMNode
a -> Parser s -> ST s ()
forall s. Parser s -> ST s ()
elementStackPop Parser s
p ST s () -> ST s () -> ST s ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Parser s -> (DOMNode -> Bool) -> ST s ()
forall s. Parser s -> (DOMNode -> Bool) -> ST s ()
elementStackPopWhile Parser s
p DOMNode -> Bool
f
    Maybe DOMNode
_ -> () -> ST s ()
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 :: 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 =
  Parser s -> ST s (Maybe DOMNode)
forall s. Parser s -> ST s (Maybe DOMNode)
currentNode Parser s
p ST s (Maybe DOMNode) -> (Maybe DOMNode -> ST s ()) -> ST s ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
    Just DOMNode
a | DOMNode -> Bool
f DOMNode
a -> Parser s -> ST s ()
forall s. Parser s -> ST s ()
elementStackPop Parser s
p
    Maybe DOMNode
_ -> () -> ST s ()
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 :: 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
  Parser s -> (DOMNode -> Bool) -> ST s ()
forall s. Parser s -> (DOMNode -> Bool) -> ST s ()
elementStackPopWhile Parser s
p (Bool -> Bool
not (Bool -> Bool) -> (DOMNode -> Bool) -> DOMNode -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. DOMNode -> Bool
g)
  Parser s -> (DOMNode -> Bool) -> ST s ()
forall s. Parser s -> (DOMNode -> Bool) -> ST s ()
elementStackPopIf Parser s
p DOMNode -> Bool
g
  where
    g :: DOMNode -> Bool
g = DOMType -> Bool
f (DOMType -> Bool) -> (DOMNode -> DOMType) -> DOMNode -> Bool
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 :: Parser s -> DOMID -> ST s ()
elementStackPopUntilID Parser s
p DOMID
x = Parser s -> ([DOMID] -> [DOMID]) -> ST s ()
forall s. Parser s -> ([DOMID] -> [DOMID]) -> ST s ()
elementStackModify Parser s
p (([DOMID] -> [DOMID]) -> ST s ())
-> ([DOMID] -> [DOMID]) -> ST s ()
forall a b. (a -> b) -> a -> b
$ DOMID -> [DOMID] -> [DOMID]
forall a. DOMID -> [a] -> [a]
drop DOMID
1 ([DOMID] -> [DOMID]) -> ([DOMID] -> [DOMID]) -> [DOMID] -> [DOMID]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (DOMID -> Bool) -> [DOMID] -> [DOMID]
forall a. (a -> Bool) -> [a] -> [a]
dropWhile (DOMID -> DOMID -> Bool
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 :: Parser s -> DOMType -> ST s ()
elementStackPopUntilType Parser s
p DOMType
x = Parser s -> (DOMType -> Bool) -> ST s ()
forall s. Parser s -> (DOMType -> Bool) -> ST s ()
elementStackPopUntil Parser s
p (DOMType -> DOMType -> Bool
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 :: Parser s -> [DOMType] -> ST s ()
elementStackPopUntilTypeIn Parser s
p [DOMType]
x = Parser s -> (DOMType -> Bool) -> ST s ()
forall s. Parser s -> (DOMType -> Bool) -> ST s ()
elementStackPopUntil Parser s
p ((DOMType -> Bool) -> ST s ()) -> (DOMType -> Bool) -> ST s ()
forall a b. (a -> b) -> a -> b
$ (DOMType -> [DOMType] -> Bool) -> [DOMType] -> DOMType -> Bool
forall a b c. (a -> b -> c) -> b -> a -> c
flip DOMType -> [DOMType] -> Bool
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 :: Parser s -> ST s [DOMNode]
elementStackNodes Parser s
p = DOM -> [DOMID] -> [DOMNode]
domMapID (DOM -> [DOMID] -> [DOMNode])
-> ST s DOM -> ST s ([DOMID] -> [DOMNode])
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser s -> ST s DOM
forall s. Parser s -> ST s DOM
getDOM Parser s
p ST s ([DOMID] -> [DOMNode]) -> ST s [DOMID] -> ST s [DOMNode]
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser s -> ST s [DOMID]
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 :: Parser s -> ST s [DOMType]
elementStackTypes Parser s
p = (DOMNode -> DOMType) -> [DOMNode] -> [DOMType]
forall a b. (a -> b) -> [a] -> [b]
map DOMNode -> DOMType
domNodeType ([DOMNode] -> [DOMType]) -> ST s [DOMNode] -> ST s [DOMType]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser s -> ST s [DOMNode]
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 :: Parser s -> (DOMNode -> Bool) -> ST s Bool
elementStackAny Parser s
p DOMNode -> Bool
f = (DOMNode -> Bool) -> [DOMNode] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any DOMNode -> Bool
f ([DOMNode] -> Bool) -> ST s [DOMNode] -> ST s Bool
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser s -> ST s [DOMNode]
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 :: Parser s -> (DOMNode -> Bool) -> ST s Bool
elementStackAll Parser s
p DOMNode -> Bool
f = (DOMNode -> Bool) -> [DOMNode] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all DOMNode -> Bool
f ([DOMNode] -> Bool) -> ST s [DOMNode] -> ST s Bool
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser s -> ST s [DOMNode]
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 :: Parser s -> ST s Bool
elementStackHasBody Parser s
p =
  ([DOMType] -> [DOMType]) -> ST s [DOMType] -> ST s [DOMType]
forall (f :: * -> *) a b. Applicative f => (a -> b) -> f a -> f b
liftA [DOMType] -> [DOMType]
forall a. [a] -> [a]
reverse (Parser s -> ST s [DOMType]
forall s. Parser s -> ST s [DOMType]
elementStackTypes Parser s
p) ST s [DOMType] -> ([DOMType] -> ST s Bool) -> ST s Bool
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Bool -> ST s Bool
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Bool -> ST s Bool)
-> ([DOMType] -> Bool) -> [DOMType] -> ST s Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. \case
    (DOMType
_:DOMType
x:[DOMType]
_)    -> DOMType
x DOMType -> DOMType -> Bool
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 :: Parser s -> ST s Bool
elementStackHasTemplate Parser s
p = Parser s -> (DOMNode -> Bool) -> ST s Bool
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 :: Parser s -> ST s Bool
elementStackMissingTemplate Parser s
p = Parser s -> (DOMNode -> Bool) -> ST s Bool
forall s. Parser s -> (DOMNode -> Bool) -> ST s Bool
elementStackAll Parser s
p ((DOMNode -> Bool) -> ST s Bool) -> (DOMNode -> Bool) -> ST s Bool
forall a b. (a -> b) -> a -> b
$ Bool -> Bool
not (Bool -> Bool) -> (DOMNode -> Bool) -> DOMNode -> Bool
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 :: Parser s -> DOMID -> ST s ()
elementStackRemove Parser s
p DOMID
x = Parser s -> ([DOMID] -> [DOMID]) -> ST s ()
forall s. Parser s -> ([DOMID] -> [DOMID]) -> ST s ()
elementStackModify Parser s
p (([DOMID] -> [DOMID]) -> ST s ())
-> ([DOMID] -> [DOMID]) -> ST s ()
forall a b. (a -> b) -> a -> b
$ (DOMID -> Bool) -> [DOMID] -> [DOMID]
forall a. (a -> Bool) -> [a] -> [a]
filter (DOMID -> DOMID -> Bool
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 :: Parser s -> DOMID -> DOMID -> ST s ()
elementStackReplace Parser s
p DOMID
x DOMID
y =
  Parser s -> ([DOMID] -> [DOMID]) -> ST s ()
forall s. Parser s -> ([DOMID] -> [DOMID]) -> ST s ()
elementStackModify Parser s
p (([DOMID] -> [DOMID]) -> ST s ())
-> ([DOMID] -> [DOMID]) -> ST s ()
forall a b. (a -> b) -> a -> b
$ (DOMID -> DOMID) -> [DOMID] -> [DOMID]
forall a b. (a -> b) -> [a] -> [b]
map (\DOMID
i -> if DOMID
i DOMID -> DOMID -> Bool
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 :: Parser s -> DOMID -> ST s (Maybe DOMID)
elementStackSucc Parser s
p DOMID
x = (DOMID -> Bool) -> [DOMID] -> Maybe DOMID
forall a. (a -> Bool) -> [a] -> Maybe a
findSucc (DOMID -> DOMID -> Bool
forall a. Eq a => a -> a -> Bool
==DOMID
x) ([DOMID] -> Maybe DOMID) -> ST s [DOMID] -> ST s (Maybe DOMID)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser s -> ST s [DOMID]
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 :: Parser s -> DOMID -> DOMID -> ST s ()
elementStackInsertBefore Parser s
p DOMID
x DOMID
y = Parser s -> ([DOMID] -> [DOMID]) -> ST s ()
forall s. Parser s -> ([DOMID] -> [DOMID]) -> ST s ()
elementStackModify Parser s
p (([DOMID] -> [DOMID]) -> ST s ())
-> ([DOMID] -> [DOMID]) -> ST s ()
forall a b. (a -> b) -> a -> b
$ (DOMID -> Bool) -> DOMID -> [DOMID] -> [DOMID]
forall a. (a -> Bool) -> a -> [a] -> [a]
insertBefore (DOMID -> DOMID -> Bool
forall a. Eq a => a -> a -> Bool
==DOMID
x) DOMID
y

-- | Gets the element stack details.
elementStackDetails :: Parser s -> ST s [ElementDetails]
elementStackDetails :: Parser s -> ST s [ElementDetails]
elementStackDetails Parser s
p = DOM -> [DOMID] -> [ElementDetails]
g (DOM -> [DOMID] -> [ElementDetails])
-> ST s DOM -> ST s ([DOMID] -> [ElementDetails])
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser s -> ST s DOM
forall s. Parser s -> ST s DOM
getDOM Parser s
p ST s ([DOMID] -> [ElementDetails])
-> ST s [DOMID] -> ST s [ElementDetails]
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser s -> ST s [DOMID]
forall s. Parser s -> ST s [DOMID]
elementStack Parser s
p
  where
    g :: DOM -> [DOMID] -> [ElementDetails]
g DOM
d [DOMID]
x = ((DOMID, DOMID) -> Maybe ElementDetails)
-> [(DOMID, DOMID)] -> [ElementDetails]
forall a b. (a -> Maybe b) -> [a] -> [b]
mapMaybe (DOM -> (DOMID, DOMID) -> Maybe ElementDetails
f DOM
d) ([(DOMID, DOMID)] -> [ElementDetails])
-> [(DOMID, DOMID)] -> [ElementDetails]
forall a b. (a -> b) -> a -> b
$ [DOMID] -> [DOMID] -> [(DOMID, DOMID)]
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 -> Maybe ElementDetails
forall a. Maybe a
Nothing
        Just DOMNode
a -> ElementDetails -> Maybe ElementDetails
forall a. a -> Maybe a
Just (ElementDetails -> Maybe ElementDetails)
-> ElementDetails -> Maybe ElementDetails
forall a b. (a -> b) -> a -> b
$ DOMID -> DOMID -> DOMNode -> DOMType -> ElementDetails
ElementDetails DOMID
i DOMID
x DOMNode
a (DOMType -> ElementDetails) -> DOMType -> ElementDetails
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 :: Parser s -> (ElementDetails -> Bool) -> ST s (Maybe ElementDetails)
elementStackFind Parser s
p ElementDetails -> Bool
f = ([ElementDetails] -> Maybe ElementDetails)
-> ST s [ElementDetails] -> ST s (Maybe ElementDetails)
forall (f :: * -> *) a b. Applicative f => (a -> b) -> f a -> f b
liftA ((ElementDetails -> Bool)
-> [ElementDetails] -> Maybe ElementDetails
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Maybe a
find ElementDetails -> Bool
f) (ST s [ElementDetails] -> ST s (Maybe ElementDetails))
-> ST s [ElementDetails] -> ST s (Maybe ElementDetails)
forall a b. (a -> b) -> a -> b
$ Parser s -> ST s [ElementDetails]
forall s. Parser s -> ST s [ElementDetails]
elementStackDetails Parser s
p

-- | Special element types.
elementTypesSpecial :: Set DOMType
elementTypesSpecial :: Set DOMType
elementTypesSpecial = [Set DOMType] -> Set DOMType
forall (f :: * -> *) a. (Foldable f, Ord a) => f (Set a) -> Set a
Set.unions
  [ [DOMType] -> Set DOMType
forall a. Ord a => [a] -> Set a
Set.fromList ([DOMType] -> Set DOMType) -> [DOMType] -> Set DOMType
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" ]
  , [DOMType] -> Set DOMType
forall a. Ord a => [a] -> Set a
Set.fromList ([DOMType] -> Set DOMType) -> [DOMType] -> Set DOMType
forall a b. (a -> b) -> a -> b
$ [BS] -> [DOMType]
domTypesMathML
    [ BS
"mi", BS
"mo", BS
"mn", BS
"ms", BS
"mtext", BS
"annotation-xml" ]
  , [DOMType] -> Set DOMType
forall a. Ord a => [a] -> Set a
Set.fromList ([DOMType] -> Set DOMType) -> [DOMType] -> Set DOMType
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 =
  [DOMType] -> Set DOMType
forall a. Ord a => [a] -> Set a
Set.fromList ([DOMType] -> Set DOMType) -> [DOMType] -> Set DOMType
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
  | DOMType -> Set DOMType -> Bool
forall a. Ord a => a -> Set a -> Bool
Set.member DOMType
x Set DOMType
elementTypesSpecial = ParserElementCategory
ElementCategorySpecial
  | DOMType -> Set DOMType -> Bool
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 ParserElementCategory -> ParserElementCategory -> Bool
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 :: Parser s -> Bool -> Set DOMType -> DOMType -> ST s Bool
elementInSpecificScope Parser s
p Bool
include Set DOMType
types DOMType
target =
  [DOMType] -> Bool
f ([DOMType] -> Bool) -> ST s [DOMType] -> ST s Bool
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser s -> ST s [DOMType]
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 DOMType -> DOMType -> Bool
forall a. Eq a => a -> a -> Bool
== DOMType
target = Bool
True
      | Bool
include Bool -> Bool -> Bool
forall a. Eq a => a -> a -> Bool
== Bool
True Bool -> Bool -> Bool
&& DOMType -> Set DOMType -> Bool
forall a. Ord a => a -> Set a -> Bool
Set.member DOMType
x Set DOMType
types Bool -> Bool -> Bool
forall a. Eq a => a -> a -> Bool
== Bool
True = Bool
False
      | Bool
include Bool -> Bool -> Bool
forall a. Eq a => a -> a -> Bool
== Bool
False Bool -> Bool -> Bool
&& DOMType -> Set DOMType -> Bool
forall a. Ord a => a -> Set a -> Bool
Set.member DOMType
x Set DOMType
types Bool -> Bool -> Bool
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 = [Set DOMType] -> Set DOMType
forall (f :: * -> *) a. (Foldable f, Ord a) => f (Set a) -> Set a
Set.unions
  [ [DOMType] -> Set DOMType
forall a. Ord a => [a] -> Set a
Set.fromList ([DOMType] -> Set DOMType) -> [DOMType] -> Set DOMType
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" ]
  , [DOMType] -> Set DOMType
forall a. Ord a => [a] -> Set a
Set.fromList ([DOMType] -> Set DOMType) -> [DOMType] -> Set DOMType
forall a b. (a -> b) -> a -> b
$ [BS] -> [DOMType]
domTypesMathML
    [ BS
"mi", BS
"mo", BS
"mn", BS
"ms", BS
"mtext", BS
"annotation-xml" ]
  , [DOMType] -> Set DOMType
forall a. Ord a => [a] -> Set a
Set.fromList ([DOMType] -> Set DOMType) -> [DOMType] -> Set DOMType
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 :: Parser s -> DOMType -> ST s Bool
elementInScope Parser s
p = Parser s -> Bool -> Set DOMType -> DOMType -> ST s Bool
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 :: Parser s -> DOMType -> ST s Bool
elementInListScope Parser s
p =
  Parser s -> Bool -> Set DOMType -> DOMType -> ST s Bool
forall s. Parser s -> Bool -> Set DOMType -> DOMType -> ST s Bool
elementInSpecificScope Parser s
p Bool
True (Set DOMType -> DOMType -> ST s Bool)
-> Set DOMType -> DOMType -> ST s Bool
forall a b. (a -> b) -> a -> b
$
    Set DOMType -> Set DOMType -> Set DOMType
forall a. Ord a => Set a -> Set a -> Set a
Set.union Set DOMType
elementScopes (Set DOMType -> Set DOMType) -> Set DOMType -> Set DOMType
forall a b. (a -> b) -> a -> b
$ [DOMType] -> Set DOMType
forall a. Ord a => [a] -> Set a
Set.fromList ([DOMType] -> Set DOMType) -> [DOMType] -> Set DOMType
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 :: Parser s -> DOMType -> ST s Bool
elementInButtonScope Parser s
p =
  Parser s -> Bool -> Set DOMType -> DOMType -> ST s Bool
forall s. Parser s -> Bool -> Set DOMType -> DOMType -> ST s Bool
elementInSpecificScope Parser s
p Bool
True (Set DOMType -> DOMType -> ST s Bool)
-> Set DOMType -> DOMType -> ST s Bool
forall a b. (a -> b) -> a -> b
$
    Set DOMType -> Set DOMType -> Set DOMType
forall a. Ord a => Set a -> Set a -> Set a
Set.union Set DOMType
elementScopes (Set DOMType -> Set DOMType) -> Set DOMType -> Set DOMType
forall a b. (a -> b) -> a -> b
$ [DOMType] -> Set DOMType
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 :: Parser s -> DOMType -> ST s Bool
elementInTableScope Parser s
p =
  Parser s -> Bool -> Set DOMType -> DOMType -> ST s Bool
forall s. Parser s -> Bool -> Set DOMType -> DOMType -> ST s Bool
elementInSpecificScope Parser s
p Bool
True (Set DOMType -> DOMType -> ST s Bool)
-> Set DOMType -> DOMType -> ST s Bool
forall a b. (a -> b) -> a -> b
$
    [DOMType] -> Set DOMType
forall a. Ord a => [a] -> Set a
Set.fromList ([DOMType] -> Set DOMType) -> [DOMType] -> Set DOMType
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 :: Parser s -> DOMType -> ST s Bool
elementInSelectScope Parser s
p =
  Parser s -> Bool -> Set DOMType -> DOMType -> ST s Bool
forall s. Parser s -> Bool -> Set DOMType -> DOMType -> ST s Bool
elementInSpecificScope Parser s
p Bool
False (Set DOMType -> DOMType -> ST s Bool)
-> Set DOMType -> DOMType -> ST s Bool
forall a b. (a -> b) -> a -> b
$
    [DOMType] -> Set DOMType
forall a. Ord a => [a] -> Set a
Set.fromList ([DOMType] -> Set DOMType) -> [DOMType] -> Set DOMType
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 :: Parser s -> DOMNode -> ST s DOMID
newID Parser s
p DOMNode
x = do
  (DOM
d, DOMID
i) <- (DOM -> DOMNode -> (DOM, DOMID)) -> DOMNode -> DOM -> (DOM, DOMID)
forall a b c. (a -> b -> c) -> b -> a -> c
flip DOM -> DOMNode -> (DOM, DOMID)
domNewID DOMNode
x (DOM -> (DOM, DOMID)) -> ST s DOM -> ST s (DOM, DOMID)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser s -> ST s DOM
forall s. Parser s -> ST s DOM
getDOM Parser s
p
  Parser s -> DOM -> ST s ()
forall s. Parser s -> DOM -> ST s ()
setDOM Parser s
p DOM
d
  DOMID -> ST s DOMID
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 :: 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 = (DOM -> DOMID -> Maybe DOMNode) -> DOMID -> DOM -> Maybe DOMNode
forall a b c. (a -> b -> c) -> b -> a -> c
flip DOM -> DOMID -> Maybe DOMNode
domGetNode DOMID
x (DOM -> Maybe DOMNode) -> ST s DOM -> ST s (Maybe DOMNode)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser s -> ST s DOM
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 :: 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 <- Parser s -> ST s DOM
forall s. Parser s -> ST s DOM
getDOM Parser s
p
  BS -> ST s BS
forall (f :: * -> *) a. Applicative f => a -> f a
pure (BS -> ST s BS) -> BS -> ST s BS
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 :: 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)
..} = [DOMID] -> Maybe DOMID
forall a. [a] -> Maybe a
listToMaybe ([DOMID] -> Maybe DOMID)
-> ([DOMID] -> [DOMID]) -> [DOMID] -> Maybe DOMID
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [DOMID] -> [DOMID]
forall a. [a] -> [a]
reverse ([DOMID] -> Maybe DOMID) -> ST s [DOMID] -> ST s (Maybe DOMID)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser s -> ST s [DOMID]
forall s. Parser s -> ST s [DOMID]
elementStack Parser s
p

-- | Gets the current node ID.
currentNodeID :: Parser s -> ST s (Maybe DOMID)
currentNodeID :: 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)
..} = [DOMID] -> Maybe DOMID
forall a. [a] -> Maybe a
listToMaybe ([DOMID] -> Maybe DOMID) -> ST s [DOMID] -> ST s (Maybe DOMID)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser s -> ST s [DOMID]
forall s. Parser s -> ST s [DOMID]
elementStack Parser s
p

-- | Gets the current node.
currentNode :: Parser s -> ST s (Maybe DOMNode)
currentNode :: Parser s -> ST s (Maybe DOMNode)
currentNode Parser s
p = Parser s -> ST s (Maybe DOMID)
forall s. Parser s -> ST s (Maybe DOMID)
currentNodeID Parser s
p ST s (Maybe DOMID)
-> (Maybe DOMID -> ST s (Maybe DOMNode)) -> ST s (Maybe DOMNode)
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ST s (Maybe DOMNode)
-> (DOMID -> ST s (Maybe DOMNode))
-> Maybe DOMID
-> ST s (Maybe DOMNode)
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (Maybe DOMNode -> ST s (Maybe DOMNode)
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe DOMNode
forall a. Maybe a
Nothing) (Parser s -> DOMID -> ST s (Maybe DOMNode)
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 :: Parser s -> DOMType -> ST s Bool
currentNodeHasType Parser s
p DOMType
x =
  Parser s -> ST s (Maybe DOMNode)
forall s. Parser s -> ST s (Maybe DOMNode)
currentNode Parser s
p ST s (Maybe DOMNode) -> (Maybe DOMNode -> ST s Bool) -> ST s Bool
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Bool -> ST s Bool
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Bool -> ST s Bool)
-> (Maybe DOMNode -> Bool) -> Maybe DOMNode -> ST s Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. \case
    Just DOMNode
a -> DOMNode -> DOMType
domNodeType DOMNode
a DOMType -> DOMType -> Bool
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 :: Parser s -> BS -> ST s Bool
currentNodeHasHTMLType Parser s
p = Parser s -> DOMType -> ST s Bool
forall s. Parser s -> DOMType -> ST s Bool
currentNodeHasType Parser s
p (DOMType -> ST s Bool) -> (BS -> DOMType) -> BS -> ST s Bool
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 :: Parser s -> [DOMType] -> ST s Bool
currentNodeHasTypeIn Parser s
p [DOMType]
x =
  Parser s -> ST s (Maybe DOMNode)
forall s. Parser s -> ST s (Maybe DOMNode)
currentNode Parser s
p ST s (Maybe DOMNode) -> (Maybe DOMNode -> ST s Bool) -> ST s Bool
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Bool -> ST s Bool
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Bool -> ST s Bool)
-> (Maybe DOMNode -> Bool) -> Maybe DOMNode -> ST s Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. \case
    Just DOMNode
a -> DOMNode -> DOMType
domNodeType DOMNode
a DOMType -> [DOMType] -> Bool
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 :: Parser s -> [BS] -> ST s Bool
currentNodeHasHTMLTypeIn Parser s
p = Parser s -> [DOMType] -> ST s Bool
forall s. Parser s -> [DOMType] -> ST s Bool
currentNodeHasTypeIn Parser s
p ([DOMType] -> ST s Bool)
-> ([BS] -> [DOMType]) -> [BS] -> ST s Bool
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 :: 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 <- STRef s Bool -> ST s Bool
forall s a. STRef s a -> ST s a
rref STRef s Bool
parserFragmentMode
  DOMID
n <- Parser s -> ST s DOMID
forall s. Parser s -> ST s DOMID
elementStackSize Parser s
p
  if Bool
f Bool -> Bool -> Bool
&& DOMID
n DOMID -> DOMID -> Bool
forall a. Eq a => a -> a -> Bool
== DOMID
1
     then STRef s (Maybe DOMID) -> ST s (Maybe DOMID)
forall s a. STRef s a -> ST s a
rref STRef s (Maybe DOMID)
parserContextElement
     else Parser s -> ST s (Maybe DOMID)
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 :: Parser s -> ST s (Maybe DOMNode)
adjustedCurrentNode Parser s
p =
  Parser s -> ST s (Maybe DOMID)
forall s. Parser s -> ST s (Maybe DOMID)
adjustedCurrentNodeID Parser s
p ST s (Maybe DOMID)
-> (Maybe DOMID -> ST s (Maybe DOMNode)) -> ST s (Maybe DOMNode)
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ST s (Maybe DOMNode)
-> (DOMID -> ST s (Maybe DOMNode))
-> Maybe DOMID
-> ST s (Maybe DOMNode)
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (Maybe DOMNode -> ST s (Maybe DOMNode)
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe DOMNode
forall a. Maybe a
Nothing) (Parser s -> DOMID -> ST s (Maybe DOMNode)
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 BS -> BS -> Bool
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
&& BS -> Set BS -> 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 = [BS] -> Set BS
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
&& BS -> Set BS -> 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 BS -> BS -> Bool
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) ->
               BS -> Set BS -> Bool
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 = [BS] -> Set BS
forall a. Ord a => [a] -> Set a
Set.fromList [ BS
"foreignObject", BS
"desc", BS
"title" ]
    s1 :: Set BS
s1 = [BS] -> Set BS
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 :: 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)
..} = STRef s DOM -> ST s DOM
forall s a. STRef s a -> ST s a
rref STRef s DOM
parserDOM

-- | Sets the DOM.
setDOM :: Parser s -> DOM -> ST s ()
setDOM :: 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)
..} = STRef s DOM -> DOM -> ST 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 :: 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)
..} = STRef s DOM -> (DOM -> DOM) -> ST 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 :: 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)
..} = STRef s ParserMode -> ParserMode -> ST 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 :: 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)
..} = STRef s ParserMode -> ST s ParserMode
forall s a. STRef s a -> ST s a
rref STRef s ParserMode
parserInsertionMode ST s ParserMode -> (ParserMode -> ST s ()) -> ST s ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= STRef s ParserMode -> ParserMode -> ST s ()
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 :: 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
  STRef s ParserMode -> ST s ParserMode
forall s a. STRef s a -> ST s a
rref STRef s ParserMode
parserOriginalMode ST s ParserMode -> (ParserMode -> ST s ()) -> ST s ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= STRef s ParserMode -> ParserMode -> ST s ()
forall s a. STRef s a -> a -> ST s ()
wref STRef s ParserMode
parserInsertionMode
  STRef s ParserMode -> ParserMode -> ST s ()
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 :: 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)
..} = STRef s (Maybe DOMID) -> Maybe DOMID -> ST 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 :: 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)
..} = STRef s (Maybe DOMID) -> ST s (Maybe DOMID)
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 :: Parser s -> ST s (Maybe DOMNode)
getHeadElement Parser s
p = Parser s -> ST s (Maybe DOMID)
forall s. Parser s -> ST s (Maybe DOMID)
getHeadID Parser s
p ST s (Maybe DOMID)
-> (Maybe DOMID -> ST s (Maybe DOMNode)) -> ST s (Maybe DOMNode)
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ST s (Maybe DOMNode)
-> (DOMID -> ST s (Maybe DOMNode))
-> Maybe DOMID
-> ST s (Maybe DOMNode)
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (Maybe DOMNode -> ST s (Maybe DOMNode)
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe DOMNode
forall a. Maybe a
Nothing) (Parser s -> DOMID -> ST s (Maybe DOMNode)
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 :: Parser s -> ST s ()
saveHead Parser s
p = Parser s -> ST s (Maybe DOMID)
forall s. Parser s -> ST s (Maybe DOMID)
currentNodeID Parser s
p ST s (Maybe DOMID) -> (Maybe DOMID -> ST s ()) -> ST s ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Parser s -> Maybe DOMID -> ST s ()
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 :: 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)
..} = STRef s (Maybe DOMID) -> Maybe DOMID -> ST 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 :: 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)
..} = STRef s (Maybe DOMID) -> ST s (Maybe DOMID)
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 :: Parser s -> ST s (Maybe DOMNode)
getFormElement Parser s
p = Parser s -> ST s (Maybe DOMID)
forall s. Parser s -> ST s (Maybe DOMID)
getFormID Parser s
p ST s (Maybe DOMID)
-> (Maybe DOMID -> ST s (Maybe DOMNode)) -> ST s (Maybe DOMNode)
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ST s (Maybe DOMNode)
-> (DOMID -> ST s (Maybe DOMNode))
-> Maybe DOMID
-> ST s (Maybe DOMNode)
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (Maybe DOMNode -> ST s (Maybe DOMNode)
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe DOMNode
forall a. Maybe a
Nothing) (Parser s -> DOMID -> ST s (Maybe DOMNode)
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 :: 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)
..} =
  Parser s -> ST s (Maybe DOMNode)
forall s. Parser s -> ST s (Maybe DOMNode)
getFormElement Parser s
p ST s (Maybe DOMNode)
-> (Maybe DOMNode -> ST s (Maybe DOMType)) -> ST s (Maybe DOMType)
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Maybe DOMType -> ST s (Maybe DOMType)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Maybe DOMType -> ST s (Maybe DOMType))
-> (Maybe DOMNode -> Maybe DOMType)
-> Maybe DOMNode
-> ST s (Maybe DOMType)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Maybe DOMType
-> (DOMNode -> Maybe DOMType) -> Maybe DOMNode -> Maybe DOMType
forall b a. b -> (a -> b) -> Maybe a -> b
maybe Maybe DOMType
forall a. Maybe a
Nothing (DOMType -> Maybe DOMType
forall a. a -> Maybe a
Just (DOMType -> Maybe DOMType)
-> (DOMNode -> DOMType) -> DOMNode -> Maybe DOMType
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 :: Parser s -> ST s ()
saveForm Parser s
p = Parser s -> ST s (Maybe DOMID)
forall s. Parser s -> ST s (Maybe DOMID)
currentNodeID Parser s
p ST s (Maybe DOMID) -> (Maybe DOMID -> ST s ()) -> ST s ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Parser s -> Maybe DOMID -> ST s ()
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 :: Parser s -> ST s Bool
formNotNull Parser s
p = Maybe DOMID -> Bool
forall a. Maybe a -> Bool
isJust (Maybe DOMID -> Bool) -> ST s (Maybe DOMID) -> ST s Bool
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser s -> ST s (Maybe DOMID)
forall s. Parser s -> ST s (Maybe DOMID)
getFormID Parser s
p

-- | Initializes the self closing flag.
selfClosingInit :: Parser s -> Token -> ST s ()
selfClosingInit :: 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 =
  STRef s Bool -> Bool -> ST s ()
forall s a. STRef s a -> a -> ST s ()
wref STRef s Bool
parserSelfClosingFlag (Bool -> ST s ()) -> Bool -> ST s ()
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 :: 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)
..} = STRef s Bool -> Bool -> ST 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 :: 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)
..} = STRef s Bool -> ST s Bool
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 :: 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)
..} = STRef s Bool -> ST s Bool
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 :: 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)
..} = STRef s Bool -> Bool -> ST 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 :: 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)
..} = STRef s Bool -> Bool -> ST 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 :: 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)
..} = STRef s Bool -> Bool -> ST 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 :: 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)
..} = STRef s Bool -> ST s Bool
forall s a. STRef s a -> ST s a
rref STRef s Bool
parserIFrameSrcDoc

-- | Sets the done flag.
parserSetDone :: Parser s -> ST s ()
parserSetDone :: 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)
..} = STRef s Bool -> Bool -> ST 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 :: 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)
..} = STRef s [ParserFormatItem] -> ST s [ParserFormatItem]
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 :: Parser s -> ST s [BS]
activeFormatNames Parser s
p = do
  DOM
d <- Parser s -> ST s DOM
forall s. Parser s -> ST s DOM
getDOM Parser s
p
  (ParserFormatItem -> BS) -> [ParserFormatItem] -> [BS]
forall a b. (a -> b) -> [a] -> [b]
map (DOM -> ParserFormatItem -> BS
f DOM
d) ([ParserFormatItem] -> [BS])
-> ST s [ParserFormatItem] -> ST s [BS]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser s -> ST s [ParserFormatItem]
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 (DOMNode -> BS) -> DOMNode -> BS
forall a b. (a -> b) -> a -> b
$ Maybe DOMNode -> DOMNode
forall a. HasCallStack => Maybe a -> a
fromJust (Maybe DOMNode -> DOMNode) -> Maybe DOMNode -> DOMNode
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 :: 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)
..} =
  STRef s [ParserFormatItem]
-> ([ParserFormatItem] -> [ParserFormatItem]) -> ST s ()
forall s a. STRef s a -> (a -> a) -> ST s ()
uref STRef s [ParserFormatItem]
parserActiveFormatList (ParserFormatItem
ParserFormatMarkerParserFormatItem -> [ParserFormatItem] -> [ParserFormatItem]
forall a. a -> [a] -> [a]
:)

-- | Adds an element to the list of active format elements.
activeFormatAddElement :: Parser s -> Token -> DOMID -> ST s ()
activeFormatAddElement :: 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 <- Parser s -> ST s DOM
forall s. Parser s -> ST s DOM
getDOM Parser s
p
  [ParserFormatItem]
a <- Parser s -> ST s [ParserFormatItem]
forall s. Parser s -> ST s [ParserFormatItem]
activeFormatList Parser s
p
  let match :: ParserFormatItem -> Bool
match (ParserFormatElement DOMID
y Token
_) = DOM -> DOMID -> DOMID -> Bool
domMatch DOM
d DOMID
x DOMID
y
      b :: [ParserFormatItem]
b = (ParserFormatItem -> Bool)
-> [ParserFormatItem] -> [ParserFormatItem]
forall a. (a -> Bool) -> [a] -> [a]
takeWhile (Bool -> Bool
not (Bool -> Bool)
-> (ParserFormatItem -> Bool) -> ParserFormatItem -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ParserFormatItem -> Bool
formatItemIsMarker) [ParserFormatItem]
a
      n :: DOMID
n = ((ParserFormatItem -> DOMID -> DOMID)
-> DOMID -> [ParserFormatItem] -> DOMID
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (\ParserFormatItem
i DOMID
z -> DOMID
z DOMID -> DOMID -> DOMID
forall a. Num a => a -> a -> a
+ if ParserFormatItem -> Bool
match ParserFormatItem
i then DOMID
1 else DOMID
0) DOMID
0 [ParserFormatItem]
b) :: Int
      a' :: [ParserFormatItem]
a' = if DOMID
n DOMID -> DOMID -> Bool
forall a. Ord a => a -> a -> Bool
< DOMID
3 then [ParserFormatItem]
a else (ParserFormatItem -> Bool)
-> [ParserFormatItem] -> [ParserFormatItem]
forall a. (a -> Bool) -> [a] -> [a]
removeFirst ParserFormatItem -> Bool
match [ParserFormatItem]
a
      e' :: [ParserFormatItem]
e' = DOMID -> Token -> ParserFormatItem
ParserFormatElement DOMID
x Token
t ParserFormatItem -> [ParserFormatItem] -> [ParserFormatItem]
forall a. a -> [a] -> [a]
: [ParserFormatItem]
a'
  STRef s [ParserFormatItem] -> [ParserFormatItem] -> ST s ()
forall s a. STRef s a -> a -> ST s ()
wref STRef s [ParserFormatItem]
parserActiveFormatList [ParserFormatItem]
e'

-- | Adds the current node to the list of active format elements.
activeFormatAddCurrentNode :: Parser s -> Token -> ST s ()
activeFormatAddCurrentNode :: 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 =
  ST s (Maybe DOMID) -> (DOMID -> ST s ()) -> ST s ()
forall (m :: * -> *) a.
Monad m =>
m (Maybe a) -> (a -> m ()) -> m ()
whenJustM (Parser s -> ST s (Maybe DOMID)
forall s. Parser s -> ST s (Maybe DOMID)
currentNodeID Parser s
p) ((DOMID -> ST s ()) -> ST s ()) -> (DOMID -> ST s ()) -> ST s ()
forall a b. (a -> b) -> a -> b
$ Parser s -> Token -> DOMID -> ST s ()
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 :: 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 <- Parser s -> ST s DOM
forall s. Parser s -> ST s DOM
getDOM Parser s
p
  [ParserFormatItem]
a <- Parser s -> ST s [ParserFormatItem]
forall s. Parser s -> ST s [ParserFormatItem]
activeFormatList Parser s
p
  Bool -> ST s Bool
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Bool -> ST s Bool) -> Bool -> ST s Bool
forall a b. (a -> b) -> a -> b
$
    ( (DOMNode -> Bool) -> [DOMNode] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any DOMNode -> Bool
f
    ([DOMNode] -> Bool)
-> ([ParserFormatItem] -> [DOMNode]) -> [ParserFormatItem] -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. DOM -> [DOMID] -> [DOMNode]
domMapID DOM
d
    ([DOMID] -> [DOMNode])
-> ([ParserFormatItem] -> [DOMID])
-> [ParserFormatItem]
-> [DOMNode]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ParserFormatItem -> DOMID) -> [ParserFormatItem] -> [DOMID]
forall a b. (a -> b) -> [a] -> [b]
map (\(ParserFormatElement DOMID
x Token
_) -> DOMID
x)
    ([ParserFormatItem] -> [DOMID])
-> ([ParserFormatItem] -> [ParserFormatItem])
-> [ParserFormatItem]
-> [DOMID]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ParserFormatItem -> Bool)
-> [ParserFormatItem] -> [ParserFormatItem]
forall a. (a -> Bool) -> [a] -> [a]
takeWhile (Bool -> Bool
not (Bool -> Bool)
-> (ParserFormatItem -> Bool) -> ParserFormatItem -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ParserFormatItem -> Bool
formatItemIsMarker)
    ) [ParserFormatItem]
a

-- | Determines if the active format list contains an element.
activeFormatContains :: Parser s -> DOMID -> ST s Bool
activeFormatContains :: Parser s -> DOMID -> ST s Bool
activeFormatContains Parser s
p DOMID
x = (ParserFormatItem -> Bool) -> [ParserFormatItem] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (DOMID -> ParserFormatItem -> Bool
formatItemHasID DOMID
x) ([ParserFormatItem] -> Bool)
-> ST s [ParserFormatItem] -> ST s Bool
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser s -> ST s [ParserFormatItem]
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 :: 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 <- Parser s -> ST s DOM
forall s. Parser s -> ST s DOM
getDOM Parser s
p
  [ParserFormatItem]
a <- Parser s -> ST s [ParserFormatItem]
forall s. Parser s -> ST s [ParserFormatItem]
activeFormatList Parser s
p
  Maybe ParserFormatItem -> ST s (Maybe ParserFormatItem)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Maybe ParserFormatItem -> ST s (Maybe ParserFormatItem))
-> Maybe ParserFormatItem -> ST s (Maybe ParserFormatItem)
forall a b. (a -> b) -> a -> b
$
    ( (ParserFormatItem -> Bool)
-> [ParserFormatItem] -> Maybe ParserFormatItem
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Maybe a
find (DOM -> BS -> ParserFormatItem -> Bool
formatItemHasTag DOM
d BS
x)
    ([ParserFormatItem] -> Maybe ParserFormatItem)
-> ([ParserFormatItem] -> [ParserFormatItem])
-> [ParserFormatItem]
-> Maybe ParserFormatItem
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ParserFormatItem -> Bool)
-> [ParserFormatItem] -> [ParserFormatItem]
forall a. (a -> Bool) -> [a] -> [a]
takeWhile (Bool -> Bool
not (Bool -> Bool)
-> (ParserFormatItem -> Bool) -> ParserFormatItem -> Bool
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 :: 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 =
  Parser s -> ST s [ParserFormatItem]
forall s. Parser s -> ST s [ParserFormatItem]
activeFormatList Parser s
p ST s [ParserFormatItem]
-> ([ParserFormatItem] -> ST s (Maybe Token)) -> ST s (Maybe Token)
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= [ParserFormatItem] -> ST s (Maybe Token)
forall (f :: * -> *).
Applicative f =>
[ParserFormatItem] -> f (Maybe Token)
f
  where
    f :: [ParserFormatItem] -> f (Maybe Token)
f [] = Maybe Token -> f (Maybe Token)
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe Token
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 DOMID -> DOMID -> Bool
forall a. Eq a => a -> a -> Bool
== DOMID
i = Maybe Token -> f (Maybe Token)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Maybe Token -> f (Maybe Token)) -> Maybe Token -> f (Maybe Token)
forall a b. (a -> b) -> a -> b
$ Token -> Maybe Token
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 :: Parser s -> ST s ()
activeFormatReconstruct Parser s
p = do
  [DOMID]
e <- Parser s -> ST s [DOMID]
forall s. Parser s -> ST s [DOMID]
elementStack Parser s
p
  [ParserFormatItem]
a <- Parser s -> ST s [ParserFormatItem]
forall s. Parser s -> ST s [ParserFormatItem]
activeFormatList Parser s
p
  case [ParserFormatItem]
a of
    [] -> () -> ST s ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
    (ParserFormatItem
x:[ParserFormatItem]
xs)
      | [DOMID] -> ParserFormatItem -> Bool
isOpen [DOMID]
e ParserFormatItem
x -> () -> ST s ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
      | Bool
otherwise -> do
          let b :: [ParserFormatItem]
b = [ParserFormatItem] -> [ParserFormatItem]
forall a. [a] -> [a]
reverse ([ParserFormatItem] -> [ParserFormatItem])
-> ([ParserFormatItem] -> [ParserFormatItem])
-> [ParserFormatItem]
-> [ParserFormatItem]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ParserFormatItem -> Bool)
-> [ParserFormatItem] -> [ParserFormatItem]
forall a. (a -> Bool) -> [a] -> [a]
takeWhile (Bool -> Bool
not (Bool -> Bool)
-> (ParserFormatItem -> Bool) -> ParserFormatItem -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [DOMID] -> ParserFormatItem -> Bool
isOpen [DOMID]
e) ([ParserFormatItem] -> [ParserFormatItem])
-> [ParserFormatItem] -> [ParserFormatItem]
forall a b. (a -> b) -> a -> b
$ [ParserFormatItem]
a
              a' :: [ParserFormatItem]
a' = DOMID -> [ParserFormatItem] -> [ParserFormatItem]
forall a. DOMID -> [a] -> [a]
drop ([ParserFormatItem] -> DOMID
forall (t :: * -> *) a. Foldable t => t a -> DOMID
length [ParserFormatItem]
b) [ParserFormatItem]
a
          Parser s -> [ParserFormatItem] -> [ParserFormatItem] -> ST s ()
forall s.
Parser s -> [ParserFormatItem] -> [ParserFormatItem] -> ST s ()
reopen Parser s
p [ParserFormatItem]
b [ParserFormatItem]
a'

-- | Determines is a format item is open.
isOpen :: [DOMID] -> ParserFormatItem -> Bool
isOpen :: [DOMID] -> ParserFormatItem -> Bool
isOpen [DOMID]
x = \case
   ParserFormatItem
ParserFormatMarker -> Bool
True
   ParserFormatElement DOMID
i Token
_ -> DOMID
i DOMID -> [DOMID] -> Bool
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 :: 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
    [] ->
      STRef s [ParserFormatItem] -> [ParserFormatItem] -> ST s ()
forall s a. STRef s a -> a -> ST s ()
wref STRef s [ParserFormatItem]
parserActiveFormatList [ParserFormatItem]
a
    ((ParserFormatItem
ParserFormatMarker):[ParserFormatItem]
xs) ->
      Parser s -> [ParserFormatItem] -> [ParserFormatItem] -> ST s ()
forall s.
Parser s -> [ParserFormatItem] -> [ParserFormatItem] -> ST s ()
reopen Parser s
p [ParserFormatItem]
xs [ParserFormatItem]
a
    ((ParserFormatElement DOMID
_ Token
t):[ParserFormatItem]
xs) -> do
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
      DOMID
i <- Maybe DOMID -> DOMID
forall a. HasCallStack => Maybe a -> a
fromJust (Maybe DOMID -> DOMID) -> ST s (Maybe DOMID) -> ST s DOMID
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser s -> ST s (Maybe DOMID)
forall s. Parser s -> ST s (Maybe DOMID)
currentNodeID Parser s
p
      Parser s -> [ParserFormatItem] -> [ParserFormatItem] -> ST s ()
forall s.
Parser s -> [ParserFormatItem] -> [ParserFormatItem] -> ST s ()
reopen Parser s
p [ParserFormatItem]
xs ([ParserFormatItem] -> ST s ()) -> [ParserFormatItem] -> ST s ()
forall a b. (a -> b) -> a -> b
$ DOMID -> Token -> ParserFormatItem
ParserFormatElement DOMID
i Token
t ParserFormatItem -> [ParserFormatItem] -> [ParserFormatItem]
forall a. a -> [a] -> [a]
: [ParserFormatItem]
a

-- | Clears the list of active format elements up to last marker.
activeFormatClear :: Parser s -> ST s ()
activeFormatClear :: Parser s -> ST s ()
activeFormatClear Parser s
p =
  Parser s -> ([ParserFormatItem] -> [ParserFormatItem]) -> ST s ()
forall s.
Parser s -> ([ParserFormatItem] -> [ParserFormatItem]) -> ST s ()
activeFormatModify Parser s
p (([ParserFormatItem] -> [ParserFormatItem]) -> ST s ())
-> ([ParserFormatItem] -> [ParserFormatItem]) -> ST s ()
forall a b. (a -> b) -> a -> b
$ DOMID -> [ParserFormatItem] -> [ParserFormatItem]
forall a. DOMID -> [a] -> [a]
drop DOMID
1 ([ParserFormatItem] -> [ParserFormatItem])
-> ([ParserFormatItem] -> [ParserFormatItem])
-> [ParserFormatItem]
-> [ParserFormatItem]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ParserFormatItem -> Bool)
-> [ParserFormatItem] -> [ParserFormatItem]
forall a. (a -> Bool) -> [a] -> [a]
dropWhile (Bool -> Bool
not (Bool -> Bool)
-> (ParserFormatItem -> Bool) -> ParserFormatItem -> Bool
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 :: Parser s -> DOMID -> ST s ()
activeFormatRemove Parser s
p DOMID
x =
  Parser s -> ([ParserFormatItem] -> [ParserFormatItem]) -> ST s ()
forall s.
Parser s -> ([ParserFormatItem] -> [ParserFormatItem]) -> ST s ()
activeFormatModify Parser s
p (([ParserFormatItem] -> [ParserFormatItem]) -> ST s ())
-> ([ParserFormatItem] -> [ParserFormatItem]) -> ST s ()
forall a b. (a -> b) -> a -> b
$ (ParserFormatItem -> Bool)
-> [ParserFormatItem] -> [ParserFormatItem]
forall a. (a -> Bool) -> [a] -> [a]
filter ((ParserFormatItem -> Bool)
 -> [ParserFormatItem] -> [ParserFormatItem])
-> (ParserFormatItem -> Bool)
-> [ParserFormatItem]
-> [ParserFormatItem]
forall a b. (a -> b) -> a -> b
$ Bool -> Bool
not (Bool -> Bool)
-> (ParserFormatItem -> Bool) -> ParserFormatItem -> Bool
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 :: Parser s -> DOMID -> DOMID -> ST s ()
activeFormatReplace Parser s
p DOMID
x DOMID
y =
  Parser s -> ([ParserFormatItem] -> [ParserFormatItem]) -> ST s ()
forall s.
Parser s -> ([ParserFormatItem] -> [ParserFormatItem]) -> ST s ()
activeFormatModify Parser s
p (([ParserFormatItem] -> [ParserFormatItem]) -> ST s ())
-> ([ParserFormatItem] -> [ParserFormatItem]) -> ST s ()
forall a b. (a -> b) -> a -> b
$ (ParserFormatItem -> ParserFormatItem)
-> [ParserFormatItem] -> [ParserFormatItem]
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 DOMID -> DOMID -> Bool
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 :: 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)
..} = STRef s [ParserFormatItem]
-> ([ParserFormatItem] -> [ParserFormatItem]) -> ST 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 :: Parser s -> DOMID -> ST s (Maybe DOMID)
activeFormatSucc Parser s
p DOMID
x =
  [ParserFormatItem] -> Maybe DOMID
f ([ParserFormatItem] -> Maybe DOMID)
-> ST s [ParserFormatItem] -> ST s (Maybe DOMID)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser s -> ST s [ParserFormatItem]
forall s. Parser s -> ST s [ParserFormatItem]
activeFormatList Parser s
p
  where
    f :: [ParserFormatItem] -> Maybe DOMID
f [ParserFormatItem]
a = case (ParserFormatItem -> Bool)
-> [ParserFormatItem] -> Maybe ParserFormatItem
forall a. (a -> Bool) -> [a] -> Maybe a
findSucc (DOMID -> ParserFormatItem -> Bool
formatItemHasID DOMID
x) [ParserFormatItem]
a of
      Just (ParserFormatElement DOMID
i Token
_) -> DOMID -> Maybe DOMID
forall a. a -> Maybe a
Just DOMID
i
      Maybe ParserFormatItem
_otherwise -> Maybe DOMID
forall a. Maybe a
Nothing

-- | Inserts an element in the active format list.
activeFormatInsertElement :: Parser s -> DOMID -> Token -> Maybe DOMID -> ST s ()
activeFormatInsertElement :: 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 -> Parser s -> ([ParserFormatItem] -> [ParserFormatItem]) -> ST s ()
forall s.
Parser s -> ([ParserFormatItem] -> [ParserFormatItem]) -> ST s ()
activeFormatModify Parser s
p (([ParserFormatItem] -> [ParserFormatItem]) -> ST s ())
-> ([ParserFormatItem] -> [ParserFormatItem]) -> ST s ()
forall a b. (a -> b) -> a -> b
$ (ParserFormatItem -> Bool)
-> ParserFormatItem -> [ParserFormatItem] -> [ParserFormatItem]
forall a. (a -> Bool) -> a -> [a] -> [a]
insertBefore (DOMID -> ParserFormatItem -> Bool
formatItemHasID DOMID
a) ParserFormatItem
e
    Maybe DOMID
Nothing -> Parser s -> ([ParserFormatItem] -> [ParserFormatItem]) -> ST s ()
forall s.
Parser s -> ([ParserFormatItem] -> [ParserFormatItem]) -> ST s ()
activeFormatModify Parser s
p ([ParserFormatItem] -> [ParserFormatItem] -> [ParserFormatItem]
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 DOMID -> DOMID -> Bool
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 BS -> BS -> Bool
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 :: 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)
..} = [ParserMode] -> Maybe ParserMode
forall a. [a] -> Maybe a
listToMaybe ([ParserMode] -> Maybe ParserMode)
-> ST s [ParserMode] -> ST s (Maybe ParserMode)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> STRef s [ParserMode] -> ST s [ParserMode]
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 :: 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 = STRef s [ParserMode] -> ([ParserMode] -> [ParserMode]) -> ST s ()
forall s a. STRef s a -> (a -> a) -> ST s ()
uref STRef s [ParserMode]
parserTemplateMode (ParserMode
xParserMode -> [ParserMode] -> [ParserMode]
forall a. a -> [a] -> [a]
:)

-- | Pops an insertion mode off of the stack of template insertion modes.
templateModePop :: Parser s -> ST s ()
templateModePop :: 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)
..} =
  STRef s [ParserMode] -> ST s [ParserMode]
forall s a. STRef s a -> ST s a
rref STRef s [ParserMode]
parserTemplateMode ST s [ParserMode] -> ([ParserMode] -> ST s ()) -> ST s ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
    (ParserMode
x:[ParserMode]
xs) -> STRef s [ParserMode] -> [ParserMode] -> ST s ()
forall s a. STRef s a -> a -> ST s ()
wref STRef s [ParserMode]
parserTemplateMode [ParserMode]
xs
    []     -> Parser s -> Maybe Token -> BS -> ST s ()
forall s. Parser s -> Maybe Token -> BS -> ST s ()
parseError Parser s
p Maybe Token
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 :: 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)
..} = [ParserMode] -> DOMID
forall (t :: * -> *) a. Foldable t => t a -> DOMID
length ([ParserMode] -> DOMID) -> ST s [ParserMode] -> ST s DOMID
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> STRef s [ParserMode] -> ST s [ParserMode]
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 :: 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 -> DOMID -> ST s DOMID
forall (f :: * -> *) a. Applicative f => a -> f a
pure DOMID
a
    Maybe DOMID
Nothing -> DOMID -> (DOMID -> DOMID) -> Maybe DOMID -> DOMID
forall b a. b -> (a -> b) -> Maybe a -> b
maybe DOMID
domRoot DOMID -> DOMID
forall a. a -> a
id (Maybe DOMID -> DOMID) -> ST s (Maybe DOMID) -> ST s DOMID
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser s -> ST s (Maybe DOMID)
forall s. Parser s -> ST s (Maybe DOMID)
currentNodeID Parser s
p
  Parser s -> DOMID -> ST s (Maybe DOMNode)
forall s. Parser s -> DOMID -> ST s (Maybe DOMNode)
getNode Parser s
p DOMID
target ST s (Maybe DOMNode)
-> (Maybe DOMNode -> ST s DOMPos) -> ST s DOMPos
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
    Maybe DOMNode
Nothing ->
      DOMPos -> ST s DOMPos
forall (f :: * -> *) a. Applicative f => a -> f a
pure (DOMPos -> ST s DOMPos) -> DOMPos -> ST s DOMPos
forall a b. (a -> b) -> a -> b
$ DOMID -> Maybe DOMID -> DOMPos
DOMPos DOMID
domRoot Maybe DOMID
forall a. Maybe a
Nothing
    Just DOMNode
n -> do
      Bool
f <- Parser s -> ST s Bool
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 BS -> [BS] -> Bool
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 <- Parser s -> (ElementDetails -> Bool) -> ST s (Maybe ElementDetails)
forall s.
Parser s -> (ElementDetails -> Bool) -> ST s (Maybe ElementDetails)
elementStackFind Parser s
p ((ElementDetails -> Bool) -> ST s (Maybe ElementDetails))
-> (ElementDetails -> Bool) -> ST s (Maybe ElementDetails)
forall a b. (a -> b) -> a -> b
$ \ElementDetails
x ->
            ElementDetails -> DOMType
elementDetailsType ElementDetails
x DOMType -> DOMType -> Bool
forall a. Eq a => a -> a -> Bool
== BS -> DOMType
domMakeTypeHTML BS
"template"
          -- (2.2) Get last table in element stack.
          Maybe ElementDetails
lastTable <- Parser s -> (ElementDetails -> Bool) -> ST s (Maybe ElementDetails)
forall s.
Parser s -> (ElementDetails -> Bool) -> ST s (Maybe ElementDetails)
elementStackFind Parser s
p ((ElementDetails -> Bool) -> ST s (Maybe ElementDetails))
-> (ElementDetails -> Bool) -> ST s (Maybe ElementDetails)
forall a b. (a -> b) -> a -> b
$ \ElementDetails
x ->
            ElementDetails -> DOMType
elementDetailsType ElementDetails
x DOMType -> DOMType -> Bool
forall a. Eq a => a -> a -> Bool
== BS -> DOMType
domMakeTypeHTML BS
"table"
          let Just (ElementDetails DOMID
i1 DOMID
x1 DOMNode
n1 DOMType
_) = Maybe ElementDetails
lastTemplate
              Just (ElementDetails DOMID
i2 DOMID
x2 DOMNode
n2 DOMType
_) = Maybe ElementDetails
lastTable
          -- (2.3) Check for template and no table.
          if | Maybe ElementDetails -> Bool
forall a. Maybe a -> Bool
isJust Maybe ElementDetails
lastTemplate Bool -> Bool -> Bool
&& (Maybe ElementDetails -> Bool
forall a. Maybe a -> Bool
isNothing Maybe ElementDetails
lastTable Bool -> Bool -> Bool
|| (DOMID
i1 DOMID -> DOMID -> Bool
forall a. Ord a => a -> a -> Bool
< DOMID
i2)) ->
                 DOMPos -> ST s DOMPos
forall (f :: * -> *) a. Applicative f => a -> f a
pure (DOMPos -> ST s DOMPos) -> DOMPos -> ST s DOMPos
forall a b. (a -> b) -> a -> b
$ DOMID -> Maybe DOMID -> DOMPos
DOMPos (DOMNode -> DOMID
domTemplateContents DOMNode
n1) Maybe DOMID
forall a. Maybe a
Nothing
             -- (2.4) If no last table then use first element.
             | Maybe ElementDetails -> Bool
forall a. Maybe a -> Bool
isNothing Maybe ElementDetails
lastTable -> do
                 DOMID
j <- Maybe DOMID -> DOMID
forall a. HasCallStack => Maybe a -> a
fromJust (Maybe DOMID -> DOMID) -> ST s (Maybe DOMID) -> ST s DOMID
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser s -> ST s (Maybe DOMID)
forall s. Parser s -> ST s (Maybe DOMID)
lastNodeID Parser s
p
                 DOMPos -> ST s DOMPos
forall (f :: * -> *) a. Applicative f => a -> f a
pure (DOMPos -> ST s DOMPos) -> DOMPos -> ST s DOMPos
forall a b. (a -> b) -> a -> b
$ DOMID -> Maybe DOMID -> DOMPos
DOMPos DOMID
j Maybe DOMID
forall a. Maybe a
Nothing
             -- (2.5) Check last table parent node.
             | DOMNode -> DOMID
domNodeParent DOMNode
n2 DOMID -> DOMID -> Bool
forall a. Eq a => a -> a -> Bool
/= DOMID
domNull ->
                 DOMPos -> ST s DOMPos
forall (f :: * -> *) a. Applicative f => a -> f a
pure (DOMPos -> ST s DOMPos) -> DOMPos -> ST s DOMPos
forall a b. (a -> b) -> a -> b
$ DOMID -> Maybe DOMID -> DOMPos
DOMPos (DOMNode -> DOMID
domNodeParent DOMNode
n2) (Maybe DOMID -> DOMPos) -> Maybe DOMID -> DOMPos
forall a b. (a -> b) -> a -> b
$ DOMID -> Maybe DOMID
forall a. a -> Maybe a
Just DOMID
x2
             | Bool
otherwise -> do
                 -- (2.6) Previous element is above last table.
                 DOMID
prev <- Maybe DOMID -> DOMID
forall a. HasCallStack => Maybe a -> a
fromJust (Maybe DOMID -> DOMID) -> ST s (Maybe DOMID) -> ST s DOMID
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser s -> DOMID -> ST s (Maybe DOMID)
forall s. Parser s -> DOMID -> ST s (Maybe DOMID)
elementStackSucc Parser s
p DOMID
x2
                 -- (2.7) Location is after previous element last child.
                 DOMPos -> ST s DOMPos
forall (f :: * -> *) a. Applicative f => a -> f a
pure (DOMPos -> ST s DOMPos) -> DOMPos -> ST s DOMPos
forall a b. (a -> b) -> a -> b
$ DOMID -> Maybe DOMID -> DOMPos
DOMPos DOMID
prev Maybe DOMID
forall a. Maybe a
Nothing
        else
          DOMPos -> ST s DOMPos
forall (f :: * -> *) a. Applicative f => a -> f a
pure (DOMPos -> ST s DOMPos) -> DOMPos -> ST s DOMPos
forall a b. (a -> b) -> a -> b
$ DOMID -> Maybe DOMID -> DOMPos
DOMPos DOMID
target Maybe DOMID
forall a. Maybe a
Nothing
      Parser s -> DOMID -> ST s (Maybe DOMNode)
forall s. Parser s -> DOMID -> ST s (Maybe DOMNode)
getNode Parser s
p (DOMPos -> DOMID
domPosParent DOMPos
adjusted) ST s (Maybe DOMNode)
-> (Maybe DOMNode -> ST s DOMPos) -> ST s DOMPos
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.
          DOMPos -> ST s DOMPos
forall (f :: * -> *) a. Applicative f => a -> f a
pure (DOMPos -> ST s DOMPos) -> DOMPos -> ST s DOMPos
forall a b. (a -> b) -> a -> b
$ DOMID -> Maybe DOMID -> DOMPos
DOMPos DOMID
domTemplateContents Maybe DOMID
forall a. Maybe a
Nothing
        Maybe DOMNode
_ ->
          -- (4) Return adjusted insertion location.
          DOMPos -> ST s DOMPos
forall (f :: * -> *) a. Applicative f => a -> f a
pure DOMPos
adjusted

-- | Gets the appropriate insertion location.
insertionLocation :: Parser s -> ST s DOMPos
insertionLocation :: Parser s -> ST s DOMPos
insertionLocation Parser s
p = Parser s -> Maybe DOMID -> ST s DOMPos
forall s. Parser s -> Maybe DOMID -> ST s DOMPos
appropriateInsertionLocation Parser s
p Maybe DOMID
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 :: Parser s -> Token -> HTMLNamespace -> ST s DOMID
createElementForToken Parser s
p Token
t HTMLNamespace
s
  | Token -> BS
tStartName Token
t BS -> BS -> Bool
forall a. Eq a => a -> a -> Bool
== BS
"template" = do
      DOMID
i <- Parser s -> DOMNode -> ST s DOMID
forall s. Parser s -> DOMNode -> ST s DOMID
newID Parser s
p (DOMNode -> ST s DOMID) -> DOMNode -> ST s DOMID
forall a b. (a -> b) -> a -> b
$ DOMNode
domDefaultFragment
      DOMID
j <- Parser s -> DOMNode -> ST s DOMID
forall s. Parser s -> DOMNode -> ST s DOMID
newID Parser s
p (DOMNode -> ST s DOMID) -> DOMNode -> ST s DOMID
forall a b. (a -> b) -> a -> b
$ DOMNode
domDefaultTemplate
        { domTemplateNamespace :: HTMLNamespace
domTemplateNamespace = HTMLNamespace
s
        , domTemplateContents :: DOMID
domTemplateContents  = DOMID
i
        }
      Parser s -> (DOM -> DOM) -> ST s ()
forall s. Parser s -> (DOM -> DOM) -> ST s ()
modifyDOM Parser s
p ((DOM -> DOM) -> ST s ()) -> (DOM -> DOM) -> ST s ()
forall a b. (a -> b) -> a -> b
$ DOMID -> DOMID -> DOM -> DOM
domSetParent DOMID
i DOMID
j
      DOMID -> ST s DOMID
forall (f :: * -> *) a. Applicative f => a -> f a
pure DOMID
j
  | Bool
otherwise = do
      DOMID
i <- Parser s -> DOMNode -> ST s DOMID
forall s. Parser s -> DOMNode -> ST s DOMID
newID Parser s
p (DOMNode -> ST s DOMID) -> DOMNode -> ST s DOMID
forall a b. (a -> b) -> a -> b
$ DOMNode
domDefaultElement
        { domElementName :: BS
domElementName       = Token -> BS
tStartName Token
t
        , domElementAttributes :: Seq DOMAttr
domElementAttributes = [DOMAttr] -> Seq DOMAttr
forall a. [a] -> Seq a
Seq.fromList ([DOMAttr] -> Seq DOMAttr) -> [DOMAttr] -> Seq DOMAttr
forall a b. (a -> b) -> a -> b
$ (TAttr -> DOMAttr) -> [TAttr] -> [DOMAttr]
forall a b. (a -> b) -> [a] -> [b]
map TAttr -> DOMAttr
f (Token -> [TAttr]
tStartAttr Token
t)
        , domElementNamespace :: HTMLNamespace
domElementNamespace  = HTMLNamespace
s
        }
      DOMID -> ST s DOMID
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 :: Parser s -> HTMLNamespace -> Token -> ST s ()
insertForeignElement Parser s
p HTMLNamespace
n =
  (Token -> ST s ()) -> Token -> ST s ()
forall s. (Token -> ST s ()) -> Token -> ST s ()
withStartToken ((Token -> ST s ()) -> Token -> ST s ())
-> (Token -> ST s ()) -> Token -> ST s ()
forall a b. (a -> b) -> a -> b
$ \Token
t -> do
    DOMID
i <- Parser s -> Token -> HTMLNamespace -> ST s DOMID
forall s. Parser s -> Token -> HTMLNamespace -> ST s DOMID
createElementForToken Parser s
p Token
t HTMLNamespace
n
    DOMPos
x <- Parser s -> ST s DOMPos
forall s. Parser s -> ST s DOMPos
insertionLocation Parser s
p
    Parser s -> (DOM -> DOM) -> ST s ()
forall s. Parser s -> (DOM -> DOM) -> ST s ()
modifyDOM Parser s
p ((DOM -> DOM) -> ST s ()) -> (DOM -> DOM) -> ST s ()
forall a b. (a -> b) -> a -> b
$ DOMPos -> DOMID -> DOM -> DOM
domInsert DOMPos
x DOMID
i
    Parser s -> DOMID -> ST s ()
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 :: Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p = Parser s -> HTMLNamespace -> Token -> ST s ()
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 :: Parser s -> Token -> ST s ()
insertMathMLElement Parser s
p = Parser s -> HTMLNamespace -> Token -> ST s ()
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 :: Parser s -> Token -> ST s ()
insertSvgElement Parser s
p = Parser s -> HTMLNamespace -> Token -> ST s ()
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 :: Parser s -> BS -> ST s ()
insertHtmlElementNamed Parser s
p BS
x = Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p (Token -> ST s ()) -> Token -> ST s ()
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 = (TAttr -> TAttr) -> [TAttr] -> [TAttr]
forall a b. (a -> b) -> [a] -> [b]
map TAttr -> TAttr
f ([TAttr] -> [TAttr]) -> [TAttr] -> [TAttr]
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 (BS -> BS
forall p. (Eq p, IsString p) => p -> p
g BS
n) BS
v HTMLAttrNamespace
s
    g :: p -> p
g p
x = if p
x p -> p -> Bool
forall a. Eq a => a -> a -> Bool
== p
"definitionurl" then p
"definitionUrl" else p
x

-- | Adjusts the SVG attributes for a token.
adjustAttrSVG :: Token -> Token
adjustAttrSVG :: Token -> Token
adjustAttrSVG Token
t =
  Token
t { tStartAttr :: [TAttr]
tStartAttr = (TAttr -> TAttr) -> [TAttr] -> [TAttr]
forall a b. (a -> b) -> [a] -> [b]
map TAttr -> TAttr
f ([TAttr] -> [TAttr]) -> [TAttr] -> [TAttr]
forall a b. (a -> b) -> a -> b
$ Token -> [TAttr]
tStartAttr Token
t }
  where
    f :: TAttr -> TAttr
f t :: TAttr
t@(TAttr BS
n BS
v HTMLAttrNamespace
s) =
      case BS -> Map BS BS -> Maybe BS
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
t

-- | Adjusts the foreign attributes for a token.
adjustAttrForeign :: Token -> Token
adjustAttrForeign :: Token -> Token
adjustAttrForeign Token
t =
  Token
t { tStartAttr :: [TAttr]
tStartAttr = (TAttr -> TAttr) -> [TAttr] -> [TAttr]
forall a b. (a -> b) -> [a] -> [b]
map TAttr -> TAttr
f ([TAttr] -> [TAttr]) -> [TAttr] -> [TAttr]
forall a b. (a -> b) -> a -> b
$ Token -> [TAttr]
tStartAttr Token
t }
  where
    f :: TAttr -> TAttr
f t :: TAttr
t@(TAttr BS
n BS
v HTMLAttrNamespace
s) =
      case BS
-> Map BS (BS, HTMLAttrNamespace) -> Maybe (BS, HTMLAttrNamespace)
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
t

-- | Adjusts the element name for an SVG element.
adjustElemSVG :: Token -> Token
adjustElemSVG :: Token -> Token
adjustElemSVG Token
t =
  case BS -> Map BS BS -> Maybe BS
forall k a. Ord k => k -> Map k a -> Maybe a
Map.lookup (Token -> BS
tStartName Token
t) Map BS BS
svgElementMap of
    Just BS
x -> Token
t { tStartName :: BS
tStartName = BS
x }
    Maybe BS
Nothing -> Token
t

-- | Adjustable SVG attribute map.
svgAttributeMap :: Map BS BS
svgAttributeMap :: Map BS BS
svgAttributeMap = [(BS, BS)] -> Map BS BS
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 = [(BS, BS)] -> Map BS BS
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 = [(BS, (BS, HTMLAttrNamespace))] -> Map BS (BS, HTMLAttrNamespace)
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 :: 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 = Parser s -> (DOM -> DOM) -> ST s ()
forall s. Parser s -> (DOM -> DOM) -> ST s ()
modifyDOM Parser s
p ((DOM -> DOM) -> ST s ()) -> (DOM -> DOM) -> ST s ()
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 :: 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 <- Parser s -> ST s DOM
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
  Parser s -> DOM -> ST s ()
forall s. Parser s -> DOM -> ST s ()
setDOM Parser s
p DOM
d'
  DOMID -> ST s DOMID
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 :: 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)
..} = Parser s -> DOMPos -> DOMID -> ST 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 :: 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)
..} = ST s DOMID -> ST s ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (ST s DOMID -> ST s ())
-> (DOMNode -> ST s DOMID) -> DOMNode -> ST s ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Parser s -> DOMPos -> DOMNode -> ST s DOMID
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 :: 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 =
  DOMNode -> ST s DOMNode
forall (f :: * -> *) a. Applicative f => a -> f a
pure (DOMNode -> ST s DOMNode) -> DOMNode -> ST s DOMNode
forall a b. (a -> b) -> a -> b
$ DOMNode
domDefaultComment { domCommentData :: BS
domCommentData = Token -> BS
tCommentData Token
t }

-- | Makes a document type node.
doctypeMake :: Parser s -> Token -> ST s DOMNode
doctypeMake :: 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)
..} 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
..} =
  DOMNode -> ST s DOMNode
forall (f :: * -> *) a. Applicative f => a -> f a
pure (DOMNode -> ST s DOMNode) -> DOMNode -> ST s DOMNode
forall a b. (a -> b) -> a -> b
$ DOMNode
domDefaultDoctype
    { domDoctypeName :: BS
domDoctypeName     = BS
tDoctypeName
    , domDoctypePublicID :: Maybe BS
domDoctypePublicID = Maybe BS
tDoctypePublic
    , domDoctypeSystemID :: Maybe BS
domDoctypeSystemID = Maybe BS
tDoctypeSystem
    }

-- | Inserts a new comment in the document.
insertComment :: Parser s -> Token -> ST s ()
insertComment :: 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 =
  Parser s -> ST s DOMPos
forall s. Parser s -> ST s DOMPos
insertionLocation Parser s
p ST s DOMPos -> (DOMPos -> ST s ()) -> ST s ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \DOMPos
x ->
    Parser s -> Token -> ST s DOMNode
forall s. Parser s -> Token -> ST s DOMNode
commentMake Parser s
p Token
t ST s DOMNode -> (DOMNode -> ST s ()) -> ST s ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ST s DOMID -> ST s ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (ST s DOMID -> ST s ())
-> (DOMNode -> ST s DOMID) -> DOMNode -> ST s ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Parser s -> DOMPos -> DOMNode -> ST s DOMID
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 :: 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 =
  Parser s -> Token -> ST s DOMNode
forall s. Parser s -> Token -> ST s DOMNode
commentMake Parser s
p Token
t ST s DOMNode -> (DOMNode -> ST s ()) -> ST s ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ST s DOMID -> ST s ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (ST s DOMID -> ST s ())
-> (DOMNode -> ST s DOMID) -> DOMNode -> ST s ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Parser s -> DOMPos -> DOMNode -> ST s DOMID
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 :: 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)
..} =
  (Word8 -> ST s ()) -> Token -> ST s ()
forall s. (Word8 -> ST s ()) -> Token -> ST s ()
withCharToken ((Word8 -> ST s ()) -> Token -> ST s ())
-> (Word8 -> ST s ()) -> Token -> ST s ()
forall a b. (a -> b) -> a -> b
$ \Word8
w -> do
    DOMPos
pos <- Parser s -> ST s DOMPos
forall s. Parser s -> ST s DOMPos
insertionLocation Parser s
p
    let i :: DOMID
i = DOMPos -> DOMID
domPosParent DOMPos
pos
    Bool -> ST s () -> ST s ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (DOMID
i DOMID -> DOMID -> Bool
forall a. Eq a => a -> a -> Bool
/= DOMID
domRoot) (ST s () -> ST s ()) -> ST s () -> ST s ()
forall a b. (a -> b) -> a -> b
$ do
      DOM
d <- Parser s -> ST s DOM
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 <- Parser s -> DOMPos -> DOMNode -> ST s DOMID
forall s. Parser s -> DOMPos -> DOMNode -> ST s DOMID
insertNewNode Parser s
p DOMPos
pos DOMNode
domDefaultText
          Parser s -> DOMID -> Word8 -> ST s ()
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
..} ->
              Parser s -> DOMID -> Word8 -> ST s ()
forall s. Parser s -> DOMID -> Word8 -> ST s ()
textMapAppend Parser s
p DOMID
domTextID Word8
w
            Just DOMNode
n -> do
              DOMID
j <- Parser s -> DOMPos -> DOMNode -> ST s DOMID
forall s. Parser s -> DOMPos -> DOMNode -> ST s DOMID
insertNewNode Parser s
p DOMPos
pos DOMNode
domDefaultText
              Parser s -> DOMID -> Word8 -> ST s ()
forall s. Parser s -> DOMID -> Word8 -> ST s ()
textMapAppend Parser s
p DOMID
j Word8
w
            Maybe DOMNode
Nothing ->
              Parser s -> Maybe Token -> BS -> ST s ()
forall s. Parser s -> Maybe Token -> BS -> ST s ()
parseError Parser s
p Maybe Token
forall a. Maybe a
Nothing (BS -> ST s ()) -> BS -> ST s ()
forall a b. (a -> b) -> a -> b
$ BS
"insert char bad id: " BS -> BS -> BS
forall a. Semigroup a => a -> a -> a
<> String -> BS
bcPack (DOMID -> String
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 :: 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 <- STRef s (IntMap (STRef s (Buffer s)))
-> ST s (IntMap (STRef s (Buffer s)))
forall s a. STRef s a -> ST s a
rref STRef s (IntMap (STRef s (Buffer s)))
parserTextMap
  case DOMID -> IntMap (STRef s (Buffer s)) -> Maybe (STRef s (Buffer s))
forall a. DOMID -> IntMap a -> Maybe a
IntMap.lookup DOMID
i IntMap (STRef s (Buffer s))
m of
    Just STRef s (Buffer s)
b ->
      Word8 -> STRef s (Buffer s) -> ST s ()
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 <- ST s (STRef s (Buffer s))
forall s. ST s (STRef s (Buffer s))
bufferNew
      Word8 -> STRef s (Buffer s) -> ST s ()
forall s. Word8 -> STRef s (Buffer s) -> ST s ()
bufferAppend Word8
w STRef s (Buffer s)
b
      STRef s (IntMap (STRef s (Buffer s)))
-> IntMap (STRef s (Buffer s)) -> ST s ()
forall s a. STRef s a -> a -> ST s ()
wref STRef s (IntMap (STRef s (Buffer s)))
parserTextMap (IntMap (STRef s (Buffer s)) -> ST s ())
-> IntMap (STRef s (Buffer s)) -> ST s ()
forall a b. (a -> b) -> a -> b
$ DOMID
-> STRef s (Buffer s)
-> IntMap (STRef s (Buffer s))
-> IntMap (STRef s (Buffer s))
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 :: 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 <- STRef s (IntMap (STRef s (Buffer s)))
-> ST s (IntMap (STRef s (Buffer s)))
forall s a. STRef s a -> ST s a
rref STRef s (IntMap (STRef s (Buffer s)))
parserTextMap
  case DOMID -> IntMap (STRef s (Buffer s)) -> Maybe (STRef s (Buffer s))
forall a. DOMID -> IntMap a -> Maybe a
IntMap.lookup DOMID
i IntMap (STRef s (Buffer s))
m of
    Just STRef s (Buffer s)
b  -> STRef s (Buffer s) -> ST s BS
forall s. STRef s (Buffer s) -> ST s BS
bufferPack STRef s (Buffer s)
b
    Maybe (STRef s (Buffer s))
Nothing -> BS -> ST s BS
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 :: 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
..} <- Parser s -> ST s DOM
forall s. Parser s -> ST s DOM
getDOM Parser s
p
  IntMap BS
m <- STRef s (IntMap (STRef s (Buffer s)))
-> ST s (IntMap (STRef s (Buffer s)))
forall s a. STRef s a -> ST s a
rref STRef s (IntMap (STRef s (Buffer s)))
parserTextMap ST s (IntMap (STRef s (Buffer s)))
-> (IntMap (STRef s (Buffer s)) -> ST s (IntMap BS))
-> ST s (IntMap BS)
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (STRef s (Buffer s) -> ST s BS)
-> IntMap (STRef s (Buffer s)) -> ST s (IntMap BS)
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM STRef s (Buffer s) -> ST s BS
forall s. STRef s (Buffer s) -> ST s BS
bufferPack
  let f :: DOMID -> BS
f DOMID
x = BS -> DOMID -> IntMap BS -> BS
forall a. a -> DOMID -> IntMap a -> a
IntMap.findWithDefault BS
bsEmpty DOMID
x IntMap BS
m
      a :: DOMMap
a = ((DOMID -> DOMNode -> DOMNode) -> DOMMap -> DOMMap)
-> DOMMap -> (DOMID -> DOMNode -> DOMNode) -> DOMMap
forall a b c. (a -> b -> c) -> b -> a -> c
flip (DOMID -> DOMNode -> DOMNode) -> DOMMap -> DOMMap
forall a b. (DOMID -> a -> b) -> IntMap a -> IntMap b
IntMap.mapWithKey DOMMap
domNodes ((DOMID -> DOMNode -> DOMNode) -> DOMMap)
-> (DOMID -> DOMNode -> DOMNode) -> DOMMap
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
  DOM -> ST s DOM
forall (f :: * -> *) a. Applicative f => a -> f a
pure (DOM -> ST s DOM) -> DOM -> ST s DOM
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 :: (Token -> ST s ()) -> Token -> ST s ()
withStartToken Token -> ST s ()
f = \case
  t :: Token
t@TStart {} -> Token -> ST s ()
f Token
t
  Token
_otherwise -> () -> ST s ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()

-- -- | Invokes processing for a character token.
withCharToken :: (Word8 -> ST s ()) -> Token -> ST s ()
withCharToken :: (Word8 -> ST s ()) -> Token -> ST s ()
withCharToken Word8 -> ST s ()
f = \case
  TChar Word8
w    -> Word8 -> ST s ()
f Word8
w
  Token
_otherwise -> () -> ST s ()
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 :: 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 = STRef s (Lexer s) -> ST s (Lexer s)
forall s a. STRef s a -> ST s a
rref STRef s (Lexer s)
parserLexer ST s (Lexer s) -> (Lexer s -> ST s ()) -> ST s ()
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 :: Parser s -> ST s ()
parserSkipNextLF Parser s
p = Parser s -> (Lexer s -> ST s ()) -> ST s ()
forall s. Parser s -> (Lexer s -> ST s ()) -> ST s ()
parserLexerUpdate Parser s
p Lexer s -> ST s ()
forall s. Lexer s -> ST s ()
lexerSkipNextLF

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

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

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

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

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

-- | Generates the implied end tags.
generateImpliedEndTags :: Parser s -> ST s ()
generateImpliedEndTags :: Parser s -> ST s ()
generateImpliedEndTags Parser s
p = Parser s -> BS -> ST s ()
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 :: Parser s -> BS -> ST s ()
generateImpliedEndTagsExcept Parser s
p BS
x =
  Parser s -> (DOMNode -> Bool) -> ST s ()
forall s. Parser s -> (DOMNode -> Bool) -> ST s ()
elementStackPopWhile Parser s
p ((DOMNode -> Bool) -> ST s ()) -> (DOMNode -> Bool) -> ST s ()
forall a b. (a -> b) -> a -> b
$ [BS] -> DOMNode -> Bool
elementNameIn ([BS] -> DOMNode -> Bool) -> [BS] -> DOMNode -> Bool
forall a b. (a -> b) -> a -> b
$
    (BS -> Bool) -> [BS] -> [BS]
forall a. (a -> Bool) -> [a] -> [a]
filter (BS -> BS -> Bool
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 :: Parser s -> ST s ()
generateImpliedEndTagsThoroughly Parser s
p =
  Parser s -> (DOMNode -> Bool) -> ST s ()
forall s. Parser s -> (DOMNode -> Bool) -> ST s ()
elementStackPopWhile Parser s
p ((DOMNode -> Bool) -> ST s ()) -> (DOMNode -> Bool) -> ST s ()
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 :: 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)
..} =
  Parser s -> ST s [DOMNode]
forall s. Parser s -> ST s [DOMNode]
elementStackNodes Parser s
p ST s [DOMNode] -> ([DOMNode] -> ST s ()) -> ST s ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= [DOMNode] -> ST s ()
f
  where
    f :: [DOMNode] -> ST s ()
f [] = () -> ST s ()
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'DOMNode -> [DOMNode] -> [DOMNode]
forall a. a -> [a] -> [a]
:[DOMNode]
xs)
        (BS
"td", Bool
False)   -> Parser s -> ParserMode -> ST s ()
forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInCell
        (BS
"th", Bool
False)   -> Parser s -> ParserMode -> ST s ()
forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInCell
        (BS
"tr", Bool
_)       -> Parser s -> ParserMode -> ST s ()
forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInRow
        (BS
"tbody", Bool
_)    -> Parser s -> ParserMode -> ST s ()
forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInTableBody
        (BS
"thead", Bool
_)    -> Parser s -> ParserMode -> ST s ()
forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInTableBody
        (BS
"tfoot", Bool
_)    -> Parser s -> ParserMode -> ST s ()
forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInTableBody
        (BS
"caption", Bool
_)  -> Parser s -> ParserMode -> ST s ()
forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInCaption
        (BS
"colgroup", Bool
_) -> Parser s -> ParserMode -> ST s ()
forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInColumnGroup
        (BS
"table", Bool
_)    -> Parser s -> ParserMode -> ST s ()
forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInTable
        (BS
"head", Bool
False) -> Parser s -> ParserMode -> ST s ()
forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInHead
        (BS
"body", Bool
_)     -> Parser s -> ParserMode -> ST s ()
forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInBody
        (BS
"frameset", Bool
_) -> Parser s -> ParserMode -> ST s ()
forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInFrameset
        (BS
"template", Bool
_) -> Parser s -> ST s (Maybe ParserMode)
forall s. Parser s -> ST s (Maybe ParserMode)
templateModeCurrent Parser s
p ST s (Maybe ParserMode) -> (Maybe ParserMode -> ST s ()) -> ST s ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
                             Just ParserMode
m  -> Parser s -> ParserMode -> ST s ()
forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
m
                             Maybe ParserMode
Nothing -> () -> ST s ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
        (BS
"html", Bool
_)     -> Parser s -> ST s (Maybe DOMID)
forall s. Parser s -> ST s (Maybe DOMID)
getHeadID Parser s
p ST s (Maybe DOMID) -> (Maybe DOMID -> ST s ()) -> ST s ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
                             Maybe DOMID
Nothing -> Parser s -> ParserMode -> ST s ()
forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeBeforeHead
                             Just DOMID
_  -> Parser s -> ParserMode -> ST s ()
forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeAfterHead
        (BS
_, Bool
True)       -> Parser s -> ParserMode -> ST s ()
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 = [DOMNode] -> DOMID
forall (t :: * -> *) a. Foldable t => t a -> DOMID
length [DOMNode]
xs DOMID -> DOMID -> Bool
forall a. Eq a => a -> a -> Bool
== DOMID
0
        node :: ST s DOMNode
node = do
          Bool
a <- STRef s Bool -> ST s Bool
forall s a. STRef s a -> ST s a
rref STRef s Bool
parserFragmentMode
          Maybe DOMID
c <- STRef s (Maybe DOMID) -> ST s (Maybe DOMID)
forall s a. STRef s a -> ST s a
rref STRef s (Maybe DOMID)
parserContextElement
          Maybe DOMNode
n <- Parser s -> DOMID -> ST s (Maybe DOMNode)
forall s. Parser s -> DOMID -> ST s (Maybe DOMNode)
getNode Parser s
p (DOMID -> ST s (Maybe DOMNode)) -> DOMID -> ST s (Maybe DOMNode)
forall a b. (a -> b) -> a -> b
$ Maybe DOMID -> DOMID
forall a. HasCallStack => Maybe a -> a
fromJust Maybe DOMID
c
          DOMNode -> ST s DOMNode
forall (f :: * -> *) a. Applicative f => a -> f a
pure (DOMNode -> ST s DOMNode) -> DOMNode -> ST s DOMNode
forall a b. (a -> b) -> a -> b
$
            if Bool
lastNode Bool -> Bool -> Bool
&& Bool
a Bool -> Bool -> Bool
&& Maybe DOMID -> Bool
forall a. Maybe a -> Bool
isJust Maybe DOMID
c
               then Maybe DOMNode -> DOMNode
forall a. HasCallStack => Maybe a -> a
fromJust (Maybe DOMNode -> DOMNode) -> Maybe DOMNode -> DOMNode
forall a b. (a -> b) -> a -> b
$ Maybe DOMNode
n
               else DOMNode
x

    g :: [DOMNode] -> ST s ()
g (DOMNode
x:[]) =
      Parser s -> ParserMode -> ST s ()
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" -> Parser s -> ParserMode -> ST s ()
forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInSelect
        BS
"table"    -> Parser s -> ParserMode -> ST s ()
forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInSelectInTable
        BS
_otherwise -> [DOMNode] -> ST s ()
g (DOMNode
yDOMNode -> [DOMNode] -> [DOMNode]
forall a. a -> [a] -> [a]
:[DOMNode]
ys)

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

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

-- | Defines the default adoption agency state.
defaultAA :: ST s (ParserAdoptionAgency s)
defaultAA :: ST s (ParserAdoptionAgency s)
defaultAA =
  ParserAdoptionAgency s -> ST s (ParserAdoptionAgency s)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (ParserAdoptionAgency s -> ST s (ParserAdoptionAgency s))
-> ParserAdoptionAgency s -> ST s (ParserAdoptionAgency s)
forall a b. (a -> b) -> a -> b
$ ParserAdoptionAgency :: forall s.
BS
-> DOMID
-> DOMID
-> DOMID
-> DOMID
-> DOMID
-> DOMID
-> DOMID
-> DOMID
-> Maybe DOMID
-> ST s ()
-> ParserAdoptionAgency s
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           = Maybe DOMID
forall a. Maybe a
Nothing
    , aaAnyOtherEndTag :: ST s ()
aaAnyOtherEndTag     = () -> ST s ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
    }

-- | Modifies the adoption agency state.
modifyAA :: Parser s -> (ParserAdoptionAgency s -> ParserAdoptionAgency s) -> ST s ()
modifyAA :: 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)
..} = STRef s (ParserAdoptionAgency s)
-> (ParserAdoptionAgency s -> ParserAdoptionAgency s) -> ST 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 :: 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)
..} = STRef s (ParserAdoptionAgency s) -> ST s (ParserAdoptionAgency 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 :: Parser s -> (ParserAdoptionAgency s -> a) -> ST s a
getsAA Parser s
p ParserAdoptionAgency s -> a
f = ParserAdoptionAgency s -> a
f (ParserAdoptionAgency s -> a)
-> ST s (ParserAdoptionAgency s) -> ST s a
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser s -> ST s (ParserAdoptionAgency s)
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 :: 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 <- Parser s -> DOMType -> ST s Bool
forall s. Parser s -> DOMType -> ST s Bool
currentNodeHasType Parser s
p (DOMType -> ST s Bool) -> DOMType -> ST s Bool
forall a b. (a -> b) -> a -> b
$ BS -> DOMType
domMakeTypeHTML BS
subject
  Bool
b <- Parser s -> ST s (Maybe DOMID)
forall s. Parser s -> ST s (Maybe DOMID)
currentNodeID Parser s
p ST s (Maybe DOMID) -> (Maybe DOMID -> ST s Bool) -> ST s Bool
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
    Just DOMID
i -> ST s Bool -> ST s Bool
forall (m :: * -> *). Functor m => m Bool -> m Bool
notM (ST s Bool -> ST s Bool) -> ST s Bool -> ST s Bool
forall a b. (a -> b) -> a -> b
$ Parser s -> DOMID -> ST s Bool
forall s. Parser s -> DOMID -> ST s Bool
activeFormatContains Parser s
p DOMID
i
    Maybe DOMID
Nothing -> Bool -> ST s Bool
forall (f :: * -> *) a. Applicative f => a -> f a
pure Bool
True
  Bool -> ST s () -> ST s ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless (Bool
a Bool -> Bool -> Bool
&& Bool
b) (ST s () -> ST s ()) -> ST s () -> ST s ()
forall a b. (a -> b) -> a -> b
$ do
    ParserAdoptionAgency s
aa <- ST s (ParserAdoptionAgency s)
forall s. ST s (ParserAdoptionAgency s)
defaultAA
    Parser s
-> (ParserAdoptionAgency s -> ParserAdoptionAgency s) -> ST s ()
forall s.
Parser s
-> (ParserAdoptionAgency s -> ParserAdoptionAgency s) -> ST s ()
modifyAA Parser s
p ((ParserAdoptionAgency s -> ParserAdoptionAgency s) -> ST s ())
-> (ParserAdoptionAgency s -> ParserAdoptionAgency s) -> ST s ()
forall a b. (a -> b) -> a -> b
$ ParserAdoptionAgency s
-> ParserAdoptionAgency s -> ParserAdoptionAgency s
forall a b. a -> b -> a
const ParserAdoptionAgency s
aa
      { aaSubject :: BS
aaSubject        = BS
subject
      , aaAnyOtherEndTag :: ST s ()
aaAnyOtherEndTag = ST s ()
anyOther
      }
    Parser s -> ST s ()
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 :: Parser s -> ST s ()
adoptionAgencyOuterLoop Parser s
p = do
  DOMID
i <- Parser s -> (ParserAdoptionAgency s -> DOMID) -> ST s DOMID
forall s a. Parser s -> (ParserAdoptionAgency s -> a) -> ST s a
getsAA Parser s
p ParserAdoptionAgency s -> DOMID
forall s. ParserAdoptionAgency s -> DOMID
aaOuterLoopCount
  -- (3) Check outer loop counter.
  Bool -> ST s () -> ST s ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (DOMID
i DOMID -> DOMID -> Bool
forall a. Ord a => a -> a -> Bool
< DOMID
8) (ST s () -> ST s ()) -> ST s () -> ST s ()
forall a b. (a -> b) -> a -> b
$ do
    -- (4) Increment outer loop counter.
    Parser s
-> (ParserAdoptionAgency s -> ParserAdoptionAgency s) -> ST s ()
forall s.
Parser s
-> (ParserAdoptionAgency s -> ParserAdoptionAgency s) -> ST s ()
modifyAA Parser s
p ((ParserAdoptionAgency s -> ParserAdoptionAgency s) -> ST s ())
-> (ParserAdoptionAgency s -> ParserAdoptionAgency s) -> ST s ()
forall a b. (a -> b) -> a -> b
$ \ParserAdoptionAgency s
a -> ParserAdoptionAgency s
a { aaOuterLoopCount :: DOMID
aaOuterLoopCount = ParserAdoptionAgency s -> DOMID
forall s. ParserAdoptionAgency s -> DOMID
aaOuterLoopCount ParserAdoptionAgency s
a DOMID -> DOMID -> DOMID
forall a. Num a => a -> a -> a
+ DOMID
1 }
    -- (5) Find the formatting element.
    (ParserAdoptionAgency s -> BS)
-> ST s (ParserAdoptionAgency s) -> ST s BS
forall (f :: * -> *) a b. Applicative f => (a -> b) -> f a -> f b
liftA ParserAdoptionAgency s -> BS
forall s. ParserAdoptionAgency s -> BS
aaSubject (Parser s -> ST s (ParserAdoptionAgency s)
forall s. Parser s -> ST s (ParserAdoptionAgency s)
getAA Parser s
p) ST s BS
-> (BS -> ST s (Maybe ParserFormatItem))
-> ST s (Maybe ParserFormatItem)
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Parser s -> BS -> ST s (Maybe ParserFormatItem)
forall s. Parser s -> BS -> ST s (Maybe ParserFormatItem)
activeFormatFindTag Parser s
p ST s (Maybe ParserFormatItem)
-> (Maybe ParserFormatItem -> ST s ()) -> ST s ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
      Maybe ParserFormatItem
Nothing -> do
        ST s ()
doAnyOtherEndTag <- Parser s -> (ParserAdoptionAgency s -> ST s ()) -> ST s (ST s ())
forall s a. Parser s -> (ParserAdoptionAgency s -> a) -> ST s a
getsAA Parser s
p ParserAdoptionAgency s -> ST s ()
forall s. ParserAdoptionAgency s -> ST s ()
aaAnyOtherEndTag
        ST s ()
doAnyOtherEndTag
      Just (ParserFormatElement DOMID
fe Token
t) -> do
        Parser s
-> (ParserAdoptionAgency s -> ParserAdoptionAgency s) -> ST s ()
forall s.
Parser s
-> (ParserAdoptionAgency s -> ParserAdoptionAgency s) -> ST s ()
modifyAA Parser s
p ((ParserAdoptionAgency s -> ParserAdoptionAgency s) -> ST s ())
-> (ParserAdoptionAgency s -> ParserAdoptionAgency s) -> ST s ()
forall a b. (a -> b) -> a -> b
$ \ParserAdoptionAgency s
a -> ParserAdoptionAgency s
a { aaFormattingElement :: DOMID
aaFormattingElement = DOMID
fe }
        -- Geting formatting node
        DOMNode
x <- Maybe DOMNode -> DOMNode
forall a. HasCallStack => Maybe a -> a
fromJust (Maybe DOMNode -> DOMNode) -> ST s (Maybe DOMNode) -> ST s DOMNode
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser s -> DOMID -> ST s (Maybe DOMNode)
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.
        (Parser s -> (DOMNode -> Bool) -> ST s Bool
forall s. Parser s -> (DOMNode -> Bool) -> ST s Bool
elementStackAny Parser s
p (DOMID -> DOMID -> Bool
forall a. Eq a => a -> a -> Bool
(==) DOMID
fe (DOMID -> Bool) -> (DOMNode -> DOMID) -> DOMNode -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. DOMNode -> DOMID
domNodeID)) ST s Bool -> (Bool -> ST s ()) -> ST s ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
          Bool
False -> do
            Parser s -> Maybe Token -> BS -> ST s ()
forall s. Parser s -> Maybe Token -> BS -> ST s ()
parseError Parser s
p Maybe Token
forall a. Maybe a
Nothing (BS -> ST s ()) -> BS -> ST s ()
forall a b. (a -> b) -> a -> b
$
              BS
"element stack missing " BS -> BS -> BS
forall a. Semigroup a => a -> a -> a
<> BS
name
              BS -> BS -> BS
forall a. Semigroup a => a -> a -> a
<> BS
"(ID:" BS -> BS -> BS
forall a. Semigroup a => a -> a -> a
<> String -> BS
bcPack (DOMID -> String
forall a. Show a => a -> String
show DOMID
fe) BS -> BS -> BS
forall a. Semigroup a => a -> a -> a
<> BS
") during adoption"
            Parser s -> DOMID -> ST s ()
forall s. Parser s -> DOMID -> ST s ()
activeFormatRemove Parser s
p DOMID
fe
          Bool
True ->
            -- (7) Check if formatting element is not in scope.
            (Parser s -> DOMType -> ST s Bool
forall s. Parser s -> DOMType -> ST s Bool
elementInScope Parser s
p (DOMType -> ST s Bool) -> DOMType -> ST s Bool
forall a b. (a -> b) -> a -> b
$ DOMNode -> DOMType
domNodeType DOMNode
x) ST s Bool -> (Bool -> ST s ()) -> ST s ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
              Bool
False ->
                Parser s -> Maybe Token -> BS -> ST s ()
forall s. Parser s -> Maybe Token -> BS -> ST s ()
parseError Parser s
p Maybe Token
forall a. Maybe a
Nothing (BS -> ST s ()) -> BS -> ST s ()
forall a b. (a -> b) -> a -> b
$
                  BS
"element " BS -> BS -> BS
forall a. Semigroup a => a -> a -> a
<> BS
name BS -> BS -> BS
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.
                ST s Bool -> ST s () -> ST s ()
forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
unlessM (Bool -> (DOMID -> Bool) -> Maybe DOMID -> Bool
forall b a. b -> (a -> b) -> Maybe a -> b
maybe Bool
False (DOMID -> DOMID -> Bool
forall a. Eq a => a -> a -> Bool
==DOMID
fe) (Maybe DOMID -> Bool) -> ST s (Maybe DOMID) -> ST s Bool
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser s -> ST s (Maybe DOMID)
forall s. Parser s -> ST s (Maybe DOMID)
currentNodeID Parser s
p) (ST s () -> ST s ()) -> ST s () -> ST s ()
forall a b. (a -> b) -> a -> b
$
                  Parser s -> Maybe Token -> BS -> ST s ()
forall s. Parser s -> Maybe Token -> BS -> ST s ()
parseError Parser s
p Maybe Token
forall a. Maybe a
Nothing (BS -> ST s ()) -> BS -> ST s ()
forall a b. (a -> b) -> a -> b
$ BS
"element " BS -> BS -> BS
forall a. Semigroup a => a -> a -> a
<> BS
name
                    BS -> BS -> BS
forall a. Semigroup a => a -> a -> a
<> BS
" is not the current ID during adoption"
                -- (9) Find the furthest block.
                DOM
d <- Parser s -> ST s DOM
forall s. Parser s -> ST s DOM
getDOM Parser s
p
                [DOMID] -> Maybe DOMID
f <- ([DOMID] -> Maybe DOMID) -> ST s ([DOMID] -> Maybe DOMID)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (([DOMID] -> Maybe DOMID) -> ST s ([DOMID] -> Maybe DOMID))
-> ([DOMID] -> Maybe DOMID) -> ST s ([DOMID] -> Maybe DOMID)
forall a b. (a -> b) -> a -> b
$ (DOMID -> Bool) -> [DOMID] -> Maybe DOMID
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Maybe a
find ((DOMID -> Bool) -> [DOMID] -> Maybe DOMID)
-> (DOMID -> Bool) -> [DOMID] -> Maybe DOMID
forall a b. (a -> b) -> a -> b
$ DOMType -> Bool
elementIsSpecial
                  (DOMType -> Bool) -> (DOMID -> DOMType) -> DOMID -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. DOMNode -> DOMType
domNodeType (DOMNode -> DOMType) -> (DOMID -> DOMNode) -> DOMID -> DOMType
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Maybe DOMNode -> DOMNode
forall a. HasCallStack => Maybe a -> a
fromJust (Maybe DOMNode -> DOMNode)
-> (DOMID -> Maybe DOMNode) -> DOMID -> DOMNode
forall b c a. (b -> c) -> (a -> b) -> a -> c
. DOM -> DOMID -> Maybe DOMNode
domGetNode DOM
d
                ([DOMID] -> Maybe DOMID) -> ST s [DOMID] -> ST s (Maybe DOMID)
forall (f :: * -> *) a b. Applicative f => (a -> b) -> f a -> f b
liftA ([DOMID] -> Maybe DOMID
f ([DOMID] -> Maybe DOMID)
-> ([DOMID] -> [DOMID]) -> [DOMID] -> Maybe DOMID
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [DOMID] -> [DOMID]
forall a. [a] -> [a]
reverse ([DOMID] -> [DOMID]) -> ([DOMID] -> [DOMID]) -> [DOMID] -> [DOMID]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (DOMID -> Bool) -> [DOMID] -> [DOMID]
forall a. (a -> Bool) -> [a] -> [a]
takeWhile (DOMID -> DOMID -> Bool
forall a. Eq a => a -> a -> Bool
/=DOMID
fe)) (Parser s -> ST s [DOMID]
forall s. Parser s -> ST s [DOMID]
elementStack Parser s
p) ST s (Maybe DOMID) -> (Maybe DOMID -> ST s ()) -> ST s ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
                  Maybe DOMID
Nothing -> do
                    -- (10) There was no furthest block.
                    Parser s -> DOMID -> ST s ()
forall s. Parser s -> DOMID -> ST s ()
elementStackPopUntilID Parser s
p DOMID
fe
                    Parser s -> DOMID -> ST s ()
forall s. Parser s -> DOMID -> ST s ()
activeFormatRemove Parser s
p DOMID
fe
                  Just DOMID
fb -> do
                    -- (11) Find the common ancestor.
                    DOMID
ca <- Maybe DOMID -> DOMID
forall a. HasCallStack => Maybe a -> a
fromJust (Maybe DOMID -> DOMID) -> ST s (Maybe DOMID) -> ST s DOMID
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser s -> DOMID -> ST s (Maybe DOMID)
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 <- Parser s -> DOMID -> ST s (Maybe DOMID)
forall s. Parser s -> DOMID -> ST s (Maybe DOMID)
activeFormatSucc Parser s
p DOMID
fe
                    Parser s
-> (ParserAdoptionAgency s -> ParserAdoptionAgency s) -> ST s ()
forall s.
Parser s
-> (ParserAdoptionAgency s -> ParserAdoptionAgency s) -> ST s ()
modifyAA Parser s
p ((ParserAdoptionAgency s -> ParserAdoptionAgency s) -> ST s ())
-> (ParserAdoptionAgency s -> ParserAdoptionAgency s) -> ST s ()
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
                      }
                    Parser s -> ST s ()
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 :: Parser s -> ST s ()
adoptionAgencyInnerLoop Parser s
p = do
  -- (13.2) Increment inner loop counter.
  Parser s
-> (ParserAdoptionAgency s -> ParserAdoptionAgency s) -> ST s ()
forall s.
Parser s
-> (ParserAdoptionAgency s -> ParserAdoptionAgency s) -> ST s ()
modifyAA Parser s
p ((ParserAdoptionAgency s -> ParserAdoptionAgency s) -> ST s ())
-> (ParserAdoptionAgency s -> ParserAdoptionAgency s) -> ST s ()
forall a b. (a -> b) -> a -> b
$ \ParserAdoptionAgency s
a -> ParserAdoptionAgency s
a { aaInnerLoopCount :: DOMID
aaInnerLoopCount = ParserAdoptionAgency s -> DOMID
forall s. ParserAdoptionAgency s -> DOMID
aaInnerLoopCount ParserAdoptionAgency s
a DOMID -> DOMID -> DOMID
forall a. Num a => a -> a -> a
+ DOMID
1 }
  -- (13.3) Move to the next node.
  DOMID
n <- Parser s -> (ParserAdoptionAgency s -> DOMID) -> ST s DOMID
forall s a. Parser s -> (ParserAdoptionAgency s -> a) -> ST s a
getsAA Parser s
p ParserAdoptionAgency s -> DOMID
forall s. ParserAdoptionAgency s -> DOMID
aaNode
  DOMID
m <- Parser s -> (ParserAdoptionAgency s -> DOMID) -> ST s DOMID
forall s a. Parser s -> (ParserAdoptionAgency s -> a) -> ST s a
getsAA Parser s
p ParserAdoptionAgency s -> DOMID
forall s. ParserAdoptionAgency s -> DOMID
aaNextNode
  DOMID
node <- DOMID -> (DOMID -> DOMID) -> Maybe DOMID -> DOMID
forall b a. b -> (a -> b) -> Maybe a -> b
maybe DOMID
m DOMID -> DOMID
forall a. a -> a
id (Maybe DOMID -> DOMID) -> ST s (Maybe DOMID) -> ST s DOMID
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser s -> DOMID -> ST s (Maybe DOMID)
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 <- Parser s -> (ParserAdoptionAgency s -> DOMID) -> ST s DOMID
forall s a. Parser s -> (ParserAdoptionAgency s -> a) -> ST s a
getsAA Parser s
p ParserAdoptionAgency s -> DOMID
forall s. ParserAdoptionAgency s -> DOMID
aaFormattingElement
  if DOMID
node DOMID -> DOMID -> Bool
forall a. Eq a => a -> a -> Bool
== DOMID
f
     then Parser s -> ST s ()
forall s. Parser s -> ST s ()
adoptionAgencyPostLoop Parser s
p
     else do
       -- (13.5) Check the inner loop counter.
       DOMID
ic <- Parser s -> (ParserAdoptionAgency s -> DOMID) -> ST s DOMID
forall s a. Parser s -> (ParserAdoptionAgency s -> a) -> ST s a
getsAA Parser s
p ParserAdoptionAgency s -> DOMID
forall s. ParserAdoptionAgency s -> DOMID
aaInnerLoopCount
       Bool
ac <- Parser s -> DOMID -> ST s Bool
forall s. Parser s -> DOMID -> ST s Bool
activeFormatContains Parser s
p DOMID
node
       Bool -> ST s () -> ST s ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (DOMID
ic DOMID -> DOMID -> Bool
forall a. Ord a => a -> a -> Bool
> DOMID
3 Bool -> Bool -> Bool
&& Bool
ac) (ST s () -> ST s ()) -> ST s () -> ST s ()
forall a b. (a -> b) -> a -> b
$ Parser s -> DOMID -> ST s ()
forall s. Parser s -> DOMID -> ST s ()
activeFormatRemove Parser s
p DOMID
node
       -- (13.6) Check if node is in the active format list.
       ST s Bool -> ST s () -> ST s ()
forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
unlessM (Parser s -> DOMID -> ST s Bool
forall s. Parser s -> DOMID -> ST s Bool
activeFormatContains Parser s
p DOMID
node) (ST s () -> ST s ()) -> ST s () -> ST s ()
forall a b. (a -> b) -> a -> b
$ do
         DOMID
m <- Maybe DOMID -> DOMID
forall a. HasCallStack => Maybe a -> a
fromJust (Maybe DOMID -> DOMID) -> ST s (Maybe DOMID) -> ST s DOMID
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser s -> DOMID -> ST s (Maybe DOMID)
forall s. Parser s -> DOMID -> ST s (Maybe DOMID)
elementStackSucc Parser s
p DOMID
node
         Parser s
-> (ParserAdoptionAgency s -> ParserAdoptionAgency s) -> ST s ()
forall s.
Parser s
-> (ParserAdoptionAgency s -> ParserAdoptionAgency s) -> ST s ()
modifyAA Parser s
p ((ParserAdoptionAgency s -> ParserAdoptionAgency s) -> ST s ())
-> (ParserAdoptionAgency s -> ParserAdoptionAgency s) -> ST s ()
forall a b. (a -> b) -> a -> b
$ \ParserAdoptionAgency s
a -> ParserAdoptionAgency s
a { aaNextNode :: DOMID
aaNextNode = DOMID
m }
         Parser s -> DOMID -> ST s ()
forall s. Parser s -> DOMID -> ST s ()
elementStackRemove Parser s
p DOMID
node
         Parser s -> ST s ()
forall s. Parser s -> ST s ()
adoptionAgencyInnerLoop Parser s
p
       -- (13.7) Create an element for the token for node.
       Token
t <- Maybe Token -> Token
forall a. HasCallStack => Maybe a -> a
fromJust (Maybe Token -> Token) -> ST s (Maybe Token) -> ST s Token
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser s -> DOMID -> ST s (Maybe Token)
forall s. Parser s -> DOMID -> ST s (Maybe Token)
activeFormatFindToken Parser s
p DOMID
node
       DOMID
e <- Parser s -> Token -> HTMLNamespace -> ST s DOMID
forall s. Parser s -> Token -> HTMLNamespace -> ST s DOMID
createElementForToken Parser s
p Token
t HTMLNamespace
HTMLNamespaceHTML
       DOMID
c <- Parser s -> (ParserAdoptionAgency s -> DOMID) -> ST s DOMID
forall s a. Parser s -> (ParserAdoptionAgency s -> a) -> ST s a
getsAA Parser s
p ParserAdoptionAgency s -> DOMID
forall s. ParserAdoptionAgency s -> DOMID
aaCommonAncestor
       Parser s -> (DOM -> DOM) -> ST s ()
forall s. Parser s -> (DOM -> DOM) -> ST s ()
modifyDOM Parser s
p ((DOM -> DOM) -> ST s ()) -> (DOM -> DOM) -> ST s ()
forall a b. (a -> b) -> a -> b
$ DOMID -> DOMID -> DOM -> DOM
domAppend DOMID
c DOMID
e
       Parser s -> DOMID -> DOMID -> ST s ()
forall s. Parser s -> DOMID -> DOMID -> ST s ()
activeFormatReplace Parser s
p DOMID
node DOMID
e
       Parser s -> DOMID -> DOMID -> ST s ()
forall s. Parser s -> DOMID -> DOMID -> ST s ()
elementStackReplace Parser s
p DOMID
node DOMID
e
       Parser s
-> (ParserAdoptionAgency s -> ParserAdoptionAgency s) -> ST s ()
forall s.
Parser s
-> (ParserAdoptionAgency s -> ParserAdoptionAgency s) -> ST s ()
modifyAA Parser s
p ((ParserAdoptionAgency s -> ParserAdoptionAgency s) -> ST s ())
-> (ParserAdoptionAgency s -> ParserAdoptionAgency s) -> ST s ()
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 <- Parser s -> (ParserAdoptionAgency s -> DOMID) -> ST s DOMID
forall s a. Parser s -> (ParserAdoptionAgency s -> a) -> ST s a
getsAA Parser s
p ParserAdoptionAgency s -> DOMID
forall s. ParserAdoptionAgency s -> DOMID
aaLastNode
       DOMID
b <- Parser s -> (ParserAdoptionAgency s -> DOMID) -> ST s DOMID
forall s a. Parser s -> (ParserAdoptionAgency s -> a) -> ST s a
getsAA Parser s
p ParserAdoptionAgency s -> DOMID
forall s. ParserAdoptionAgency s -> DOMID
aaFurthestBlock
       Bool -> ST s () -> ST s ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (DOMID
x DOMID -> DOMID -> Bool
forall a. Eq a => a -> a -> Bool
== DOMID
b) (ST s () -> ST s ()) -> ST s () -> ST s ()
forall a b. (a -> b) -> a -> b
$ do
         Maybe DOMID
bm <- Parser s -> DOMID -> ST s (Maybe DOMID)
forall s. Parser s -> DOMID -> ST s (Maybe DOMID)
activeFormatSucc Parser s
p DOMID
e
         Parser s
-> (ParserAdoptionAgency s -> ParserAdoptionAgency s) -> ST s ()
forall s.
Parser s
-> (ParserAdoptionAgency s -> ParserAdoptionAgency s) -> ST s ()
modifyAA Parser s
p ((ParserAdoptionAgency s -> ParserAdoptionAgency s) -> ST s ())
-> (ParserAdoptionAgency s -> ParserAdoptionAgency s) -> ST s ()
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.
       Parser s -> (DOM -> DOM) -> ST s ()
forall s. Parser s -> (DOM -> DOM) -> ST s ()
modifyDOM Parser s
p ((DOM -> DOM) -> ST s ()) -> (DOM -> DOM) -> ST s ()
forall a b. (a -> b) -> a -> b
$ DOMID -> DOMID -> DOM -> DOM
domMove DOMID
x DOMID
e
       -- (13.10) Set last node to be node.
       Parser s
-> (ParserAdoptionAgency s -> ParserAdoptionAgency s) -> ST s ()
forall s.
Parser s
-> (ParserAdoptionAgency s -> ParserAdoptionAgency s) -> ST s ()
modifyAA Parser s
p ((ParserAdoptionAgency s -> ParserAdoptionAgency s) -> ST s ())
-> (ParserAdoptionAgency s -> ParserAdoptionAgency s) -> ST s ()
forall a b. (a -> b) -> a -> b
$ \ParserAdoptionAgency s
a -> ParserAdoptionAgency s
a { aaLastNode :: DOMID
aaLastNode = DOMID
e }
       -- (13.11) Repeat inner loop.
       Parser s -> ST s ()
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 :: Parser s -> ST s ()
adoptionAgencyPostLoop Parser s
p = do
  -- (14) Insert last node with common ancestor as target.
  DOMID
c <- Parser s -> (ParserAdoptionAgency s -> DOMID) -> ST s DOMID
forall s a. Parser s -> (ParserAdoptionAgency s -> a) -> ST s a
getsAA Parser s
p ParserAdoptionAgency s -> DOMID
forall s. ParserAdoptionAgency s -> DOMID
aaCommonAncestor
  DOMID
n <- Parser s -> (ParserAdoptionAgency s -> DOMID) -> ST s DOMID
forall s a. Parser s -> (ParserAdoptionAgency s -> a) -> ST s a
getsAA Parser s
p ParserAdoptionAgency s -> DOMID
forall s. ParserAdoptionAgency s -> DOMID
aaLastNode
  DOMPos
i <- Parser s -> Maybe DOMID -> ST s DOMPos
forall s. Parser s -> Maybe DOMID -> ST s DOMPos
appropriateInsertionLocation Parser s
p (Maybe DOMID -> ST s DOMPos) -> Maybe DOMID -> ST s DOMPos
forall a b. (a -> b) -> a -> b
$ DOMID -> Maybe DOMID
forall a. a -> Maybe a
Just DOMID
c
  Parser s -> (DOM -> DOM) -> ST s ()
forall s. Parser s -> (DOM -> DOM) -> ST s ()
modifyDOM Parser s
p ((DOM -> DOM) -> ST s ()) -> (DOM -> DOM) -> ST s ()
forall a b. (a -> b) -> a -> b
$ DOMID -> DOMID -> DOM -> DOM
domMove DOMID
n (DOMID -> DOM -> DOM) -> DOMID -> DOM -> DOM
forall a b. (a -> b) -> a -> b
$ DOMPos -> DOMID
domPosParent DOMPos
i
  -- (15) Create element for token.
  DOMID
f <- Parser s -> (ParserAdoptionAgency s -> DOMID) -> ST s DOMID
forall s a. Parser s -> (ParserAdoptionAgency s -> a) -> ST s a
getsAA Parser s
p ParserAdoptionAgency s -> DOMID
forall s. ParserAdoptionAgency s -> DOMID
aaFormattingElement
  Token
t <- Maybe Token -> Token
forall a. HasCallStack => Maybe a -> a
fromJust (Maybe Token -> Token) -> ST s (Maybe Token) -> ST s Token
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser s -> DOMID -> ST s (Maybe Token)
forall s. Parser s -> DOMID -> ST s (Maybe Token)
activeFormatFindToken Parser s
p DOMID
f
  DOMID
e <- Parser s -> Token -> HTMLNamespace -> ST s DOMID
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 <- Parser s -> (ParserAdoptionAgency s -> DOMID) -> ST s DOMID
forall s a. Parser s -> (ParserAdoptionAgency s -> a) -> ST s a
getsAA Parser s
p ParserAdoptionAgency s -> DOMID
forall s. ParserAdoptionAgency s -> DOMID
aaFurthestBlock
  Parser s -> (DOM -> DOM) -> ST s ()
forall s. Parser s -> (DOM -> DOM) -> ST s ()
modifyDOM Parser s
p ((DOM -> DOM) -> ST s ()) -> (DOM -> DOM) -> ST s ()
forall a b. (a -> b) -> a -> b
$ DOMID -> DOMID -> DOM -> DOM
domMoveChildren DOMID
b DOMID
e
  -- (17) Append new element to furthest block.
  Parser s -> (DOM -> DOM) -> ST s ()
forall s. Parser s -> (DOM -> DOM) -> ST s ()
modifyDOM Parser s
p ((DOM -> DOM) -> ST s ()) -> (DOM -> DOM) -> ST s ()
forall a b. (a -> b) -> a -> b
$ DOMID -> DOMID -> DOM -> DOM
domAppend DOMID
b DOMID
e
  -- (18) Remove formatting element and insert new element.
  Parser s -> DOMID -> ST s ()
forall s. Parser s -> DOMID -> ST s ()
activeFormatRemove Parser s
p DOMID
f
  Parser s
-> (ParserAdoptionAgency s -> Maybe DOMID) -> ST s (Maybe DOMID)
forall s a. Parser s -> (ParserAdoptionAgency s -> a) -> ST s a
getsAA Parser s
p ParserAdoptionAgency s -> Maybe DOMID
forall s. ParserAdoptionAgency s -> Maybe DOMID
aaBookmark ST s (Maybe DOMID) -> (Maybe DOMID -> ST s ()) -> ST s ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Parser s -> DOMID -> Token -> Maybe DOMID -> ST s ()
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.
  Parser s -> DOMID -> ST s ()
forall s. Parser s -> DOMID -> ST s ()
elementStackRemove Parser s
p DOMID
f
  Parser s -> DOMID -> DOMID -> ST s ()
forall s. Parser s -> DOMID -> DOMID -> ST s ()
elementStackInsertBefore Parser s
p DOMID
b DOMID
e
  -- (20) Jump back to outer loop.
  Parser s -> ST s ()
forall s. Parser s -> ST s ()
adoptionAgencyOuterLoop Parser s
p

-- | Initializes the pending table characters.
pendingTableCharInit :: Parser s -> ST s ()
pendingTableCharInit :: 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)
..} = STRef s [Token] -> [Token] -> ST 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 :: 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 = STRef s [Token] -> ([Token] -> [Token]) -> ST s ()
forall s a. STRef s a -> (a -> a) -> ST s ()
uref STRef s [Token]
parserTableChars ([Token] -> [Token] -> [Token]
forall a. Semigroup a => a -> a -> a
<>[Token
t])

-- | Gets the pending table characters.
pendingTableChars :: Parser s -> ST s [Token]
pendingTableChars :: 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)
..} = STRef s [Token] -> ST s [Token]
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 :: 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) =
  Bool -> ST s () -> ST s ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (BS
n BS -> BS -> Bool
forall a. Eq a => a -> a -> Bool
/= BS
"html"
    Bool -> Bool -> Bool
|| Maybe BS
p Maybe BS -> Maybe BS -> Bool
forall a. Eq a => a -> a -> Bool
/= Maybe BS
forall a. Maybe a
Nothing
    Bool -> Bool -> Bool
|| Maybe BS
s Maybe BS -> Maybe BS -> Bool
forall a. Eq a => a -> a -> Bool
/= Maybe BS
forall a. Maybe a
Nothing Bool -> Bool -> Bool
&& Maybe BS
s Maybe BS -> Maybe BS -> Bool
forall a. Eq a => a -> a -> Bool
/= BS -> Maybe BS
forall a. a -> Maybe a
Just BS
"about:legacy-compat") (ST s () -> ST s ()) -> ST s () -> ST s ()
forall a b. (a -> b) -> a -> b
$
    Parser s -> Maybe Token -> BS -> ST s ()
forall s. Parser s -> Maybe Token -> BS -> ST s ()
parseError Parser s
parser (Token -> Maybe Token
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) =
  [Bool] -> Bool
forall (t :: * -> *). Foldable t => t Bool -> Bool
or
  [ BS
n BS -> BS -> Bool
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
  , [Bool] -> Bool
forall (t :: * -> *). Foldable t => t Bool -> Bool
and
    [ Maybe BS
s Maybe BS -> Maybe BS -> Bool
forall a. Eq a => a -> a -> Bool
== Maybe BS
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
..} =
  [Bool] -> Bool
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//"
    ]
  , [Bool] -> Bool
forall (t :: * -> *). Foldable t => t Bool -> Bool
and
    [ Maybe BS -> Bool
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 BS -> BS -> Bool
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 = (BS -> Bool) -> [BS] -> Bool
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 :: 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
      () -> ST s ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
    TComment {} -> do
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
insertDocComment Parser s
p Token
t
    TDoctype {} -> do
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
doctypeTokenCheck Parser s
p Token
t
      Parser s -> Token -> ST s DOMNode
forall s. Parser s -> Token -> ST s DOMNode
doctypeMake Parser s
p Token
t ST s DOMNode -> (DOMNode -> ST s ()) -> ST s ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Parser s -> DOMNode -> ST s ()
forall s. Parser s -> DOMNode -> ST s ()
insertNewDocumentNode Parser s
p
      Bool
iframe <- Parser s -> ST s Bool
forall s. Parser s -> ST s Bool
iframeSrcDoc Parser s
p
      Bool -> ST s () -> ST s ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Bool -> Bool
not Bool
iframe Bool -> Bool -> Bool
&& Token -> Bool
tokenQuirks Token
t) (ST s () -> ST s ()) -> ST s () -> ST s ()
forall a b. (a -> b) -> a -> b
$ do
        Parser s -> (DOM -> DOM) -> ST s ()
forall s. Parser s -> (DOM -> DOM) -> ST s ()
modifyDOM Parser s
p ((DOM -> DOM) -> ST s ()) -> (DOM -> DOM) -> ST s ()
forall a b. (a -> b) -> a -> b
$ DOMQuirks -> DOM -> DOM
domQuirksSet DOMQuirks
DOMQuirksMode
      Bool -> ST s () -> ST s ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Bool -> Bool
not Bool
iframe Bool -> Bool -> Bool
&& Token -> Bool
tokenLimitedQuirks Token
t) (ST s () -> ST s ()) -> ST s () -> ST s ()
forall a b. (a -> b) -> a -> b
$ do
        Parser s -> (DOM -> DOM) -> ST s ()
forall s. Parser s -> (DOM -> DOM) -> ST s ()
modifyDOM Parser s
p ((DOM -> DOM) -> ST s ()) -> (DOM -> DOM) -> ST s ()
forall a b. (a -> b) -> a -> b
$ DOMQuirks -> DOM -> DOM
domQuirksSet DOMQuirks
DOMQuirksLimited
      Parser s -> ParserMode -> ST s ()
forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeBeforeHtml
    Token
_otherwise -> do
      ST s Bool -> ST s () -> ST s ()
forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
whenM (ST s Bool -> ST s Bool
forall (m :: * -> *). Functor m => m Bool -> m Bool
notM (ST s Bool -> ST s Bool) -> ST s Bool -> ST s Bool
forall a b. (a -> b) -> a -> b
$ Parser s -> ST s Bool
forall s. Parser s -> ST s Bool
iframeSrcDoc Parser s
p) (ST s () -> ST s ()) -> ST s () -> ST s ()
forall a b. (a -> b) -> a -> b
$ do
        Parser s -> Maybe Token -> BS -> ST s ()
forall s. Parser s -> Maybe Token -> BS -> ST s ()
parseError Parser s
p (Token -> Maybe Token
forall a. a -> Maybe a
Just Token
t) BS
"initial unexpected token"
        Parser s -> (DOM -> DOM) -> ST s ()
forall s. Parser s -> (DOM -> DOM) -> ST s ()
modifyDOM Parser s
p ((DOM -> DOM) -> ST s ()) -> (DOM -> DOM) -> ST s ()
forall a b. (a -> b) -> a -> b
$ DOMQuirks -> DOM -> DOM
domQuirksSet DOMQuirks
DOMQuirksMode
      Parser s -> ParserMode -> ST s ()
forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeBeforeHtml
      Parser s -> Token -> ST s ()
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 :: 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 {} ->
      Parser s -> Maybe Token -> BS -> ST s ()
forall s. Parser s -> Maybe Token -> BS -> ST s ()
parseError Parser s
p (Token -> Maybe Token
forall a. a -> Maybe a
Just Token
t) BS
"before html doctype"
    TComment {} ->
      Parser s -> Token -> ST s ()
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 ->
      () -> ST s ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
    TStart { tStartName :: Token -> BS
tStartName = BS
"html" } -> do
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
      Parser s -> ParserMode -> ST s ()
forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeBeforeHead
    TEnd { tEndName :: Token -> BS
tEndName = BS
x }
      | BS -> [BS] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem BS
x [ BS
"head", BS
"body", BS
"html", BS
"br" ] -> do
          Parser s -> BS -> ST s ()
forall s. Parser s -> BS -> ST s ()
insertHtmlElementNamed Parser s
p BS
"html"
          Parser s -> ParserMode -> ST s ()
forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeBeforeHead
          Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
reprocess Parser s
p Token
t
    TEnd {} ->
      Parser s -> Maybe Token -> BS -> ST s ()
forall s. Parser s -> Maybe Token -> BS -> ST s ()
parseError Parser s
p (Token -> Maybe Token
forall a. a -> Maybe a
Just Token
t) BS
"before html end tag"
    Token
_otherwise -> do
      Parser s -> BS -> ST s ()
forall s. Parser s -> BS -> ST s ()
insertHtmlElementNamed Parser s
p BS
"html"
      Parser s -> ParserMode -> ST s ()
forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeBeforeHead
      Parser s -> Token -> ST s ()
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 :: 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 ->
      () -> ST s ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
    TComment {} ->
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
insertComment Parser s
p Token
t
    TDoctype {} ->
      Parser s -> Maybe Token -> BS -> ST s ()
forall s. Parser s -> Maybe Token -> BS -> ST s ()
parseError Parser s
p (Token -> Maybe Token
forall a. a -> Maybe a
Just Token
t) BS
"before head doctype"
    TStart { tStartName :: Token -> BS
tStartName = BS
"html" } ->
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
doModeInBody Parser s
p Token
t
    TStart { tStartName :: Token -> BS
tStartName = BS
"head" } -> do
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
      Parser s -> ST s ()
forall s. Parser s -> ST s ()
saveHead Parser s
p
      Parser s -> ParserMode -> ST s ()
forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInHead
    TEnd { tEndName :: Token -> BS
tEndName = BS
x }
      | BS -> [BS] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem BS
x [ BS
"head", BS
"body", BS
"html", BS
"br" ] -> do
          Parser s -> BS -> ST s ()
forall s. Parser s -> BS -> ST s ()
insertHtmlElementNamed Parser s
p BS
"head"
          Parser s -> ST s ()
forall s. Parser s -> ST s ()
saveHead Parser s
p
          Parser s -> ParserMode -> ST s ()
forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInHead
          Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
reprocess Parser s
p Token
t
    TEnd {} ->
      Parser s -> Maybe Token -> BS -> ST s ()
forall s. Parser s -> Maybe Token -> BS -> ST s ()
parseError Parser s
p (Token -> Maybe Token
forall a. a -> Maybe a
Just Token
t) BS
"before head end tag"
    Token
_otherwise -> do
      Parser s -> BS -> ST s ()
forall s. Parser s -> BS -> ST s ()
insertHtmlElementNamed Parser s
p BS
"head"
      Parser s -> ST s ()
forall s. Parser s -> ST s ()
saveHead Parser s
p
      Parser s -> ParserMode -> ST s ()
forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInHead
      Parser s -> Token -> ST s ()
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 :: 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 ->
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
insertChar Parser s
p Token
t
    TComment {} ->
      Parser s -> Token -> ST s ()
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" } ->
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
doModeInBody Parser s
p Token
t
    TStart { tStartName :: Token -> BS
tStartName = BS
x }
      | BS -> [BS] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem BS
x [ BS
"base", BS
"basefont", BS
"bgsound", BS
"link" ] -> do
          Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
          Parser s -> ST s ()
forall s. Parser s -> ST s ()
elementStackPop Parser s
p
          Parser s -> ST s ()
forall s. Parser s -> ST s ()
selfClosingAcknowledge Parser s
p
    TStart { tStartName :: Token -> BS
tStartName = BS
"meta" } -> do
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
      Parser s -> ST s ()
forall s. Parser s -> ST s ()
elementStackPop Parser s
p
      Parser s -> ST s ()
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" } ->
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
insertElementRCDATA Parser s
p Token
t
    TStart { tStartName :: Token -> BS
tStartName = BS
"noframes" } ->
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
insertElementRAWTEXT Parser s
p Token
t
    TStart { tStartName :: Token -> BS
tStartName = BS
"style" } ->
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
insertElementRAWTEXT Parser s
p Token
t
    TStart { tStartName :: Token -> BS
tStartName = BS
"noscript" } -> do
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
      Parser s -> ParserMode -> ST s ()
forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInHeadNoscript
    TStart { tStartName :: Token -> BS
tStartName = BS
"script" } -> do
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
      Parser s -> ST s ()
forall s. Parser s -> ST s ()
parserSetScriptData Parser s
p
      Parser s -> ST s ()
forall s. Parser s -> ST s ()
saveMode Parser s
p
      Parser s -> ParserMode -> ST s ()
forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeText
    TEnd { tEndName :: Token -> BS
tEndName = BS
"head" } -> do
      Parser s -> ST s ()
forall s. Parser s -> ST s ()
elementStackPop Parser s
p
      Parser s -> ParserMode -> ST s ()
forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeAfterHead
    TEnd { tEndName :: Token -> BS
tEndName = BS
x }
      | BS -> [BS] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem BS
x [ BS
"body", BS
"html", BS
"br" ] -> do
          Parser s -> ST s ()
forall s. Parser s -> ST s ()
elementStackPop Parser s
p
          Parser s -> ParserMode -> ST s ()
forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeAfterHead
          Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
reprocess Parser s
p Token
t
    TStart { tStartName :: Token -> BS
tStartName = BS
"template" } -> do
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
      Parser s -> ST s ()
forall s. Parser s -> ST s ()
activeFormatAddMarker Parser s
p
      Parser s -> ST s ()
forall s. Parser s -> ST s ()
frameSetNotOK Parser s
p
      Parser s -> ParserMode -> ST s ()
forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInTemplate
      Parser s -> ParserMode -> ST s ()
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.
      Parser s -> ST s Bool
forall s. Parser s -> ST s Bool
elementStackHasTemplate Parser s
p ST s Bool -> (Bool -> ST s ()) -> ST s ()
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.
          Parser s -> ST s ()
forall s. Parser s -> ST s ()
generateImpliedEndTagsThoroughly Parser s
p
          -- (2) Make sure template is the current node.
          ST s Bool -> ST s () -> ST s ()
forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
unlessM (Parser s -> DOMType -> ST s Bool
forall s. Parser s -> DOMType -> ST s Bool
currentNodeHasType Parser s
p DOMType
a) (ST s () -> ST s ()) -> ST s () -> ST s ()
forall a b. (a -> b) -> a -> b
$
            Parser s -> Maybe Token -> BS -> ST s ()
forall s. Parser s -> Maybe Token -> BS -> ST s ()
parseError Parser s
p Maybe Token
forall a. Maybe a
Nothing BS
"template not current node"
          -- (3) Pop elements until a template has been popped.
          Parser s -> DOMType -> ST s ()
forall s. Parser s -> DOMType -> ST s ()
elementStackPopUntilType Parser s
p DOMType
a
          -- (4) Clear list of active formatting elements up to last marker.
          Parser s -> ST s ()
forall s. Parser s -> ST s ()
activeFormatClear Parser s
p
          -- (5) Pop the current template insertion mode.
          Parser s -> ST s ()
forall s. Parser s -> ST s ()
templateModePop Parser s
p
          -- (6) Reset the insertion mode appropriately.
          Parser s -> ST s ()
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
      Parser s -> ST s ()
forall s. Parser s -> ST s ()
elementStackPop Parser s
p
      Parser s -> ParserMode -> ST s ()
forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeAfterHead
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
reprocess Parser s
p Token
t
  where
    warn :: BS -> ST s ()
warn BS
x = Parser s -> Maybe Token -> BS -> ST s ()
forall s. Parser s -> Maybe Token -> BS -> ST s ()
parseError Parser s
p (Token -> Maybe Token
forall a. a -> Maybe a
Just Token
t) (BS -> ST s ()) -> BS -> ST s ()
forall a b. (a -> b) -> a -> b
$ BS
"in head " BS -> BS -> BS
forall a. Semigroup a => a -> a -> a
<> BS
x

-- | Handles the in head no script parser mode.
doModeInHeadNoscript :: Parser s -> Token -> ST s ()
doModeInHeadNoscript :: 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" } ->
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
doModeInBody Parser s
p Token
t
    TEnd { tEndName :: Token -> BS
tEndName = BS
"noscript" } -> do
      Parser s -> ST s ()
forall s. Parser s -> ST s ()
elementStackPop Parser s
p
      Parser s -> ParserMode -> ST s ()
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 ->
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
doModeInHead Parser s
p Token
t
    TComment {} ->
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
doModeInHead Parser s
p Token
t
    TStart { tStartName :: Token -> BS
tStartName = BS
x }
      | BS -> [BS] -> Bool
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" ] ->
          Parser s -> Token -> ST s ()
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"
      Parser s -> ST s ()
forall s. Parser s -> ST s ()
elementStackPop Parser s
p
      Parser s -> ParserMode -> ST s ()
forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInHead
      Parser s -> Token -> ST s ()
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"
      Parser s -> ST s ()
forall s. Parser s -> ST s ()
elementStackPop Parser s
p
      Parser s -> ParserMode -> ST s ()
forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInHead
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
reprocess Parser s
p Token
t
  where
    warn :: BS -> ST s ()
warn BS
x = Parser s -> Maybe Token -> BS -> ST s ()
forall s. Parser s -> Maybe Token -> BS -> ST s ()
parseError Parser s
p (Token -> Maybe Token
forall a. a -> Maybe a
Just Token
t) (BS -> ST s ()) -> BS -> ST s ()
forall a b. (a -> b) -> a -> b
$ BS
"in head noscript " BS -> BS -> BS
forall a. Semigroup a => a -> a -> a
<> BS
x

-- | Handles the after head parser mode.
doModeAfterHead :: Parser s -> Token -> ST s ()
doModeAfterHead :: 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 ->
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
insertChar Parser s
p Token
t
    TComment {} ->
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
insertComment Parser s
p Token
t
    TDoctype {} ->
      Parser s -> Maybe Token -> BS -> ST s ()
forall s. Parser s -> Maybe Token -> BS -> ST s ()
parseError Parser s
p (Token -> Maybe Token
forall a. a -> Maybe a
Just Token
t) BS
"after head doctype"
    TStart { tStartName :: Token -> BS
tStartName = BS
"html" } ->
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
doModeInBody Parser s
p Token
t
    TStart { tStartName :: Token -> BS
tStartName = BS
"body" } -> do
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
      Parser s -> ST s ()
forall s. Parser s -> ST s ()
frameSetNotOK Parser s
p
      Parser s -> ParserMode -> ST s ()
forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInBody
    TStart { tStartName :: Token -> BS
tStartName = BS
"frameset" } -> do
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
      Parser s -> ParserMode -> ST s ()
forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInFrameset
    TStart { tStartName :: Token -> BS
tStartName = BS
x }
      | BS -> [BS] -> Bool
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
          Parser s -> Maybe Token -> BS -> ST s ()
forall s. Parser s -> Maybe Token -> BS -> ST s ()
parseError Parser s
p (Token -> Maybe Token
forall a. a -> Maybe a
Just Token
t) BS
"AfterHead bad start tag"
          Just DOMID
h <- Parser s -> ST s (Maybe DOMID)
forall s. Parser s -> ST s (Maybe DOMID)
getHeadID Parser s
p
          Parser s -> DOMID -> ST s ()
forall s. Parser s -> DOMID -> ST s ()
elementStackPush Parser s
p DOMID
h
          Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
doModeInHead Parser s
p Token
t
          Parser s -> DOMID -> ST s ()
forall s. Parser s -> DOMID -> ST s ()
elementStackRemove Parser s
p DOMID
h
    TEnd { tEndName :: Token -> BS
tEndName = BS
"template" } ->
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
doModeInHead Parser s
p Token
t
    TEnd { tEndName :: Token -> BS
tEndName = BS
x }
      | BS -> [BS] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem BS
x [ BS
"body", BS
"html", BS
"br" ] -> do
          Parser s -> BS -> ST s ()
forall s. Parser s -> BS -> ST s ()
insertHtmlElementNamed Parser s
p BS
"body"
          Parser s -> ParserMode -> ST s ()
forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInBody
          Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
reprocess Parser s
p Token
t
    TStart { tStartName :: Token -> BS
tStartName = BS
"head" } ->
      Parser s -> Maybe Token -> BS -> ST s ()
forall s. Parser s -> Maybe Token -> BS -> ST s ()
parseError Parser s
p (Token -> Maybe Token
forall a. a -> Maybe a
Just Token
t) BS
"after head head"
    TEnd {} ->
      Parser s -> Maybe Token -> BS -> ST s ()
forall s. Parser s -> Maybe Token -> BS -> ST s ()
parseError Parser s
p (Token -> Maybe Token
forall a. a -> Maybe a
Just Token
t) BS
"after head end tag"
    Token
_otherwise -> do
      Parser s -> BS -> ST s ()
forall s. Parser s -> BS -> ST s ()
insertHtmlElementNamed Parser s
p BS
"body"
      Parser s -> ParserMode -> ST s ()
forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInBody
      Parser s -> Token -> ST s ()
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 :: 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
      Parser s -> ST s ()
forall s. Parser s -> ST s ()
activeFormatReconstruct Parser s
p
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
insertChar Parser s
p Token
t
    TChar {} -> do
      Parser s -> ST s ()
forall s. Parser s -> ST s ()
activeFormatReconstruct Parser s
p
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
insertChar Parser s
p Token
t
      Parser s -> ST s ()
forall s. Parser s -> ST s ()
frameSetNotOK Parser s
p
    TComment {} ->
      Parser s -> Token -> ST s ()
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
      ST s Bool -> ST s () -> ST s ()
forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
unlessM (Parser s -> ST s Bool
forall s. Parser s -> ST s Bool
elementStackHasTemplate Parser s
p) (ST s () -> ST s ()) -> ST s () -> ST s ()
forall a b. (a -> b) -> a -> b
$ do
        Just DOMID
i <- Parser s -> ST s (Maybe DOMID)
forall s. Parser s -> ST s (Maybe DOMID)
lastNodeID Parser s
p
        Parser s -> (DOM -> DOM) -> ST s ()
forall s. Parser s -> (DOM -> DOM) -> ST s ()
modifyDOM Parser s
p ((DOM -> DOM) -> ST s ()) -> (DOM -> DOM) -> ST s ()
forall a b. (a -> b) -> a -> b
$ DOMID -> Seq DOMAttr -> DOM -> DOM
domAttrMerge DOMID
i (Seq DOMAttr -> DOM -> DOM) -> Seq DOMAttr -> DOM -> DOM
forall a b. (a -> b) -> a -> b
$ [DOMAttr] -> Seq DOMAttr
forall a. [a] -> Seq a
Seq.fromList ([DOMAttr] -> Seq DOMAttr) -> [DOMAttr] -> Seq DOMAttr
forall a b. (a -> b) -> a -> b
$
          (TAttr -> DOMAttr) -> [TAttr] -> [DOMAttr]
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) ([TAttr] -> [DOMAttr]) -> [TAttr] -> [DOMAttr]
forall a b. (a -> b) -> a -> b
$ Token -> [TAttr]
tStartAttr Token
t
    TStart { tStartName :: Token -> BS
tStartName = BS
x }
      | BS -> [BS] -> Bool
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"] ->
          Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
doModeInHead Parser s
p Token
t
    TEnd { tEndName :: Token -> BS
tEndName = BS
"template" } ->
      Parser s -> Token -> ST s ()
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
      ST s Bool -> ST s () -> ST s ()
forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
unlessM (ST s Bool -> ST s Bool
forall (m :: * -> *). Functor m => m Bool -> m Bool
notM (Parser s -> ST s Bool
forall s. Parser s -> ST s Bool
elementStackHasBody Parser s
p)
        ST s Bool -> ST s Bool -> ST s Bool
forall (m :: * -> *). Monad m => m Bool -> m Bool -> m Bool
||^ (DOMID -> Bool) -> ST s DOMID -> ST s Bool
forall (f :: * -> *) a b. Applicative f => (a -> b) -> f a -> f b
liftA (DOMID -> DOMID -> Bool
forall a. Eq a => a -> a -> Bool
==DOMID
1) (Parser s -> ST s DOMID
forall s. Parser s -> ST s DOMID
elementStackSize Parser s
p)
        ST s Bool -> ST s Bool -> ST s Bool
forall (m :: * -> *). Monad m => m Bool -> m Bool -> m Bool
||^ (Parser s -> ST s Bool
forall s. Parser s -> ST s Bool
elementStackHasTemplate Parser s
p)) (ST s () -> ST s ()) -> ST s () -> ST s ()
forall a b. (a -> b) -> a -> b
$ do
          Parser s -> ST s ()
forall s. Parser s -> ST s ()
frameSetNotOK Parser s
p
          Just DOMID
i <- [DOMID] -> Maybe DOMID
forall a. [a] -> Maybe a
listToMaybe ([DOMID] -> Maybe DOMID)
-> ([DOMID] -> [DOMID]) -> [DOMID] -> Maybe DOMID
forall b c a. (b -> c) -> (a -> b) -> a -> c
. DOMID -> [DOMID] -> [DOMID]
forall a. DOMID -> [a] -> [a]
drop DOMID
1 ([DOMID] -> [DOMID]) -> ([DOMID] -> [DOMID]) -> [DOMID] -> [DOMID]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [DOMID] -> [DOMID]
forall a. [a] -> [a]
reverse ([DOMID] -> Maybe DOMID) -> ST s [DOMID] -> ST s (Maybe DOMID)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser s -> ST s [DOMID]
forall s. Parser s -> ST s [DOMID]
elementStack Parser s
p
          Parser s -> (DOM -> DOM) -> ST s ()
forall s. Parser s -> (DOM -> DOM) -> ST s ()
modifyDOM Parser s
p ((DOM -> DOM) -> ST s ()) -> (DOM -> DOM) -> ST s ()
forall a b. (a -> b) -> a -> b
$ DOMID -> Seq DOMAttr -> DOM -> DOM
domAttrMerge DOMID
i (Seq DOMAttr -> DOM -> DOM) -> Seq DOMAttr -> DOM -> DOM
forall a b. (a -> b) -> a -> b
$ [DOMAttr] -> Seq DOMAttr
forall a. [a] -> Seq a
Seq.fromList ([DOMAttr] -> Seq DOMAttr) -> [DOMAttr] -> Seq DOMAttr
forall a b. (a -> b) -> a -> b
$
            (TAttr -> DOMAttr) -> [TAttr] -> [DOMAttr]
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) ([TAttr] -> [DOMAttr]) -> [TAttr] -> [DOMAttr]
forall a b. (a -> b) -> a -> b
$ Token -> [TAttr]
tStartAttr Token
t
    TStart { tStartName :: Token -> BS
tStartName = x :: BS
x@BS
"frameset" } -> do
      BS -> ST s ()
warn BS
x
      ST s Bool -> ST s () -> ST s ()
forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
unlessM ((DOMID -> Bool) -> ST s DOMID -> ST s Bool
forall (f :: * -> *) a b. Applicative f => (a -> b) -> f a -> f b
liftA (DOMID -> DOMID -> Bool
forall a. Eq a => a -> a -> Bool
==DOMID
1) (Parser s -> ST s DOMID
forall s. Parser s -> ST s DOMID
elementStackSize Parser s
p)
        ST s Bool -> ST s Bool -> ST s Bool
forall (m :: * -> *). Monad m => m Bool -> m Bool -> m Bool
||^ ST s Bool -> ST s Bool
forall (m :: * -> *). Functor m => m Bool -> m Bool
notM (Parser s -> ST s Bool
forall s. Parser s -> ST s Bool
elementStackHasBody Parser s
p)
        ST s Bool -> ST s Bool -> ST s Bool
forall (m :: * -> *). Monad m => m Bool -> m Bool -> m Bool
||^ ST s Bool -> ST s Bool
forall (m :: * -> *). Functor m => m Bool -> m Bool
notM (STRef s Bool -> ST s Bool
forall s a. STRef s a -> ST s a
rref STRef s Bool
parserFrameSetOK)) (ST s () -> ST s ()) -> ST s () -> ST s ()
forall a b. (a -> b) -> a -> b
$ do
          Just DOMNode
n <- [DOMNode] -> Maybe DOMNode
forall a. [a] -> Maybe a
listToMaybe ([DOMNode] -> Maybe DOMNode)
-> ([DOMNode] -> [DOMNode]) -> [DOMNode] -> Maybe DOMNode
forall b c a. (b -> c) -> (a -> b) -> a -> c
. DOMID -> [DOMNode] -> [DOMNode]
forall a. DOMID -> [a] -> [a]
drop DOMID
1 ([DOMNode] -> [DOMNode])
-> ([DOMNode] -> [DOMNode]) -> [DOMNode] -> [DOMNode]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [DOMNode] -> [DOMNode]
forall a. [a] -> [a]
reverse ([DOMNode] -> Maybe DOMNode)
-> ST s [DOMNode] -> ST s (Maybe DOMNode)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser s -> ST s [DOMNode]
forall s. Parser s -> ST s [DOMNode]
elementStackNodes Parser s
p
          Parser s -> (DOM -> DOM) -> ST s ()
forall s. Parser s -> (DOM -> DOM) -> ST s ()
modifyDOM Parser s
p ((DOM -> DOM) -> ST s ()) -> (DOM -> DOM) -> ST s ()
forall a b. (a -> b) -> a -> b
$ DOMID -> DOMID -> DOM -> DOM
domRemoveChild (DOMNode -> DOMID
domNodeParent DOMNode
n) (DOMID -> DOM -> DOM) -> DOMID -> DOM -> DOM
forall a b. (a -> b) -> a -> b
$ DOMNode -> DOMID
domNodeID DOMNode
n
          Parser s -> (DOMNode -> Bool) -> ST s ()
forall s. Parser s -> (DOMNode -> Bool) -> ST s ()
elementStackPopWhile Parser s
p ((DOMNode -> Bool) -> ST s ()) -> (DOMNode -> Bool) -> ST s ()
forall a b. (a -> b) -> a -> b
$ \DOMNode
n ->
            DOMNode -> DOMType
domNodeType DOMNode
n DOMType -> DOMType -> Bool
forall a. Eq a => a -> a -> Bool
/= BS -> DOMType
domMakeTypeHTML BS
"html"
          Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
          Parser s -> ParserMode -> ST s ()
forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInFrameset
    Token
TEOF -> do
      DOMID
n <- Parser s -> ST s DOMID
forall s. Parser s -> ST s DOMID
templateModeCount Parser s
p
      if DOMID
n DOMID -> DOMID -> Bool
forall a. Ord a => a -> a -> Bool
> DOMID
0
      then Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
doModeInTemplate Parser s
p Token
t
      else do
        ST s Bool -> ST s () -> ST s ()
forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
whenM (Parser s -> (DOMNode -> Bool) -> ST s Bool
forall s. Parser s -> (DOMNode -> Bool) -> ST s Bool
elementStackAny Parser s
p ((DOMNode -> Bool) -> ST s Bool) -> (DOMNode -> Bool) -> ST s Bool
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"]) (ST s () -> ST s ()) -> ST s () -> ST s ()
forall a b. (a -> b) -> a -> b
$
          BS -> ST s ()
warn BS
"bad element on stack"
        Parser s -> ST s ()
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
      Parser s -> DOMType -> ST s Bool
forall s. Parser s -> DOMType -> ST s Bool
elementInScope Parser s
p DOMType
a ST s Bool -> (Bool -> ST s ()) -> ST s ()
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
          ST s Bool -> ST s () -> ST s ()
forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
whenM (Parser s -> (DOMNode -> Bool) -> ST s Bool
forall s. Parser s -> (DOMNode -> Bool) -> ST s Bool
elementStackAny Parser s
p ((DOMNode -> Bool) -> ST s Bool) -> (DOMNode -> Bool) -> ST s Bool
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"]) (ST s () -> ST s ()) -> ST s () -> ST s ()
forall a b. (a -> b) -> a -> b
$
            BS -> ST s ()
warn BS
"bad element on stack"
          Parser s -> ParserMode -> ST s ()
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
      Parser s -> DOMType -> ST s Bool
forall s. Parser s -> DOMType -> ST s Bool
elementInScope Parser s
p DOMType
a ST s Bool -> (Bool -> ST s ()) -> ST s ()
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
          ST s Bool -> ST s () -> ST s ()
forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
whenM (Parser s -> (DOMNode -> Bool) -> ST s Bool
forall s. Parser s -> (DOMNode -> Bool) -> ST s Bool
elementStackAny Parser s
p ((DOMNode -> Bool) -> ST s Bool) -> (DOMNode -> Bool) -> ST s Bool
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"]) (ST s () -> ST s ()) -> ST s () -> ST s ()
forall a b. (a -> b) -> a -> b
$
            BS -> ST s ()
warn BS
"bad element on stack"
          Parser s -> ParserMode -> ST s ()
forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeAfterBody
          Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
reprocess Parser s
p Token
t
    TStart { tStartName :: Token -> BS
tStartName = BS
x } | BS -> [BS] -> Bool
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
      Parser s -> Token -> ST s ()
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
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
    TStart { tStartName :: Token -> BS
tStartName = BS
x }
      | BS -> [BS] -> Bool
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
        ST s Bool -> ST s () -> ST s ()
forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
whenM (Parser s -> [DOMType] -> ST s Bool
forall s. Parser s -> [DOMType] -> ST s Bool
currentNodeHasTypeIn Parser s
p ([DOMType] -> ST s Bool) -> [DOMType] -> ST s Bool
forall a b. (a -> b) -> a -> b
$ [BS] -> [DOMType]
domTypesHTML
          [BS
"h1", BS
"h2", BS
"h3", BS
"h4", BS
"h5", BS
"h6"]) (ST s () -> ST s ()) -> ST s () -> ST s ()
forall a b. (a -> b) -> a -> b
$ do
          BS -> ST s ()
warn BS
"bad header tag on stack"
          Parser s -> ST s ()
forall s. Parser s -> ST s ()
elementStackPop Parser s
p
        Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
    TStart { tStartName :: Token -> BS
tStartName = BS
x } | BS -> [BS] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem BS
x [BS
"pre", BS
"listing"] -> do
      ST s ()
closeP
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
      Parser s -> ST s ()
forall s. Parser s -> ST s ()
parserSkipNextLF Parser s
p
      Parser s -> ST s ()
forall s. Parser s -> ST s ()
frameSetNotOK Parser s
p
    TStart { tStartName :: Token -> BS
tStartName = BS
"form" } -> do
      (Parser s -> ST s Bool
forall s. Parser s -> ST s Bool
formNotNull Parser s
p ST s Bool -> ST s Bool -> ST s Bool
forall (m :: * -> *). Monad m => m Bool -> m Bool -> m Bool
&&^ Parser s -> ST s Bool
forall s. Parser s -> ST s Bool
elementStackMissingTemplate Parser s
p) ST s Bool -> (Bool -> ST s ()) -> ST s ()
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
          Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
          ST s Bool -> ST s () -> ST s ()
forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
whenM (Parser s -> ST s Bool
forall s. Parser s -> ST s Bool
elementStackMissingTemplate Parser s
p) (ST s () -> ST s ()) -> ST s () -> ST s ()
forall a b. (a -> b) -> a -> b
$ Parser s -> ST s ()
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 = [DOMType] -> Set DOMType
forall a. Ord a => [a] -> Set a
Set.fromList ([DOMType] -> Set DOMType) -> [DOMType] -> Set DOMType
forall a b. (a -> b) -> a -> b
$ [BS] -> [DOMType]
domTypesHTML [ BS
"address", BS
"div", BS
"p" ]
          f :: [DOMType] -> ST s ()
f [] = () -> ST s ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
          f (DOMType
y:[DOMType]
ys)
            | DOMType
y DOMType -> DOMType -> Bool
forall a. Eq a => a -> a -> Bool
== DOMType
a = do
                Parser s -> BS -> ST s ()
forall s. Parser s -> BS -> ST s ()
generateImpliedEndTagsExcept Parser s
p BS
x
                ST s Bool -> ST s () -> ST s ()
forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
unlessM (Parser s -> DOMType -> ST s Bool
forall s. Parser s -> DOMType -> ST s Bool
currentNodeHasType Parser s
p DOMType
a) (ST s () -> ST s ()) -> ST s () -> ST s ()
forall a b. (a -> b) -> a -> b
$
                  BS -> ST s ()
warn BS
"current node is not li"
                Parser s -> DOMType -> ST s ()
forall s. Parser s -> DOMType -> ST s ()
elementStackPopUntilType Parser s
p DOMType
a
            | DOMType -> Bool
elementIsSpecial DOMType
y Bool -> Bool -> Bool
&& DOMType -> Set DOMType -> Bool
forall a. Ord a => a -> Set a -> Bool
Set.notMember DOMType
y Set DOMType
s = () -> ST s ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
            | Bool
otherwise = [DOMType] -> ST s ()
f [DOMType]
ys
      Parser s -> ST s ()
forall s. Parser s -> ST s ()
frameSetNotOK Parser s
p
      Parser s -> ST s [DOMType]
forall s. Parser s -> ST s [DOMType]
elementStackTypes Parser s
p ST s [DOMType] -> ([DOMType] -> ST s ()) -> ST s ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= [DOMType] -> ST s ()
f
      ST s ()
closeP
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
    TStart { tStartName :: Token -> BS
tStartName = BS
x } | BS -> [BS] -> Bool
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 = [DOMType] -> Set DOMType
forall a. Ord a => [a] -> Set a
Set.fromList ([DOMType] -> Set DOMType) -> [DOMType] -> Set DOMType
forall a b. (a -> b) -> a -> b
$ [BS] -> [DOMType]
domTypesHTML [ BS
"address", BS
"div", BS
"p" ]
          f :: [DOMType] -> ST s ()
f [] = () -> ST s ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
          f (DOMType
y:[DOMType]
ys)
            | DOMType
y DOMType -> DOMType -> Bool
forall a. Eq a => a -> a -> Bool
== DOMType
dd Bool -> Bool -> Bool
|| DOMType
y DOMType -> DOMType -> Bool
forall a. Eq a => a -> a -> Bool
== DOMType
dt = do
                Parser s -> BS -> ST s ()
forall s. Parser s -> BS -> ST s ()
generateImpliedEndTagsExcept Parser s
p (BS -> ST s ()) -> BS -> ST s ()
forall a b. (a -> b) -> a -> b
$ DOMType -> BS
domTypeName DOMType
y
                ST s Bool -> ST s () -> ST s ()
forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
unlessM (Parser s -> DOMType -> ST s Bool
forall s. Parser s -> DOMType -> ST s Bool
currentNodeHasType Parser s
p DOMType
y) (ST s () -> ST s ()) -> ST s () -> ST s ()
forall a b. (a -> b) -> a -> b
$
                  BS -> ST s ()
warn BS
"current node is not dd or dt"
                Parser s -> DOMType -> ST s ()
forall s. Parser s -> DOMType -> ST s ()
elementStackPopUntilType Parser s
p DOMType
y
            | DOMType -> Bool
elementIsSpecial DOMType
y Bool -> Bool -> Bool
&& DOMType -> Set DOMType -> Bool
forall a. Ord a => a -> Set a -> Bool
Set.notMember DOMType
y Set DOMType
s = () -> ST s ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
            | Bool
otherwise = [DOMType] -> ST s ()
f [DOMType]
ys
      Parser s -> ST s ()
forall s. Parser s -> ST s ()
frameSetNotOK Parser s
p
      Parser s -> ST s [DOMType]
forall s. Parser s -> ST s [DOMType]
elementStackTypes Parser s
p ST s [DOMType] -> ([DOMType] -> ST s ()) -> ST s ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= [DOMType] -> ST s ()
f
      ST s ()
closeP
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
    TStart { tStartName :: Token -> BS
tStartName = BS
"plaintext" } -> do
      ST s ()
closeP
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
      Parser s -> ST s ()
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
      ST s Bool -> ST s () -> ST s ()
forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
whenM (Parser s -> DOMType -> ST s Bool
forall s. Parser s -> DOMType -> ST s Bool
elementInScope Parser s
p DOMType
a) (ST s () -> ST s ()) -> ST s () -> ST s ()
forall a b. (a -> b) -> a -> b
$ do
        BS -> ST s ()
warn BS
"button element in scope"
        Parser s -> ST s ()
forall s. Parser s -> ST s ()
generateImpliedEndTags Parser s
p
        Parser s -> DOMType -> ST s ()
forall s. Parser s -> DOMType -> ST s ()
elementStackPopUntilType Parser s
p DOMType
a
      Parser s -> ST s ()
forall s. Parser s -> ST s ()
activeFormatReconstruct Parser s
p
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
      Parser s -> ST s ()
forall s. Parser s -> ST s ()
frameSetNotOK Parser s
p
    TEnd { tEndName :: Token -> BS
tEndName = BS
x }
      | BS -> [BS] -> Bool
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
          Parser s -> DOMType -> ST s Bool
forall s. Parser s -> DOMType -> ST s Bool
elementInScope Parser s
p DOMType
a ST s Bool -> (Bool -> ST s ()) -> ST s ()
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
              Parser s -> ST s ()
forall s. Parser s -> ST s ()
generateImpliedEndTags Parser s
p
              ST s Bool -> ST s () -> ST s ()
forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
unlessM (Parser s -> DOMType -> ST s Bool
forall s. Parser s -> DOMType -> ST s Bool
currentNodeHasType Parser s
p DOMType
a) (ST s () -> ST s ()) -> ST s () -> ST s ()
forall a b. (a -> b) -> a -> b
$
                BS -> ST s ()
warn BS
"current node wrong type"
              Parser s -> DOMType -> ST s ()
forall s. Parser s -> DOMType -> ST s ()
elementStackPopUntilType Parser s
p DOMType
a
    TEnd { tEndName :: Token -> BS
tEndName = x :: BS
x@BS
"form" } ->
      Parser s -> ST s Bool
forall s. Parser s -> ST s Bool
elementStackHasTemplate Parser s
p ST s Bool -> (Bool -> ST s ()) -> ST s ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
        Bool
False -> do
          Parser s -> ST s (Maybe DOMID)
forall s. Parser s -> ST s (Maybe DOMID)
getFormID Parser s
p ST s (Maybe DOMID) -> (Maybe DOMID -> ST s ()) -> ST s ()
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 <- Maybe DOMType -> DOMType
forall a. HasCallStack => Maybe a -> a
fromJust (Maybe DOMType -> DOMType) -> ST s (Maybe DOMType) -> ST s DOMType
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser s -> ST s (Maybe DOMType)
forall s. Parser s -> ST s (Maybe DOMType)
getFormType Parser s
p
              Parser s -> Maybe DOMID -> ST s ()
forall s. Parser s -> Maybe DOMID -> ST s ()
setFormID Parser s
p Maybe DOMID
forall a. Maybe a
Nothing
              Parser s -> DOMType -> ST s Bool
forall s. Parser s -> DOMType -> ST s Bool
elementInScope Parser s
p DOMType
a ST s Bool -> (Bool -> ST s ()) -> ST s ()
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
                  Parser s -> ST s ()
forall s. Parser s -> ST s ()
generateImpliedEndTags Parser s
p
                  ST s Bool -> ST s () -> ST s ()
forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
unlessM ((Maybe DOMID -> Bool) -> ST s (Maybe DOMID) -> ST s Bool
forall (f :: * -> *) a b. Applicative f => (a -> b) -> f a -> f b
liftA (Maybe DOMID -> Maybe DOMID -> Bool
forall a. Eq a => a -> a -> Bool
==(DOMID -> Maybe DOMID
forall a. a -> Maybe a
Just DOMID
n)) (Parser s -> ST s (Maybe DOMID)
forall s. Parser s -> ST s (Maybe DOMID)
currentNodeID Parser s
p)) (ST s () -> ST s ()) -> ST s () -> ST s ()
forall a b. (a -> b) -> a -> b
$
                    BS -> ST s ()
warn BS
"current node is wrong node"
                  Parser s -> DOMID -> ST s ()
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
          Parser s -> DOMType -> ST s Bool
forall s. Parser s -> DOMType -> ST s Bool
elementInScope Parser s
p DOMType
a ST s Bool -> (Bool -> ST s ()) -> ST s ()
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
              Parser s -> ST s ()
forall s. Parser s -> ST s ()
generateImpliedEndTags Parser s
p
              ST s Bool -> ST s () -> ST s ()
forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
unlessM (Parser s -> DOMType -> ST s Bool
forall s. Parser s -> DOMType -> ST s Bool
currentNodeHasType Parser s
p DOMType
a) (ST s () -> ST s ()) -> ST s () -> ST s ()
forall a b. (a -> b) -> a -> b
$
                BS -> ST s ()
warn BS
"current node is not a form"
              Parser s -> DOMType -> ST s ()
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
      ST s Bool -> ST s () -> ST s ()
forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
unlessM (Parser s -> DOMType -> ST s Bool
forall s. Parser s -> DOMType -> ST s Bool
elementInButtonScope Parser s
p DOMType
a) (ST s () -> ST s ()) -> ST s () -> ST s ()
forall a b. (a -> b) -> a -> b
$ do
        BS -> ST s ()
warn BS
"no p in button scope"
        Parser s -> BS -> ST s ()
forall s. Parser s -> BS -> ST s ()
insertHtmlElementNamed Parser s
p BS
x
      Parser s -> ST s ()
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
      Parser s -> DOMType -> ST s Bool
forall s. Parser s -> DOMType -> ST s Bool
elementInListScope Parser s
p DOMType
a ST s Bool -> (Bool -> ST s ()) -> ST s ()
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
          Parser s -> BS -> ST s ()
forall s. Parser s -> BS -> ST s ()
generateImpliedEndTagsExcept Parser s
p BS
x
          ST s Bool -> ST s () -> ST s ()
forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
unlessM (Parser s -> DOMType -> ST s Bool
forall s. Parser s -> DOMType -> ST s Bool
currentNodeHasType Parser s
p DOMType
a) (ST s () -> ST s ()) -> ST s () -> ST s ()
forall a b. (a -> b) -> a -> b
$
            BS -> ST s ()
warn BS
"current node not an li element"
          Parser s -> DOMType -> ST s ()
forall s. Parser s -> DOMType -> ST s ()
elementStackPopUntilType Parser s
p DOMType
a
    TEnd { tEndName :: Token -> BS
tEndName = BS
x } | BS -> [BS] -> Bool
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
      Parser s -> DOMType -> ST s Bool
forall s. Parser s -> DOMType -> ST s Bool
elementInListScope Parser s
p DOMType
a ST s Bool -> (Bool -> ST s ()) -> ST s ()
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
          Parser s -> BS -> ST s ()
forall s. Parser s -> BS -> ST s ()
generateImpliedEndTagsExcept Parser s
p BS
x
          ST s Bool -> ST s () -> ST s ()
forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
unlessM (Parser s -> DOMType -> ST s Bool
forall s. Parser s -> DOMType -> ST s Bool
currentNodeHasType Parser s
p DOMType
a) (ST s () -> ST s ()) -> ST s () -> ST s ()
forall a b. (a -> b) -> a -> b
$
            BS -> ST s ()
warn BS
"current not is not a dd or dt"
          Parser s -> DOMType -> ST s ()
forall s. Parser s -> DOMType -> ST s ()
elementStackPopUntilType Parser s
p DOMType
a
    TEnd { tEndName :: Token -> BS
tEndName = BS
x }
      | BS -> [BS] -> Bool
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"]
          (DOMType -> ST s Bool) -> [DOMType] -> ST s Bool
forall (m :: * -> *) a. Monad m => (a -> m Bool) -> [a] -> m Bool
anyM (Parser s -> DOMType -> ST s Bool
forall s. Parser s -> DOMType -> ST s Bool
elementInScope Parser s
p) [DOMType]
h ST s Bool -> (Bool -> ST s ()) -> ST s ()
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
              Parser s -> ST s ()
forall s. Parser s -> ST s ()
generateImpliedEndTags Parser s
p
              ST s Bool -> ST s () -> ST s ()
forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
unlessM (Parser s -> DOMType -> ST s Bool
forall s. Parser s -> DOMType -> ST s Bool
currentNodeHasType Parser s
p (DOMType -> ST s Bool) -> DOMType -> ST s Bool
forall a b. (a -> b) -> a -> b
$ BS -> DOMType
domMakeTypeHTML BS
x) (ST s () -> ST s ()) -> ST s () -> ST s ()
forall a b. (a -> b) -> a -> b
$
                BS -> ST s ()
warn BS
"current node not a header type"
              Parser s -> [DOMType] -> ST s ()
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
      Parser s -> BS -> ST s (Maybe ParserFormatItem)
forall s. Parser s -> BS -> ST s (Maybe ParserFormatItem)
activeFormatFindTag Parser s
p BS
x ST s (Maybe ParserFormatItem)
-> (Maybe ParserFormatItem -> ST s ()) -> ST s ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
        Maybe ParserFormatItem
Nothing -> () -> ST s ()
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
          Parser s -> DOMID -> ST s ()
forall s. Parser s -> DOMID -> ST s ()
elementStackRemove Parser s
p DOMID
i
          Parser s -> DOMID -> ST s ()
forall s. Parser s -> DOMID -> ST s ()
activeFormatRemove Parser s
p DOMID
i
      Parser s -> ST s ()
forall s. Parser s -> ST s ()
activeFormatReconstruct Parser s
p
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
activeFormatAddCurrentNode Parser s
p Token
t
    TStart { tStartName :: Token -> BS
tStartName = BS
x } | BS -> [BS] -> Bool
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
      Parser s -> ST s ()
forall s. Parser s -> ST s ()
activeFormatReconstruct Parser s
p
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
      Parser s -> Token -> ST s ()
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
      Parser s -> ST s ()
forall s. Parser s -> ST s ()
activeFormatReconstruct Parser s
p
      ST s Bool -> ST s () -> ST s ()
forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
whenM (Parser s -> DOMType -> ST s Bool
forall s. Parser s -> DOMType -> ST s Bool
elementInScope Parser s
p DOMType
a) (ST s () -> ST s ()) -> ST s () -> ST s ()
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
        Parser s -> ST s ()
forall s. Parser s -> ST s ()
activeFormatReconstruct Parser s
p
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
activeFormatAddCurrentNode Parser s
p Token
t
    TEnd { tEndName :: Token -> BS
tEndName = BS
x } | BS -> [BS] -> Bool
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 } | BS -> [BS] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem BS
x
      [BS
"applet", BS
"marquee", BS
"object"] -> do
      Parser s -> ST s ()
forall s. Parser s -> ST s ()
activeFormatReconstruct Parser s
p
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
      Parser s -> ST s ()
forall s. Parser s -> ST s ()
activeFormatAddMarker Parser s
p
      Parser s -> ST s ()
forall s. Parser s -> ST s ()
frameSetNotOK Parser s
p
    TEnd { tEndName :: Token -> BS
tEndName = BS
x } | BS -> [BS] -> Bool
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
      Parser s -> DOMType -> ST s Bool
forall s. Parser s -> DOMType -> ST s Bool
elementInScope Parser s
p DOMType
a ST s Bool -> (Bool -> ST s ()) -> ST s ()
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
          Parser s -> ST s ()
forall s. Parser s -> ST s ()
generateImpliedEndTags Parser s
p
          ST s Bool -> ST s () -> ST s ()
forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
unlessM (Parser s -> DOMType -> ST s Bool
forall s. Parser s -> DOMType -> ST s Bool
currentNodeHasType Parser s
p DOMType
a) (ST s () -> ST s ()) -> ST s () -> ST s ()
forall a b. (a -> b) -> a -> b
$
            BS -> ST s ()
warn BS
"current node is wring type"
          Parser s -> DOMType -> ST s ()
forall s. Parser s -> DOMType -> ST s ()
elementStackPopUntilType Parser s
p DOMType
a
          Parser s -> ST s ()
forall s. Parser s -> ST s ()
activeFormatClear Parser s
p
    TStart { tStartName :: Token -> BS
tStartName = BS
"table" } -> do
      DOMQuirks
q <- DOM -> DOMQuirks
domQuirksGet (DOM -> DOMQuirks) -> ST s DOM -> ST s DOMQuirks
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser s -> ST s DOM
forall s. Parser s -> ST s DOM
getDOM Parser s
p
      Bool -> ST s () -> ST s ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (DOMQuirks
q DOMQuirks -> DOMQuirks -> Bool
forall a. Eq a => a -> a -> Bool
/= DOMQuirks
DOMQuirksMode) ST s ()
closeP
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
      Parser s -> ST s ()
forall s. Parser s -> ST s ()
frameSetNotOK Parser s
p
      Parser s -> ParserMode -> ST s ()
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"
      Parser s -> ST s ()
forall s. Parser s -> ST s ()
activeFormatReconstruct Parser s
p
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p (Token -> ST s ()) -> Token -> ST s ()
forall a b. (a -> b) -> a -> b
$ BS -> Bool -> [TAttr] -> Token
TStart BS
"br" Bool
False []
      Parser s -> ST s ()
forall s. Parser s -> ST s ()
elementStackPop Parser s
p
      Parser s -> ST s ()
forall s. Parser s -> ST s ()
selfClosingAcknowledge Parser s
p
      Parser s -> ST s ()
forall s. Parser s -> ST s ()
frameSetNotOK Parser s
p
    TStart { tStartName :: Token -> BS
tStartName = BS
x } | BS -> [BS] -> Bool
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
      Parser s -> ST s ()
forall s. Parser s -> ST s ()
activeFormatReconstruct Parser s
p
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
      Parser s -> ST s ()
forall s. Parser s -> ST s ()
elementStackPop Parser s
p
      Parser s -> ST s ()
forall s. Parser s -> ST s ()
selfClosingAcknowledge Parser s
p
      Parser s -> ST s ()
forall s. Parser s -> ST s ()
frameSetNotOK Parser s
p
    TStart { tStartName :: Token -> BS
tStartName = BS
"input" } -> do
      Parser s -> ST s ()
forall s. Parser s -> ST s ()
activeFormatReconstruct Parser s
p
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
      Parser s -> ST s ()
forall s. Parser s -> ST s ()
elementStackPop Parser s
p
      Parser s -> ST s ()
forall s. Parser s -> ST s ()
selfClosingAcknowledge Parser s
p
      case BS -> Token -> Maybe BS
tokenGetAttrVal BS
"type" Token
t of
        Just BS
v -> Bool -> ST s () -> ST s ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (BS -> BS
bsLower BS
v BS -> BS -> Bool
forall a. Eq a => a -> a -> Bool
/= BS
"hidden") (ST s () -> ST s ()) -> ST s () -> ST s ()
forall a b. (a -> b) -> a -> b
$ Parser s -> ST s ()
forall s. Parser s -> ST s ()
frameSetNotOK Parser s
p
        Maybe BS
Nothing -> Parser s -> ST s ()
forall s. Parser s -> ST s ()
frameSetNotOK Parser s
p
    TStart { tStartName :: Token -> BS
tStartName = BS
x } | BS -> [BS] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem BS
x
      [BS
"param", BS
"source", BS
"track"] -> do
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
      Parser s -> ST s ()
forall s. Parser s -> ST s ()
elementStackPop Parser s
p
      Parser s -> ST s ()
forall s. Parser s -> ST s ()
selfClosingAcknowledge Parser s
p
    TStart { tStartName :: Token -> BS
tStartName = BS
"hr" } -> do
      ST s ()
closeP
      ST s ()
popMenuitem
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
      Parser s -> ST s ()
forall s. Parser s -> ST s ()
elementStackPop Parser s
p
      Parser s -> ST s ()
forall s. Parser s -> ST s ()
selfClosingAcknowledge Parser s
p
      Parser s -> ST s ()
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" }
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
reprocess Parser s
p Token
t'
    TStart { tStartName :: Token -> BS
tStartName = BS
"textarea" } -> do
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
      Parser s -> ST s ()
forall s. Parser s -> ST s ()
parserSkipNextLF Parser s
p
      Parser s -> ST s ()
forall s. Parser s -> ST s ()
parserSetRCDATA Parser s
p
      Parser s -> ST s ()
forall s. Parser s -> ST s ()
saveMode Parser s
p
      Parser s -> ST s ()
forall s. Parser s -> ST s ()
frameSetNotOK Parser s
p
      Parser s -> ParserMode -> ST s ()
forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeText
    TStart { tStartName :: Token -> BS
tStartName = BS
"xmp" } -> do
      ST s ()
closeP
      Parser s -> ST s ()
forall s. Parser s -> ST s ()
activeFormatReconstruct Parser s
p
      Parser s -> ST s ()
forall s. Parser s -> ST s ()
frameSetNotOK Parser s
p
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
insertElementRAWTEXT Parser s
p Token
t
    TStart { tStartName :: Token -> BS
tStartName = BS
"iframe" } -> do
      Parser s -> ST s ()
forall s. Parser s -> ST s ()
frameSetNotOK Parser s
p
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
insertElementRAWTEXT Parser s
p Token
t
    TStart { tStartName :: Token -> BS
tStartName = BS
"noembed" } ->
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
insertElementRAWTEXT Parser s
p Token
t
    TStart { tStartName :: Token -> BS
tStartName = BS
"select" } -> do
      Parser s -> ST s ()
forall s. Parser s -> ST s ()
activeFormatReconstruct Parser s
p
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
      Parser s -> ST s ()
forall s. Parser s -> ST s ()
frameSetNotOK Parser s
p
      Set ParserMode
s <- Set ParserMode -> ST s (Set ParserMode)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Set ParserMode -> ST s (Set ParserMode))
-> Set ParserMode -> ST s (Set ParserMode)
forall a b. (a -> b) -> a -> b
$ [ParserMode] -> Set ParserMode
forall a. Ord a => [a] -> Set a
Set.fromList
        [ ParserMode
ModeInTable, ParserMode
ModeInCaption, ParserMode
ModeInTableBody,
          ParserMode
ModeInRow, ParserMode
ModeInCell ]
      STRef s ParserMode -> ST s ParserMode
forall s a. STRef s a -> ST s a
rref STRef s ParserMode
parserInsertionMode ST s ParserMode -> (ParserMode -> ST s ()) -> ST s ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \ParserMode
x -> Parser s -> ParserMode -> ST s ()
forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p (ParserMode -> ST s ()) -> ParserMode -> ST s ()
forall a b. (a -> b) -> a -> b
$
        if ParserMode -> Set ParserMode -> Bool
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 } | BS -> [BS] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem BS
x
      [BS
"optgroup", BS
"option"] -> do
      Parser s -> (DOMNode -> Bool) -> ST s ()
forall s. Parser s -> (DOMNode -> Bool) -> ST s ()
elementStackPopIf Parser s
p ((DOMNode -> Bool) -> ST s ()) -> (DOMNode -> Bool) -> ST s ()
forall a b. (a -> b) -> a -> b
$ BS -> DOMNode -> Bool
elementName BS
"option"
      Parser s -> ST s ()
forall s. Parser s -> ST s ()
activeFormatReconstruct Parser s
p
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
    TStart { tStartName :: Token -> BS
tStartName = BS
"menuitem" } -> do
      ST s ()
popMenuitem
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
    TStart { tStartName :: Token -> BS
tStartName = BS
x } | BS -> [BS] -> Bool
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"
      ST s Bool -> ST s () -> ST s ()
forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
whenM (Parser s -> DOMType -> ST s Bool
forall s. Parser s -> DOMType -> ST s Bool
elementInScope Parser s
p DOMType
a) (ST s () -> ST s ()) -> ST s () -> ST s ()
forall a b. (a -> b) -> a -> b
$ do
        Parser s -> ST s ()
forall s. Parser s -> ST s ()
generateImpliedEndTags Parser s
p
        ST s Bool -> ST s () -> ST s ()
forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
unlessM (Parser s -> DOMType -> ST s Bool
forall s. Parser s -> DOMType -> ST s Bool
currentNodeHasType Parser s
p DOMType
a) (ST s () -> ST s ()) -> ST s () -> ST s ()
forall a b. (a -> b) -> a -> b
$
          BS -> ST s ()
warn BS
"ruby element not in scope"
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
    TStart { tStartName :: Token -> BS
tStartName = BS
x } | BS -> [BS] -> Bool
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"
      ST s Bool -> ST s () -> ST s ()
forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
whenM (Parser s -> DOMType -> ST s Bool
forall s. Parser s -> DOMType -> ST s Bool
elementInScope Parser s
p DOMType
a) (ST s () -> ST s ()) -> ST s () -> ST s ()
forall a b. (a -> b) -> a -> b
$ do
        Parser s -> BS -> ST s ()
forall s. Parser s -> BS -> ST s ()
generateImpliedEndTagsExcept Parser s
p BS
"rtc"
        ST s Bool -> ST s () -> ST s ()
forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
unlessM (Parser s -> DOMType -> ST s Bool
forall s. Parser s -> DOMType -> ST s Bool
currentNodeHasType Parser s
p DOMType
a ST s Bool -> ST s Bool -> ST s Bool
forall (m :: * -> *). Monad m => m Bool -> m Bool -> m Bool
||^ Parser s -> DOMType -> ST s Bool
forall s. Parser s -> DOMType -> ST s Bool
currentNodeHasType Parser s
p DOMType
b) (ST s () -> ST s ()) -> ST s () -> ST s ()
forall a b. (a -> b) -> a -> b
$
          BS -> ST s ()
warn BS
"ruby or rtc element not in scope"
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
    TStart { tStartName :: Token -> BS
tStartName = BS
"math" } -> do
      Parser s -> ST s ()
forall s. Parser s -> ST s ()
activeFormatReconstruct Parser s
p
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
insertMathMLElement Parser s
p (Token -> ST s ()) -> (Token -> Token) -> Token -> ST s ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Token -> Token
adjustAttrForeign (Token -> Token) -> (Token -> Token) -> Token -> Token
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Token -> Token
adjustAttrMathML (Token -> ST s ()) -> Token -> ST s ()
forall a b. (a -> b) -> a -> b
$ Token
t
      Bool -> ST s () -> ST s ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Token -> Bool
tStartClosed Token
t) (ST s () -> ST s ()) -> ST s () -> ST s ()
forall a b. (a -> b) -> a -> b
$ do
        Parser s -> ST s ()
forall s. Parser s -> ST s ()
elementStackPop Parser s
p
        Parser s -> ST s ()
forall s. Parser s -> ST s ()
selfClosingAcknowledge Parser s
p
    TStart { tStartName :: Token -> BS
tStartName = BS
"svg" } -> do
      Parser s -> ST s ()
forall s. Parser s -> ST s ()
activeFormatReconstruct Parser s
p
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
insertSvgElement Parser s
p (Token -> ST s ()) -> (Token -> Token) -> Token -> ST s ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Token -> Token
adjustAttrForeign (Token -> Token) -> (Token -> Token) -> Token -> Token
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Token -> Token
adjustAttrSVG (Token -> ST s ()) -> Token -> ST s ()
forall a b. (a -> b) -> a -> b
$ Token
t
      Bool -> ST s () -> ST s ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Token -> Bool
tStartClosed Token
t) (ST s () -> ST s ()) -> ST s () -> ST s ()
forall a b. (a -> b) -> a -> b
$ do
        Parser s -> ST s ()
forall s. Parser s -> ST s ()
elementStackPop Parser s
p
        Parser s -> ST s ()
forall s. Parser s -> ST s ()
selfClosingAcknowledge Parser s
p
    TStart { tStartName :: Token -> BS
tStartName = BS
x } | BS -> [BS] -> Bool
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
      Parser s -> ST s ()
forall s. Parser s -> ST s ()
activeFormatReconstruct Parser s
p
      Parser s -> Token -> ST s ()
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"
      ST s Bool -> ST s () -> ST s ()
forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
whenM (Parser s -> DOMType -> ST s Bool
forall s. Parser s -> DOMType -> ST s Bool
elementInButtonScope Parser s
p DOMType
a) (ST s () -> ST s ()) -> ST s () -> ST s ()
forall a b. (a -> b) -> a -> b
$ Parser s -> ST s ()
forall s. Parser s -> ST s ()
closeElementP Parser s
p
    popMenuitem :: ST s ()
popMenuitem =
      Parser s -> (DOMNode -> Bool) -> ST s ()
forall s. Parser s -> (DOMNode -> Bool) -> ST s ()
elementStackPopIf Parser s
p ((DOMNode -> Bool) -> ST s ()) -> (DOMNode -> Bool) -> ST s ()
forall a b. (a -> b) -> a -> b
$ BS -> DOMNode -> Bool
elementName BS
"menuitem"
    runAA :: BS -> ST s ()
runAA =
      (BS -> ST s () -> ST s ()) -> ST s () -> BS -> ST s ()
forall a b c. (a -> b -> c) -> b -> a -> c
flip (Parser s -> BS -> ST s () -> ST s ()
forall s. Parser s -> BS -> ST s () -> ST s ()
adoptionAgencyRun Parser s
p) ST s ()
doAnyOtherEndTag
    doAnyOtherEndTag :: ST s ()
doAnyOtherEndTag =
      Parser s -> ST s [DOMType]
forall s. Parser s -> ST s [DOMType]
elementStackTypes Parser s
p ST s [DOMType] -> ([DOMType] -> ST s ()) -> ST s ()
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 [] = () -> ST s ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
        f (DOMType
x:[DOMType]
xs)
          | DOMType
x DOMType -> DOMType -> Bool
forall a. Eq a => a -> a -> Bool
== DOMType
a = do
              Parser s -> BS -> ST s ()
forall s. Parser s -> BS -> ST s ()
generateImpliedEndTagsExcept Parser s
p BS
n
              ST s Bool -> ST s () -> ST s ()
forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
unlessM (Parser s -> DOMType -> ST s Bool
forall s. Parser s -> DOMType -> ST s Bool
currentNodeHasType Parser s
p DOMType
x) (ST s () -> ST s ()) -> ST s () -> ST s ()
forall a b. (a -> b) -> a -> b
$
                BS -> ST s ()
warn BS
"current node has wrong type"
              Parser s -> ST s ()
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 =
      Parser s -> Maybe Token -> BS -> ST s ()
forall s. Parser s -> Maybe Token -> BS -> ST s ()
parseError Parser s
p (Token -> Maybe Token
forall a. a -> Maybe a
Just Token
t) (BS -> ST s ()) -> BS -> ST s ()
forall a b. (a -> b) -> a -> b
$ BS
"in body " BS -> BS -> BS
forall a. Semigroup a => a -> a -> a
<> BS
x

-- | Handle the text insertion mode.
doModeText :: Parser s -> Token -> ST s ()
doModeText :: 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 {} ->
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
insertChar Parser s
p Token
t
    Token
TEOF -> do
      Parser s -> Maybe Token -> BS -> ST s ()
forall s. Parser s -> Maybe Token -> BS -> ST s ()
parseError Parser s
p (Token -> Maybe Token
forall a. a -> Maybe a
Just Token
t) BS
"text eof"
      Parser s -> ST s ()
forall s. Parser s -> ST s ()
elementStackPop Parser s
p
      Parser s -> ST s ()
forall s. Parser s -> ST s ()
restoreMode Parser s
p
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
reprocess Parser s
p Token
t
    TEnd { tEndName :: Token -> BS
tEndName = BS
"script" } -> do
      Parser s -> ST s ()
forall s. Parser s -> ST s ()
elementStackPop Parser s
p
      Parser s -> ST s ()
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
      Parser s -> ST s ()
forall s. Parser s -> ST s ()
elementStackPop Parser s
p
      Parser s -> ST s ()
forall s. Parser s -> ST s ()
restoreMode Parser s
p

-- | Handle the in-table insertion mode.
doModeInTable :: Parser s -> Token -> ST s ()
doModeInTable :: 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 <- Parser s -> [DOMType] -> ST s Bool
forall s. Parser s -> [DOMType] -> ST s Bool
currentNodeHasTypeIn Parser s
p ([DOMType] -> ST s Bool) -> [DOMType] -> ST s Bool
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
        Parser s -> ST s ()
forall s. Parser s -> ST s ()
pendingTableCharInit Parser s
p
        Parser s -> ST s ()
forall s. Parser s -> ST s ()
saveMode Parser s
p
        Parser s -> ParserMode -> ST s ()
forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInTableText
        Parser s -> Token -> ST s ()
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 {} ->
      Parser s -> Token -> ST s ()
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
      Parser s -> ST s ()
forall s. Parser s -> ST s ()
activeFormatAddMarker Parser s
p
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
      Parser s -> ParserMode -> ST s ()
forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInCaption
    TStart { tStartName :: Token -> BS
tStartName = BS
"colgroup" } -> do
      ST s ()
clearToTableContext
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
      Parser s -> ParserMode -> ST s ()
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
      Parser s -> BS -> ST s ()
forall s. Parser s -> BS -> ST s ()
insertHtmlElementNamed Parser s
p BS
x
      Parser s -> ParserMode -> ST s ()
forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInColumnGroup
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
reprocess Parser s
p Token
t
    TStart { tStartName :: Token -> BS
tStartName = BS
x } | BS -> [BS] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem BS
x
      [BS
"tbody", BS
"tfoot", BS
"thead"] -> do
      ST s ()
clearToTableContext
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
      Parser s -> ParserMode -> ST s ()
forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInTableBody
    TStart { tStartName :: Token -> BS
tStartName = BS
x } | BS -> [BS] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem BS
x
      [BS
"td", BS
"th", BS
"tr"] -> do
      ST s ()
clearToTableContext
      Parser s -> BS -> ST s ()
forall s. Parser s -> BS -> ST s ()
insertHtmlElementNamed Parser s
p BS
"tbody"
      Parser s -> ParserMode -> ST s ()
forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInTableBody
      Parser s -> Token -> ST s ()
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
      ST s Bool -> ST s () -> ST s ()
forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
unlessM (Parser s -> DOMType -> ST s Bool
forall s. Parser s -> DOMType -> ST s Bool
elementInTableScope Parser s
p DOMType
a) (ST s () -> ST s ()) -> ST s () -> ST s ()
forall a b. (a -> b) -> a -> b
$ do
        Parser s -> DOMType -> ST s ()
forall s. Parser s -> DOMType -> ST s ()
elementStackPopUntilType Parser s
p DOMType
a
        Parser s -> ST s ()
forall s. Parser s -> ST s ()
resetInsertionMode Parser s
p
        Parser s -> Token -> ST s ()
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
      Parser s -> DOMType -> ST s Bool
forall s. Parser s -> DOMType -> ST s Bool
elementInTableScope Parser s
p DOMType
a ST s Bool -> (Bool -> ST s ()) -> ST s ()
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
          Parser s -> DOMType -> ST s ()
forall s. Parser s -> DOMType -> ST s ()
elementStackPopUntilType Parser s
p DOMType
a
          Parser s -> ST s ()
forall s. Parser s -> ST s ()
resetInsertionMode Parser s
p
    TStart { tStartName :: Token -> BS
tStartName = BS
x } | BS -> [BS] -> Bool
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 } | BS -> [BS] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem BS
x
     [BS
"style", BS
"script", BS
"template"] ->
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
doModeInHead Parser s
p Token
t
    TEnd { tEndName :: Token -> BS
tEndName = BS
"template" } ->
      Parser s -> Token -> ST s ()
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) BS -> BS -> Bool
forall a. Eq a => a -> a -> Bool
/= BS
"hidden"
      then ST s ()
anythingElse
      else do
        BS -> ST s ()
warn BS
"hidden input"
        Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
        Parser s -> ST s ()
forall s. Parser s -> ST s ()
elementStackPop Parser s
p
        Parser s -> ST s ()
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"
      ST s Bool -> ST s () -> ST s ()
forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
unlessM (Parser s -> ST s Bool
forall s. Parser s -> ST s Bool
elementStackHasTemplate Parser s
p ST s Bool -> ST s Bool -> ST s Bool
forall (m :: * -> *). Monad m => m Bool -> m Bool -> m Bool
||^ Parser s -> ST s Bool
forall s. Parser s -> ST s Bool
formNotNull Parser s
p) (ST s () -> ST s ()) -> ST s () -> ST s ()
forall a b. (a -> b) -> a -> b
$ do
        Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
        Parser s -> ST s ()
forall s. Parser s -> ST s ()
saveForm Parser s
p
        Parser s -> ST s ()
forall s. Parser s -> ST s ()
elementStackPop Parser s
p
    Token
TEOF ->
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
doModeInBody Parser s
p Token
t
    Token
_otherwise ->
      ST s ()
anythingElse
  where
    clearToTableContext :: ST s ()
clearToTableContext =
      Parser s -> (DOMNode -> Bool) -> ST s ()
forall s. Parser s -> (DOMNode -> Bool) -> ST s ()
elementStackPopWhile Parser s
p ((DOMNode -> Bool) -> ST s ()) -> (DOMNode -> Bool) -> ST s ()
forall a b. (a -> b) -> a -> b
$ \DOMNode
x -> Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ DOMType -> [DOMType] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem (DOMNode -> DOMType
domNodeType DOMNode
x) ([DOMType] -> Bool) -> [DOMType] -> Bool
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"
      Parser s -> ST s ()
forall s. Parser s -> ST s ()
fosterParentingSet Parser s
p
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
doModeInBody Parser s
p Token
t
      Parser s -> ST s ()
forall s. Parser s -> ST s ()
fosterParentingClear Parser s
p
    warn :: BS -> ST s ()
warn BS
x =
      Parser s -> Maybe Token -> BS -> ST s ()
forall s. Parser s -> Maybe Token -> BS -> ST s ()
parseError Parser s
p (Token -> Maybe Token
forall a. a -> Maybe a
Just Token
t) (BS -> ST s ()) -> BS -> ST s ()
forall a b. (a -> b) -> a -> b
$ BS
"in table " BS -> BS -> BS
forall a. Semigroup a => a -> a -> a
<> BS
x

-- | Handle the in-table-text insertion mode.
doModeInTableText :: Parser s -> Token -> ST s ()
doModeInTableText :: 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 {} ->
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
pendingTableCharAppend Parser s
p Token
t
    Token
_otherwise -> do
      [Token]
a <- Parser s -> ST s [Token]
forall s. Parser s -> ST s [Token]
pendingTableChars Parser s
p
      if (Token -> Bool) -> [Token] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (Bool -> Bool
not (Bool -> Bool) -> (Token -> Bool) -> Token -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word8 -> Bool
chrWhitespace (Word8 -> Bool) -> (Token -> Word8) -> Token -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Token -> Word8
tCharData) [Token]
a
      then do
        BS -> ST s ()
warn BS
"unexpected character"
        Parser s -> ST s ()
forall s. Parser s -> ST s ()
fosterParentingSet Parser s
p
        (Token -> ST s ()) -> [Token] -> ST s ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
doModeInBody Parser s
p) [Token]
a
        Parser s -> ST s ()
forall s. Parser s -> ST s ()
fosterParentingClear Parser s
p
      else do
        (Token -> ST s ()) -> [Token] -> ST s ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
insertChar Parser s
p) [Token]
a
      Parser s -> ST s ()
forall s. Parser s -> ST s ()
restoreMode Parser s
p
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
reprocess Parser s
p Token
t
  where
    warn :: BS -> ST s ()
warn BS
x =
      Parser s -> Maybe Token -> BS -> ST s ()
forall s. Parser s -> Maybe Token -> BS -> ST s ()
parseError Parser s
p (Token -> Maybe Token
forall a. a -> Maybe a
Just Token
t) (BS -> ST s ()) -> BS -> ST s ()
forall a b. (a -> b) -> a -> b
$ BS
"in table text " BS -> BS -> BS
forall a. Semigroup a => a -> a -> a
<> BS
x

-- | Handle the in-caption insertion mode.
doModeInCaption :: Parser s -> Token -> ST s ()
doModeInCaption :: 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 } | BS -> [BS] -> Bool
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
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
reprocess Parser s
p Token
t
    TEnd { tEndName :: Token -> BS
tEndName = BS
"table" } -> do
      ST s ()
processCaption
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
reprocess Parser s
p Token
t
    TEnd { tEndName :: Token -> BS
tEndName = BS
x } | BS -> [BS] -> Bool
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 ->
      Parser s -> Token -> ST s ()
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"
      Parser s -> DOMType -> ST s Bool
forall s. Parser s -> DOMType -> ST s Bool
elementInTableScope Parser s
p DOMType
a ST s Bool -> (Bool -> ST s ()) -> ST s ()
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
          Parser s -> ST s ()
forall s. Parser s -> ST s ()
generateImpliedEndTags Parser s
p
          ST s Bool -> ST s () -> ST s ()
forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
unlessM (Parser s -> DOMType -> ST s Bool
forall s. Parser s -> DOMType -> ST s Bool
currentNodeHasType Parser s
p DOMType
a) (ST s () -> ST s ()) -> ST s () -> ST s ()
forall a b. (a -> b) -> a -> b
$
            BS -> ST s ()
warn BS
"current node is not a caption"
          Parser s -> DOMType -> ST s ()
forall s. Parser s -> DOMType -> ST s ()
elementStackPopUntilType Parser s
p DOMType
a
          Parser s -> ST s ()
forall s. Parser s -> ST s ()
activeFormatClear Parser s
p
          Parser s -> ParserMode -> ST s ()
forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInTable
    warn :: BS -> ST s ()
warn BS
x =
      Parser s -> Maybe Token -> BS -> ST s ()
forall s. Parser s -> Maybe Token -> BS -> ST s ()
parseError Parser s
p (Token -> Maybe Token
forall a. a -> Maybe a
Just Token
t) (BS -> ST s ()) -> BS -> ST s ()
forall a b. (a -> b) -> a -> b
$ BS
"in caption " BS -> BS -> BS
forall a. Semigroup a => a -> a -> a
<> BS
x

-- | Handle the in-column-group insertion mode.
doModeInColumnGroup :: Parser s -> Token -> ST s ()
doModeInColumnGroup :: 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 ->
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
insertChar Parser s
p Token
t
    TComment {} ->
      Parser s -> Token -> ST s ()
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" } ->
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
doModeInBody Parser s
p Token
t
    TStart { tStartName :: Token -> BS
tStartName = BS
"col" } -> do
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
      Parser s -> ST s ()
forall s. Parser s -> ST s ()
elementStackPop Parser s
p
      Parser s -> ST s ()
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
      Parser s -> DOMType -> ST s Bool
forall s. Parser s -> DOMType -> ST s Bool
currentNodeHasType Parser s
p DOMType
a ST s Bool -> (Bool -> ST s ()) -> ST s ()
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
          Parser s -> ST s ()
forall s. Parser s -> ST s ()
elementStackPop Parser s
p
          Parser s -> ParserMode -> ST s ()
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" } ->
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
doModeInHead Parser s
p Token
t
    TEnd { tEndName :: Token -> BS
tEndName = BS
"template" } ->
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
doModeInHead Parser s
p Token
t
    Token
TEOF ->
      Parser s -> Token -> ST s ()
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"
      Parser s -> DOMType -> ST s Bool
forall s. Parser s -> DOMType -> ST s Bool
currentNodeHasType Parser s
p DOMType
a ST s Bool -> (Bool -> ST s ()) -> ST s ()
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
          Parser s -> ST s ()
forall s. Parser s -> ST s ()
elementStackPop Parser s
p
          Parser s -> ParserMode -> ST s ()
forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInTable
          Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
reprocess Parser s
p Token
t
  where
    warn :: BS -> ST s ()
warn BS
x =
      Parser s -> Maybe Token -> BS -> ST s ()
forall s. Parser s -> Maybe Token -> BS -> ST s ()
parseError Parser s
p (Token -> Maybe Token
forall a. a -> Maybe a
Just Token
t) (BS -> ST s ()) -> BS -> ST s ()
forall a b. (a -> b) -> a -> b
$ BS
"in column group " BS -> BS -> BS
forall a. Semigroup a => a -> a -> a
<> BS
x

-- | Handle the in-table-body insertion mode.
doModeInTableBody :: Parser s -> Token -> ST s ()
doModeInTableBody :: 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
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
      Parser s -> ParserMode -> ST s ()
forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInRow
    TStart { tStartName :: Token -> BS
tStartName = BS
x } | BS -> [BS] -> Bool
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
      Parser s -> BS -> ST s ()
forall s. Parser s -> BS -> ST s ()
insertHtmlElementNamed Parser s
p BS
"tr"
      Parser s -> ParserMode -> ST s ()
forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInRow
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
reprocess Parser s
p Token
t
    TEnd { tEndName :: Token -> BS
tEndName = BS
x } | BS -> [BS] -> Bool
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
      Parser s -> DOMType -> ST s Bool
forall s. Parser s -> DOMType -> ST s Bool
elementInTableScope Parser s
p DOMType
a ST s Bool -> (Bool -> ST s ()) -> ST s ()
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
          Parser s -> ST s ()
forall s. Parser s -> ST s ()
elementStackPop Parser s
p
          Parser s -> ParserMode -> ST s ()
forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInTable
    TStart { tStartName :: Token -> BS
tStartName = BS
x } | BS -> [BS] -> Bool
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 } | BS -> [BS] -> Bool
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 ->
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
doModeInTable Parser s
p Token
t
  where
    processElements :: ST s ()
processElements = do
      (BS -> ST s Bool) -> [BS] -> ST s Bool
forall (m :: * -> *) a. Monad m => (a -> m Bool) -> [a] -> m Bool
anyM (Parser s -> DOMType -> ST s Bool
forall s. Parser s -> DOMType -> ST s Bool
elementInTableScope Parser s
p (DOMType -> ST s Bool) -> (BS -> DOMType) -> BS -> ST s Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. BS -> DOMType
domMakeTypeHTML)
        [BS
"tbody", BS
"tfoot", BS
"thead"] ST s Bool -> (Bool -> ST s ()) -> ST s ()
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
          Parser s -> ST s ()
forall s. Parser s -> ST s ()
elementStackPop Parser s
p
          Parser s -> ParserMode -> ST s ()
forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInTable
          Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
reprocess Parser s
p Token
t
    clearToTableBodyContext :: ST s ()
clearToTableBodyContext =
      Parser s -> (DOMNode -> Bool) -> ST s ()
forall s. Parser s -> (DOMNode -> Bool) -> ST s ()
elementStackPopWhile Parser s
p ((DOMNode -> Bool) -> ST s ()) -> (DOMNode -> Bool) -> ST s ()
forall a b. (a -> b) -> a -> b
$ \DOMNode
x -> Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ DOMType -> [DOMType] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem (DOMNode -> DOMType
domNodeType DOMNode
x) ([DOMType] -> Bool) -> [DOMType] -> Bool
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 =
      Parser s -> Maybe Token -> BS -> ST s ()
forall s. Parser s -> Maybe Token -> BS -> ST s ()
parseError Parser s
p (Token -> Maybe Token
forall a. a -> Maybe a
Just Token
t) (BS -> ST s ()) -> BS -> ST s ()
forall a b. (a -> b) -> a -> b
$ BS
"in table body " BS -> BS -> BS
forall a. Semigroup a => a -> a -> a
<> BS
x

-- | Handle the in-row insertion mode.
doModeInRow :: Parser s -> Token -> ST s ()
doModeInRow :: 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 } | BS -> [BS] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem BS
x [BS
"th", BS
"td"] -> do
      ST s ()
clearToTableRowContext
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
      Parser s -> ParserMode -> ST s ()
forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInCell
      Parser s -> ST s ()
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 } | BS -> [BS] -> Bool
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
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
reprocess Parser s
p Token
t
    TEnd { tEndName :: Token -> BS
tEndName = BS
"table" } -> do
      ST s ()
processTr
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
reprocess Parser s
p Token
t
    TEnd { tEndName :: Token -> BS
tEndName = BS
x } | BS -> [BS] -> Bool
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"
      Parser s -> DOMType -> ST s Bool
forall s. Parser s -> DOMType -> ST s Bool
elementInTableScope Parser s
p DOMType
a ST s Bool -> (Bool -> ST s ()) -> ST s ()
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 ->
          ST s Bool -> ST s () -> ST s ()
forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
whenM (Parser s -> DOMType -> ST s Bool
forall s. Parser s -> DOMType -> ST s Bool
elementInTableScope Parser s
p DOMType
b) (ST s () -> ST s ()) -> ST s () -> ST s ()
forall a b. (a -> b) -> a -> b
$ do
            ST s ()
clearToTableRowContext
            Parser s -> ST s ()
forall s. Parser s -> ST s ()
elementStackPop Parser s
p
            Parser s -> ParserMode -> ST s ()
forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInTableBody
            Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
reprocess Parser s
p Token
t
    TEnd { tEndName :: Token -> BS
tEndName = BS
x } | BS -> [BS] -> Bool
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 ->
      Parser s -> Token -> ST s ()
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"
      Parser s -> DOMType -> ST s Bool
forall s. Parser s -> DOMType -> ST s Bool
elementInTableScope Parser s
p DOMType
a ST s Bool -> (Bool -> ST s ()) -> ST s ()
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
          Parser s -> ST s ()
forall s. Parser s -> ST s ()
elementStackPop Parser s
p
          Parser s -> ParserMode -> ST s ()
forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInTableBody
    clearToTableRowContext :: ST s ()
clearToTableRowContext =
      Parser s -> (DOMNode -> Bool) -> ST s ()
forall s. Parser s -> (DOMNode -> Bool) -> ST s ()
elementStackPopWhile Parser s
p ((DOMNode -> Bool) -> ST s ()) -> (DOMNode -> Bool) -> ST s ()
forall a b. (a -> b) -> a -> b
$ \DOMNode
x -> Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ DOMType -> [DOMType] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem (DOMNode -> DOMType
domNodeType DOMNode
x) ([DOMType] -> Bool) -> [DOMType] -> Bool
forall a b. (a -> b) -> a -> b
$
        [BS] -> [DOMType]
domTypesHTML [BS
"tr", BS
"template", BS
"html"]
    warn :: BS -> ST s ()
warn BS
x =
      Parser s -> Maybe Token -> BS -> ST s ()
forall s. Parser s -> Maybe Token -> BS -> ST s ()
parseError Parser s
p (Token -> Maybe Token
forall a. a -> Maybe a
Just Token
t) (BS -> ST s ()) -> BS -> ST s ()
forall a b. (a -> b) -> a -> b
$ BS
"in row " BS -> BS -> BS
forall a. Semigroup a => a -> a -> a
<> BS
x

-- | Handle the in-cell insertion mode.
doModeInCell :: Parser s -> Token -> ST s ()
doModeInCell :: 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 } | BS -> [BS] -> Bool
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
      Parser s -> DOMType -> ST s Bool
forall s. Parser s -> DOMType -> ST s Bool
elementInTableScope Parser s
p DOMType
a ST s Bool -> (Bool -> ST s ()) -> ST s ()
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
          Parser s -> ST s ()
forall s. Parser s -> ST s ()
generateImpliedEndTags Parser s
p
          ST s Bool -> ST s () -> ST s ()
forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
unlessM (Parser s -> DOMType -> ST s Bool
forall s. Parser s -> DOMType -> ST s Bool
currentNodeHasType Parser s
p DOMType
a) (ST s () -> ST s ()) -> ST s () -> ST s ()
forall a b. (a -> b) -> a -> b
$
            BS -> ST s ()
warn (BS -> ST s ()) -> BS -> ST s ()
forall a b. (a -> b) -> a -> b
$ BS
"current node not " BS -> BS -> BS
forall a. Semigroup a => a -> a -> a
<> BS
x
          Parser s -> DOMType -> ST s ()
forall s. Parser s -> DOMType -> ST s ()
elementStackPopUntilType Parser s
p DOMType
a
          Parser s -> ST s ()
forall s. Parser s -> ST s ()
activeFormatClear Parser s
p
          Parser s -> ParserMode -> ST s ()
forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInRow
    TStart { tStartName :: Token -> BS
tStartName = BS
x } | BS -> [BS] -> Bool
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
      (BS -> ST s Bool) -> [BS] -> ST s Bool
forall (m :: * -> *) a. Monad m => (a -> m Bool) -> [a] -> m Bool
anyM (Parser s -> DOMType -> ST s Bool
forall s. Parser s -> DOMType -> ST s Bool
elementInTableScope Parser s
p (DOMType -> ST s Bool) -> (BS -> DOMType) -> BS -> ST s Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. BS -> DOMType
domMakeTypeHTML) [BS
"td", BS
"th"] ST s Bool -> (Bool -> ST s ()) -> ST s ()
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
          Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
reprocess Parser s
p Token
t
    TEnd { tEndName :: Token -> BS
tEndName = BS
x } | BS -> [BS] -> Bool
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 } | BS -> [BS] -> Bool
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
      Parser s -> DOMType -> ST s Bool
forall s. Parser s -> DOMType -> ST s Bool
elementInTableScope Parser s
p DOMType
a ST s Bool -> (Bool -> ST s ()) -> ST s ()
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
          Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
reprocess Parser s
p Token
t
    Token
_otherwise ->
      Parser s -> Token -> ST s ()
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"]
      Parser s -> ST s ()
forall s. Parser s -> ST s ()
generateImpliedEndTags Parser s
p
      ST s Bool -> ST s () -> ST s ()
forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
unlessM (Parser s -> [DOMType] -> ST s Bool
forall s. Parser s -> [DOMType] -> ST s Bool
currentNodeHasTypeIn Parser s
p [DOMType]
a) (ST s () -> ST s ()) -> ST s () -> ST s ()
forall a b. (a -> b) -> a -> b
$
        BS -> ST s ()
warn BS
"current node is not td or th"
      Parser s -> [DOMType] -> ST s ()
forall s. Parser s -> [DOMType] -> ST s ()
elementStackPopUntilTypeIn Parser s
p [DOMType]
a
      Parser s -> ST s ()
forall s. Parser s -> ST s ()
activeFormatClear Parser s
p
      Parser s -> ParserMode -> ST s ()
forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInRow
    warn :: BS -> ST s ()
warn BS
x =
      Parser s -> Maybe Token -> BS -> ST s ()
forall s. Parser s -> Maybe Token -> BS -> ST s ()
parseError Parser s
p (Token -> Maybe Token
forall a. a -> Maybe a
Just Token
t) (BS -> ST s ()) -> BS -> ST s ()
forall a b. (a -> b) -> a -> b
$ BS
"in cell " BS -> BS -> BS
forall a. Semigroup a => a -> a -> a
<> BS
x

-- | Handle the in-select insertion mode.
doModeInSelect :: Parser s -> Token -> ST s ()
doModeInSelect :: 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 {} ->
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
insertChar Parser s
p Token
t
    TComment {} ->
      Parser s -> Token -> ST s ()
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" } ->
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
doModeInBody Parser s
p Token
t
    TStart { tStartName :: Token -> BS
tStartName = x :: BS
x@BS
"option" } -> do
      Parser s -> (DOMNode -> Bool) -> ST s ()
forall s. Parser s -> (DOMNode -> Bool) -> ST s ()
elementStackPopIf Parser s
p ((DOMNode -> Bool) -> ST s ()) -> (DOMNode -> Bool) -> ST s ()
forall a b. (a -> b) -> a -> b
$ BS -> DOMNode -> Bool
elementName BS
x
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
    TStart { tStartName :: Token -> BS
tStartName = x :: BS
x@BS
"optgroup" } -> do
      Parser s -> (DOMNode -> Bool) -> ST s ()
forall s. Parser s -> (DOMNode -> Bool) -> ST s ()
elementStackPopIf Parser s
p ((DOMNode -> Bool) -> ST s ()) -> (DOMNode -> Bool) -> ST s ()
forall a b. (a -> b) -> a -> b
$ BS -> DOMNode -> Bool
elementName BS
"option"
      Parser s -> (DOMNode -> Bool) -> ST s ()
forall s. Parser s -> (DOMNode -> Bool) -> ST s ()
elementStackPopIf Parser s
p ((DOMNode -> Bool) -> ST s ()) -> (DOMNode -> Bool) -> ST s ()
forall a b. (a -> b) -> a -> b
$ BS -> DOMNode -> Bool
elementName BS
x
      Parser s -> Token -> ST s ()
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 <- DOMID -> [DOMType] -> [DOMType]
forall a. DOMID -> [a] -> [a]
take DOMID
2 ([DOMType] -> [DOMType]) -> ST s [DOMType] -> ST s [DOMType]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser s -> ST s [DOMType]
forall s. Parser s -> ST s [DOMType]
elementStackTypes Parser s
p
      Bool -> ST s () -> ST s ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when ([DOMType]
y [DOMType] -> [DOMType] -> Bool
forall a. Eq a => a -> a -> Bool
== [DOMType
a,DOMType
b]) (ST s () -> ST s ()) -> ST s () -> ST s ()
forall a b. (a -> b) -> a -> b
$ Parser s -> ST s ()
forall s. Parser s -> ST s ()
elementStackPop Parser s
p
      Parser s -> DOMType -> ST s Bool
forall s. Parser s -> DOMType -> ST s Bool
currentNodeHasType Parser s
p DOMType
b ST s Bool -> (Bool -> ST s ()) -> ST s ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
        Bool
False ->
          BS -> ST s ()
warn (BS -> ST s ()) -> BS -> ST s ()
forall a b. (a -> b) -> a -> b
$ BS
"current node not " BS -> BS -> BS
forall a. Semigroup a => a -> a -> a
<> BS
x
        Bool
True ->
          Parser s -> ST s ()
forall s. Parser s -> ST s ()
elementStackPop Parser s
p
    TEnd { tEndName :: Token -> BS
tEndName = x :: BS
x@BS
"option" } -> do
      Parser s -> DOMType -> ST s Bool
forall s. Parser s -> DOMType -> ST s Bool
currentNodeHasType Parser s
p (BS -> DOMType
domMakeTypeHTML BS
x) ST s Bool -> (Bool -> ST s ()) -> ST s ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
        Bool
False ->
          BS -> ST s ()
warn (BS -> ST s ()) -> BS -> ST s ()
forall a b. (a -> b) -> a -> b
$ BS
"current node not " BS -> BS -> BS
forall a. Semigroup a => a -> a -> a
<> BS
x
        Bool
True ->
          Parser s -> ST s ()
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
      Parser s -> DOMType -> ST s Bool
forall s. Parser s -> DOMType -> ST s Bool
elementInSelectScope Parser s
p DOMType
a ST s Bool -> (Bool -> ST s ()) -> ST s ()
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
          Parser s -> DOMType -> ST s ()
forall s. Parser s -> DOMType -> ST s ()
elementStackPopUntilType Parser s
p DOMType
a
          Parser s -> ST s ()
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
      ST s Bool -> ST s () -> ST s ()
forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
whenM (Parser s -> DOMType -> ST s Bool
forall s. Parser s -> DOMType -> ST s Bool
elementInSelectScope Parser s
p DOMType
a) (ST s () -> ST s ()) -> ST s () -> ST s ()
forall a b. (a -> b) -> a -> b
$ do
        Parser s -> DOMType -> ST s ()
forall s. Parser s -> DOMType -> ST s ()
elementStackPopUntilType Parser s
p DOMType
a
        Parser s -> ST s ()
forall s. Parser s -> ST s ()
resetInsertionMode Parser s
p
    TStart { tStartName :: Token -> BS
tStartName = BS
x } | BS -> [BS] -> Bool
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
      ST s Bool -> ST s () -> ST s ()
forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
whenM (Parser s -> DOMType -> ST s Bool
forall s. Parser s -> DOMType -> ST s Bool
elementInSelectScope Parser s
p DOMType
a) (ST s () -> ST s ()) -> ST s () -> ST s ()
forall a b. (a -> b) -> a -> b
$ do
        Parser s -> DOMType -> ST s ()
forall s. Parser s -> DOMType -> ST s ()
elementStackPopUntilType Parser s
p DOMType
a
        Parser s -> ST s ()
forall s. Parser s -> ST s ()
resetInsertionMode Parser s
p
        Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
reprocess Parser s
p Token
t
    TStart { tStartName :: Token -> BS
tStartName = BS
x } | BS -> [BS] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem BS
x
     [BS
"script", BS
"template"] ->
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
doModeInHead Parser s
p Token
t
    TEnd { tEndName :: Token -> BS
tEndName = BS
"template" } ->
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
doModeInHead Parser s
p Token
t
    Token
TEOF ->
      Parser s -> Token -> ST s ()
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 =
      Parser s -> Maybe Token -> BS -> ST s ()
forall s. Parser s -> Maybe Token -> BS -> ST s ()
parseError Parser s
p (Token -> Maybe Token
forall a. a -> Maybe a
Just Token
t) (BS -> ST s ()) -> BS -> ST s ()
forall a b. (a -> b) -> a -> b
$ BS
"in select " BS -> BS -> BS
forall a. Semigroup a => a -> a -> a
<> BS
x

-- | Handle the in-select-in-table insertion mode.
doModeInSelectInTable :: Parser s -> Token -> ST s ()
doModeInSelectInTable :: 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 } | BS -> [BS] -> Bool
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"
      Parser s -> DOMType -> ST s ()
forall s. Parser s -> DOMType -> ST s ()
elementStackPopUntilType Parser s
p (DOMType -> ST s ()) -> DOMType -> ST s ()
forall a b. (a -> b) -> a -> b
$ BS -> DOMType
domMakeTypeHTML BS
"select"
      Parser s -> ST s ()
forall s. Parser s -> ST s ()
resetInsertionMode Parser s
p
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
reprocess Parser s
p Token
t
    TEnd { tEndName :: Token -> BS
tEndName = BS
x } | BS -> [BS] -> Bool
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"
      ST s Bool -> ST s () -> ST s ()
forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
whenM (Parser s -> DOMType -> ST s Bool
forall s. Parser s -> DOMType -> ST s Bool
elementInTableScope Parser s
p (DOMType -> ST s Bool) -> DOMType -> ST s Bool
forall a b. (a -> b) -> a -> b
$ BS -> DOMType
domMakeTypeHTML BS
x) (ST s () -> ST s ()) -> ST s () -> ST s ()
forall a b. (a -> b) -> a -> b
$ do
        Parser s -> DOMType -> ST s ()
forall s. Parser s -> DOMType -> ST s ()
elementStackPopUntilType Parser s
p (DOMType -> ST s ()) -> DOMType -> ST s ()
forall a b. (a -> b) -> a -> b
$ BS -> DOMType
domMakeTypeHTML BS
"select"
        Parser s -> ST s ()
forall s. Parser s -> ST s ()
resetInsertionMode Parser s
p
        Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
reprocess Parser s
p Token
t
    Token
_otherwise ->
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
doModeInSelect Parser s
p Token
t
  where
    warn :: BS -> ST s ()
warn BS
x =
      Parser s -> Maybe Token -> BS -> ST s ()
forall s. Parser s -> Maybe Token -> BS -> ST s ()
parseError Parser s
p (Token -> Maybe Token
forall a. a -> Maybe a
Just Token
t) (BS -> ST s ()) -> BS -> ST s ()
forall a b. (a -> b) -> a -> b
$ BS
"in select in table " BS -> BS -> BS
forall a. Semigroup a => a -> a -> a
<> BS
x

-- | Handle the in-template insertion mode.
doModeInTemplate :: Parser s -> Token -> ST s ()
doModeInTemplate :: 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 {} ->
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
doModeInBody Parser s
p Token
t
    TComment {} ->
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
doModeInBody Parser s
p Token
t
    TDoctype {} ->
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
doModeInBody Parser s
p Token
t
    TStart { tStartName :: Token -> BS
tStartName = BS
x } | BS -> [BS] -> Bool
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"] ->
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
doModeInHead Parser s
p Token
t
    TEnd { tEndName :: Token -> BS
tEndName = BS
"template" } ->
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
doModeInHead Parser s
p Token
t
    TStart { tStartName :: Token -> BS
tStartName = BS
x } | BS -> [BS] -> Bool
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
      Parser s -> ST s ()
forall s. Parser s -> ST s ()
templateModePop Parser s
p
      Parser s -> ParserMode -> ST s ()
forall s. Parser s -> ParserMode -> ST s ()
templateModePush Parser s
p ParserMode
ModeInTable
      Parser s -> ParserMode -> ST s ()
forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInTable
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
reprocess Parser s
p Token
t
    TStart { tStartName :: Token -> BS
tStartName = BS
"col" } -> do
      Parser s -> ST s ()
forall s. Parser s -> ST s ()
templateModePop Parser s
p
      Parser s -> ParserMode -> ST s ()
forall s. Parser s -> ParserMode -> ST s ()
templateModePush Parser s
p ParserMode
ModeInColumnGroup
      Parser s -> ParserMode -> ST s ()
forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInColumnGroup
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
reprocess Parser s
p Token
t
    TStart { tStartName :: Token -> BS
tStartName = BS
"tr" } -> do
      Parser s -> ST s ()
forall s. Parser s -> ST s ()
templateModePop Parser s
p
      Parser s -> ParserMode -> ST s ()
forall s. Parser s -> ParserMode -> ST s ()
templateModePush Parser s
p ParserMode
ModeInTableBody
      Parser s -> ParserMode -> ST s ()
forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInTableBody
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
reprocess Parser s
p Token
t
    TStart { tStartName :: Token -> BS
tStartName = BS
x } | BS -> [BS] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem BS
x [BS
"td", BS
"th"] -> do
      Parser s -> ST s ()
forall s. Parser s -> ST s ()
templateModePop Parser s
p
      Parser s -> ParserMode -> ST s ()
forall s. Parser s -> ParserMode -> ST s ()
templateModePush Parser s
p ParserMode
ModeInRow
      Parser s -> ParserMode -> ST s ()
forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInRow
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
reprocess Parser s
p Token
t
    TStart {} -> do
      Parser s -> ST s ()
forall s. Parser s -> ST s ()
templateModePop Parser s
p
      Parser s -> ParserMode -> ST s ()
forall s. Parser s -> ParserMode -> ST s ()
templateModePush Parser s
p ParserMode
ModeInBody
      Parser s -> ParserMode -> ST s ()
forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInBody
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
reprocess Parser s
p Token
t
    TEnd {} ->
      BS -> ST s ()
warn BS
"unexpected end tag"
    Token
TEOF ->
      Parser s -> ST s Bool
forall s. Parser s -> ST s Bool
elementStackMissingTemplate Parser s
p ST s Bool -> (Bool -> ST s ()) -> ST s ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
        Bool
True ->
          Parser s -> ST s ()
forall s. Parser s -> ST s ()
parserSetDone Parser s
p
        Bool
False -> do
          BS -> ST s ()
warn BS
"template on stack"
          Parser s -> ST s ()
forall s. Parser s -> ST s ()
activeFormatClear Parser s
p
          Parser s -> ST s ()
forall s. Parser s -> ST s ()
templateModePop Parser s
p
          Parser s -> ST s ()
forall s. Parser s -> ST s ()
resetInsertionMode Parser s
p
          Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
reprocess Parser s
p Token
t
  where
    warn :: BS -> ST s ()
warn BS
x =
      Parser s -> Maybe Token -> BS -> ST s ()
forall s. Parser s -> Maybe Token -> BS -> ST s ()
parseError Parser s
p (Token -> Maybe Token
forall a. a -> Maybe a
Just Token
t) (BS -> ST s ()) -> BS -> ST s ()
forall a b. (a -> b) -> a -> b
$ BS
"in template " BS -> BS -> BS
forall a. Semigroup a => a -> a -> a
<> BS
x

-- | Handle the after-body insertion mode.
doModeAfterBody :: Parser s -> Token -> ST s ()
doModeAfterBody :: 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 ->
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
doModeInBody Parser s
p Token
t
    TComment {} -> do
      DOMPos
x <- DOMID -> DOMPos
domPos (DOMID -> DOMPos)
-> (Maybe DOMID -> DOMID) -> Maybe DOMID -> DOMPos
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Maybe DOMID -> DOMID
forall a. HasCallStack => Maybe a -> a
fromJust (Maybe DOMID -> DOMPos) -> ST s (Maybe DOMID) -> ST s DOMPos
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser s -> ST s (Maybe DOMID)
forall s. Parser s -> ST s (Maybe DOMID)
lastNodeID Parser s
p
      Parser s -> Token -> ST s DOMNode
forall s. Parser s -> Token -> ST s DOMNode
commentMake Parser s
p Token
t ST s DOMNode -> (DOMNode -> ST s ()) -> ST s ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ST s DOMID -> ST s ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (ST s DOMID -> ST s ())
-> (DOMNode -> ST s DOMID) -> DOMNode -> ST s ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Parser s -> DOMPos -> DOMNode -> ST s DOMID
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" } ->
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
doModeInBody Parser s
p Token
t
    TEnd { tEndName :: Token -> BS
tEndName = BS
"html" } ->
      STRef s Bool -> ST s Bool
forall s a. STRef s a -> ST s a
rref STRef s Bool
parserFragmentMode ST s Bool -> (Bool -> ST s ()) -> ST s ()
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 ->
          Parser s -> ParserMode -> ST s ()
forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeAfterAfterBody
    Token
TEOF ->
      Parser s -> ST s ()
forall s. Parser s -> ST s ()
parserSetDone Parser s
p
    Token
_otherwise -> do
      BS -> ST s ()
warn BS
"unexpected token"
      Parser s -> ParserMode -> ST s ()
forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInBody
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
reprocess Parser s
p Token
t
  where
    warn :: BS -> ST s ()
warn BS
x =
      Parser s -> Maybe Token -> BS -> ST s ()
forall s. Parser s -> Maybe Token -> BS -> ST s ()
parseError Parser s
p (Token -> Maybe Token
forall a. a -> Maybe a
Just Token
t) (BS -> ST s ()) -> BS -> ST s ()
forall a b. (a -> b) -> a -> b
$ BS
"after body " BS -> BS -> BS
forall a. Semigroup a => a -> a -> a
<> BS
x

-- | Handle the in-frameset insertion mode.
doModeInFrameset :: Parser s -> Token -> ST s ()
doModeInFrameset :: 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 ->
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
insertChar Parser s
p Token
t
    TComment {} ->
      Parser s -> Token -> ST s ()
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" } ->
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
doModeInBody Parser s
p Token
t
    TStart { tStartName :: Token -> BS
tStartName = BS
"frameset" } ->
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
    TEnd { tEndName :: Token -> BS
tEndName = BS
"frameset" } -> do
      Parser s -> BS -> ST s Bool
forall s. Parser s -> BS -> ST s Bool
currentNodeHasHTMLType Parser s
p BS
"html" ST s Bool -> (Bool -> ST s ()) -> ST s ()
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
          Parser s -> ST s ()
forall s. Parser s -> ST s ()
elementStackPop Parser s
p
          ST s Bool -> ST s () -> ST s ()
forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
whenM (ST s Bool -> ST s Bool
forall (m :: * -> *). Functor m => m Bool -> m Bool
notM (STRef s Bool -> ST s Bool
forall s a. STRef s a -> ST s a
rref STRef s Bool
parserFragmentMode) ST s Bool -> ST s Bool -> ST s Bool
forall (m :: * -> *). Monad m => m Bool -> m Bool -> m Bool
&&^
            ST s Bool -> ST s Bool
forall (m :: * -> *). Functor m => m Bool -> m Bool
notM (Parser s -> BS -> ST s Bool
forall s. Parser s -> BS -> ST s Bool
currentNodeHasHTMLType Parser s
p BS
"frameset")) (ST s () -> ST s ()) -> ST s () -> ST s ()
forall a b. (a -> b) -> a -> b
$
            Parser s -> ParserMode -> ST s ()
forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeAfterFrameset
    TStart { tStartName :: Token -> BS
tStartName = BS
"frame" } -> do
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
insertHtmlElement Parser s
p Token
t
      Parser s -> ST s ()
forall s. Parser s -> ST s ()
elementStackPop Parser s
p
      Parser s -> ST s ()
forall s. Parser s -> ST s ()
selfClosingAcknowledge Parser s
p
    TStart { tStartName :: Token -> BS
tStartName = BS
"noframes" } ->
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
doModeInHead Parser s
p Token
t
    Token
TEOF -> do
      ST s Bool -> ST s () -> ST s ()
forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
unlessM (Parser s -> BS -> ST s Bool
forall s. Parser s -> BS -> ST s Bool
currentNodeHasHTMLType Parser s
p BS
"html") (ST s () -> ST s ()) -> ST s () -> ST s ()
forall a b. (a -> b) -> a -> b
$
        BS -> ST s ()
warn BS
"current node is not html"
      Parser s -> ST s ()
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 =
      Parser s -> Maybe Token -> BS -> ST s ()
forall s. Parser s -> Maybe Token -> BS -> ST s ()
parseError Parser s
p (Token -> Maybe Token
forall a. a -> Maybe a
Just Token
t) (BS -> ST s ()) -> BS -> ST s ()
forall a b. (a -> b) -> a -> b
$ BS
"in frameset " BS -> BS -> BS
forall a. Semigroup a => a -> a -> a
<> BS
x

-- | Handle the after-frameset insertion mode.
doModeAfterFrameset :: Parser s -> Token -> ST s ()
doModeAfterFrameset :: 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 ->
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
insertChar Parser s
p Token
t
    TComment {} ->
      Parser s -> Token -> ST s ()
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" } ->
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
doModeInBody Parser s
p Token
t
    TEnd { tEndName :: Token -> BS
tEndName = BS
"html" } ->
      Parser s -> ParserMode -> ST s ()
forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeAfterAfterFrameset
    TStart { tStartName :: Token -> BS
tStartName = BS
"noframes" } ->
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
doModeInHead Parser s
p Token
t
    Token
TEOF ->
      Parser s -> ST s ()
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 =
        Parser s -> Maybe Token -> BS -> ST s ()
forall s. Parser s -> Maybe Token -> BS -> ST s ()
parseError Parser s
p (Token -> Maybe Token
forall a. a -> Maybe a
Just Token
t) (BS -> ST s ()) -> BS -> ST s ()
forall a b. (a -> b) -> a -> b
$ BS
"after frameset " BS -> BS -> BS
forall a. Semigroup a => a -> a -> a
<> BS
x

-- | Handle the after-after-body insertion mode.
doModeAfterAfterBody :: Parser s -> Token -> ST s ()
doModeAfterAfterBody :: 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 {} ->
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
insertDocComment Parser s
p Token
t
    TDoctype {} ->
      Parser s -> Token -> ST s ()
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 ->
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
doModeInBody Parser s
p Token
t
    TStart { tStartName :: Token -> BS
tStartName = BS
"html" } ->
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
doModeInBody Parser s
p Token
t
    Token
TEOF ->
      Parser s -> ST s ()
forall s. Parser s -> ST s ()
parserSetDone Parser s
p
    Token
_otherwise -> do
      BS -> ST s ()
warn BS
"unexpected token"
      Parser s -> ParserMode -> ST s ()
forall s. Parser s -> ParserMode -> ST s ()
setMode Parser s
p ParserMode
ModeInBody
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
reprocess Parser s
p Token
t
    where
      warn :: BS -> ST s ()
warn BS
x =
        Parser s -> Maybe Token -> BS -> ST s ()
forall s. Parser s -> Maybe Token -> BS -> ST s ()
parseError Parser s
p (Token -> Maybe Token
forall a. a -> Maybe a
Just Token
t) (BS -> ST s ()) -> BS -> ST s ()
forall a b. (a -> b) -> a -> b
$ BS
"after after body " BS -> BS -> BS
forall a. Semigroup a => a -> a -> a
<> BS
x

-- | Handle the after-after-frameset insertion mode.
doModeAfterAfterFrameset :: Parser s -> Token -> ST s ()
doModeAfterAfterFrameset :: 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 {} ->
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
insertDocComment Parser s
p Token
t
    TDoctype {} ->
      Parser s -> Token -> ST s ()
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 ->
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
doModeInBody Parser s
p Token
t
    TStart { tStartName :: Token -> BS
tStartName = BS
"html" } ->
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
doModeInBody Parser s
p Token
t
    Token
TEOF ->
      Parser s -> ST s ()
forall s. Parser s -> ST s ()
parserSetDone Parser s
p
    TStart { tStartName :: Token -> BS
tStartName = BS
"noframes" } ->
      Parser s -> Token -> ST s ()
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 =
        Parser s -> Maybe Token -> BS -> ST s ()
forall s. Parser s -> Maybe Token -> BS -> ST s ()
parseError Parser s
p (Token -> Maybe Token
forall a. a -> Maybe a
Just Token
t) (BS -> ST s ()) -> BS -> ST s ()
forall a b. (a -> b) -> a -> b
$ BS
"after after frameset " BS -> BS -> BS
forall a. Semigroup a => a -> a -> a
<> BS
x

-- | Handle foreign content.
doForeignContent :: Parser s -> Token -> ST s ()
doForeignContent :: 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 ->
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
insertChar Parser s
p Token
t
    TChar {} -> do
      Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
insertChar Parser s
p Token
t
      Parser s -> ST s ()
forall s. Parser s -> ST s ()
frameSetNotOK Parser s
p
    TComment {} ->
      Parser s -> Token -> ST s ()
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 } | BS -> [BS] -> Bool
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 BS -> BS -> Bool
forall a. Eq a => a -> a -> Bool
== BS
"font" Bool -> Bool -> Bool
&&
         (BS -> Bool) -> [BS] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any ((BS -> Token -> Bool) -> Token -> BS -> Bool
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"
      STRef s Bool -> ST s Bool
forall s a. STRef s a -> ST s a
rref STRef s Bool
parserFragmentMode ST s Bool -> (Bool -> ST s ()) -> ST s ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
        Bool
True ->
          ST s ()
anyOtherStartTag
        Bool
False -> do
          Parser s -> ST s ()
forall s. Parser s -> ST s ()
elementStackPop Parser s
p
          Parser s -> (DOMNode -> Bool) -> ST s ()
forall s. Parser s -> (DOMNode -> Bool) -> ST s ()
elementStackPopWhile Parser s
p ((DOMNode -> Bool) -> ST s ()) -> (DOMNode -> Bool) -> ST s ()
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)
          Parser s -> Token -> ST s ()
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 <- Bool -> (DOMNode -> Bool) -> Maybe DOMNode -> Bool
forall b a. b -> (a -> b) -> Maybe a -> b
maybe Bool
False (DOMType -> DOMType -> Bool
forall a. Eq a => a -> a -> Bool
(==) DOMType
a (DOMType -> Bool) -> (DOMNode -> DOMType) -> DOMNode -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. DOMNode -> DOMType
domNodeType) (Maybe DOMNode -> Bool) -> ST s (Maybe DOMNode) -> ST s Bool
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser s -> ST s (Maybe DOMNode)
forall s. Parser s -> ST s (Maybe DOMNode)
currentNode Parser s
p
      if BS
n BS -> BS -> Bool
forall a. Eq a => a -> a -> Bool
== BS
s Bool -> Bool -> Bool
&& Bool
svg
      then ST s ()
doScriptEndTag
      else do
        DOMNode
node <- Maybe DOMNode -> DOMNode
forall a. HasCallStack => Maybe a -> a
fromJust (Maybe DOMNode -> DOMNode) -> ST s (Maybe DOMNode) -> ST s DOMNode
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser s -> ST s (Maybe DOMNode)
forall s. Parser s -> ST s (Maybe DOMNode)
currentNode Parser s
p
        let h :: DOMNode -> BS
h = BS -> BS
bsLower (BS -> BS) -> (DOMNode -> BS) -> DOMNode -> BS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. DOMNode -> BS
domNodeElementName
            nodeName :: BS
nodeName = DOMNode -> BS
h DOMNode
node
        Bool -> ST s () -> ST s ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (BS
nodeName BS -> BS -> Bool
forall a. Eq a => a -> a -> Bool
/= BS
n) (ST s () -> ST s ()) -> ST s () -> ST s ()
forall a b. (a -> b) -> a -> b
$
          BS -> ST s ()
warn (BS -> ST s ()) -> BS -> ST s ()
forall a b. (a -> b) -> a -> b
$
            BS
"bad end tag in foreign content ("
            BS -> BS -> BS
forall a. Semigroup a => a -> a -> a
<> BS
nodeName BS -> BS -> BS
forall a. Semigroup a => a -> a -> a
<> BS
" /= " BS -> BS -> BS
forall a. Semigroup a => a -> a -> a
<> String -> BS
bcPack (BS -> String
forall a. Show a => a -> String
show BS
n) BS -> BS -> BS
forall a. Semigroup a => a -> a -> a
<> BS
")"
        let f :: [DOMNode] -> ST s ()
f (DOMNode
x:[]) = () -> ST s ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
            f (DOMNode
x:DOMNode
y:[DOMNode]
ys)
              | DOMNode -> BS
h DOMNode
x BS -> BS -> Bool
forall a. Eq a => a -> a -> Bool
== BS
n =
                  Parser s -> DOMID -> ST s ()
forall s. Parser s -> DOMID -> ST s ()
elementStackPopUntilID Parser s
p (DOMID -> ST s ()) -> DOMID -> ST s ()
forall a b. (a -> b) -> a -> b
$ DOMNode -> DOMID
domNodeID DOMNode
node
              | DOMNode -> Bool
domNodeIsHTML DOMNode
y =
                  Parser s -> Token -> ST s ()
forall s. Parser s -> Token -> ST s ()
doHtmlContent Parser s
p Token
t
              | Bool
otherwise =
                  [DOMNode] -> ST s ()
f (DOMNode
yDOMNode -> [DOMNode] -> [DOMNode]
forall a. a -> [a] -> [a]
:[DOMNode]
ys)
        Parser s -> ST s [DOMNode]
forall s. Parser s -> ST s [DOMNode]
elementStackNodes Parser s
p ST s [DOMNode] -> ([DOMNode] -> ST s ()) -> ST s ()
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) <- Parser s -> ST s (Maybe DOMNode)
forall s. Parser s -> ST s (Maybe DOMNode)
adjustedCurrentNode Parser s
p ST s (Maybe DOMNode)
-> (Maybe DOMNode -> ST s (Token, HTMLNamespace))
-> ST s (Token, HTMLNamespace)
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
        Just DOMNode
a
          | DOMNode -> Bool
domNodeIsMathML DOMNode
a ->
              (Token, HTMLNamespace) -> ST s (Token, HTMLNamespace)
forall (f :: * -> *) a. Applicative f => a -> f a
pure ( Token -> Token
adjustAttrMathML Token
t
                   , DOMNode -> HTMLNamespace
domNodeElementNamespace DOMNode
a
                   )
          | DOMNode -> Bool
domNodeIsSVG DOMNode
a ->
              (Token, HTMLNamespace) -> ST s (Token, HTMLNamespace)
forall (f :: * -> *) a. Applicative f => a -> f a
pure ( Token -> Token
adjustElemSVG (Token -> Token) -> Token -> Token
forall a b. (a -> b) -> a -> b
$ Token -> Token
adjustAttrSVG Token
t
                   , DOMNode -> HTMLNamespace
domNodeElementNamespace DOMNode
a
                   )
        Maybe DOMNode
Nothing ->
          (Token, HTMLNamespace) -> ST s (Token, HTMLNamespace)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Token
t, HTMLNamespace
HTMLNamespaceHTML)
      Parser s -> HTMLNamespace -> Token -> ST s ()
forall s. Parser s -> HTMLNamespace -> Token -> ST s ()
insertForeignElement Parser s
p HTMLNamespace
n (Token -> ST s ()) -> Token -> ST s ()
forall a b. (a -> b) -> a -> b
$ Token -> Token
adjustAttrForeign Token
t'
      Bool -> ST s () -> ST s ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Token -> Bool
tStartClosed Token
t) (ST s () -> ST s ()) -> ST s () -> ST s ()
forall a b. (a -> b) -> a -> b
$ do
        Bool
svg <- Bool -> (DOMNode -> Bool) -> Maybe DOMNode -> Bool
forall b a. b -> (a -> b) -> Maybe a -> b
maybe Bool
False DOMNode -> Bool
domNodeIsSVG (Maybe DOMNode -> Bool) -> ST s (Maybe DOMNode) -> ST s Bool
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser s -> ST s (Maybe DOMNode)
forall s. Parser s -> ST s (Maybe DOMNode)
currentNode Parser s
p
        if Token -> BS
tStartName Token
t BS -> BS -> Bool
forall a. Eq a => a -> a -> Bool
== BS
"script" Bool -> Bool -> Bool
&& Bool
svg
        then do
          Parser s -> ST s ()
forall s. Parser s -> ST s ()
selfClosingAcknowledge Parser s
p
          ST s ()
doScriptEndTag
        else do
          Parser s -> ST s ()
forall s. Parser s -> ST s ()
elementStackPop Parser s
p
          Parser s -> ST s ()
forall s. Parser s -> ST s ()
selfClosingAcknowledge Parser s
p
    doScriptEndTag :: ST s ()
doScriptEndTag = do
      Parser s -> ST s ()
forall s. Parser s -> ST s ()
elementStackPop Parser s
p
    warn :: BS -> ST s ()
warn BS
x =
      Parser s -> Maybe Token -> BS -> ST s ()
forall s. Parser s -> Maybe Token -> BS -> ST s ()
parseError Parser s
p (Token -> Maybe Token
forall a. a -> Maybe a
Just Token
t) (BS -> ST s ()) -> BS -> ST s ()
forall a b. (a -> b) -> a -> b
$ BS
"foreign content " BS -> BS -> BS
forall a. Semigroup a => a -> a -> a
<> BS
x