module Language.Drasil.HTML.Helpers where
import Prelude hiding ((<>))
import Text.PrettyPrint (Doc, text, empty, ($$), (<>), (<+>), vcat, hcat, nest,
cat, hcat)
import Data.List (intersperse)
import Language.Drasil hiding (Expr)
import Language.Drasil.Printing.AST (Expr)
html, headTag, body, title, paragraph, code, tr, th, td, figure,
figcaption, li, pa, ba :: Doc -> Doc
html :: Doc -> Doc
html = String -> [String] -> Doc -> Doc
wrap "html" []
headTag :: Doc -> Doc
headTag = String -> [String] -> Doc -> Doc
wrap "head" []
body :: Doc -> Doc
body = String -> [String] -> Doc -> Doc
wrap "body" []
title :: Doc -> Doc
title = String -> [String] -> Doc -> Doc
wrap "title" []
paragraph :: Doc -> Doc
paragraph = String -> [String] -> Doc -> Doc
wrap "p" ["paragraph"]
code :: Doc -> Doc
code = String -> [String] -> Doc -> Doc
wrap "code" ["code"]
tr :: Doc -> Doc
tr = String -> [String] -> Doc -> Doc
wrap "tr" []
th :: Doc -> Doc
th = String -> [String] -> Doc -> Doc
wrap "th" []
td :: Doc -> Doc
td = String -> [String] -> Doc -> Doc
wrap "td" []
figure :: Doc -> Doc
figure = String -> [String] -> Doc -> Doc
wrap "figure" []
figcaption :: Doc -> Doc
figcaption = String -> [String] -> Doc -> Doc
wrap "figcaption" []
li :: Doc -> Doc
li = String -> [String] -> Doc -> Doc
wrap "li" []
pa :: Doc -> Doc
pa = String -> [String] -> Doc -> Doc
wrap "p" []
ba :: Doc -> Doc
ba = String -> [String] -> Doc -> Doc
wrap "b" []
ol, ul, table :: [String] -> Doc -> Doc
ol :: [String] -> Doc -> Doc
ol = String -> [String] -> Doc -> Doc
wrap "ol"
ul :: [String] -> Doc -> Doc
ul = String -> [String] -> Doc -> Doc
wrap "ul"
table :: [String] -> Doc -> Doc
table = String -> [String] -> Doc -> Doc
wrap "table"
img :: [(String, Doc)] -> Doc
img :: [(String, Doc)] -> Doc
img = String -> [(String, Doc)] -> Doc
wrapInside "img"
h :: Int -> Doc -> Doc
h :: Int -> Doc -> Doc
h n :: Int
n | Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< 1 = String -> Doc -> Doc
forall a. HasCallStack => String -> a
error "Illegal header (too small)"
| Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> 7 = String -> Doc -> Doc
forall a. HasCallStack => String -> a
error "Illegal header (too large)"
| Bool
otherwise = String -> [String] -> Doc -> Doc
wrap ("h" String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
n) []
data Variation = Class | Id
wrap :: String -> [String] -> Doc -> Doc
wrap :: String -> [String] -> Doc -> Doc
wrap a :: String
a = Variation -> String -> Doc -> [String] -> Doc -> Doc
wrapGen Variation
Class String
a Doc
empty
wrap' :: String -> [String] -> Doc -> Doc
wrap' :: String -> [String] -> Doc -> Doc
wrap' a :: String
a = ([Doc] -> Doc)
-> Variation -> String -> Doc -> [String] -> Doc -> Doc
wrapGen' [Doc] -> Doc
hcat Variation
Class String
a Doc
empty
wrapGen' :: ([Doc] -> Doc) -> Variation -> String -> Doc -> [String] -> Doc -> Doc
wrapGen' :: ([Doc] -> Doc)
-> Variation -> String -> Doc -> [String] -> Doc -> Doc
wrapGen' sepf :: [Doc] -> Doc
sepf _ s :: String
s _ [] = \x :: Doc
x ->
let tb :: String -> Doc
tb c :: String
c = String -> Doc
text (String -> Doc) -> String -> Doc
forall a b. (a -> b) -> a -> b
$ "<" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
c String -> String -> String
forall a. [a] -> [a] -> [a]
++ ">"
in [Doc] -> Doc
sepf [String -> Doc
tb String
s, Doc -> Doc
indent Doc
x, String -> Doc
tb (String -> Doc) -> String -> Doc
forall a b. (a -> b) -> a -> b
$ '/'Char -> String -> String
forall a. a -> [a] -> [a]
:String
s]
wrapGen' sepf :: [Doc] -> Doc
sepf Class s :: String
s _ ts :: [String]
ts = \x :: Doc
x ->
let tb :: String -> Doc
tb c :: String
c = String -> Doc
text (String -> Doc) -> String -> Doc
forall a b. (a -> b) -> a -> b
$ "<" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
c String -> String -> String
forall a. [a] -> [a] -> [a]
++ " class=\"" String -> String -> String
forall a. [a] -> [a] -> [a]
++ (String -> String -> String) -> [String] -> String
forall (t :: * -> *) a. Foldable t => (a -> a -> a) -> t a -> a
foldr1 String -> String -> String
forall a. [a] -> [a] -> [a]
(++) (String -> [String] -> [String]
forall a. a -> [a] -> [a]
intersperse " " [String]
ts) String -> String -> String
forall a. [a] -> [a] -> [a]
++ "\">"
in let te :: String -> Doc
te c :: String
c = String -> Doc
text (String -> Doc) -> String -> Doc
forall a b. (a -> b) -> a -> b
$ "</" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
c String -> String -> String
forall a. [a] -> [a] -> [a]
++ ">"
in [Doc] -> Doc
sepf [String -> Doc
tb String
s, Doc -> Doc
indent Doc
x, String -> Doc
te String
s]
wrapGen' sepf :: [Doc] -> Doc
sepf Id s :: String
s ti :: Doc
ti _ = \x :: Doc
x ->
let tb :: String -> Doc
tb c :: String
c = String -> Doc
text ("<" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
c String -> String -> String
forall a. [a] -> [a] -> [a]
++ " id=\"") Doc -> Doc -> Doc
<> Doc
ti Doc -> Doc -> Doc
<> String -> Doc
text "\">"
te :: String -> Doc
te c :: String
c = String -> Doc
text (String -> Doc) -> String -> Doc
forall a b. (a -> b) -> a -> b
$ "</" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
c String -> String -> String
forall a. [a] -> [a] -> [a]
++ ">"
in [Doc] -> Doc
sepf [String -> Doc
tb String
s, Doc -> Doc
indent Doc
x, String -> Doc
te String
s]
wrapGen :: Variation -> String -> Doc -> [String] -> Doc -> Doc
wrapGen :: Variation -> String -> Doc -> [String] -> Doc -> Doc
wrapGen = ([Doc] -> Doc)
-> Variation -> String -> Doc -> [String] -> Doc -> Doc
wrapGen' [Doc] -> Doc
cat
wrapInside :: String -> [(String, Doc)] -> Doc
wrapInside :: String -> [(String, Doc)] -> Doc
wrapInside t :: String
t p :: [(String, Doc)]
p = String -> Doc
text ("<" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
t String -> String -> String
forall a. [a] -> [a] -> [a]
++ " ") Doc -> Doc -> Doc
<> (Doc -> Doc -> Doc) -> [Doc] -> Doc
forall (t :: * -> *) a. Foldable t => (a -> a -> a) -> t a -> a
foldl1 Doc -> Doc -> Doc
(<>) (((String, Doc) -> Doc) -> [(String, Doc)] -> [Doc]
forall a b. (a -> b) -> [a] -> [b]
map (String, Doc) -> Doc
foldStr [(String, Doc)]
p) Doc -> Doc -> Doc
<> String -> Doc
text ">"
where foldStr :: (String, Doc) -> Doc
foldStr (attr :: String
attr, val :: Doc
val) = String -> Doc
text (String
attr String -> String -> String
forall a. [a] -> [a] -> [a]
++ "=\"") Doc -> Doc -> Doc
<> Doc
val Doc -> Doc -> Doc
<> String -> Doc
text "\" "
caption :: Doc -> Doc
caption :: Doc -> Doc
caption = String -> [String] -> Doc -> Doc
wrap "p" ["caption"]
refwrap :: Doc -> Doc -> Doc
refwrap :: Doc -> Doc -> Doc
refwrap = (Doc -> [String] -> Doc -> Doc) -> [String] -> Doc -> Doc -> Doc
forall a b c. (a -> b -> c) -> b -> a -> c
flip (Variation -> String -> Doc -> [String] -> Doc -> Doc
wrapGen Variation
Id "div") [""]
reflink :: String -> Doc -> Doc
reflink :: String -> Doc -> Doc
reflink rf :: String
rf txt :: Doc
txt = String -> Doc
text ("<a href=#" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
rf String -> String -> String
forall a. [a] -> [a] -> [a]
++ ">") Doc -> Doc -> Doc
<> Doc
txt Doc -> Doc -> Doc
<> String -> Doc
text "</a>"
reflinkInfo :: String -> Doc -> Doc -> Doc
reflinkInfo :: String -> Doc -> Doc -> Doc
reflinkInfo rf :: String
rf txt :: Doc
txt info :: Doc
info = String -> Doc
text ("<a href=#" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
rf String -> String -> String
forall a. [a] -> [a] -> [a]
++ ">") Doc -> Doc -> Doc
<> Doc
txt Doc -> Doc -> Doc
<> String -> Doc
text "</a>" Doc -> Doc -> Doc
<+> Doc
info
reflinkURI :: String -> Doc -> Doc
reflinkURI :: String -> Doc -> Doc
reflinkURI rf :: String
rf txt :: Doc
txt = String -> Doc
text ("<a href=\"" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
rf String -> String -> String
forall a. [a] -> [a] -> [a]
++ "\">") Doc -> Doc -> Doc
<> Doc
txt Doc -> Doc -> Doc
<> String -> Doc
text "</a>"
image :: Doc -> Doc -> MaxWidthPercent -> Doc
image :: Doc -> Doc -> MaxWidthPercent -> Doc
image f :: Doc
f c :: Doc
c 100 =
Doc -> Doc
figure (Doc -> Doc) -> Doc -> Doc
forall a b. (a -> b) -> a -> b
$ [Doc] -> Doc
vcat [
[(String, Doc)] -> Doc
img [("src", Doc
f), ("alt", Doc
c)],
Doc -> Doc
figcaption Doc
c]
image f :: Doc
f c :: Doc
c wp :: MaxWidthPercent
wp =
Doc -> Doc
figure (Doc -> Doc) -> Doc -> Doc
forall a b. (a -> b) -> a -> b
$ [Doc] -> Doc
vcat [
[(String, Doc)] -> Doc
img [("src", Doc
f), ("alt", Doc
c), ("width", String -> Doc
text (String -> Doc) -> String -> Doc
forall a b. (a -> b) -> a -> b
$ MaxWidthPercent -> String
forall a. Show a => a -> String
show MaxWidthPercent
wp String -> String -> String
forall a. [a] -> [a] -> [a]
++ "%")],
Doc -> Doc
figcaption Doc
c]
em, sup, sub, bold :: Doc -> Doc
em :: Doc -> Doc
em = String -> [String] -> Doc -> Doc
wrap' "em" []
sup :: Doc -> Doc
sup = String -> [String] -> Doc -> Doc
wrap' "sup" []
sub :: Doc -> Doc
sub = String -> [String] -> Doc -> Doc
wrap' "sub" []
bold :: Doc -> Doc
bold = String -> [String] -> Doc -> Doc
wrap' "b" []
articleTitle, author :: Doc -> Doc
articleTitle :: Doc -> Doc
articleTitle t :: Doc
t = [String] -> Doc -> Doc
divTag ["title"] (Int -> Doc -> Doc
h 1 Doc
t)
author :: Doc -> Doc
author a :: Doc
a = [String] -> Doc -> Doc
divTag ["author"] (Int -> Doc -> Doc
h 2 Doc
a)
divTag :: [String] -> Doc -> Doc
divTag :: [String] -> Doc -> Doc
divTag = String -> [String] -> Doc -> Doc
wrap "div"
spanTag :: [String] -> Doc -> Doc
spanTag :: [String] -> Doc -> Doc
spanTag = String -> [String] -> Doc -> Doc
wrap "span"
indent :: Doc -> Doc
indent :: Doc -> Doc
indent = Int -> Doc -> Doc
nest 2
makeCases :: [(Expr,Expr)] -> (Expr -> Doc) -> Doc
makeCases :: [(Expr, Expr)] -> (Expr -> Doc) -> Doc
makeCases [] _ = Doc
empty
makeCases (p :: (Expr, Expr)
p:ps :: [(Expr, Expr)]
ps) pExpr :: Expr -> Doc
pExpr = [String] -> Doc -> Doc
spanTag [] (Expr -> Doc
pExpr ((Expr, Expr) -> Expr
forall a b. (a, b) -> a
fst (Expr, Expr)
p) Doc -> Doc -> Doc
<> String -> Doc
text " , " Doc -> Doc -> Doc
<>
[String] -> Doc -> Doc
spanTag ["case"] (Expr -> Doc
pExpr ((Expr, Expr) -> Expr
forall a b. (a, b) -> b
snd (Expr, Expr)
p))) Doc -> Doc -> Doc
$$
[(Expr, Expr)] -> (Expr -> Doc) -> Doc
makeCases [(Expr, Expr)]
ps Expr -> Doc
pExpr