{-|
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) :
   []