xml-pipe-0.0.0.5: xml-pipe.cabal
build-type: Simple
cabal-version: >= 1.8
name: xml-pipe
version: 0.0.0.5
stability: Experimental
author: Yoshikuni Jujo <PAF01143@nifty.ne.jp>
maintainer: Yoshikuni Jujo <PAF01143@nifty.ne.jp>
homepage: https://github.com/YoshikuniJujo/xml-pipe/wiki
license: BSD3
license-file: LICENSE
category: XML
synopsis: XML parser which uses simple-pipe
description:
This package process subset of XML and is still far from perfect, now.
.
Example programs
.
examples/indians.hs
.
extensions
.
* OverloadedStrings
.
* PackageImports
.
> import Control.Monad
> import "monads-tf" Control.Monad.Trans
> import Data.Maybe
> import Data.Pipe
> import Data.Pipe.List
> import Text.XML.Pipe
>
> import qualified Data.ByteString.Char8 as BSC
>
> littleIndians :: Int -> BSC.ByteString
> littleIndians n = "<indians>" `BSC.append`
> BSC.pack (show n) `BSC.append` " little, " `BSC.append`
> BSC.pack (show $ n + 1) `BSC.append` " little, " `BSC.append`
> BSC.pack (show $ n + 2) `BSC.append` " little Indians" `BSC.append`
> "</indians>"
>
> infiniteIndians :: [BSC.ByteString]
> infiniteIndians = map littleIndians [1, 4 .. ]
>
> xml :: [BSC.ByteString]
> xml = "<?xml version='1.0'?><song>" : infiniteIndians
>
> main :: IO ()
> main = void . runPipe $ fromList xml
> =$= xmlEvent
> =$= convert fromJust
> =$= (xmlBegin >>= xmlNode)
> =$= takeP 8
> =$= printP
>
> takeP :: Monad m => Int -> Pipe a a m ()
> takeP 0 = return ()
> takeP n = do
> mx <- await
> maybe (return ()) (\x -> yield x >> takeP (n - 1)) mx
>
> convert :: Monad m => (a -> b) -> Pipe a b m ()
> convert f = do
> mx <- await
> maybe (return ()) (\x -> yield (f x) >> convert f) mx
>
> printP :: Show a => Pipe a () IO ()
> printP = do
> mx <- await
> maybe (return ()) (\x -> lift (print x) >> printP) mx
.
examples/starttls.hs
.
It process STARTTLS of XMPP as client.
The fllowings are only main part.
.
> main :: IO ()
> main = do
> h <- connectTo "localhost" (PortNumber 5222)
> BS.hPut h $ xmlString begin
> BS.hPut h $ xmlString startTls
> void . runPipe $ handleP h
> =$= xmlEvent
> =$= convert fromJust
> =$= (xmlBegin >>= xmlNodeUntil isProceed)
> =$= printP
> ca <- readCertificateStore ["cacert.sample_pem"]
> g <- cprgCreate <$> createEntropyPool :: IO SystemRNG
> (`run` g) $ do
> p <- open' h "localhost" ["TLS_RSA_WITH_AES_128_CBC_SHA"] [] ca
> hlPut p $ xmlString begin
> void . runPipe $ handleP p
> =$= xmlEvent
> =$= convert fromJust
> =$= (xmlBegin >>= xmlNode)
> =$= printP
.
extra-source-files:
examples/indians.hs
examples/starttls.hs
source-repository head
type: git
location: git://github.com/YoshikuniJujo/xml-pipe.git
source-repository this
type: git
location: git://github.com/YoshikuniJujo/xml-pipe.git
tag: xml-pipe-0.0.0.5
library
hs-source-dirs: src
exposed-modules: Text.XML.Pipe
other-modules:
Text.XML.XmlEvent, Text.XML.Lexer, Text.XML.Papillon, Text.XML.XmlCreate
build-depends:
base == 4.*, bytestring == 0.10.*, simple-pipe == 0.0.0.6,
papillon == 0.1.*
ghc-options: -Wall
extensions: DoAndIfThenElse, PatternGuards