module Xmlbf.XmlHtml
( element
, element'
, nodesXml
, nodesHtml
) where
import Control.Monad ((>=>))
import qualified Data.ByteString as B
import qualified Data.HashMap.Strict as HM
import Data.Maybe (catMaybes)
import qualified Text.XmlHtml as XmlHtml
import qualified Xmlbf
element
:: XmlHtml.Node
-> Either String Xmlbf.Node
element = element' >=> \case
Just x -> Right x
Nothing -> Left "Comments not supported"
element'
:: XmlHtml.Node
-> Either String (Maybe Xmlbf.Node)
element' = \case
XmlHtml.Comment _ -> Right Nothing
XmlHtml.TextNode t -> Right (Just (Xmlbf.text t))
XmlHtml.Element t as cs -> do
cs' <- catMaybes <$> traverse element' cs
Just <$> Xmlbf.element t (HM.fromList as) cs'
nodesXml
:: B.ByteString
-> Either String [Xmlbf.Node]
nodesXml = \bs -> case XmlHtml.parseXML "xmlbf-xmlhtml-input.xml" bs of
Left e -> Left ("Malformed XML: " ++ show e)
Right d -> catMaybes <$> traverse element' (XmlHtml.docContent d)
nodesHtml
:: B.ByteString
-> Either String [Xmlbf.Node]
nodesHtml = \bs -> case XmlHtml.parseHTML "xmlbf-xmlhtml-input.html" bs of
Left e -> Left ("Malformed HTML: " ++ show e)
Right d -> catMaybes <$> traverse element' (XmlHtml.docContent d)