{-# LANGUAGE OverloadedStrings #-}
{-# OPTIONS -fno-warn-unused-imports #-}
module Lucid.Svg
(
Svg
, prettyText
, module Lucid.Svg.Path
, module Lucid.Svg.Elements
, module Lucid.Svg.Attributes
, renderText
, renderBS
, renderTextT
, renderBST
, renderToFile
, execHtmlT
, evalHtmlT
, runHtmlT
, Attribute(..)
, Term(..)
, ToHtml(..)
, With(..)
) where
import Data.Functor.Identity
import Data.Int (Int64)
import Data.Monoid
import Data.Text.Lazy
import Data.Text.Lazy as LT
import Data.Text.Lazy.Builder as B
import Lucid.Base
import qualified Lucid.Svg.Attributes as A
import Lucid.Svg.Attributes hiding (cursor_, filter_, path_, style_)
import Lucid.Svg.Elements
import Lucid.Svg.Path
type Svg = SvgT Identity
prettyText :: Svg a -> Text
prettyText :: forall a. Svg a -> Text
prettyText Svg a
svg = Builder -> Text
B.toLazyText forall a b. (a -> b) -> a -> b
$ forall a. (Char -> a -> a) -> a -> Text -> a
LT.foldr Char
-> (Maybe Char -> Int64 -> Builder)
-> Maybe Char
-> Int64
-> Builder
go forall a. Monoid a => a
mempty Text
text forall a. Maybe a
Nothing (-Int64
1)
where
text :: Text
text = forall a. Svg a -> Text
renderText Svg a
svg
go :: Char
-> (Maybe Char -> Int64 -> Builder)
-> Maybe Char
-> Int64
-> Builder
go Char
c Maybe Char -> Int64 -> Builder
f Maybe Char
Nothing Int64
n
| Char
c forall a. Eq a => a -> a -> Bool
== Char
'<' Bool -> Bool -> Bool
|| Char
c forall a. Eq a => a -> a -> Bool
== Char
'/' = Maybe Char -> Int64 -> Builder
f (forall a. a -> Maybe a
Just Char
c) Int64
n
go Char
c Maybe Char -> Int64 -> Builder
f (Just Char
'<') Int64
n
| Char
c forall a. Eq a => a -> a -> Bool
== Char
'?' = Builder
"<?" forall a. Semigroup a => a -> a -> a
<> Maybe Char -> Int64 -> Builder
f forall a. Maybe a
Nothing Int64
n
| Char
c forall a. Eq a => a -> a -> Bool
== Char
'!' = Builder
"<!" forall a. Semigroup a => a -> a -> a
<> Maybe Char -> Int64 -> Builder
f forall a. Maybe a
Nothing Int64
n
| Char
c forall a. Eq a => a -> a -> Bool
== Char
'/' = Builder
"\n"
forall a. Semigroup a => a -> a -> a
<> (Text -> Builder
B.fromLazyText forall a b. (a -> b) -> a -> b
$ Int64 -> Text -> Text
LT.replicate Int64
n Text
" " )
forall a. Semigroup a => a -> a -> a
<> Builder
"</"
forall a. Semigroup a => a -> a -> a
<> Maybe Char -> Int64 -> Builder
f forall a. Maybe a
Nothing (Int64
nforall a. Num a => a -> a -> a
-Int64
1)
| Bool
otherwise = Builder
"\n"
forall a. Semigroup a => a -> a -> a
<> (Text -> Builder
B.fromLazyText forall a b. (a -> b) -> a -> b
$ Int64 -> Text -> Text
LT.replicate (Int64
nforall a. Num a => a -> a -> a
+Int64
1) Text
" " )
forall a. Semigroup a => a -> a -> a
<> Builder
"<"
forall a. Semigroup a => a -> a -> a
<> Char -> Builder
B.singleton Char
c
forall a. Semigroup a => a -> a -> a
<> Maybe Char -> Int64 -> Builder
f forall a. Maybe a
Nothing (Int64
nforall a. Num a => a -> a -> a
+Int64
1)
go Char
'>' Maybe Char -> Int64 -> Builder
f (Just Char
_) Int64
n = Builder
"/>" forall a. Semigroup a => a -> a -> a
<> Maybe Char -> Int64 -> Builder
f forall a. Maybe a
Nothing (Int64
nforall a. Num a => a -> a -> a
-Int64
1)
go Char
c Maybe Char -> Int64 -> Builder
f Maybe Char
s Int64
n = Builder
s' forall a. Semigroup a => a -> a -> a
<> Char -> Builder
B.singleton Char
c forall a. Semigroup a => a -> a -> a
<> Maybe Char -> Int64 -> Builder
f forall a. Maybe a
Nothing Int64
n
where s' :: Builder
s' = forall b a. b -> (a -> b) -> Maybe a -> b
maybe forall a. Monoid a => a
mempty Char -> Builder
B.singleton Maybe Char
s