{-# LANGUAGE OverloadedStrings #-} {-| Description: Token processing rules within a @\@ section providing a fragment for script processing. Copyright: (c) 2020 Sam May License: MPL-2.0 Maintainer: ag.eitilt@gmail.com Stability: stable Portability: portable -} module Web.Mangrove.Parse.Tree.InTemplate ( treeInTemplate ) where import Web.Mangrove.Parse.Common.Error import Web.Mangrove.Parse.Tree.Common import Web.Mangrove.Parse.Tree.InHead import Web.Mangrove.Parse.Tree.Patch import Web.Willow.Common.Parser import Web.Willow.Common.Parser.Switch import {-# SOURCE #-} Web.Mangrove.Parse.Tree.InBody -- | __HTML:__ -- @[the "in template" insertion mode] -- (https://html.spec.whatwg.org/multipage/parsing.html#parsing-main-intemplate)@ -- -- The parsing instructions corresponding to the 'InTemplate' section of the -- state machine. treeInTemplate :: TreeBuilder TreeOutput treeInTemplate = next >>= switch [ If isCharacter $ \t' -> do push t' treeInBody , If isComment $ \t' -> do push t' treeInBody , If isDoctype $ \t' -> do push t' treeInBody , If (isStartTag [ "base" , "basefont" , "bgsound" , "link" , "meta" , "noframes" , "script" , "style" , "template" , "title" ]) $ \t' -> do push t' treeInHead , If (isEndTag ["template"]) $ \t' -> do push t' treeInHead , If (isStartTag [ "caption" , "colgroup" , "tbody" , "tfoot" , "thead" ]) $ \t' -> do push t' _ <- popTemplateMode pushTemplateMode InTable switchMode InTable packTree_ [] , If (isStartTag ["col"]) $ \t' -> do push t' popTemplateMode pushTemplateMode InColumnGroup switchMode InColumnGroup packTree_ [] , If (isStartTag ["tr"]) $ \t' -> do push t' popTemplateMode pushTemplateMode InTableBody switchMode InTableBody packTree_ [] , If (isStartTag ["td", "th"]) $ \t' -> do push t' popTemplateMode pushTemplateMode InRow switchMode InRow packTree_ [] , If isAnyStartTag $ \t' -> do push t' popTemplateMode pushTemplateMode InBody switchMode InBody packTree_ [] , If isAnyEndTag $ \t' -> packTreeErrors [UnmatchedEndTag $ tokenElement t'] t' , If isEOF $ \t' -> do hasTemplate <- hasOpenElement ["template"] if hasTemplate then do push t' close <- closeElement "template" clearFormattingElements popTemplateMode resetInsertionMode packTree_ close else stopParsing t' ]