{-| This parser emits the data structure of the original tagsoup package by Neil Mitchell. -} module Text.HTML.TagSoup.HT.ParserNM ( runSoup, ) where import qualified Text.HTML.TagSoup as TagSoup import qualified Text.HTML.TagSoup.HT.Tag as Custom import qualified Text.HTML.TagSoup.HT.PositionTag as PosTag import qualified Text.HTML.TagSoup.HT.Parser as Parser import qualified Text.HTML.TagSoup.HT.Position as Position import Data.Accessor.Basic ((^.), ) runSoup :: String -> [TagSoup.Tag] runSoup = concatMap convertTag . Parser.runSoupWithPositions convertTag :: PosTag.T Char -> [TagSoup.Tag] convertTag (pos,tag) = TagSoup.TagPosition (pos ^. Position.row) (pos ^. Position.column) : (case tag of Custom.Open name attrs -> TagSoup.TagOpen name attrs Custom.Close name -> TagSoup.TagClose name Custom.Text text -> TagSoup.TagText text Custom.Comment text -> TagSoup.TagComment text Custom.Special name content -> TagSoup.TagOpen ('!':name) [("",content)] Custom.Processing name p -> TagSoup.TagOpen ('?':name) $ case p of Custom.KnownProcessing attrs -> attrs Custom.UnknownProcessing content -> [("",content)] Custom.Warning text -> TagSoup.TagWarning text) : []