hoodle-parser 0.1.1 → 0.2
raw patch · 6 files changed
+744/−118 lines, 6 filesdep +eitherdep ~hoodle-typesPVP ok
version bump matches the API change (PVP)
Dependencies added: either
Dependency ranges changed: hoodle-types
API changes (from Hackage documentation)
- Text.Hoodle.Parse.Attoparsec: preview :: Parser ()
- Text.Hoodle.Parse.Attoparsec: previewclose :: Parser ByteString
- Text.Hoodle.Parse.Attoparsec: previewheader :: Parser ByteString
- Text.Hoodle.Parse.Attoparsec: svg_command :: Parser ByteString
- Text.Hoodle.Parse.Attoparsec: svg_render :: Parser ByteString
- Text.Hoodle.Parse.Attoparsec: svg_text :: Parser ByteString
- Text.Hoodle.Translate.FromXournal: mkHoodleFromXournal :: Xournal -> Hoodle
+ Text.Hoodle.Migrate.FromXournal: mkHoodleFromXournal :: Xournal -> IO Hoodle
+ 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.Parse.Attoparsec: checkHoodleVersion :: Parser ByteString
+ Text.Hoodle.Parse.Attoparsec: commandCDATA :: Parser ByteString
+ Text.Hoodle.Parse.Attoparsec: embeddedpdf :: Parser (ByteString)
+ Text.Hoodle.Parse.Attoparsec: hoodleid :: Parser ByteString
+ Text.Hoodle.Parse.Attoparsec: hoodleversion :: Parser ByteString
+ Text.Hoodle.Parse.Attoparsec: link :: Parser Item
+ Text.Hoodle.Parse.Attoparsec: link_footer :: Parser ()
+ Text.Hoodle.Parse.Attoparsec: link_header :: Parser (ByteString, ByteString, Maybe ByteString, ByteString, (Double, Double), Dimension)
+ Text.Hoodle.Parse.Attoparsec: renderCDATA :: Parser ByteString
+ Text.Hoodle.Parse.Attoparsec: textCDATA :: Parser ByteString
+ Text.Hoodle.Parse.Attoparsec.V0_1_1: SingleWidth :: Double -> StrokeWidth
+ Text.Hoodle.Parse.Attoparsec.V0_1_1: VarWidth :: [Double] -> StrokeWidth
+ Text.Hoodle.Parse.Attoparsec.V0_1_1: XmlStroke :: ByteString -> ByteString -> StrokeWidth -> [Pair Double Double] -> XmlStroke
+ Text.Hoodle.Parse.Attoparsec.V0_1_1: alphabet :: Parser ByteString
+ Text.Hoodle.Parse.Attoparsec.V0_1_1: alphanumsharp :: Parser ByteString
+ Text.Hoodle.Parse.Attoparsec.V0_1_1: background :: Parser Background
+ Text.Hoodle.Parse.Attoparsec.V0_1_1: backgroundclose :: Parser ByteString
+ Text.Hoodle.Parse.Attoparsec.V0_1_1: backgroundheader :: Parser ByteString
+ Text.Hoodle.Parse.Attoparsec.V0_1_1: data StrokeWidth
+ Text.Hoodle.Parse.Attoparsec.V0_1_1: data XmlStroke
+ Text.Hoodle.Parse.Attoparsec.V0_1_1: headercontent :: Parser ByteString
+ Text.Hoodle.Parse.Attoparsec.V0_1_1: headercontentWorker :: ByteString -> Parser ByteString
+ Text.Hoodle.Parse.Attoparsec.V0_1_1: hoodle :: Parser Hoodle
+ Text.Hoodle.Parse.Attoparsec.V0_1_1: hoodleclose :: Parser ByteString
+ Text.Hoodle.Parse.Attoparsec.V0_1_1: hoodleheader :: Parser ByteString
+ Text.Hoodle.Parse.Attoparsec.V0_1_1: hoodleheaderend :: Parser Char
+ Text.Hoodle.Parse.Attoparsec.V0_1_1: hoodleheaderstart :: Parser ByteString
+ Text.Hoodle.Parse.Attoparsec.V0_1_1: img :: Parser Item
+ Text.Hoodle.Parse.Attoparsec.V0_1_1: langle :: Parser Char
+ Text.Hoodle.Parse.Attoparsec.V0_1_1: layer :: Parser Layer
+ Text.Hoodle.Parse.Attoparsec.V0_1_1: layerclose :: Parser ByteString
+ Text.Hoodle.Parse.Attoparsec.V0_1_1: layerheader :: Parser ByteString
+ Text.Hoodle.Parse.Attoparsec.V0_1_1: mkXYZ :: [Pair Double Double] -> [Double] -> [(Double, Double, Double)]
+ Text.Hoodle.Parse.Attoparsec.V0_1_1: onestroke :: Parser Item
+ Text.Hoodle.Parse.Attoparsec.V0_1_1: page :: Parser Page
+ Text.Hoodle.Parse.Attoparsec.V0_1_1: pageclose :: Parser ByteString
+ Text.Hoodle.Parse.Attoparsec.V0_1_1: pageheader :: Parser Dimension
+ Text.Hoodle.Parse.Attoparsec.V0_1_1: pageheaderend :: Parser Char
+ Text.Hoodle.Parse.Attoparsec.V0_1_1: pageheaderstart :: Parser ByteString
+ Text.Hoodle.Parse.Attoparsec.V0_1_1: parseFileName :: Parser ByteString
+ Text.Hoodle.Parse.Attoparsec.V0_1_1: preview :: Parser ()
+ Text.Hoodle.Parse.Attoparsec.V0_1_1: previewclose :: Parser ByteString
+ Text.Hoodle.Parse.Attoparsec.V0_1_1: previewheader :: Parser ByteString
+ Text.Hoodle.Parse.Attoparsec.V0_1_1: rangle :: Parser Char
+ Text.Hoodle.Parse.Attoparsec.V0_1_1: skipSpaces :: Parser ()
+ Text.Hoodle.Parse.Attoparsec.V0_1_1: strokewidth :: Parser StrokeWidth
+ Text.Hoodle.Parse.Attoparsec.V0_1_1: svg_command :: Parser ByteString
+ Text.Hoodle.Parse.Attoparsec.V0_1_1: svg_footer :: Parser ()
+ Text.Hoodle.Parse.Attoparsec.V0_1_1: svg_header :: Parser ((Double, Double), Dimension)
+ Text.Hoodle.Parse.Attoparsec.V0_1_1: svg_obj :: Parser Item
+ Text.Hoodle.Parse.Attoparsec.V0_1_1: svg_render :: Parser ByteString
+ Text.Hoodle.Parse.Attoparsec.V0_1_1: svg_text :: Parser ByteString
+ Text.Hoodle.Parse.Attoparsec.V0_1_1: title :: Parser ByteString
+ Text.Hoodle.Parse.Attoparsec.V0_1_1: titleclose :: Parser ByteString
+ Text.Hoodle.Parse.Attoparsec.V0_1_1: titleheader :: Parser ByteString
+ Text.Hoodle.Parse.Attoparsec.V0_1_1: trim :: Parser ()
+ Text.Hoodle.Parse.Attoparsec.V0_1_1: trim_starting_space :: Parser ()
+ Text.Hoodle.Parse.Attoparsec.V0_1_1: xmlheader :: Parser ByteString
+ Text.Hoodle.Parse.Attoparsec.V0_1_1: xmlstroke :: Parser XmlStroke
+ Text.Hoodle.Parse.Attoparsec.V0_1_1: xmlstroketagclose :: Parser ()
+ Text.Hoodle.Parse.Attoparsec.V0_1_1: xmlstroketagopen :: Parser XmlStroke
+ Text.Hoodle.Parse.Attoparsec.V0_1_1: xstrk_color :: XmlStroke -> ByteString
+ Text.Hoodle.Parse.Attoparsec.V0_1_1: xstrk_tool :: XmlStroke -> ByteString
+ Text.Hoodle.Parse.Attoparsec.V0_1_1: xstrk_width :: XmlStroke -> StrokeWidth
+ Text.Hoodle.Parse.Attoparsec.V0_1_1: xstrk_xydata :: XmlStroke -> [Pair Double Double]
- Text.Hoodle.Parse.Attoparsec: hoodleheader :: Parser ByteString
+ Text.Hoodle.Parse.Attoparsec: hoodleheader :: Parser (ByteString, ByteString)
Files
- hoodle-parser.cabal +8/−4
- src/Text/Hoodle/Migrate/FromXournal.hs +60/−0
- src/Text/Hoodle/Migrate/V0_1_1_to_V0_2.hs +113/−0
- src/Text/Hoodle/Parse/Attoparsec.hs +110/−57
- src/Text/Hoodle/Parse/Attoparsec/V0_1_1.hs +453/−0
- src/Text/Hoodle/Translate/FromXournal.hs +0/−57
hoodle-parser.cabal view
@@ -1,5 +1,5 @@ Name: hoodle-parser-Version: 0.1.1+Version: 0.2 Synopsis: Hoodle file parser Description: Text parser for hoodle xml file Homepage: http://ianwookim.org/hoodle@@ -26,14 +26,18 @@ bytestring >= 0.9, containers >= 0.4, strict == 0.3.*, - hoodle-types >= 0.1.1, + hoodle-types >= 0.2, xournal-types >= 0.5.0.1, text == 0.11.*,- lens >= 2.5+ lens >= 2.5, + either >= 3.1 Exposed-Modules: + Text.Hoodle.Migrate.FromXournal+ Text.Hoodle.Migrate.V0_1_1_to_V0_2 Text.Hoodle.Parse.Attoparsec+ Text.Hoodle.Parse.Attoparsec.V0_1_1+ -- Text.Hoodle.Parse.Attoparsec.V0_1_999 Text.Hoodle.Parse.Zlib- Text.Hoodle.Translate.FromXournal
+ src/Text/Hoodle/Migrate/FromXournal.hs view
@@ -0,0 +1,60 @@+{-# LANGUAGE RecordWildCards #-}++-----------------------------------------------------------------------------+-- |+-- Module : Text.Hoodle.Migrate.FromXournal +-- Copyright : (c) 2011-2013 Ian-Woo Kim+--+-- License : BSD3+-- Maintainer : Ian-Woo Kim <ianwookim@gmail.com>+-- Stability : experimental+-- Portability : GHC+--+-----------------------------------------------------------------------------++module Text.Hoodle.Migrate.FromXournal +( mkHoodleFromXournal +) where++import Control.Applicative+import Control.Lens+-- +import qualified Data.Xournal.Simple as X +import qualified Data.Hoodle.Simple as H++-- | +mkHoodleFromXournal :: X.Xournal -> IO H.Hoodle +mkHoodleFromXournal X.Xournal {..} = + set H.title xoj_title . set H.pages (map x2h4Page xoj_pages) <$> H.emptyHoodle + +-- | +x2h4Page :: X.Page -> H.Page+x2h4Page X.Page {..} = H.Page + (x2h4dim page_dim) + (x2h4bkg page_bkg) + (map x2h4layer page_layers)+ +-- | +x2h4dim :: X.Dimension -> H.Dimension+x2h4dim X.Dim {..} = H.Dim dim_width dim_height ++-- | +x2h4bkg :: X.Background -> H.Background +x2h4bkg X.Background {..} = H.Background bkg_type bkg_color bkg_style+x2h4bkg X.BackgroundPdf {..} = + H.BackgroundPdf bkg_type bkg_domain bkg_filename bkg_pageno+++-- | +x2h4layer :: X.Layer -> H.Layer +x2h4layer X.Layer {..} = H.Layer (map x2h4stroke layer_strokes)++-- | +x2h4stroke :: X.Stroke -> H.Item -- H.Stroke +x2h4stroke X.Stroke {..} = + H.ItemStroke (H.Stroke stroke_tool stroke_color stroke_width stroke_data)+x2h4stroke X.VWStroke {..} = + H.ItemStroke (H.VWStroke stroke_tool stroke_color stroke_vwdata)+ + +
+ src/Text/Hoodle/Migrate/V0_1_1_to_V0_2.hs view
@@ -0,0 +1,113 @@+{-# 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/Parse/Attoparsec.hs view
@@ -3,7 +3,7 @@ ----------------------------------------------------------------------------- -- | -- Module : Text.Hoodle.Parse.Attoparsec--- Copyright : (c) 2011, 2012 Ian-Woo Kim+-- Copyright : (c) 2011-2013 Ian-Woo Kim -- -- License : BSD3 -- Maintainer : Ian-Woo Kim <ianwookim@gmail.com>@@ -20,11 +20,8 @@ import Data.Attoparsec import Data.Attoparsec.Char8 ( char, decimal, double, skipSpace , isHorizontalSpace, anyChar)--- import qualified Data.Attoparsec.Iteratee as AI import qualified Data.ByteString.Char8 as B hiding (map) import Data.Char --- import qualified Data.Iteratee as Iter--- import Data.Iteratee.Char import Data.Strict.Tuple -- from hoodle-platform import qualified Data.Hoodle.Simple as H@@ -202,22 +199,22 @@ svg_footer :: Parser () svg_footer = string "</svgobject>" >> return () -svg_text :: Parser B.ByteString -svg_text = do +textCDATA :: Parser B.ByteString +textCDATA = do string "<text>" str <- string "<![CDATA[" *> manyTill anyChar (try (string "]]>")) string "</text>" return (B.pack str) -svg_command :: Parser B.ByteString -svg_command = do +commandCDATA :: Parser B.ByteString +commandCDATA = do string "<command>" str <- string "<![CDATA[" *> manyTill anyChar (try (string "]]>")) string "</command>" return (B.pack str) -svg_render :: Parser B.ByteString -svg_render = do +renderCDATA :: Parser B.ByteString +renderCDATA = do string "<render>" str <- string "<![CDATA[" *> manyTill anyChar (try (string "]]>")) string "</render>"@@ -227,40 +224,101 @@ svg_obj :: Parser H.Item svg_obj = do (xy,dim) <- svg_header trim - (mt,mc) <- (try (do t <- svg_text + (mt,mc) <- (try (do t <- textCDATA trim - c <- svg_command + c <- commandCDATA return (Just t, Just c)) - <|> try (svg_text >>= \t -> return (Just t, Nothing))+ <|> try (textCDATA >>= \t -> return (Just t, Nothing)) <|> return (Nothing,Nothing)) trim - bstr <- svg_render + 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,(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 <- case typ of + "simple" -> return Nothing + "linkdocid" -> Just<$>(string "linkedid=\"" *> takeTill (inClass "\"")<* char '"')+ _ -> fail "unknown link type"+ trim + loc <- B.pack <$> (string "location=\"" *> 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 + string ">"+ return (i,typ,mlid,loc,(posx,posy),H.Dim width height) ++link_footer :: Parser () +link_footer = string "</link>" >> return ()+++link :: Parser H.Item +link = do + (i,typ,mlid,loc,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+ return . H.ItemLink $ + flip ($) mlid $ maybe (H.Link i typ loc mt mc bstr xy dim)+ (\lid -> H.LinkDocID i lid loc mt mc bstr xy dim) ++++ -- | 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- hoodleheader <?> "hoodleheader"+ (_v,hid) <- hoodleheader <?> "hoodleheader" trim t <- title <?> "title" trim- (try (preview >> return ())- <|> return ()) + pdf <- (try (Just <$> embeddedpdf)+ <|> return Nothing ) pgs <- many1 (page <?> "page") trim hoodleclose - return $ H.Hoodle t pgs + return $ H.Hoodle hid t pdf pgs page :: Parser H.Page page = do trim @@ -278,10 +336,7 @@ layer = do trim layerheader <?> "layer" trim- -- s1 <- onestroke - -- s2 <- img- -- let strokes = [s1,s2]- itms <- many (try onestroke <|> try img <|> svg_obj)+ itms <- many (try onestroke <|> try img <|> try svg_obj <|> link) trim layerclose return $ H.Layer itms@@ -300,25 +355,36 @@ titleclose :: Parser B.ByteString titleclose = string "</title>" -preview :: Parser ()-preview = do trim - previewheader- _str <- takeTill (inClass "<") - previewclose- trim+embeddedpdf :: Parser (B.ByteString) +embeddedpdf = do string "<embeddedpdf" + trim + string "src=\""+ str <- manyTill anyChar (try (char '"'))+ trim + string "/>" + return (B.pack str) -previewheader :: Parser B.ByteString -previewheader = string "<preview>" -previewclose :: Parser B.ByteString -previewclose = string "</preview>"--hoodleheader :: Parser B.ByteString-hoodleheader = hoodleheaderstart *> takeTill (inClass ">") <* hoodleheaderend+hoodleheader :: Parser (B.ByteString,B.ByteString)+hoodleheader = do hoodleheaderstart + trim + v <- hoodleversion+ trim + hid <- hoodleid+ trim + char '>' -- takeTill (inClass ">") <* hoodleheaderend+ 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 '>' @@ -407,6 +473,15 @@ takeTill (inClass "/>") <?> "here takeTill" backgroundclose return $ H.BackgroundPdf typ mdomain mfilename pnum + "embedpdf" -> do + trim <?> "trim0"+ string "pageno="+ char '"'+ pnum <- decimal <?> "embedpdf decimal" -- str <- manyTill anyChar (try (char '"'))+ char '"'+ trim + backgroundclose+ return $ H.BackgroundEmbedPdf typ pnum -- (B.pack str) _ -> fail "in parsing background" @@ -422,10 +497,6 @@ -- | need to be reimplemented parseFileName :: Parser B.ByteString parseFileName = takeTill (inClass ['"'])- -- takeWhilw1 (\w -> (w >= 65 && w <= 90) - -- || (w >= 97 && w <= 122)- -- || (w >= 48 && w <= 57)- -- || (w == 35) -- |@@ -435,22 +506,4 @@ -- | backgroundclose :: Parser B.ByteString backgroundclose = string "/>"--{--iter_hoodle :: Iter.Iteratee B.ByteString IO Hoodle-iter_hoodle = AI.parserToIteratee parser_hoodle --read_hoodle :: String -> IO Hoodle -read_hoodle str = Iter.fileDriver iter_hoodle str --read_xojgz :: String -> IO Hoodle -read_xojgz str = Iter.fileDriver (Iter.joinIM (ungzipXoj iter_hoodle)) str---cat_hoodlegz :: String -> IO () -cat_hoodlegz str = Iter.fileDriver - (Iter.joinIM (ungzipXoj printLinesUnterminated)) str --onlyresult (Done _ r) = r --}
+ src/Text/Hoodle/Parse/Attoparsec/V0_1_1.hs view
@@ -0,0 +1,453 @@+{-# LANGUAGE OverloadedStrings #-}++-----------------------------------------------------------------------------+-- |+-- Module : Text.Hoodle.Parse.Attoparsec.V0_1_1+-- 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.Parse.Attoparsec.V0_1_1 where++import Control.Applicative +import Data.Attoparsec+import Data.Attoparsec.Char8 ( char, decimal, double, skipSpace+ , isHorizontalSpace, anyChar)+import qualified Data.ByteString.Char8 as B hiding (map) +import Data.Char +import Data.Strict.Tuple+-- from hoodle-platform +import qualified Data.Hoodle.Simple.V0_1_1 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 <- double + 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.Item +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 . H.ItemStroke) 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 ()++svg_text :: Parser B.ByteString +svg_text = do + string "<text>"+ str <- string "<![CDATA[" *> manyTill anyChar (try (string "]]>"))+ string "</text>"+ return (B.pack str) ++svg_command :: Parser B.ByteString +svg_command = do + string "<command>"+ str <- string "<![CDATA[" *> manyTill anyChar (try (string "]]>"))+ string "</command>"+ return (B.pack str)++svg_render :: Parser B.ByteString +svg_render = do + string "<render>"+ str <- string "<![CDATA[" *> manyTill anyChar (try (string "]]>"))+ string "</render>"+ return (B.pack str)+++svg_obj :: Parser H.Item +svg_obj = do (xy,dim) <- svg_header+ trim + (mt,mc) <- (try (do t <- svg_text + trim + c <- svg_command + return (Just t, Just c)) + <|> try (svg_text >>= \t -> return (Just t, Nothing))+ <|> return (Nothing,Nothing))+ trim + bstr <- svg_render + trim + svg_footer+ (return . H.ItemSVG) (H.SVG mt mc bstr xy dim)++ ++-- | +trim :: Parser ()+trim = trim_starting_space++ +-- | +hoodle :: Parser H.Hoodle +hoodle = do trim+ xmlheader <?> "xmlheader"+ trim+ hoodleheader <?> "hoodleheader"+ trim+ t <- title <?> "title"+ trim+ (try (preview >> return ())+ <|> return ()) + pgs <- many1 (page <?> "page")+ trim+ hoodleclose + return $ H.Hoodle t 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+ -- s1 <- onestroke + -- s2 <- img+ -- let strokes = [s1,s2]+ itms <- many (try onestroke <|> try img <|> svg_obj)+ trim+ layerclose + return $ H.Layer itms+++title :: Parser B.ByteString +title = do trim + titleheader+ str <- takeTill (inClass "<") -- (many . satisfy . notInClass ) "<"+ titleclose+ return str ++titleheader :: Parser B.ByteString +titleheader = string "<title>"++titleclose :: Parser B.ByteString+titleclose = string "</title>"++preview :: Parser ()+preview = do trim + previewheader+ _str <- takeTill (inClass "<") + previewclose+ trim++previewheader :: Parser B.ByteString +previewheader = string "<preview>"++previewclose :: Parser B.ByteString +previewclose = string "</preview>"++hoodleheader :: Parser B.ByteString+hoodleheader = hoodleheaderstart *> takeTill (inClass ">") <* hoodleheaderend++hoodleheaderstart :: Parser B.ByteString +hoodleheaderstart = string "<hoodle"++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 + _ -> 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 ['"'])+ -- takeWhilw1 (\w -> (w >= 65 && w <= 90) + -- || (w >= 97 && w <= 122)+ -- || (w >= 48 && w <= 57)+ -- || (w == 35) +++-- |+backgroundheader :: Parser B.ByteString+backgroundheader = string "<background"++-- | +backgroundclose :: Parser B.ByteString+backgroundclose = string "/>"++{-+iter_hoodle :: Iter.Iteratee B.ByteString IO Hoodle+iter_hoodle = AI.parserToIteratee parser_hoodle ++read_hoodle :: String -> IO Hoodle +read_hoodle str = Iter.fileDriver iter_hoodle str ++read_xojgz :: String -> IO Hoodle +read_xojgz str = Iter.fileDriver (Iter.joinIM (ungzipXoj iter_hoodle)) str+++cat_hoodlegz :: String -> IO () +cat_hoodlegz str = Iter.fileDriver + (Iter.joinIM (ungzipXoj printLinesUnterminated)) str ++onlyresult (Done _ r) = r +-}+
− src/Text/Hoodle/Translate/FromXournal.hs
@@ -1,57 +0,0 @@-{-# LANGUAGE RecordWildCards #-}---------------------------------------------------------------------------------- |--- Module : Text.Hoodle.Builder --- Copyright : (c) 2011, 2012 Ian-Woo Kim------ License : BSD3--- Maintainer : Ian-Woo Kim <ianwookim@gmail.com>--- Stability : experimental--- Portability : GHC-----------------------------------------------------------------------------------module Text.Hoodle.Translate.FromXournal -( mkHoodleFromXournal -) where--import qualified Data.Xournal.Simple as X -import qualified Data.Hoodle.Simple as H---- | -mkHoodleFromXournal :: X.Xournal -> H.Hoodle -mkHoodleFromXournal X.Xournal {..} = - H.Hoodle xoj_title (map x2h4Page xoj_pages) - --- | -x2h4Page :: X.Page -> H.Page-x2h4Page X.Page {..} = H.Page - (x2h4dim page_dim) - (x2h4bkg page_bkg) - (map x2h4layer page_layers)- --- | -x2h4dim :: X.Dimension -> H.Dimension-x2h4dim X.Dim {..} = H.Dim dim_width dim_height ---- | -x2h4bkg :: X.Background -> H.Background -x2h4bkg X.Background {..} = H.Background bkg_type bkg_color bkg_style-x2h4bkg X.BackgroundPdf {..} = - H.BackgroundPdf bkg_type bkg_domain bkg_filename bkg_pageno----- | -x2h4layer :: X.Layer -> H.Layer -x2h4layer X.Layer {..} = H.Layer (map x2h4stroke layer_strokes)---- | -x2h4stroke :: X.Stroke -> H.Item -- H.Stroke -x2h4stroke X.Stroke {..} = - H.ItemStroke (H.Stroke stroke_tool stroke_color stroke_width stroke_data)-x2h4stroke X.VWStroke {..} = - H.ItemStroke (H.VWStroke stroke_tool stroke_color stroke_vwdata)- - -