Как сделать разметку Blaze-SVG в Blaze-HTML
Я хочу включить диаграмму svg, сгенерированную с помощью blaze-svg непосредственно в html, сгенерированную с помощью blaze-html. Оба основаны на блейз-разметке, поэтому я ожидал, что это будет легко.
diagram1 :: Svg
diagram1 = ...
try1 :: Html
try1 = html $
body $ do
h1 "My first diagram"
toHtml diagram1
try2 :: Html
try2 :: html $
body $ do
h1 "My first diagram"
toHtml $ renderSvg diagram1
Оба try1 и try2 проходят компилятор, но ни один не показывает диаграмму. Какой правильный путь? Это проблема с включением тега svg напрямую?
2 ответа
try2
сначала генерирует строковое представление SVG с renderSvg
ускользает (toHtml
) и включает результат в вывод HTML. Используя его, вы должны увидеть источник SVG вместо результирующего изображения.
try1
должно на самом деле работать. toHtml
определяется как личность на Svg
типа, так что вы также можете просто использовать diagram1
непосредственно.
Вот полный пример, который генерирует документ HTML со встроенным SVG:
{-# LANGUAGE OverloadedStrings #-}
module Main where
import Prelude hiding (head)
import Text.Blaze.Svg11 hiding (title)
import Text.Blaze.Svg11.Attributes hiding (title)
import Text.Blaze.Html5
import Text.Blaze.Html.Renderer.Pretty
diagram1 :: Svg
diagram1 = svg ! width "100" ! height "100" $
circle ! cx "50" ! cy "50" ! r "40" ! stroke "green"
! strokeWidth "4" ! fill "yellow"
try2 :: Html
try2 = docTypeHtml $ do
head $ title "Works"
body $ do
h1 "My first diagram"
diagram1
main :: IO ()
main = putStr $ renderHtml try2
Вот пример из blaze-svg
Пакет изменен для встраивания в документ HTML:
{-# LANGUAGE OverloadedStrings #-}
import Text.Blaze.Svg11 ((!), mkPath, rotate, l, m)
import qualified Text.Blaze.Svg11 as S
import qualified Text.Blaze.Svg11.Attributes as A
import Text.Blaze.Svg.Renderer.String (renderSvg)
import qualified Text.Blaze.Html5 as H
import Text.Blaze.Html.Renderer.Text
import qualified Data.Text.Lazy.IO as TL
main :: IO ()
main = do
let a = renderHtml try1 -- renderSvg svgDoc
TL.putStrLn a
try1 :: H.Html
try1 = H.html $
H.body $ do
H.h1 "My first diagram"
svgDoc
-- svgDoc :: S.Svg
svgDoc = S.svg ! A.version "1.1" ! A.width "150" ! A.height "100" ! A.viewbox "0 0 3 2" $ do
S.g ! A.transform makeTransform $ do
S.rect ! A.width "1" ! A.height "2" ! A.fill "#008d46"
S.rect ! A.width "1" ! A.height "2" ! A.fill "#ffffff"
S.rect ! A.width "1" ! A.height "2" ! A.fill "#d2232c"
S.path ! A.d makePath
makePath :: S.AttributeValue
makePath = mkPath $ do
l 2 3
m 4 5
makeTransform :: S.AttributeValue
makeTransform = rotate 50