module Text.HTML.TagSoup.HT.ParserNM (
runSoup,
) where
import qualified Text.HTML.TagSoup as TagSoup
import qualified Text.HTML.TagSoup.HT.Parser as Parser
import qualified Text.HTML.TagSoup.HT.Tag as Custom
import qualified Text.HTML.TagSoup.HT.PositionTag as PosTag
import qualified Text.XML.Basic.Position as Position
import qualified Text.XML.Basic.ProcessingInstruction as PI
import qualified Text.XML.Basic.Attribute as Attr
import qualified Text.XML.Basic.Name as Name
import qualified Text.XML.Basic.Name.MixedCase as NameMC
import Data.Accessor.Basic ((^.), )
runSoup :: String -> [TagSoup.Tag]
runSoup =
concatMap convertTag .
(\x -> x :: [PosTag.T NameMC.T String]) .
Parser.runSoupWithPositions
convertTag ::
(Name.Tag name, Name.Attribute name) =>
PosTag.T name String -> [TagSoup.Tag]
convertTag (PosTag.Cons pos tag) =
TagSoup.TagPosition (pos ^. Position.row) (pos ^. Position.column) :
(case tag of
Custom.Open name attrs ->
TagSoup.TagOpen (Name.toString name) (map Attr.toPair attrs)
Custom.Close name ->
TagSoup.TagClose (Name.toString name)
Custom.Text text ->
TagSoup.TagText text
Custom.Comment text ->
TagSoup.TagComment text
Custom.Special name content ->
TagSoup.TagOpen ('!' : Name.toString name) [("",content)]
Custom.Processing name p ->
TagSoup.TagOpen ('?' : Name.toString name) $
case p of
PI.Known attrs -> map Attr.toPair attrs
PI.Unknown content -> [("",content)]
Custom.Warning text -> TagSoup.TagWarning text) :
[]