hoodle-builder 0.3 → 0.3.0
raw patch · 3 files changed
+314/−9 lines, 3 filesdep ~hoodle-typesPVP: minor bump suggested
API additions: PVP suggests at least a minor version bump
Dependency ranges changed: hoodle-types
API changes (from Hackage documentation)
+ Text.Hoodle.Builder.V0_3: (<>) :: Monoid a => a -> a -> a
+ Text.Hoodle.Builder.V0_3: build2D :: Pair Double Double -> Builder
+ Text.Hoodle.Builder.V0_3: buildAnchor :: Anchor -> Builder
+ Text.Hoodle.Builder.V0_3: buildBackground :: Background -> Builder
+ Text.Hoodle.Builder.V0_3: buildEmbeddedPdf :: ByteString -> Builder
+ Text.Hoodle.Builder.V0_3: buildEmbeddedText :: Text -> Builder
+ Text.Hoodle.Builder.V0_3: buildHoodle :: Hoodle -> Builder
+ Text.Hoodle.Builder.V0_3: buildImage :: Image -> Builder
+ Text.Hoodle.Builder.V0_3: buildItem :: Item -> Builder
+ Text.Hoodle.Builder.V0_3: buildLayer :: Layer -> Builder
+ Text.Hoodle.Builder.V0_3: buildLink :: Link -> Builder
+ Text.Hoodle.Builder.V0_3: buildPage :: Page -> Builder
+ Text.Hoodle.Builder.V0_3: buildRevision :: Revision -> Builder
+ Text.Hoodle.Builder.V0_3: buildSVG :: SVG -> Builder
+ Text.Hoodle.Builder.V0_3: buildStroke :: Stroke -> Builder
+ Text.Hoodle.Builder.V0_3: buildTitle :: ByteString -> Builder
+ Text.Hoodle.Builder.V0_3: buildXYFrm3D :: (Double, Double, Double) -> Builder
+ Text.Hoodle.Builder.V0_3: buildZFrm3D :: (Double, Double, Double) -> Builder
+ Text.Hoodle.Builder.V0_3: builder :: Hoodle -> ByteString
Files
- CHANGES +0/−6
- hoodle-builder.cabal +4/−3
- src/Text/Hoodle/Builder/V0_3.hs +310/−0
− CHANGES
@@ -1,6 +0,0 @@-0.1: 18 Dec 2011- * First public release. -0.1.1: 12 Feb 2012- * variable width stroke support-0.1.1.1: 3 Sep 2012- * fix duplicated (<>) problem with Data.Monoid in base>4.5
hoodle-builder.cabal view
@@ -1,5 +1,5 @@ Name: hoodle-builder-Version: 0.3+Version: 0.3.0 Synopsis: text builder for hoodle file format Description: This library builds text xoj format file from hoodle data structure License: BSD3@@ -9,7 +9,7 @@ Category: Text Build-Type: Simple Cabal-Version: >= 1.8-data-files: CHANGES+data-files: Source-repository head type: git location: http://www.github.com/wavewave/hoodle-builder@@ -23,7 +23,7 @@ base == 4.*, blaze-builder >= 0.3, bytestring >= 0.9, - hoodle-types >= 0.3,+ hoodle-types >= 0.3.0, lens >= 2.5, strict >= 0.3, text > 0.11@@ -32,6 +32,7 @@ Text.Hoodle.Builder Text.Hoodle.Builder.V0_1_1 Text.Hoodle.Builder.V0_2_2+ Text.Hoodle.Builder.V0_3 Text.Hoodlet.Builder Other-Modules:
+ src/Text/Hoodle/Builder/V0_3.hs view
@@ -0,0 +1,310 @@+{-# LANGUAGE CPP, OverloadedStrings #-}+{-# LANGUAGE RecordWildCards #-}++-----------------------------------------------------------------------------+-- |+-- Module : Text.Hoodle.Builder.V0_3+-- 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_3 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+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 +(<>) = 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.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"+ +-- | +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"++-- | +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)+ <> 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+buildItem (ItemAnchor anc) = buildAnchor anc++-- | +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" +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) + <> 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 ' '