1 {-# LANGUAGE OverloadedLists #-}
2 {-# OPTIONS_GHC -Wno-orphans #-}
4 module Worksheets.Utils.HTML (
5 module Worksheets.Utils.HTML,
6 module Text.Blaze.Html5,
7 module Text.Blaze.Renderer.Utf8,
10 import Data.Char qualified as Char
11 import Data.List qualified as List
12 import Data.Map.Strict qualified as Map
13 import Data.Text qualified as Text
14 import Data.Text.Short qualified as ShortText
16 import Text.Blaze.Html5
17 import Text.Blaze.Html5.Attributes qualified as HA
18 import Text.Blaze.Renderer.Utf8
19 import Worksheets.Utils.Paper
20 import Worksheets.Utils.Prelude
22 classes :: [String] -> Attribute
23 classes cls = HA.class_ $ cls & List.filter (not . null) <&> toValue & List.intersperse " " & mconcat
25 className :: Show a => a -> String
27 x & show & List.map \c ->
32 type CSSBlock = Map String String
34 styles :: CSSBlock -> Attribute
37 [ toValue k <> ":" <> toValue v <> ";"
38 | (k, v) <- kvs & Map.toList
43 type CSS = Map [String] CSSBlock
44 styleCSS :: CSS -> Markup
48 $ [ mconcat [n <> " {" | n <- ns]
51 [ k <> ":" <> v <> ";"
52 | (k, v) <- kvs & Map.toList
55 <> mconcat [" }" | _n <- ns]
57 | (ns, kvs) <- m & Map.toList
66 instance ToMarkup ShortText where
67 toMarkup = ShortText.toText >>> toMarkup
68 preEscapedToMarkup = ShortText.toText >>> preEscapedToMarkup
71 = LengthFractionalRatio Natural
72 | LengthMillimeters Double
74 instance ToCSS Text where
76 instance ToCSS Length where
78 LengthFractionalRatio x -> show x <> "fr"
79 LengthMillimeters x -> show x <> "mm"
80 cm :: Double -> Length
81 cm = LengthMillimeters . (* 10)
82 mm :: Double -> Length
83 mm = LengthMillimeters
84 fr :: Natural -> Length
85 fr = LengthFractionalRatio
88 PageOrientationLandscape -> 29.7 & cm
89 PageOrientationPortrait -> 21.0 & cm
91 PageOrientationLandscape -> 21.0 & cm
92 PageOrientationPortrait -> 29.7 & cm
96 PageSizeA4Plus -> "A4plus"
98 cssPageOrientation = \case
99 PageOrientationPortrait -> "portrait"
100 PageOrientationLandscape -> "landscape"
102 cssPrintPage :: PageOrientation -> PageSize -> CSS
103 cssPrintPage pageOrient pageSize =
108 [ cssPageSize pageSize
109 , cssPageOrientation pageOrient
116 cssBlockObjectFitCover :: CSSBlock
117 cssBlockObjectFitCover = ["object-fit" := "cover"]