module HTMLEntities.Builder (char, text) where

import qualified Data.Text as Text
import qualified Data.Text.Lazy.Builder as Text (Builder)
import qualified Data.Text.Lazy.Builder as Text.Builder
import HTMLEntities.Prelude

-- |
-- HTML-encodes the given char into a text builder.
char :: Char -> Text.Builder
char :: Char -> Builder
char Char
c =
  Builder -> Maybe Builder -> Builder
forall a. a -> Maybe a -> a
fromMaybe (Char -> Builder
Text.Builder.singleton Char
c) (Maybe Builder -> Builder) -> Maybe Builder -> Builder
forall a b. (a -> b) -> a -> b
$
    Char -> [(Char, Builder)] -> Maybe Builder
forall a b. Eq a => a -> [(a, b)] -> Maybe b
lookup Char
c [(Char, Builder)]
entitiesTable

-- |
-- HTML-encodes the given text into a text builder.
--
-- >>> Data.Text.Lazy.IO.putStrLn $ Data.Text.Lazy.Builder.toLazyText $ text "<a href=\"\">"
-- &lt;a href=&quot;&quot;&gt;
text :: Text -> Text.Builder
text :: Text -> Builder
text =
  (Char -> Builder -> Builder) -> Builder -> Text -> Builder
forall a. (Char -> a -> a) -> a -> Text -> a
Text.foldr (\Char
c Builder
b -> Char -> Builder
char Char
c Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Builder
b) Builder
forall a. Monoid a => a
mempty

{-# NOINLINE entitiesTable #-}
entitiesTable :: [(Char, Text.Builder)]
entitiesTable :: [(Char, Builder)]
entitiesTable =
  [ (Char
'<', Builder
"&lt;"),
    (Char
'>', Builder
"&gt;"),
    (Char
'&', Builder
"&amp;"),
    (Char
'"', Builder
"&quot;"),
    (Char
'\'', Builder
"&#39;")
  ]