{-# LANGUAGE OverloadedStrings #-}
{-# OPTIONS -fno-warn-unused-imports #-}
module Graphics.Svg
(
module Graphics.Svg.Core
, module Graphics.Svg.Path
, module Graphics.Svg.Elements
, module Graphics.Svg.Attributes
, (<>)
, prettyText
) where
import Data.Int (Int64)
import Data.Monoid
import Data.Text.Lazy as LT
import Data.Text.Lazy.Builder as B
import Graphics.Svg.Core
import Graphics.Svg.Attributes
import Graphics.Svg.Elements
import Graphics.Svg.Path
prettyText :: Element -> Text
prettyText :: Element -> Text
prettyText Element
svg = Builder -> Text
B.toLazyText (Builder -> Text) -> Builder -> Text
forall a b. (a -> b) -> a -> b
$ (Char
-> (Maybe Char -> Int64 -> Builder)
-> Maybe Char
-> Int64
-> Builder)
-> (Maybe Char -> Int64 -> Builder)
-> Text
-> Maybe Char
-> Int64
-> Builder
forall a. (Char -> a -> a) -> a -> Text -> a
LT.foldr Char
-> (Maybe Char -> Int64 -> Builder)
-> Maybe Char
-> Int64
-> Builder
go Maybe Char -> Int64 -> Builder
forall a. Monoid a => a
mempty Text
text Maybe Char
forall a. Maybe a
Nothing (-Int64
1)
where
text :: Text
text = Element -> Text
renderText Element
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 Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'<' Bool -> Bool -> Bool
|| Char
c Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'/' = Maybe Char -> Int64 -> Builder
f (Char -> Maybe Char
forall a. a -> Maybe a
Just Char
c) Int64
n
go Char
c Maybe Char -> Int64 -> Builder
f (Just Char
'<') Int64
n
| Char
c Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'?' = Builder
"<?" Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Maybe Char -> Int64 -> Builder
f Maybe Char
forall a. Maybe a
Nothing Int64
n
| Char
c Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'!' = Builder
"<!" Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Maybe Char -> Int64 -> Builder
f Maybe Char
forall a. Maybe a
Nothing Int64
n
| Char
c Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'/' = Builder
"\n"
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> (Text -> Builder
B.fromLazyText (Text -> Builder) -> Text -> Builder
forall a b. (a -> b) -> a -> b
$ Int64 -> Text -> Text
LT.replicate Int64
n Text
" " )
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Builder
"</"
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Maybe Char -> Int64 -> Builder
f Maybe Char
forall a. Maybe a
Nothing (Int64
nInt64 -> Int64 -> Int64
forall a. Num a => a -> a -> a
-Int64
1)
| Bool
otherwise = Builder
"\n"
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> (Text -> Builder
B.fromLazyText (Text -> Builder) -> Text -> Builder
forall a b. (a -> b) -> a -> b
$ Int64 -> Text -> Text
LT.replicate (Int64
nInt64 -> Int64 -> Int64
forall a. Num a => a -> a -> a
+Int64
1) Text
" " )
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Builder
"<"
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Char -> Builder
B.singleton Char
c
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Maybe Char -> Int64 -> Builder
f Maybe Char
forall a. Maybe a
Nothing (Int64
nInt64 -> Int64 -> Int64
forall a. Num a => a -> a -> a
+Int64
1)
go Char
'>' Maybe Char -> Int64 -> Builder
f (Just Char
_) Int64
n = Builder
"/>" Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Maybe Char -> Int64 -> Builder
f Maybe Char
forall a. Maybe a
Nothing (Int64
nInt64 -> Int64 -> Int64
forall a. Num a => a -> a -> a
-Int64
1)
go Char
c Maybe Char -> Int64 -> Builder
f Maybe Char
s Int64
n = Builder
s' Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Char -> Builder
B.singleton Char
c Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Maybe Char -> Int64 -> Builder
f Maybe Char
forall a. Maybe a
Nothing Int64
n
where s' :: Builder
s' = Builder -> (Char -> Builder) -> Maybe Char -> Builder
forall b a. b -> (a -> b) -> Maybe a -> b
maybe Builder
forall a. Monoid a => a
mempty Char -> Builder
B.singleton Maybe Char
s