-- | Module    : Html.Intl
-- Copyright   : (c) Joshua Obritsch, 2021
-- License     : MIT
-- Maintainer  : joshua@obritsch.com
-- Stability   : Experimental
--
-- The "Html.Intl" module provides a set of functions for internationalization in HTML.
module Html.Intl
    ( -- * Internationalization
      -- ** translate
      translate
      -- ** intl
    , intl
    ) where


import Data.Text.Lazy.Builder (Builder)
import Html (Html(..), Translatable)


-- INTERNATIONALIZATION


-- | Converts all multilingual HTML text nodes to simple HTML text nodes given a target language and HTML.
translate :: Translatable a => (a -> Builder) -> Html a -> Html a
translate :: forall a. Translatable a => (a -> Builder) -> Html a -> Html a
translate a -> Builder
lang Html a
html = case Html a
html of
    ParentNode Builder
startTag Builder
endTag [Attribute]
attributes [Html a]
children -> forall lng.
Builder -> Builder -> [Attribute] -> [Html lng] -> Html lng
ParentNode Builder
startTag Builder
endTag [Attribute]
attributes (forall a b. (a -> b) -> [a] -> [b]
map (forall a. Translatable a => (a -> Builder) -> Html a -> Html a
translate a -> Builder
lang) [Html a]
children)
    RootNode   Builder
startTag                   [Html a]
children -> forall lng. Builder -> [Html lng] -> Html lng
RootNode   Builder
startTag                   (forall a b. (a -> b) -> [a] -> [b]
map (forall a. Translatable a => (a -> Builder) -> Html a -> Html a
translate a -> Builder
lang) [Html a]
children)
    LeafNode   Builder
startTag        [Attribute]
attributes          -> forall lng. Builder -> [Attribute] -> Html lng
LeafNode   Builder
startTag        [Attribute]
attributes
    TextNode   Builder
text                                -> forall lng. Builder -> Html lng
TextNode   Builder
text
    IntlNode   a
intl                                -> forall lng. Builder -> Html lng
TextNode   Builder
text
      where text :: Builder
text = a -> Builder
lang a
intl


-- | Generates a multilingual HTML text node given a set of languages.
intl :: Translatable a => a -> Html a
intl :: forall a. Translatable a => a -> Html a
intl = forall a. Translatable a => a -> Html a
IntlNode
{-# INLINE intl #-}