packages feed

hoodle-parser 0.3 → 0.3.0

raw patch · 10 files changed

+996/−131 lines, 10 filesdep ~hoodle-typesdep ~xournal-typesPVP: major bump suggested

API removals or changes: PVP suggests a major version bump

Dependency ranges changed: hoodle-types, xournal-types

API changes (from Hackage documentation)

- Text.Hoodle.Migrate.V0_1_1_to_V0_2: bkg2Bkg :: Background -> Background
- Text.Hoodle.Migrate.V0_1_1_to_V0_2: dim2Dim :: Dimension -> Dimension
- Text.Hoodle.Migrate.V0_1_1_to_V0_2: image2Image :: Image -> Image
- Text.Hoodle.Migrate.V0_1_1_to_V0_2: item2Item :: Item -> Item
- Text.Hoodle.Migrate.V0_1_1_to_V0_2: layer2Layer :: Layer -> Layer
- Text.Hoodle.Migrate.V0_1_1_to_V0_2: migrate :: ByteString -> IO (Either String Hoodle)
- Text.Hoodle.Migrate.V0_1_1_to_V0_2: page2Page :: Page -> Page
- Text.Hoodle.Migrate.V0_1_1_to_V0_2: stroke2Stroke :: Stroke -> Stroke
- Text.Hoodle.Migrate.V0_1_1_to_V0_2: svg2SVG :: SVG -> SVG
+ Text.Hoodle.Migrate.V0_1_1_to_V0_2_2: bkg2Bkg :: Background -> Background
+ Text.Hoodle.Migrate.V0_1_1_to_V0_2_2: dim2Dim :: Dimension -> Dimension
+ Text.Hoodle.Migrate.V0_1_1_to_V0_2_2: image2Image :: Image -> Image
+ Text.Hoodle.Migrate.V0_1_1_to_V0_2_2: item2Item :: Item -> Item
+ Text.Hoodle.Migrate.V0_1_1_to_V0_2_2: layer2Layer :: Layer -> Layer
+ Text.Hoodle.Migrate.V0_1_1_to_V0_2_2: migrate :: ByteString -> IO (Either String Hoodle)
+ Text.Hoodle.Migrate.V0_1_1_to_V0_2_2: page2Page :: Page -> Page
+ Text.Hoodle.Migrate.V0_1_1_to_V0_2_2: stroke2Stroke :: Stroke -> Stroke
+ Text.Hoodle.Migrate.V0_1_1_to_V0_2_2: svg2SVG :: SVG -> SVG
+ Text.Hoodle.Migrate.V0_2_2_to_V0_3: bkg2Bkg :: Background -> Background
+ Text.Hoodle.Migrate.V0_2_2_to_V0_3: dim2Dim :: Dimension -> Dimension
+ Text.Hoodle.Migrate.V0_2_2_to_V0_3: hoodle2Hoodle :: Hoodle -> IO Hoodle
+ Text.Hoodle.Migrate.V0_2_2_to_V0_3: image2Image :: Image -> Image
+ Text.Hoodle.Migrate.V0_2_2_to_V0_3: item2Item :: Item -> Item
+ Text.Hoodle.Migrate.V0_2_2_to_V0_3: layer2Layer :: Layer -> Layer
+ Text.Hoodle.Migrate.V0_2_2_to_V0_3: link2Link :: Link -> Link
+ Text.Hoodle.Migrate.V0_2_2_to_V0_3: migrate :: ByteString -> IO (Either String Hoodle)
+ Text.Hoodle.Migrate.V0_2_2_to_V0_3: page2Page :: Page -> Page
+ Text.Hoodle.Migrate.V0_2_2_to_V0_3: rev2Rev :: Revision -> Revision
+ Text.Hoodle.Migrate.V0_2_2_to_V0_3: stroke2Stroke :: Stroke -> Stroke
+ Text.Hoodle.Migrate.V0_2_2_to_V0_3: svg2SVG :: SVG -> SVG
+ Text.Hoodle.Migrate.V0_3_to_HEAD: anchor2Anchor :: Anchor -> Anchor
+ Text.Hoodle.Migrate.V0_3_to_HEAD: bkg2Bkg :: Background -> Background
+ Text.Hoodle.Migrate.V0_3_to_HEAD: dim2Dim :: Dimension -> Dimension
+ Text.Hoodle.Migrate.V0_3_to_HEAD: hoodle2Hoodle :: Hoodle -> IO Hoodle
+ Text.Hoodle.Migrate.V0_3_to_HEAD: image2Image :: Image -> Image
+ Text.Hoodle.Migrate.V0_3_to_HEAD: item2Item :: Item -> Item
+ Text.Hoodle.Migrate.V0_3_to_HEAD: layer2Layer :: Layer -> Layer
+ Text.Hoodle.Migrate.V0_3_to_HEAD: link2Link :: Link -> Link
+ Text.Hoodle.Migrate.V0_3_to_HEAD: page2Page :: Page -> Page
+ Text.Hoodle.Migrate.V0_3_to_HEAD: rev2Rev :: Revision -> Revision
+ Text.Hoodle.Migrate.V0_3_to_HEAD: stroke2Stroke :: Stroke -> Stroke
+ Text.Hoodle.Migrate.V0_3_to_HEAD: svg2SVG :: SVG -> SVG
+ Text.Hoodle.Parse.Attoparsec.V0_3: SingleWidth :: Double -> StrokeWidth
+ Text.Hoodle.Parse.Attoparsec.V0_3: VarWidth :: [Double] -> StrokeWidth
+ Text.Hoodle.Parse.Attoparsec.V0_3: XmlStroke :: ByteString -> ByteString -> StrokeWidth -> [Pair Double Double] -> XmlStroke
+ Text.Hoodle.Parse.Attoparsec.V0_3: alphabet :: Parser ByteString
+ Text.Hoodle.Parse.Attoparsec.V0_3: alphanumsharp :: Parser ByteString
+ Text.Hoodle.Parse.Attoparsec.V0_3: anchor :: Parser Item
+ Text.Hoodle.Parse.Attoparsec.V0_3: background :: Parser Background
+ Text.Hoodle.Parse.Attoparsec.V0_3: backgroundclose :: Parser ByteString
+ Text.Hoodle.Parse.Attoparsec.V0_3: backgroundheader :: Parser ByteString
+ Text.Hoodle.Parse.Attoparsec.V0_3: checkHoodleVersion :: Parser ByteString
+ Text.Hoodle.Parse.Attoparsec.V0_3: commandCDATA :: Parser ByteString
+ Text.Hoodle.Parse.Attoparsec.V0_3: data StrokeWidth
+ Text.Hoodle.Parse.Attoparsec.V0_3: data XmlStroke
+ Text.Hoodle.Parse.Attoparsec.V0_3: embeddedpdf :: Parser (ByteString)
+ Text.Hoodle.Parse.Attoparsec.V0_3: embeddedtext :: Parser (Text)
+ Text.Hoodle.Parse.Attoparsec.V0_3: getCDATA :: Parser ByteString
+ Text.Hoodle.Parse.Attoparsec.V0_3: headercontent :: Parser ByteString
+ Text.Hoodle.Parse.Attoparsec.V0_3: headercontentWorker :: ByteString -> Parser ByteString
+ Text.Hoodle.Parse.Attoparsec.V0_3: hoodle :: Parser Hoodle
+ Text.Hoodle.Parse.Attoparsec.V0_3: hoodleclose :: Parser ByteString
+ Text.Hoodle.Parse.Attoparsec.V0_3: hoodleheader :: Parser (ByteString, ByteString)
+ Text.Hoodle.Parse.Attoparsec.V0_3: hoodleheaderend :: Parser Char
+ Text.Hoodle.Parse.Attoparsec.V0_3: hoodleheaderstart :: Parser ByteString
+ Text.Hoodle.Parse.Attoparsec.V0_3: hoodleid :: Parser ByteString
+ Text.Hoodle.Parse.Attoparsec.V0_3: hoodleversion :: Parser ByteString
+ Text.Hoodle.Parse.Attoparsec.V0_3: img :: Parser Item
+ Text.Hoodle.Parse.Attoparsec.V0_3: langle :: Parser Char
+ Text.Hoodle.Parse.Attoparsec.V0_3: layer :: Parser Layer
+ Text.Hoodle.Parse.Attoparsec.V0_3: layerclose :: Parser ByteString
+ Text.Hoodle.Parse.Attoparsec.V0_3: layerheader :: Parser ByteString
+ Text.Hoodle.Parse.Attoparsec.V0_3: link :: Parser Item
+ Text.Hoodle.Parse.Attoparsec.V0_3: link_footer :: Parser ()
+ Text.Hoodle.Parse.Attoparsec.V0_3: link_header :: Parser (ByteString, ByteString, Maybe ByteString, ByteString, Maybe ByteString, (Double, Double), Dimension)
+ Text.Hoodle.Parse.Attoparsec.V0_3: mkXYZ :: [Pair Double Double] -> [Double] -> [(Double, Double, Double)]
+ Text.Hoodle.Parse.Attoparsec.V0_3: onestroke :: Parser Stroke
+ Text.Hoodle.Parse.Attoparsec.V0_3: page :: Parser Page
+ Text.Hoodle.Parse.Attoparsec.V0_3: pageclose :: Parser ByteString
+ Text.Hoodle.Parse.Attoparsec.V0_3: pageheader :: Parser Dimension
+ Text.Hoodle.Parse.Attoparsec.V0_3: pageheaderend :: Parser Char
+ Text.Hoodle.Parse.Attoparsec.V0_3: pageheaderstart :: Parser ByteString
+ Text.Hoodle.Parse.Attoparsec.V0_3: parseFileName :: Parser ByteString
+ Text.Hoodle.Parse.Attoparsec.V0_3: rangle :: Parser Char
+ Text.Hoodle.Parse.Attoparsec.V0_3: renderCDATA :: Parser ByteString
+ Text.Hoodle.Parse.Attoparsec.V0_3: revision :: Parser Revision
+ Text.Hoodle.Parse.Attoparsec.V0_3: skipSpaces :: Parser ()
+ Text.Hoodle.Parse.Attoparsec.V0_3: strokewidth :: Parser StrokeWidth
+ Text.Hoodle.Parse.Attoparsec.V0_3: svg_footer :: Parser ()
+ Text.Hoodle.Parse.Attoparsec.V0_3: svg_header :: Parser ((Double, Double), Dimension)
+ Text.Hoodle.Parse.Attoparsec.V0_3: svg_obj :: Parser Item
+ Text.Hoodle.Parse.Attoparsec.V0_3: textCDATA :: Parser ByteString
+ Text.Hoodle.Parse.Attoparsec.V0_3: title :: Parser ByteString
+ Text.Hoodle.Parse.Attoparsec.V0_3: titleclose :: Parser ByteString
+ Text.Hoodle.Parse.Attoparsec.V0_3: titleheader :: Parser ByteString
+ Text.Hoodle.Parse.Attoparsec.V0_3: trim :: Parser ()
+ Text.Hoodle.Parse.Attoparsec.V0_3: trim_starting_space :: Parser ()
+ Text.Hoodle.Parse.Attoparsec.V0_3: xmlheader :: Parser ByteString
+ Text.Hoodle.Parse.Attoparsec.V0_3: xmlstroke :: Parser XmlStroke
+ Text.Hoodle.Parse.Attoparsec.V0_3: xmlstroketagclose :: Parser ()
+ Text.Hoodle.Parse.Attoparsec.V0_3: xmlstroketagopen :: Parser XmlStroke
+ Text.Hoodle.Parse.Attoparsec.V0_3: xstrk_color :: XmlStroke -> ByteString
+ Text.Hoodle.Parse.Attoparsec.V0_3: xstrk_tool :: XmlStroke -> ByteString
+ Text.Hoodle.Parse.Attoparsec.V0_3: xstrk_width :: XmlStroke -> StrokeWidth
+ Text.Hoodle.Parse.Attoparsec.V0_3: xstrk_xydata :: XmlStroke -> [Pair Double Double]

