{-# LANGUAGE OverloadedStrings #-}
module Core.Render
( renderSvgFiles
, renderSvgReact
, svgToReact
) where
import GHC.IO.Encoding
import qualified Data.Text as T
import Text.Blaze.Svg11 ((!))
import Text.Blaze.Svg11 as S
import Text.Blaze.Svg11.Attributes as A
import Text.Blaze.Svg.Renderer.Pretty
import Core.Utils
renderSvgFiles :: FilePath -> [ (FilePath , Svg) ] -> IO ()
renderSvgFiles :: [Char] -> [([Char], Svg)] -> IO ()
renderSvgFiles [Char]
folder [([Char], Svg)]
svgs =
do
TextEncoding -> IO ()
setLocaleEncoding TextEncoding
utf8
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ ([Char], Svg) -> IO ()
f [([Char], Svg)]
svgs
where
f :: ([Char], Svg) -> IO ()
f ([Char]
name , Svg
svgCode) =
[Char] -> [Char] -> IO ()
writeFile
([Char]
folder forall a. [a] -> [a] -> [a]
++ [Char]
name forall a. [a] -> [a] -> [a]
++ [Char]
".svg")
(Svg -> [Char]
renderSvg forall a b. (a -> b) -> a -> b
$ Svg
S.docType forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Svg -> Svg
addXmlns Svg
svgCode)
renderSvgReact :: FilePath -> [ (FilePath , Svg) ] -> IO ()
renderSvgReact :: [Char] -> [([Char], Svg)] -> IO ()
renderSvgReact [Char]
folder [([Char], Svg)]
svgs =
do
TextEncoding -> IO ()
setLocaleEncoding TextEncoding
utf8
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ ([Char], Svg) -> IO ()
f [([Char], Svg)]
svgs
where
f :: ([Char], Svg) -> IO ()
f ([Char]
name , Svg
svgCode) =
[Char] -> [Char] -> IO ()
writeFile
([Char]
folder forall a. [a] -> [a] -> [a]
++ [Char]
name forall a. [a] -> [a] -> [a]
++ [Char]
".jsx")
([Char] -> Svg -> [Char]
svgToReact [Char]
name forall a b. (a -> b) -> a -> b
$ Svg -> Svg
addXmlns Svg
svgCode)
svgToReact :: String -> Svg -> String
svgToReact :: [Char] -> Svg -> [Char]
svgToReact [Char]
name Svg
svgCode =
[Char]
"import React from 'react';"
forall a. [a] -> [a] -> [a]
++ [Char]
"\n\n" forall a. [a] -> [a] -> [a]
++
[Char]
"export const " forall a. [a] -> [a] -> [a]
++ [Char]
name forall a. [a] -> [a] -> [a]
++ [Char]
" = \n" forall a. [a] -> [a] -> [a]
++ Svg -> [Char]
render Svg
svgCode
where
render :: Svg -> [Char]
render = Text -> [Char]
T.unpack forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Text
adaptToReact forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Char] -> Text
T.pack forall b c a. (b -> c) -> (a -> b) -> a -> c
. Svg -> [Char]
renderSvg
adaptToReact :: Text -> Text
adaptToReact =
(HasCallStack => Text -> Text -> Text -> Text
T.replace Text
"xmlns:xlink" Text
"xmlnsXlink")
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (HasCallStack => Text -> Text -> Text -> Text
T.replace Text
"stroke-width" Text
"strokeWidth")
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (HasCallStack => Text -> Text -> Text -> Text
T.replace Text
"stroke-dasharray" Text
"strokeDasharray")
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (HasCallStack => Text -> Text -> Text -> Text
T.replace Text
"stroke-dashoffset" Text
"strokeDashoffset")
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (HasCallStack => Text -> Text -> Text -> Text
T.replace Text
"stroke-linejoin" Text
"strokeLinejoin")
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (HasCallStack => Text -> Text -> Text -> Text
T.replace Text
"stroke-linecap" Text
"strokeLinecap")
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (HasCallStack => Text -> Text -> Text -> Text
T.replace Text
"font-family" Text
"fontFamily")
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (HasCallStack => Text -> Text -> Text -> Text
T.replace Text
"font-size" Text
"fontSize")
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (HasCallStack => Text -> Text -> Text -> Text
T.replace Text
"text-anchor" Text
"textAnchor")
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (HasCallStack => Text -> Text -> Text -> Text
T.replace Text
"letter-spacing" Text
"letterSpacing")
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (HasCallStack => Text -> Text -> Text -> Text
T.replace Text
"dominant-baseline" Text
"dominantBaseline")
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (HasCallStack => Text -> Text -> Text -> Text
T.replace Text
"stroke-miterlimit" Text
"strokeMiterlimit")