{-# LANGUAGE OverloadedStrings #-}

-- |
-- Module      :  Gemoire.Converter.Web
-- Copyright   :  (c) 2025 Sena
-- License     :  GPL-3.0-or-later
--
-- Maintainer  :  contact@sena.pink
-- Stability   :  stable
-- Portability :  portable
--
-- Default configuration and templates for Gemini to HTML conversion
module Gemoire.Converter.Web
    ( -- * Defaults
      defWebConversion
    , escapeContent
    , escapeAttr
    , defDocument
    , defText
    , defLink
    , defH1
    , defH2
    , defH3
    , defList
    , defListItem
    , defQuote
    , defPre
    ) where

import Data.HashMap.Strict (empty)
import Data.Text (Text)
import qualified Data.Text as T

import Gemoire.Converter.Types (Conversion (..))
import Gemoire.Template (Template, template)

defWebConversion :: Conversion
defWebConversion :: Conversion
defWebConversion =
    Conversion
        { targetExtension :: String
targetExtension = String
".html"
        , escaper :: Text -> Text
escaper = Text -> Text
escapeContent
        , preEscaper :: Text -> Text
preEscaper = Text -> Text
escapeContent
        , attrEscaper :: Text -> Text
attrEscaper = Text -> Text
escapeAttr
        , documentTemplate :: Template
documentTemplate = Template
defDocument
        , textTemplate :: Template
textTemplate = Template
defText
        , linkTemplate :: Template
linkTemplate = Template
defLink
        , h1Template :: Template
h1Template = Template
defH1
        , h2Template :: Template
h2Template = Template
defH2
        , h3Template :: Template
h3Template = Template
defH3
        , listTemplates :: (Template, Template)
listTemplates = (Template
defList, Template
defListItem)
        , quoteTemplate :: Template
quoteTemplate = Template
defQuote
        , preTemplate :: Template
preTemplate = Template
defPre
        , rewriteRules :: [RewriteRule]
rewriteRules = []
        , conversionOverrides :: Values
conversionOverrides = Values
forall k v. HashMap k v
empty
        }

escapeContent :: Text -> Text
escapeContent :: Text -> Text
escapeContent = HasCallStack => Text -> Text -> Text -> Text
Text -> Text -> Text -> Text
T.replace Text
">" Text
">" (Text -> Text) -> (Text -> Text) -> Text -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HasCallStack => Text -> Text -> Text -> Text
Text -> Text -> Text -> Text
T.replace Text
"<" Text
"&lt;" (Text -> Text) -> (Text -> Text) -> Text -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HasCallStack => Text -> Text -> Text -> Text
Text -> Text -> Text -> Text
T.replace Text
"&" Text
"&amp;"

escapeAttr :: Text -> Text
escapeAttr :: Text -> Text
escapeAttr = HasCallStack => Text -> Text -> Text -> Text
Text -> Text -> Text -> Text
T.replace Text
"'" Text
"&#39;" (Text -> Text) -> (Text -> Text) -> Text -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HasCallStack => Text -> Text -> Text -> Text
Text -> Text -> Text -> Text
T.replace Text
"\"" Text
"&quot;" (Text -> Text) -> (Text -> Text) -> Text -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HasCallStack => Text -> Text -> Text -> Text
Text -> Text -> Text -> Text
T.replace Text
"&" Text
"&amp;"

defDocument :: Template
defDocument :: Template
defDocument =
    Text -> Template
template (Text -> Template) -> ([Text] -> Text) -> [Text] -> Template
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Text] -> Text
T.unlines ([Text] -> Template) -> [Text] -> Template
forall a b. (a -> b) -> a -> b
$
        [ Text
"<!DOCTYPE html>"
        , Text
"<html>"
        , Text
"  <head>"
        , Text
"    <title>{&title:fname&}</title>"
        , Text
"  </head>"
        , Text
"  <body>"
        , Text
""
        , Text
"{$body$}"
        , Text
""
        , Text
"  </body>"
        , Text
"</html>"
        ]

defText :: Template
defText :: Template
defText = Text -> Template
template Text
"<p>{$text$}</p>"

defLink :: Template
defLink :: Template
defLink = Text -> Template
template Text
"<a href=\"{$link$}\">{&description:link&}</a>"

defH1 :: Template
defH1 :: Template
defH1 = Text -> Template
template Text
"<h1>{$text$}</h1>"

defH2 :: Template
defH2 :: Template
defH2 = Text -> Template
template Text
"<h2>{$text$}</h2>"

defH3 :: Template
defH3 :: Template
defH3 = Text -> Template
template Text
"<h3>{$text$}</h3>"

defList :: Template
defList :: Template
defList =
    Text -> Template
template (Text -> Template) -> ([Text] -> Text) -> [Text] -> Template
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> [Text] -> Text
T.intercalate Text
"\LF" ([Text] -> Template) -> [Text] -> Template
forall a b. (a -> b) -> a -> b
$
        [ Text
"<ul>"
        , Text
"{$items$}"
        , Text
"</ul>"
        ]

defListItem :: Template
defListItem :: Template
defListItem = Text -> Template
template Text
"  <li>{$text$}</li>"

defQuote :: Template
defQuote :: Template
defQuote =
    Text -> Template
template (Text -> Template) -> ([Text] -> Text) -> [Text] -> Template
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> [Text] -> Text
T.intercalate Text
"\LF" ([Text] -> Template) -> [Text] -> Template
forall a b. (a -> b) -> a -> b
$
        [ Text
"<blockquote>"
        , Text
"  {$text$}"
        , Text
"</blockquote>"
        ]

defPre :: Template
defPre :: Template
defPre =
    Text -> Template
template (Text -> Template) -> ([Text] -> Text) -> [Text] -> Template
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> [Text] -> Text
T.intercalate Text
"\LF" ([Text] -> Template) -> [Text] -> Template
forall a b. (a -> b) -> a -> b
$
        [ Text
"<pre title=\"{$alt$}\">"
        , Text
"{$text$}"
        , Text
"</pre>"
        ]