module Html.ToString (toString) where import Data.Array as Array import Data.Map as Map import Data.Maybe as Maybe import Data.String as String import Data.String.NonEmpty (NonEmptyString) import Data.String.NonEmpty as NonEmptyString import Data.Tuple as Tuple import Html.Data as Data import Prelude as Prelude escapeInHtml :: String -> String escapeInHtml text = String.replaceAll (String.Pattern "`") (String.Replacement "`") ( String.replaceAll (String.Pattern "'") (String.Replacement "'") ( String.replaceAll (String.Pattern "\"") (String.Replacement """) ( String.replaceAll (String.Pattern "<") (String.Replacement "<") ( String.replaceAll (String.Pattern ">") (String.Replacement ">") (String.replaceAll (String.Pattern "&") (String.Replacement "&") text) ) ) ) ) -- | 文字列の HTML を生成する. -- | ```html -- | -- | ``` -- | を先頭に結合する toString :: Data.RawHtmlElement -> String toString htmlElement = Prelude.append "" (htmlElementToString htmlElement) htmlElementToString :: Data.RawHtmlElement -> String htmlElementToString (Data.RawHtmlElement element) = let startTag = String.joinWith "" [ "<" , NonEmptyString.toString element.name , attributesToString (element.attributes) , ">" ] endTag = String.joinWith "" [ "" ] in String.joinWith "" ( Array.concat [ [ startTag ] , case element.children of Data.ElementList list -> [ String.joinWith "" (Prelude.map htmlElementToString list) , endTag ] Data.Text text -> [ escapeInHtml text, endTag ] Data.RawText text -> [ text, endTag ] Data.NoEndTag -> [] ] ) attributesToString :: Map.Map NonEmptyString (Maybe.Maybe String) -> String attributesToString attributeMap = if Map.isEmpty attributeMap then "" else Prelude.append " " ( String.joinWith " " ( Prelude.map ( \(Tuple.Tuple key value) -> case value of Maybe.Just v -> String.joinWith "" [ NonEmptyString.toString key , "=\"" , escapeInHtml v , "\"" ] Maybe.Nothing -> NonEmptyString.toString key ) (Map.toUnfoldable attributeMap) ) )