Files

hoodle-parser.cabal view
@@ -1,5 +1,5 @@ Name:		hoodle-parser-Version:	0.3+Version:	0.3.0 Synopsis:       Hoodle file parser Description: 	Text parser for hoodle xml file Homepage:       http://ianwookim.org/hoodle@@ -26,17 +26,20 @@                  bytestring >= 0.9,                   containers >= 0.4,                   strict >= 0.3, -                 hoodle-types >= 0.3, -                 xournal-types >= 0.5.0.2,+                 hoodle-types >= 0.3.0, +                 xournal-types >= 0.5.1,                  text >= 0.11,                  lens >= 2.5,                   either >= 3.1   Exposed-Modules:                     Text.Hoodle.Migrate.FromXournal-                   Text.Hoodle.Migrate.V0_1_1_to_V0_2+                   Text.Hoodle.Migrate.V0_1_1_to_V0_2_2+                   Text.Hoodle.Migrate.V0_2_2_to_V0_3+                   Text.Hoodle.Migrate.V0_3_to_HEAD                    Text.Hoodle.Parse.Attoparsec                    Text.Hoodle.Parse.Attoparsec.V0_1_1                    Text.Hoodle.Parse.Attoparsec.V0_2_2+                   Text.Hoodle.Parse.Attoparsec.V0_3                    Text.Hoodle.Parse.Zlib                    Text.Hoodlet.Parse.Attoparsec 
− src/Text/Hoodle/Migrate/V0_1_1_to_V0_2.hs
@@ -1,113 +0,0 @@-{-# LANGUAGE OverloadedStrings, RecordWildCards #-}---------------------------------------------------------------------------------- |--- Module      : Text.Hoodle.Migrate.V0_1_999_to_V0_2--- Copyright   : (c) 2011-2013 Ian-Woo Kim------ License     : BSD3--- Maintainer  : Ian-Woo Kim <ianwookim@gmail.com>--- Stability   : experimental--- Portability : GHC------ attoparsec implementation of hoodle parser--- --------------------------------------------------------------------------------module Text.Hoodle.Migrate.V0_1_1_to_V0_2 where--import           Control.Applicative -import           Control.Lens-import           Control.Monad.Trans-import           Control.Monad.Trans.Either-import           Data.Attoparsec-import qualified Data.ByteString.Char8 as B----import qualified Data.Hoodle.Simple.V0_1_1 as OH-import qualified Data.Hoodle.Simple as NH--- import qualified Text.Hoodle.Builder as NB--- -import           Text.Hoodle.Parse.Attoparsec-import qualified Text.Hoodle.Parse.Attoparsec.V0_1_1 as OP --page2Page :: OH.Page -> NH.Page-page2Page OH.Page {..} = NH.Page { NH.page_dim = dim2Dim page_dim-                                 , NH.page_bkg = bkg2Bkg page_bkg-                                 , NH.page_layers = fmap layer2Layer page_layers } --dim2Dim :: OH.Dimension -> NH.Dimension -dim2Dim (OH.Dim w h) = NH.Dim w h ---bkg2Bkg :: OH.Background -> NH.Background -bkg2Bkg OH.Background {..} = NH.Background { NH.bkg_type = bkg_type -                                           , NH.bkg_color = bkg_color-                                           , NH.bkg_style = bkg_style }-bkg2Bkg OH.BackgroundPdf {..} = NH.BackgroundPdf { NH.bkg_type = bkg_type-                                                 , NH.bkg_domain = bkg_domain -                                                 , NH.bkg_filename = bkg_filename-                                              ,   NH.bkg_pageno = bkg_pageno } --- bkg2Bkg OH.BackgroundEmbedPdf {..} = NH.BackgroundEmbedPdf { NH.bkg_type = bkg_type---                                                            , NH.bkg_pageno = bkg_pageno }---item2Item :: OH.Item -> NH.Item -item2Item (OH.ItemStroke strk) = NH.ItemStroke (stroke2Stroke strk)-item2Item (OH.ItemImage image) = NH.ItemImage (image2Image image)-item2Item (OH.ItemSVG svg) = NH.ItemSVG (svg2SVG svg)--- item2Item (OH.ItemLink lnk) = NH.ItemLink (link2Link lnk)--stroke2Stroke :: OH.Stroke -> NH.Stroke-stroke2Stroke OH.Stroke {..} = NH.Stroke { NH.stroke_tool = stroke_tool -                                         , NH.stroke_color = stroke_color-                                         , NH.stroke_width = stroke_width-                                         , NH.stroke_data = stroke_data } -stroke2Stroke OH.VWStroke {..} = NH.VWStroke { NH.stroke_tool = stroke_tool -                                             , NH.stroke_color = stroke_color-                                             , NH.stroke_vwdata = stroke_vwdata } --image2Image :: OH.Image -> NH.Image-image2Image OH.Image {..} = NH.Image { NH.img_src = img_src -                                     , NH.img_pos = img_pos-                                     , NH.img_dim = dim2Dim img_dim } --svg2SVG :: OH.SVG -> NH.SVG-svg2SVG OH.SVG {..} = NH.SVG { NH.svg_text = svg_text-                             , NH.svg_command = svg_command -                             , NH.svg_render = svg_render -                             , NH.svg_pos = svg_pos -                             , NH.svg_dim = dim2Dim svg_dim } --{- -link2Link :: OH.Link -> NH.Link-link2Link OH.Link {..} = NH.Link { NH.link_id = link_id -                                 , NH.link_type = link_type-                                 , NH.link_location = link_location-                                 , NH.link_text = link_text-                                 , NH.link_command = link_command-                                 , NH.link_render = link_render-                                 , NH.link_pos = link_pos-                                 , NH.link_dim = dim2Dim link_dim }--}                                                 -                                                     -layer2Layer :: OH.Layer -> NH.Layer-layer2Layer OH.Layer {..} = NH.Layer { NH.layer_items = fmap item2Item layer_items } ---migrate :: B.ByteString -> IO (Either String NH.Hoodle)-migrate bstr = do -  runEitherT $ do -    v <- hoistEither (parseOnly checkHoodleVersion bstr)-    if v <= "0.1.1" -      then do  -        oh <- hoistEither (parseOnly OP.hoodle bstr)-        let ttl = view OH.title oh -            pgs = (fmap page2Page . view OH.pages) oh -        set NH.title ttl . set NH.pages pgs <$> lift NH.emptyHoodle -      else -        hoistEither (parseOnly hoodle bstr)--            -- pdf = view OH.embeddedPdf oh -{- . set NH.embeddedPdf pdf -}--
+ src/Text/Hoodle/Migrate/V0_1_1_to_V0_2_2.hs view
@@ -0,0 +1,109 @@+{-# LANGUAGE OverloadedStrings, RecordWildCards #-}++-----------------------------------------------------------------------------+-- |+-- Module      : Text.Hoodle.Migrate.V0_1_1_to_V0_2_2+-- Copyright   : (c) 2011-2015 Ian-Woo Kim+--+-- License     : BSD3+-- Maintainer  : Ian-Woo Kim <ianwookim@gmail.com>+-- Stability   : experimental+-- Portability : GHC+--+-- attoparsec implementation of hoodle parser+-- +-----------------------------------------------------------------------------++module Text.Hoodle.Migrate.V0_1_1_to_V0_2_2 where++import           Control.Applicative +import           Control.Lens+import           Control.Monad.Trans+import           Control.Monad.Trans.Either+import           Data.Attoparsec.ByteString+import qualified Data.ByteString.Char8 as B+--+import qualified Data.Hoodle.Simple.V0_1_1 as OH+import qualified Data.Hoodle.Simple.V0_2_2 as NH+-- +import qualified Text.Hoodle.Parse.Attoparsec.V0_1_1 as OP +import qualified Text.Hoodle.Parse.Attoparsec.V0_2_2 as NP++page2Page :: OH.Page -> NH.Page+page2Page OH.Page {..} = NH.Page { NH.page_dim = dim2Dim page_dim+                                 , NH.page_bkg = bkg2Bkg page_bkg+                                 , NH.page_layers = fmap layer2Layer page_layers } ++dim2Dim :: OH.Dimension -> NH.Dimension +dim2Dim (OH.Dim w h) = NH.Dim w h +++bkg2Bkg :: OH.Background -> NH.Background +bkg2Bkg OH.Background {..} = NH.Background { NH.bkg_type = bkg_type +                                           , NH.bkg_color = bkg_color+                                           , NH.bkg_style = bkg_style }+bkg2Bkg OH.BackgroundPdf {..} = NH.BackgroundPdf { NH.bkg_type = bkg_type+                                                 , NH.bkg_domain = bkg_domain +                                                 , NH.bkg_filename = bkg_filename+                                              ,   NH.bkg_pageno = bkg_pageno } +++item2Item :: OH.Item -> NH.Item +item2Item (OH.ItemStroke strk) = NH.ItemStroke (stroke2Stroke strk)+item2Item (OH.ItemImage image) = NH.ItemImage (image2Image image)+item2Item (OH.ItemSVG svg) = NH.ItemSVG (svg2SVG svg)++stroke2Stroke :: OH.Stroke -> NH.Stroke+stroke2Stroke OH.Stroke {..} = NH.Stroke { NH.stroke_tool = stroke_tool +                                         , NH.stroke_color = stroke_color+                                         , NH.stroke_width = stroke_width+                                         , NH.stroke_data = stroke_data } +stroke2Stroke OH.VWStroke {..} = NH.VWStroke { NH.stroke_tool = stroke_tool +                                             , NH.stroke_color = stroke_color+                                             , NH.stroke_vwdata = stroke_vwdata } ++image2Image :: OH.Image -> NH.Image+image2Image OH.Image {..} = NH.Image { NH.img_src = img_src +                                     , NH.img_pos = img_pos+                                     , NH.img_dim = dim2Dim img_dim } ++svg2SVG :: OH.SVG -> NH.SVG+svg2SVG OH.SVG {..} = NH.SVG { NH.svg_text = svg_text+                             , NH.svg_command = svg_command +                             , NH.svg_render = svg_render +                             , NH.svg_pos = svg_pos +                             , NH.svg_dim = dim2Dim svg_dim } ++{- +link2Link :: OH.Link -> NH.Link+link2Link OH.Link {..} = NH.Link { NH.link_id = link_id +                                 , NH.link_type = link_type+                                 , NH.link_location = link_location+                                 , NH.link_text = link_text+                                 , NH.link_command = link_command+                                 , NH.link_render = link_render+                                 , NH.link_pos = link_pos+                                 , NH.link_dim = dim2Dim link_dim }+-}                                                 +                                                     +layer2Layer :: OH.Layer -> NH.Layer+layer2Layer OH.Layer {..} = NH.Layer { NH.layer_items = fmap item2Item layer_items } +++migrate :: B.ByteString -> IO (Either String NH.Hoodle)+migrate bstr = do +  runEitherT $ do +    v <- hoistEither (parseOnly NP.checkHoodleVersion bstr)+    if v <= "0.1.1" +      then do  +        oh <- hoistEither (parseOnly OP.hoodle bstr)+        let ttl = view OH.title oh +            pgs = (fmap page2Page . view OH.pages) oh +        set NH.title ttl . set NH.pages pgs <$> lift NH.emptyHoodle +      else +        hoistEither (parseOnly NP.hoodle bstr)++            -- pdf = view OH.embeddedPdf oh +{- . set NH.embeddedPdf pdf -}++
+ src/Text/Hoodle/Migrate/V0_2_2_to_V0_3.hs view
@@ -0,0 +1,140 @@+{-# LANGUAGE MultiWayIf #-}+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE RecordWildCards #-}++-----------------------------------------------------------------------------+-- |+-- Module      : Text.Hoodle.Migrate.V0_2_2_to_V0_3+-- Copyright   : (c) 2011-2015 Ian-Woo Kim+--+-- License     : BSD3+-- Maintainer  : Ian-Woo Kim <ianwookim@gmail.com>+-- Stability   : experimental+-- Portability : GHC+--+-- attoparsec implementation of hoodle parser+-- +-----------------------------------------------------------------------------++module Text.Hoodle.Migrate.V0_2_2_to_V0_3 where++import           Control.Applicative +import           Control.Lens+import           Control.Monad.Trans+import           Control.Monad.Trans.Either+import           Data.Attoparsec.ByteString+import qualified Data.ByteString.Char8 as B+--+import qualified Data.Hoodle.Simple.V0_2_2 as OH+import qualified Data.Hoodle.Simple.V0_3 as NH+-- +import qualified Text.Hoodle.Migrate.V0_1_1_to_V0_2_2+import qualified Text.Hoodle.Parse.Attoparsec.V0_2_2 as OP +import qualified Text.Hoodle.Parse.Attoparsec.V0_3 as NP++++dim2Dim :: OH.Dimension -> NH.Dimension +dim2Dim (OH.Dim w h) = NH.Dim w h +++bkg2Bkg :: OH.Background -> NH.Background +bkg2Bkg OH.Background {..} = NH.Background { NH.bkg_type = bkg_type +                                           , NH.bkg_color = bkg_color+                                           , NH.bkg_style = bkg_style }+bkg2Bkg OH.BackgroundPdf {..} = NH.BackgroundPdf { NH.bkg_type = bkg_type+                                                 , NH.bkg_domain = bkg_domain +                                                 , NH.bkg_filename = bkg_filename+                                              ,   NH.bkg_pageno = bkg_pageno } +bkg2Bkg OH.BackgroundEmbedPdf {..} = NH.BackgroundEmbedPdf { NH.bkg_type = bkg_type+                                                           , NH.bkg_pageno = bkg_pageno }+++item2Item :: OH.Item -> NH.Item +item2Item (OH.ItemStroke strk) = NH.ItemStroke (stroke2Stroke strk)+item2Item (OH.ItemImage image) = NH.ItemImage (image2Image image)+item2Item (OH.ItemSVG svg) = NH.ItemSVG (svg2SVG svg)+item2Item (OH.ItemLink lnk) = NH.ItemLink (link2Link lnk)++stroke2Stroke :: OH.Stroke -> NH.Stroke+stroke2Stroke OH.Stroke {..} = NH.Stroke { NH.stroke_tool = stroke_tool +                                         , NH.stroke_color = stroke_color+                                         , NH.stroke_width = stroke_width+                                         , NH.stroke_data = stroke_data } +stroke2Stroke OH.VWStroke {..} = NH.VWStroke { NH.stroke_tool = stroke_tool +                                             , NH.stroke_color = stroke_color+                                             , NH.stroke_vwdata = stroke_vwdata } ++image2Image :: OH.Image -> NH.Image+image2Image OH.Image {..} = NH.Image { NH.img_src = img_src +                                     , NH.img_pos = img_pos+                                     , NH.img_dim = dim2Dim img_dim } ++svg2SVG :: OH.SVG -> NH.SVG+svg2SVG OH.SVG {..} = NH.SVG { NH.svg_text = svg_text+                             , NH.svg_command = svg_command +                             , NH.svg_render = svg_render +                             , NH.svg_pos = svg_pos +                             , NH.svg_dim = dim2Dim svg_dim } +++link2Link :: OH.Link -> NH.Link+link2Link OH.Link {..}      = NH.Link      { NH.link_id = link_id +                                           , NH.link_type = link_type+                                           , NH.link_location = link_location+                                           , NH.link_text = link_text+                                           , NH.link_command = link_command+                                           , NH.link_render = link_render+                                           , NH.link_pos = link_pos+                                           , NH.link_dim = dim2Dim link_dim }+link2Link OH.LinkDocID {..} = NH.LinkDocID { NH.link_id = link_id +                                           , NH.link_linkeddocid = link_linkeddocid+                                           , NH.link_location = link_location+                                           , NH.link_text = link_text+                                           , NH.link_command = link_command+                                           , NH.link_render = link_render+                                           , NH.link_pos = link_pos+                                           , NH.link_dim = dim2Dim link_dim }+++                                                     +layer2Layer :: OH.Layer -> NH.Layer+layer2Layer OH.Layer {..} = NH.Layer { NH.layer_items = fmap item2Item layer_items } ++page2Page :: OH.Page -> NH.Page+page2Page OH.Page {..} = NH.Page { NH.page_dim = dim2Dim page_dim+                                 , NH.page_bkg = bkg2Bkg page_bkg+                                 , NH.page_layers = fmap layer2Layer page_layers } ++rev2Rev :: OH.Revision -> NH.Revision+rev2Rev OH.Revision {..} = NH.Revision { NH._revmd5 = _revmd5 +                                       , NH._revtxt = _revtxt }+rev2Rev OH.RevisionInk {..} = NH.RevisionInk { NH._revmd5 = _revmd5 +                                             , NH._revink = map stroke2Stroke _revink }++hoodle2Hoodle :: OH.Hoodle -> IO NH.Hoodle+hoodle2Hoodle oh =  set NH.hoodleID  (view OH.hoodleID oh)+                  . set NH.title     (view OH.title oh)+                  . set NH.revisions (map rev2Rev (view OH.revisions oh))+                  . set NH.embeddedPdf (view OH.embeddedPdf oh)+                  . set NH.pages ((fmap page2Page . view OH.pages) oh)+                  <$> NH.emptyHoodle ++migrate :: B.ByteString -> IO (Either String NH.Hoodle)+migrate bstr = do +  runEitherT $ do +    v <- hoistEither (parseOnly NP.checkHoodleVersion bstr)+    if | v <= "0.1.1" -> do oh <- EitherT (Text.Hoodle.Migrate.V0_1_1_to_V0_2_2.migrate bstr)+                            let ttl = view OH.title oh +                                pgs = (fmap page2Page . view OH.pages) oh +                            set NH.title ttl . set NH.pages pgs <$> lift NH.emptyHoodle +       | v <= "0.2.2" && v > "0.1.1" ->+                         do oh <- hoistEither (parseOnly OP.hoodle bstr)+                            lift (hoodle2Hoodle oh)+       | otherwise -> hoistEither (parseOnly NP.hoodle bstr)+++            -- pdf = view OH.embeddedPdf oh +{- . set NH.embeddedPdf pdf -}++
+ src/Text/Hoodle/Migrate/V0_3_to_HEAD.hs view
@@ -0,0 +1,129 @@+{-# LANGUAGE MultiWayIf #-}+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE RecordWildCards #-}++-----------------------------------------------------------------------------+-- |+-- Module      : Text.Hoodle.Migrate.V0_3_to_HEAD+-- Copyright   : (c) 2011-2015 Ian-Woo Kim+--+-- License     : BSD3+-- Maintainer  : Ian-Woo Kim <ianwookim@gmail.com>+-- Stability   : experimental+-- Portability : GHC+--+-- attoparsec implementation of hoodle parser+-- +-----------------------------------------------------------------------------++module Text.Hoodle.Migrate.V0_3_to_HEAD where++import           Control.Applicative +import           Control.Lens+--+import qualified Data.Hoodle.Simple.V0_3 as OH+import qualified Data.Hoodle.Simple as NH+-- +++dim2Dim :: OH.Dimension -> NH.Dimension +dim2Dim (OH.Dim w h) = NH.Dim w h +++bkg2Bkg :: OH.Background -> NH.Background +bkg2Bkg OH.Background {..} = NH.Background { NH.bkg_type = bkg_type +                                           , NH.bkg_color = bkg_color+                                           , NH.bkg_style = bkg_style }+bkg2Bkg OH.BackgroundPdf {..} = NH.BackgroundPdf { NH.bkg_type = bkg_type+                                                 , NH.bkg_domain = bkg_domain +                                                 , NH.bkg_filename = bkg_filename+                                              ,   NH.bkg_pageno = bkg_pageno } +bkg2Bkg OH.BackgroundEmbedPdf {..} = NH.BackgroundEmbedPdf { NH.bkg_type = bkg_type+                                                           , NH.bkg_pageno = bkg_pageno }+++item2Item :: OH.Item -> NH.Item +item2Item (OH.ItemStroke strk) = NH.ItemStroke (stroke2Stroke strk)+item2Item (OH.ItemImage image) = NH.ItemImage (image2Image image)+item2Item (OH.ItemSVG svg) = NH.ItemSVG (svg2SVG svg)+item2Item (OH.ItemLink lnk) = NH.ItemLink (link2Link lnk)+item2Item (OH.ItemAnchor anchor) = NH.ItemAnchor (anchor2Anchor anchor)++stroke2Stroke :: OH.Stroke -> NH.Stroke+stroke2Stroke OH.Stroke {..} = NH.Stroke { NH.stroke_tool = stroke_tool +                                         , NH.stroke_color = stroke_color+                                         , NH.stroke_width = stroke_width+                                         , NH.stroke_data = stroke_data } +stroke2Stroke OH.VWStroke {..} = NH.VWStroke { NH.stroke_tool = stroke_tool +                                             , NH.stroke_color = stroke_color+                                             , NH.stroke_vwdata = stroke_vwdata } ++image2Image :: OH.Image -> NH.Image+image2Image OH.Image {..} = NH.Image { NH.img_src = img_src +                                     , NH.img_pos = img_pos+                                     , NH.img_dim = dim2Dim img_dim } ++svg2SVG :: OH.SVG -> NH.SVG+svg2SVG OH.SVG {..} = NH.SVG { NH.svg_text = svg_text+                             , NH.svg_command = svg_command +                             , NH.svg_render = svg_render +                             , NH.svg_pos = svg_pos +                             , NH.svg_dim = dim2Dim svg_dim } +++link2Link :: OH.Link -> NH.Link+link2Link OH.Link {..}      = NH.Link      { NH.link_id = link_id +                                           , NH.link_type = link_type+                                           , NH.link_location = link_location+                                           , NH.link_text = link_text+                                           , NH.link_command = link_command+                                           , NH.link_render = link_render+                                           , NH.link_pos = link_pos+                                           , NH.link_dim = dim2Dim link_dim }+link2Link OH.LinkDocID {..} = NH.LinkDocID { NH.link_id = link_id +                                           , NH.link_linkeddocid = link_linkeddocid+                                           , NH.link_location = link_location+                                           , NH.link_text = link_text+                                           , NH.link_command = link_command+                                           , NH.link_render = link_render+                                           , NH.link_pos = link_pos+                                           , NH.link_dim = dim2Dim link_dim }+link2Link OH.LinkAnchor {..} = NH.LinkAnchor { NH.link_id = link_id+                                             , NH.link_linkeddocid = link_linkeddocid+                                             , NH.link_location = link_location+                                             , NH.link_anchorid = link_anchorid+                                             , NH.link_render = link_render+                                             , NH.link_pos = link_pos+                                             , NH.link_dim = dim2Dim link_dim }+++anchor2Anchor :: OH.Anchor -> NH.Anchor+anchor2Anchor OH.Anchor {..} = NH.Anchor { NH.anchor_id = anchor_id+                                         , NH.anchor_render = anchor_render+                                         , NH.anchor_pos = anchor_pos+                                         , NH.anchor_dim = dim2Dim anchor_dim }+                                                     +layer2Layer :: OH.Layer -> NH.Layer+layer2Layer OH.Layer {..} = NH.Layer { NH.layer_items = fmap item2Item layer_items } ++page2Page :: OH.Page -> NH.Page+page2Page OH.Page {..} = NH.Page { NH.page_dim = dim2Dim page_dim+                                 , NH.page_bkg = bkg2Bkg page_bkg+                                 , NH.page_layers = fmap layer2Layer page_layers } ++rev2Rev :: OH.Revision -> NH.Revision+rev2Rev OH.Revision {..} = NH.Revision { NH._revmd5 = _revmd5 +                                       , NH._revtxt = _revtxt }+rev2Rev OH.RevisionInk {..} = NH.RevisionInk { NH._revmd5 = _revmd5 +                                             , NH._revink = map stroke2Stroke _revink }++hoodle2Hoodle :: OH.Hoodle -> IO NH.Hoodle+hoodle2Hoodle oh =  set NH.hoodleID  (view OH.hoodleID oh)+                  . set NH.title     (view OH.title oh)+                  . set NH.revisions (map rev2Rev (view OH.revisions oh))+                  . set NH.embeddedPdf (view OH.embeddedPdf oh)+                  . set NH.embeddedText (view OH.embeddedText oh)+                  . set NH.pages ((fmap page2Page . view OH.pages) oh)+                  <$> NH.emptyHoodle ++
src/Text/Hoodle/Parse/Attoparsec.hs view
@@ -4,7 +4,7 @@ ----------------------------------------------------------------------------- -- | -- Module      : Text.Hoodle.Parse.Attoparsec--- Copyright   : (c) 2011-2014 Ian-Woo Kim+-- Copyright   : (c) 2011-2015 Ian-Woo Kim -- -- License     : BSD3 -- Maintainer  : Ian-Woo Kim <ianwookim@gmail.com>@@ -18,9 +18,10 @@ module Text.Hoodle.Parse.Attoparsec where  import           Control.Applicative -import           Data.Attoparsec-import           Data.Attoparsec.Char8 ( char, decimal, double, skipSpace-                                       , isHorizontalSpace, anyChar)+import           Data.Attoparsec.ByteString+import           Data.Attoparsec.ByteString.Char8 ( char, decimal, double+                                                  , skipSpace+                                                  , isHorizontalSpace, anyChar) import qualified Data.ByteString.Char8 as B hiding (map)  import           Data.Char  import           Data.Strict.Tuple
src/Text/Hoodle/Parse/Attoparsec/V0_1_1.hs view
@@ -3,7 +3,7 @@ ----------------------------------------------------------------------------- -- | -- Module      : Text.Hoodle.Parse.Attoparsec.V0_1_1--- Copyright   : (c) 2011-2013 Ian-Woo Kim+-- Copyright   : (c) 2011-2015 Ian-Woo Kim -- -- License     : BSD3 -- Maintainer  : Ian-Woo Kim <ianwookim@gmail.com>@@ -17,9 +17,10 @@ module Text.Hoodle.Parse.Attoparsec.V0_1_1 where  import           Control.Applicative -import           Data.Attoparsec-import           Data.Attoparsec.Char8 ( char, decimal, double, skipSpace-                                      , isHorizontalSpace, anyChar)+import           Data.Attoparsec.ByteString+import           Data.Attoparsec.ByteString.Char8 ( char, decimal, double+                                                  , skipSpace+                                                  , isHorizontalSpace, anyChar) import qualified Data.ByteString.Char8 as B hiding (map)  import           Data.Char  import           Data.Strict.Tuple
src/Text/Hoodle/Parse/Attoparsec/V0_2_2.hs view
@@ -3,7 +3,7 @@ ----------------------------------------------------------------------------- -- | -- Module      : Text.Hoodle.Parse.Attoparsec.V0_2_2--- Copyright   : (c) 2011-2014 Ian-Woo Kim+-- Copyright   : (c) 2011-2015 Ian-Woo Kim -- -- License     : BSD3 -- Maintainer  : Ian-Woo Kim <ianwookim@gmail.com>@@ -17,9 +17,10 @@ module Text.Hoodle.Parse.Attoparsec.V0_2_2 where  import           Control.Applicative -import           Data.Attoparsec-import           Data.Attoparsec.Char8 ( char, decimal, double, skipSpace-                                      , isHorizontalSpace, anyChar)+import           Data.Attoparsec.ByteString+import           Data.Attoparsec.ByteString.Char8 ( char, decimal, double+                                                  , skipSpace+                                                  , isHorizontalSpace, anyChar) import qualified Data.ByteString.Char8 as B hiding (map)  import           Data.Char  import           Data.Strict.Tuple
+ src/Text/Hoodle/Parse/Attoparsec/V0_3.hs view
@@ -0,0 +1,594 @@+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE MultiWayIf #-}++-----------------------------------------------------------------------------+-- |+-- Module      : Text.Hoodle.Parse.Attoparsec.V0_3+-- Copyright   : (c) 2011-2015 Ian-Woo Kim+--+-- License     : BSD3+-- Maintainer  : Ian-Woo Kim <ianwookim@gmail.com>+-- Stability   : experimental+-- Portability : GHC+--+-- attoparsec implementation of hoodle parser+-- +-----------------------------------------------------------------------------++module Text.Hoodle.Parse.Attoparsec.V0_3 where++import           Control.Applicative +import           Data.Attoparsec.ByteString+import           Data.Attoparsec.ByteString.Char8 ( char, decimal, double+                                                  , skipSpace+                                                  , isHorizontalSpace, anyChar)+import qualified Data.ByteString.Char8 as B hiding (map) +import           Data.Char +import           Data.Strict.Tuple+import qualified Data.Text as T+import qualified Data.Text.Encoding as TE +-- from hoodle-platform +import qualified Data.Hoodle.Simple.V0_3 as H+-- +import Prelude hiding (takeWhile)++-- |+skipSpaces :: Parser () +skipSpaces = satisfy isHorizontalSpace *> skipWhile isHorizontalSpace++-- | +trim_starting_space :: Parser ()+trim_starting_space = do try endOfInput+                         <|> takeWhile (inClass " \n") *> return ()+                +-- | +langle :: Parser Char +langle = char '<'++-- | +rangle :: Parser Char +rangle = char '>'++-- | +xmlheader :: Parser B.ByteString+xmlheader = string "<?" *> takeTill (inClass "?>") <* string "?>"+                 +-- | +headercontentWorker :: B.ByteString -> Parser B.ByteString +headercontentWorker  bstr = do +  h <- takeWhile1 (notInClass "?>") +  ((string "?>" >>= return . (bstr `B.append` h `B.append`))+   <|> headercontentWorker (bstr `B.append` h))++-- | +headercontent :: Parser B.ByteString +headercontent = headercontentWorker B.empty+                 +-- | +data StrokeWidth = SingleWidth Double | VarWidth [Double] +++-- | +data XmlStroke = XmlStroke { xstrk_tool :: B.ByteString  +                           , xstrk_color :: B.ByteString+                           , xstrk_width :: StrokeWidth+                           , xstrk_xydata :: [Pair Double Double] }++-- | +xmlstroketagopen :: Parser XmlStroke +xmlstroketagopen = do +  trim +  string "<stroke"+  trim +  string "tool="+  char '"'+  tool <- alphabet +  char '"'+  trim +  string "color="+  char '"'+  color <- alphanumsharp +  char '"'+  trim +  string "width="+  width <- strokewidth +  char '>' +  return $ XmlStroke tool color width []   ++strokewidth :: Parser StrokeWidth   +strokewidth = do +    char '"'+    wlst <- many $ do trim_starting_space+                      w <- double+                      skipSpace +                      return w+    char '"'+    let msw | length wlst == 1 = return (SingleWidth (head wlst)) +            | length wlst == 0 = fail "no width"+            | otherwise = return (VarWidth wlst)+    msw++  +-- | +xmlstroketagclose :: Parser ()+xmlstroketagclose = string "</stroke>" >> return ()+++-- | +xmlstroke :: Parser XmlStroke                 +xmlstroke = do +    trim +    strokeinit <- xmlstroketagopen+    coordlist <- many $ do trim_starting_space+                           x <- double+                           skipSpace +                           y <- double+                           skipSpace +                           return (x :!: y)  +    xmlstroketagclose +    return $ strokeinit { xstrk_xydata = coordlist } +++-- | +onestroke :: Parser H.Stroke +onestroke =  do +    xstrk <- xmlstroke +    let r = case xstrk_width xstrk of +              SingleWidth w -> (H.Stroke <$> xstrk_tool +                                 <*> xstrk_color +                                 <*> pure w +                                 <*> xstrk_xydata ) xstrk+              VarWidth ws -> let xyz = mkXYZ (xstrk_xydata xstrk) ws+                             in (H.VWStroke <$> xstrk_tool <*> xstrk_color   +                                  <*> pure xyz) xstrk+    return r ++-- | +mkXYZ :: [Pair Double Double] -> [Double] -> [(Double,Double,Double)]+mkXYZ = zipWith f where f (x :!: y) z = (x,y,z)++-- |  +img :: Parser H.Item +img = do trim +         string "<img"+         trim +         string "src=\""+         fsrc <- parseFileName +         char '"'+         trim +         string "x=\""+         posx <- double +         char '"'+         trim+         string "y=\""+         posy <- double+         char '"'+         trim +         string "width=\""+         width <- double+         char '"'+         trim +         string "height=\""+         height <- double+         char '"'+         trim +         string "/>"+         (return . H.ItemImage) (H.Image fsrc (posx,posy) (H.Dim width height))+         ++svg_header :: Parser ((Double,Double),H.Dimension)+svg_header = do trim +                string "<svgobject"+                trim +                string "x=\""+                posx <- double +                char '"'+                trim+                string "y=\""+                posy <- double+                char '"'+                trim +                string "width=\""+                width <- double+                char '"'+                trim +                string "height=\""+                height <- double+                char '"'+                trim +                string ">"+                return ((posx,posy),H.Dim width height) ++svg_footer :: Parser () +svg_footer = string "</svgobject>" >> return ()++textCDATA :: Parser B.ByteString +textCDATA = do +    string "<text>"+    bstr <- getCDATA+    -- str <- string "<![CDATA[" *> manyTill anyChar (try (string "]]>"))+    string "</text>"+    return bstr -- (B.pack str) ++commandCDATA :: Parser B.ByteString +commandCDATA = do +    string "<command>"+    bstr <- getCDATA+    -- str <- string "<![CDATA[" *> manyTill anyChar (try (string "]]>"))+    string "</command>"+    return bstr -- (B.pack str)++renderCDATA :: Parser B.ByteString +renderCDATA = do +    string "<render>"+    bstr <- getCDATA+    -- str <- string "<![CDATA[" *> manyTill anyChar (try (string "]]>"))+    string "</render>"+    return bstr -- (B.pack str)+++getCDATA :: Parser B.ByteString+getCDATA = string "<![CDATA[" *> manyTill anyChar (try (string "]]>")) >>= return . B.pack ++svg_obj :: Parser H.Item +svg_obj = do (xy,dim) <- svg_header+             trim +             (mt,mc) <- (try (do t <- textCDATA +                                 trim +                                 c <- commandCDATA +                                 return (Just t, Just c)) +                         <|> try (textCDATA >>= \t -> return (Just t, Nothing))+                         <|> return (Nothing,Nothing))+             trim +             bstr <- renderCDATA +             trim +             svg_footer+             (return . H.ItemSVG) (H.SVG mt mc bstr xy dim)++                                  ++link_header :: Parser ( B.ByteString+                      , B.ByteString+                      , Maybe B.ByteString+                      , B.ByteString+                      , Maybe B.ByteString+                      , (Double,Double),H.Dimension)+link_header = do +    trim +    string "<link"+    trim +    i <- B.pack <$> (string "id=\"" *> manyTill anyChar (try (char '"')))+    trim +    typ <- B.pack <$> (string "type=\"" *> manyTill anyChar (try (char '"')))+    trim +    mlid <- if | typ == "simple" -> return Nothing +               | typ == "linkdocid" || typ == "anchor" ->+                   Just <$> (string "linkedid=\"" +                             *> takeTill (inClass "\"") +                             <* char '"')+               | otherwise -> fail "unknown link type"+    trim+    loc <- if | typ == "simple" || typ == "linkdocid" || typ == "anchor" ->+                  (string "location=\"" +                   *> takeTill (inClass "\"")+                   <* char '"')+              | otherwise -> fail "unknown link type"+    trim+    maid <- if | typ == "anchor" -> +                   Just <$> (string "anchorid=\""+                             *> takeTill (inClass "\"")+                             <* char '"')+               | typ == "simple" || typ == "linkdocid" -> return Nothing+               | otherwise -> fail "unknown link type"+    trim+    posx <- string "x=\"" *> double <* char '"'+    trim+    posy <- string "y=\"" *> double <* char '"'+    trim +    width <- string "width=\"" *> double <* char '"'+    trim +    height <- string "height=\"" *> double <* char '"'+    trim +    string ">"+    return (i,typ,mlid,loc,maid,(posx,posy),H.Dim width height) ++link_footer :: Parser () +link_footer = string "</link>" >> return ()++link :: Parser H.Item +link = do +    (i,typ,mlid,loc,maid,xy,dim) <- link_header+    trim +    (mt,mc) <- (try (do t <- textCDATA +                        trim +                        c <- commandCDATA +                        return (Just t, Just c)) +                <|> try (textCDATA >>= \t -> return (Just t, Nothing))+                <|> return (Nothing,Nothing))+    trim +    bstr <- renderCDATA +    trim +    link_footer+    let lnk | typ == "simple" = H.Link i typ loc mt mc bstr xy dim+            | typ == "linkdocid" = +                maybe (error "no linkedid or location for linkdocid") +                      (\lid -> H.LinkDocID i lid loc mt mc bstr xy dim)+                      mlid +            | typ == "anchor" = +                maybe (error "no linkedid for anchor")+                      (\(lid,aid) -> H.LinkAnchor i lid loc aid bstr xy dim)+                      ( mlid >>= \lid -> maid >>= \aid -> return (lid,aid))+            | otherwise = error "link type is not recognized"+    (return . H.ItemLink) lnk  ++anchor :: Parser H.Item+anchor = do+    trim +    string "<anchor"+    trim+    i <- B.pack <$> (string "id=\"" *> manyTill anyChar (try (char '"')))+    trim+    posx <- string "x=\"" *> double <* char '"'+    trim+    posy <- string "y=\"" *> double <* char '"'+    trim+    width <- string "width=\"" *> double <* char '"'+    trim +    height <- string "height=\"" *> double <* char '"'+    trim +    (try (string "/>" >>+          return (H.ItemAnchor (H.Anchor i "" (posx,posy) (H.Dim width height))))+     <|> (do string ">" +             trim+             bstr <- renderCDATA +             trim+             string "</anchor>" >> return ()+             return . H.ItemAnchor $ (H.Anchor i bstr (posx,posy) (H.Dim width height))))+    +-- | +trim :: Parser ()+trim = trim_starting_space++-- | +checkHoodleVersion :: Parser B.ByteString+checkHoodleVersion = do trim +                        xmlheader+                        trim +                        hoodleheaderstart+                        trim +                        hoodleversion ++                  +-- | +hoodle :: Parser H.Hoodle +hoodle  = do trim+             xmlheader <?> "xmlheader"+             trim+             (_v,hid) <- hoodleheader <?> "hoodleheader"+             trim+             t <- title <?> "title"+             trim+             revs <- many (revision <?> "revision")+             skipSpace+             pdf <- (try (Just <$> embeddedpdf)+                     <|> return Nothing )+             txt <- (try (Just <$> embeddedtext)+                     <|> return Nothing )+             pgs <- many1 (page <?> "page")+             trim+             hoodleclose +             return $ H.Hoodle hid t revs pdf txt pgs +             +page :: Parser H.Page +page = do trim +          dim <- pageheader+          trim +          bkg <- background <?> "background"+          trim +          layers <- many1 layer+          trim+          pageclose +          return $ H.Page dim bkg layers+         +          +layer :: Parser H.Layer+layer = do trim+           layerheader <?> "layer"+           trim+           itms <- many (try (H.ItemStroke <$> onestroke) <|> try img <|> try svg_obj <|> try link <|> anchor)+           trim+           layerclose +           return $ H.Layer itms+++title :: Parser B.ByteString +title = do trim +           titleheader+           str <- takeTill (inClass "<")+           titleclose+           return str ++titleheader :: Parser B.ByteString          +titleheader = string "<title>"++titleclose :: Parser B.ByteString+titleclose = string "</title>"++revision :: Parser H.Revision +revision = do skipSpace+              string "<revision" +              skipSpace +              string "revmd5=\""+              md5str <- manyTill anyChar (try (char '"'))+              skipSpace +              (try (do string "revtxt=\""+                       txtstr <- manyTill anyChar (try (char '"')) +                       skipSpace+                       string "/>"+                       return (H.Revision (B.pack md5str) (B.pack txtstr)))+               <|> (do string "type=\"ink\""+                       skipSpace+                       char '>'+                       skipSpace+                       strks <- many1 onestroke+                       skipSpace+                       string "</revision>"+                       return (H.RevisionInk (B.pack md5str) strks)))++embeddedpdf :: Parser (B.ByteString) +embeddedpdf = do string "<embeddedpdf" +                 trim +                 string "src=\""+                 str <- manyTill anyChar (try (char '"'))+                 trim +                 string "/>" +                 return (B.pack str)++embeddedtext :: Parser (T.Text) +embeddedtext = do string "<embeddedtext>"+                  bstr <- getCDATA+                  string "</embeddedtext>" +                  return (TE.decodeUtf8 bstr)++hoodleheader :: Parser (B.ByteString,B.ByteString)+hoodleheader = do hoodleheaderstart +                  trim +                  v <- hoodleversion+                  trim +                  hid <- hoodleid+                  trim +                  char '>' +                  return (v,hid)++hoodleheaderstart :: Parser B.ByteString +hoodleheaderstart = string "<hoodle"+++hoodleversion :: Parser B.ByteString +hoodleversion = string "version=\"" *> takeTill (inClass "\"") <* char '"'++hoodleid :: Parser B.ByteString +hoodleid = string "id=\"" *> takeTill (inClass "\"") <* char '"'++hoodleheaderend :: Parser Char+hoodleheaderend = char '>'++hoodleclose :: Parser B.ByteString+hoodleclose =  string "</hoodle>"++pageheader :: Parser H.Dimension +pageheader = do pageheaderstart  +                trim+                string "width=" +                char '"'+                w <- double+                char '"'+                trim +                string "height="+                char '"' +                h <- double +                char '"'+                takeTill (inClass ">")+                pageheaderend+                return $ H.Dim w h+                 +pageheaderstart :: Parser B.ByteString+pageheaderstart = string "<page"++pageheaderend :: Parser Char+pageheaderend = char '>'++pageclose :: Parser B.ByteString                  +pageclose = string "</page>"++layerheader :: Parser B.ByteString+layerheader = string "<layer>"++layerclose :: Parser B.ByteString+layerclose = string "</layer>"++background :: Parser H.Background +background = do +    trim+    backgroundheader+    trim +    string "type=" +    char '"'+    typ <- alphabet+    char '"'+    case typ of +      "solid" -> do +        trim +        string "color="+        char '"' +        col <- alphanumsharp +        char '"'+        trim +        string "style="+        trim +        char '"'+        sty <- alphabet +        char '"' +        trim +        takeTill (inClass "/>") +        backgroundclose+        return $ H.Background typ col sty +      "pdf" -> do     +        trim <?> "trim0"+        (mdomain,mfilename) <- (try $ do  +                                 string "domain="+                                 char '"' +                                 domain <- alphabet +                                 char '"'+                                 trim <?> "trim1"+                                 string "filename="+                                 trim <?> "trim2"+                                 char '"'+                                 filename <- parseFileName <?> "filename parse"+                                 char '"' +                                 return (Just domain, Just filename))+                               <|> return (Nothing,Nothing)+        trim <?> "trim3"+        string "pageno="+        trim <?> "trim4"+        char '"' +        pnum <- decimal <?> "decimal"+        char '"'+        trim +        takeTill (inClass "/>")  <?> "here takeTill"+        backgroundclose+        return $ H.BackgroundPdf typ mdomain mfilename pnum +      "embedpdf" -> do     +        trim <?> "trim0"+        string "pageno="+        char '"'+        pnum <- decimal <?> "embedpdf decimal" +        char '"'+        trim +        backgroundclose+        return $ H.BackgroundEmbedPdf  typ pnum+      _ -> fail "in parsing background"  +        +        +alphabet :: Parser B.ByteString+alphabet = takeWhile1 (\w -> (w >= 65 && w <= 90) || (w >= 97 && w <= 122)) ++alphanumsharp :: Parser B.ByteString            +alphanumsharp = takeWhile1 (\w -> (w >= 65 && w <= 90) +                                  || (w >= 97 && w <= 122) +                                  || ( w >= 48 && w<= 57 ) +                                  || ( w== 35) ) ++-- | need to be reimplemented+parseFileName :: Parser B.ByteString+parseFileName = takeTill (inClass ['"'])+++-- |+backgroundheader :: Parser B.ByteString+backgroundheader = string "<background"++-- | +backgroundclose :: Parser B.ByteString+backgroundclose = string "/>"+
src/Text/Hoodlet/Parse/Attoparsec.hs view
@@ -17,8 +17,8 @@ module Text.Hoodlet.Parse.Attoparsec where  import           Control.Applicative -import           Data.Attoparsec-import           Data.Attoparsec.Char8+import           Data.Attoparsec.ByteString+import           Data.Attoparsec.ByteString.Char8 import qualified Data.ByteString.Char8 as B --  import qualified Data.Hoodle.Simple as H