{-# LANGUAGE LambdaCase #-}
module Xmlbf.XmlHtml
( fromXmlHtmlNode
, fromRawXml
, fromRawHtml
) where
import qualified Data.ByteString as B
import qualified Data.HashMap.Strict as HM
import qualified Data.Text.Lazy as TL
import qualified Text.XmlHtml as XmlHtml
import qualified Xmlbf
fromXmlHtmlNode
:: XmlHtml.Node
-> Either String Xmlbf.Node
fromXmlHtmlNode = \case
XmlHtml.Comment _ -> Left "Comments not supported"
XmlHtml.TextNode t -> Xmlbf.text' (TL.fromStrict t)
XmlHtml.Element t as cs -> do
cs' <- traverse fromXmlHtmlNode cs
Xmlbf.element' t (HM.fromList as) cs'
fromRawXml
:: B.ByteString
-> Either String [Xmlbf.Node]
fromRawXml = \bs -> case XmlHtml.parseXML "xmlbf-xmlhtml-input.xml" bs of
Left e -> Left ("Malformed XML: " ++ e)
Right d -> traverse fromXmlHtmlNode (XmlHtml.docContent d)
fromRawHtml
:: B.ByteString
-> Either String [Xmlbf.Node]
fromRawHtml = \bs -> case XmlHtml.parseHTML "xmlbf-xmlhtml-input.html" bs of
Left e -> Left ("Malformed HTML: " ++ e)
Right d -> traverse fromXmlHtmlNode (XmlHtml.docContent d)