hoodle-builder 0.2.2.0 → 0.3
raw patch · 4 files changed
+359/−13 lines, 4 filesdep +textdep ~hoodle-types
Dependencies added: text
Dependency ranges changed: hoodle-types
Files
- hoodle-builder.cabal +8/−5
- src/Text/Hoodle/Builder.hs +58/−8
- src/Text/Hoodle/Builder/V0_2_2.hs +260/−0
- src/Text/Hoodlet/Builder.hs +33/−0
hoodle-builder.cabal view
@@ -1,5 +1,5 @@ Name: hoodle-builder-Version: 0.2.2.0+Version: 0.3 Synopsis: text builder for hoodle file format Description: This library builds text xoj format file from hoodle data structure License: BSD3@@ -19,17 +19,20 @@ ghc-options: -Wall -funbox-strict-fields -fno-warn-unused-do-bind -fno-warn-orphans ghc-prof-options: -caf-all -auto-all Build-Depends: + double-conversion >= 0.2.0.6, base == 4.*,- hoodle-types >= 0.2.2,- lens >= 2.5, blaze-builder >= 0.3, - strict >= 0.3, bytestring >= 0.9, - double-conversion >= 0.2.0.6+ hoodle-types >= 0.3,+ lens >= 2.5,+ strict >= 0.3, + text > 0.11 Exposed-Modules: Text.Hoodle.Builder Text.Hoodle.Builder.V0_1_1+ Text.Hoodle.Builder.V0_2_2+ Text.Hoodlet.Builder Other-Modules:
src/Text/Hoodle/Builder.hs view
@@ -4,7 +4,7 @@ ----------------------------------------------------------------------------- -- | -- Module : Text.Hoodle.Builder --- Copyright : (c) 2011-2013 Ian-Woo Kim+-- Copyright : (c) 2011-2014 Ian-Woo Kim -- -- License : BSD3 -- Maintainer : Ian-Woo Kim <ianwookim@gmail.com>@@ -16,22 +16,24 @@ module Text.Hoodle.Builder where -- from other packages +import Blaze.ByteString.Builder+import Blaze.ByteString.Builder.Char8 (fromChar, fromString) import Control.Lens import qualified Data.ByteString as S import qualified Data.ByteString.Lazy as L-import Data.Foldable (foldMap)-import Blaze.ByteString.Builder-import Blaze.ByteString.Builder.Char8 (fromChar, fromString) import Data.Double.Conversion.ByteString (toFixed)+import Data.Foldable (foldMap) #if MIN_VERSION_base(4,5,0) import Data.Monoid hiding ((<>)) #else import Data.Monoid #endif import Data.Strict.Tuple--- from this package +import qualified Data.Text as T+import qualified Data.Text.Encoding as TE+-- from hoodle platform import Data.Hoodle.Simple-+-- -- | (<>) :: Monoid a => a -> a -> a @@ -45,12 +47,13 @@ -- | buildHoodle :: Hoodle -> Builder -buildHoodle hdl = fromByteString "<?xml version=\"1.0\" standalone=\"no\"?>\n<hoodle version=\"0.2.2\" id=\""+buildHoodle hdl = fromByteString "<?xml version=\"1.0\" standalone=\"no\"?>\n<hoodle version=\"0.3\" id=\"" <> fromByteString (view hoodleID hdl) <> fromByteString "\">\n" <> (buildTitle . view title) hdl <> (mconcat . map buildRevision . view revisions) hdl <> (maybe mempty buildEmbeddedPdf . view embeddedPdf) hdl + <> (maybe mempty buildEmbeddedText . view embeddedText) hdl <> (mconcat . map buildPage . view pages) hdl <> fromByteString "</hoodle>\n" @@ -80,6 +83,13 @@ <> fromByteString "\"/>\n" -- | +buildEmbeddedText :: T.Text -> Builder +buildEmbeddedText txt = fromByteString "<embeddedtext><![CDATA["+ <> fromByteString (TE.encodeUtf8 txt)+ <> fromByteString "]]></embeddedtext>\n"+++-- | buildPage :: Page -> Builder buildPage pg = fromByteString "<page width=\"" <> fromByteString (toFixed 2 w)@@ -136,7 +146,7 @@ buildItem (ItemImage img) = buildImage img buildItem (ItemSVG svg) = buildSVG svg buildItem (ItemLink lnk) = buildLink lnk-+buildItem (ItemAnchor anc) = buildAnchor anc -- | buildStroke :: Stroke -> Builder@@ -238,8 +248,48 @@ <> fromByteString rdr <> fromByteString "]]></render>" <> fromByteString "</link>\n" +buildLink (LinkAnchor i docid loc anchorid rdr (x,y) (Dim w h)) =+ fromByteString "<link id=\"" + <> fromByteString i + <> fromByteString "\" type=\"anchor\" linkedid=\"" + <> fromByteString docid + <> fromByteString "\" location=\""+ <> fromByteString loc+ <> fromByteString "\" anchorid=\""+ <> fromByteString anchorid+ <> fromByteString "\" x=\"" + <> fromByteString (toFixed 2 x)+ <> fromByteString "\" y=\""+ <> fromByteString (toFixed 2 y)+ <> fromByteString "\" width=\""+ <> fromByteString (toFixed 2 w)+ <> fromByteString "\" height=\""+ <> fromByteString (toFixed 2 h)+ <> fromByteString "\" >\n"+ <> fromByteString "<render><![CDATA[" + <> fromByteString rdr + <> fromByteString "]]></render>"+ <> fromByteString "</link>\n" +buildAnchor :: Anchor -> Builder+buildAnchor (Anchor i rdr (x,y) (Dim w h)) = + fromByteString "<anchor id=\""+ <> fromByteString i + <> fromByteString "\" x=\""+ <> fromByteString (toFixed 2 x)+ <> fromByteString "\" y=\""+ <> fromByteString (toFixed 2 y)+ <> fromByteString "\" width=\""+ <> fromByteString (toFixed 2 w)+ <> fromByteString "\" height=\""+ <> fromByteString (toFixed 2 h) + <> fromByteString "\" >\n"+ <> fromByteString "<render><![CDATA[" + <> fromByteString rdr + <> fromByteString "]]></render>"+ <> fromByteString "</anchor>\n" + -- | build2D :: Pair Double Double -> Builder build2D (x :!: y) = fromByteString (toFixed 2 x)
+ src/Text/Hoodle/Builder/V0_2_2.hs view
@@ -0,0 +1,260 @@+{-# LANGUAGE CPP, OverloadedStrings #-}+{-# LANGUAGE RecordWildCards #-}++-----------------------------------------------------------------------------+-- |+-- Module : Text.Hoodle.Builder.V0_2_2 +-- Copyright : (c) 2011-2014 Ian-Woo Kim+--+-- License : BSD3+-- Maintainer : Ian-Woo Kim <ianwookim@gmail.com>+-- Stability : experimental+-- Portability : GHC+--+-----------------------------------------------------------------------------++module Text.Hoodle.Builder.V0_2_2 where++-- from other packages +import Blaze.ByteString.Builder+import Blaze.ByteString.Builder.Char8 (fromChar, fromString)+import Control.Lens +import qualified Data.ByteString as S+import qualified Data.ByteString.Lazy as L+import Data.Double.Conversion.ByteString (toFixed)+import Data.Foldable (foldMap)+#if MIN_VERSION_base(4,5,0) +import Data.Monoid hiding ((<>)) +#else+import Data.Monoid +#endif +import Data.Strict.Tuple+-- from hoodle platform +import Data.Hoodle.Simple.V0_2_2+-- ++-- | +(<>) :: Monoid a => a -> a -> a +(<>) = mappend ++infixl 4 <>++-- | +builder :: Hoodle -> L.ByteString+builder = toLazyByteString . buildHoodle++-- |+buildHoodle :: Hoodle -> Builder +buildHoodle hdl = fromByteString "<?xml version=\"1.0\" standalone=\"no\"?>\n<hoodle version=\"0.2.2\" id=\""+ <> fromByteString (view hoodleID hdl) + <> fromByteString "\">\n" + <> (buildTitle . view title) hdl + <> (mconcat . map buildRevision . view revisions) hdl+ <> (maybe mempty buildEmbeddedPdf . view embeddedPdf) hdl + <> (mconcat . map buildPage . view pages) hdl+ <> fromByteString "</hoodle>\n"+ +-- | +buildTitle :: S.ByteString -> Builder+buildTitle ttl = fromByteString "<title>"+ <> fromByteString ttl+ <> fromByteString "</title>\n"+ +-- | +buildRevision :: Revision -> Builder +buildRevision Revision {..} = fromByteString "<revision revmd5=\""+ <> fromByteString _revmd5+ <> fromByteString "\" revtxt=\""+ <> fromByteString _revtxt+ <> fromByteString "\"/>\n"+buildRevision RevisionInk {..} = fromByteString "<revision revmd5=\""+ <> fromByteString _revmd5+ <> fromByteString "\" type=\"ink\">\n"+ <> foldMap buildStroke _revink+ <> fromByteString "</revision>\n"++-- | +buildEmbeddedPdf :: S.ByteString -> Builder +buildEmbeddedPdf pdf = fromByteString "<embeddedpdf src=\""+ <> fromByteString pdf+ <> fromByteString "\"/>\n"++-- | +buildPage :: Page -> Builder +buildPage pg = fromByteString "<page width=\""+ <> fromByteString (toFixed 2 w)+ <> fromByteString "\" height=\""+ <> fromByteString (toFixed 2 h)+ <> fromByteString "\">\n" + <> (buildBackground . view background) pg + <> (mconcat . map buildLayer . view layers) pg + <> fromByteString "</page>\n"+ where Dim w h = view dimension pg+ +-- | +buildBackground :: Background -> Builder +buildBackground bkg = + case bkg of + Background typ col sty -> + fromByteString "<background type=\""+ <> fromByteString typ+ <> fromByteString "\" color=\""+ <> fromByteString col+ <> fromByteString "\" style=\""+ <> fromByteString sty+ <> fromByteString "\"/>\n"+ BackgroundPdf typ mdom mfile pageno -> + fromByteString "<background type=\""+ <> fromByteString typ+ <> case mdom of + Nothing -> fromByteString S.empty + Just dom -> fromByteString "\" domain=\""+ <> fromByteString dom+ <> case mfile of + Nothing -> fromByteString S.empty + Just file -> fromByteString "\" filename=\""+ <> fromByteString file+ <> fromByteString "\" pageno=\""+ <> fromString (show pageno)+ <> fromByteString "\"/>\n"+ BackgroundEmbedPdf typ pageno -> + fromByteString "<background type=\""+ <> fromByteString typ + <> fromByteString "\" pageno=\""+ <> fromString (show pageno)+ <> fromByteString "\"/>\n"++ +-- | +buildLayer :: Layer -> Builder+buildLayer layer = fromByteString "<layer>\n"+ <> (mconcat . map buildItem . view items) layer+ <> fromByteString "</layer>\n"++buildItem :: Item -> Builder+buildItem (ItemStroke strk) = buildStroke strk+buildItem (ItemImage img) = buildImage img+buildItem (ItemSVG svg) = buildSVG svg +buildItem (ItemLink lnk) = buildLink lnk+++-- | +buildStroke :: Stroke -> Builder+buildStroke stroke@(Stroke _ _ _ _) = + fromByteString "<stroke tool=\""+ <> fromByteString (stroke_tool stroke)+ <> fromByteString "\" color=\""+ <> fromByteString (stroke_color stroke)+ <> fromByteString "\" width=\""+ <> fromByteString (toFixed 2 (stroke_width stroke))+ <> fromByteString "\">\n"+ <> mconcat (map build2D (stroke_data stroke))+ <> fromByteString "\n</stroke>\n"+buildStroke stroke@(VWStroke _ _ _) =+ fromByteString "<stroke tool=\""+ <> fromByteString (stroke_tool stroke)+ <> fromByteString "\" color=\""+ <> fromByteString (stroke_color stroke)+ <> fromByteString "\" width=\""+ <> mconcat (map buildZFrm3D (stroke_vwdata stroke))+ <> fromByteString "\">\n"+ <> mconcat (map buildXYFrm3D (stroke_vwdata stroke))+ <> fromByteString "\n</stroke>\n"++buildImage :: Image -> Builder +buildImage (Image bstr (x,y) (Dim w h)) =+ fromByteString "<img src=\""+ <> fromByteString bstr+ <> fromByteString "\" x=\"" + <> fromByteString (toFixed 2 x)+ <> fromByteString "\" y=\""+ <> fromByteString (toFixed 2 y)+ <> fromByteString "\" width=\""+ <> fromByteString (toFixed 2 w)+ <> fromByteString "\" height=\""+ <> fromByteString (toFixed 2 h)+ <> fromByteString "\" />\n"++buildSVG :: SVG -> Builder +buildSVG (SVG mtxt mcmd rdr (x,y) (Dim w h)) =+ fromByteString "<svgobject x=\"" + <> fromByteString (toFixed 2 x)+ <> fromByteString "\" y=\""+ <> fromByteString (toFixed 2 y)+ <> fromByteString "\" width=\""+ <> fromByteString (toFixed 2 w)+ <> fromByteString "\" height=\""+ <> fromByteString (toFixed 2 h)+ <> fromByteString "\" >\n"+ <> maybe mempty (\txt->fromByteString "<text><![CDATA[" <> fromByteString txt <> fromByteString "]]></text>") mtxt + <> maybe mempty (\cmd->fromByteString "<command><![CDATA[" <> fromByteString cmd <> fromByteString "]]></command>") mcmd + <> fromByteString "<render><![CDATA[" + <> fromByteString rdr + <> fromByteString "]]></render>"+ <> fromByteString "</svgobject>\n"++buildLink :: Link -> Builder +buildLink (Link i typ loc mtxt mcmd rdr (x,y) (Dim w h)) =+ fromByteString "<link id=\"" + <> fromByteString i + <> fromByteString "\" type=\"" + <> fromByteString typ+ <> fromByteString "\" location=\""+ <> fromByteString loc+ <> fromByteString "\" x=\"" + <> fromByteString (toFixed 2 x)+ <> fromByteString "\" y=\""+ <> fromByteString (toFixed 2 y)+ <> fromByteString "\" width=\""+ <> fromByteString (toFixed 2 w)+ <> fromByteString "\" height=\""+ <> fromByteString (toFixed 2 h)+ <> fromByteString "\" >\n"+ <> maybe mempty (\txt->fromByteString "<text><![CDATA[" <> fromByteString txt <> fromByteString "]]></text>") mtxt + <> maybe mempty (\cmd->fromByteString "<command><![CDATA[" <> fromByteString cmd <> fromByteString "]]></command>") mcmd + <> fromByteString "<render><![CDATA[" + <> fromByteString rdr + <> fromByteString "]]></render>"+ <> fromByteString "</link>\n"+buildLink (LinkDocID i docid loc mtxt mcmd rdr (x,y) (Dim w h)) =+ fromByteString "<link id=\"" + <> fromByteString i + <> fromByteString "\" type=\"linkdocid\" linkedid=\"" + <> fromByteString docid + <> fromByteString "\" location=\""+ <> fromByteString loc+ <> fromByteString "\" x=\"" + <> fromByteString (toFixed 2 x)+ <> fromByteString "\" y=\""+ <> fromByteString (toFixed 2 y)+ <> fromByteString "\" width=\""+ <> fromByteString (toFixed 2 w)+ <> fromByteString "\" height=\""+ <> fromByteString (toFixed 2 h)+ <> fromByteString "\" >\n"+ <> maybe mempty (\txt->fromByteString "<text><![CDATA[" <> fromByteString txt <> fromByteString "]]></text>") mtxt + <> maybe mempty (\cmd->fromByteString "<command><![CDATA[" <> fromByteString cmd <> fromByteString "]]></command>") mcmd + <> fromByteString "<render><![CDATA[" + <> fromByteString rdr + <> fromByteString "]]></render>"+ <> fromByteString "</link>\n" +++-- | +build2D :: Pair Double Double -> Builder +build2D (x :!: y) = fromByteString (toFixed 2 x) + <> fromChar ' ' + <> fromByteString (toFixed 2 y) + <> fromChar ' ' + +-- | +buildXYFrm3D :: (Double,Double,Double) -> Builder +buildXYFrm3D (x,y,_) = fromByteString (toFixed 2 x) + <> fromChar ' ' + <> fromByteString (toFixed 2 y)+ <> fromChar ' ' + +-- |+buildZFrm3D :: (Double,Double,Double) -> Builder +buildZFrm3D (_,_,z) = fromByteString (toFixed 2 z) + <> fromChar ' '
+ src/Text/Hoodlet/Builder.hs view
@@ -0,0 +1,33 @@+{-# LANGUAGE OverloadedStrings #-}++-----------------------------------------------------------------------------+-- |+-- Module : Text.Hoodlet.Builder +-- Copyright : (c) 2014 Ian-Woo Kim+--+-- License : BSD3+-- Maintainer : Ian-Woo Kim <ianwookim@gmail.com>+-- Stability : experimental+-- Portability : GHC+--+-----------------------------------------------------------------------------++module Text.Hoodlet.Builder where++import Blaze.ByteString.Builder+import qualified Data.ByteString.Lazy.Char8 as L+-- +import Data.Hoodle.Simple+--+import Text.Hoodle.Builder+--+-- | +builder :: Item -> L.ByteString+builder = toLazyByteString . buildHoodlet+++buildHoodlet :: Item -> Builder+buildHoodlet item = fromByteString "<?xml version=\"1.0\" standalone=\"no\"?>\n<hoodlet version=\"0.2.2\" >\n" + <> buildItem item+ <> fromByteString "</hoodlet>\n"+