packages feed

HandsomeSoup 0.3.1 → 0.3.2

raw patch · 4 files changed

+28/−12 lines, 4 filesdep +hxt-httpPVP: major bump suggested

API removals or changes: PVP suggests a major version bump

Dependencies added: hxt-http

API changes (from Hackage documentation)

+ Text.CSS.Parser: ident :: ParsecT [Char] u Identity String
+ Text.CSS.Parser: nmchar :: ParsecT [Char] u Identity Char
+ Text.CSS.Parser: nmstart :: ParsecT [Char] u Identity Char
- Text.HandsomeSoup: fromUrl :: String -> IO (IOSArrow XmlTree (NTree XNode))
+ Text.HandsomeSoup: fromUrl :: String -> IOSArrow XmlTree (NTree XNode)

Files

HandsomeSoup.cabal view
@@ -7,7 +7,7 @@ -- The package version. See the Haskell package versioning policy -- (http://www.haskell.org/haskellwiki/Package_versioning_policy) for -- standards guiding when and how versions should be incremented.-Version:             0.3.1+Version:             0.3.2  -- A short (one-line) description of the package. Synopsis:            Work with HTML more easily in HXT@@ -51,7 +51,7 @@   Exposed-modules:     Text.HandsomeSoup, Text.CSS.Parser      -- Packages needed in order to build this package.-  Build-depends: base < 5, transformers, HTTP, parsec, containers, mtl, MaybeT, hxt, network+  Build-depends: base < 5, transformers, HTTP, parsec, containers, mtl, MaybeT, hxt, network, hxt-http      -- Modules not exported by this package.   Other-modules: Text.CSS.Utils
README.markdown view
@@ -4,7 +4,7 @@  HandsomeSoup is the library I wish I had when I started parsing HTML in Haskell. -It is built on top of [HXT](http://www.fh-wedel.de/~si/HXmlToolbox/) and adds a few functions that make is easier to work with HTML.+It is built on top of [HXT](http://www.fh-wedel.de/~si/HXmlToolbox/) and adds a few functions that make it easier to work with HTML.  Most importantly, it adds CSS selectors to HXT. The goal of HandsomeSoup is to be a complete CSS2 selector parser for HXT. 
Text/CSS/Parser.hs view
@@ -3,6 +3,7 @@ import Text.Parsec import qualified Data.Functor.Identity as I import Data.List+import Data.Maybe import Text.CSS.Utils -- if no tag name was given, sName will be set to '*' -- attrs are (attr name, attr value).@@ -27,11 +28,21 @@ pp (Selector name attrs pseudo) = show name ++ ":" ++ showMap attrs ++ ", " ++ show pseudo     where showMap m = ("{" ++ (foldl (\acc (k,v) -> acc ++ (show k) ++ ":" ++ (show v) ++ ", ") "" m)) ++ "}" +{- Some lexeme parsers -}+ident :: ParsecT [Char] u I.Identity String+ident = do c1 <- optionMaybe (char '-')+           c2 <- nmstart+           cs <- many nmchar+           return $ concat [maybeToList c1, [c2], cs]++nmstart = alphaNum <|> char '_'+nmchar  = alphaNum <|> oneOf "_-"+ {- TYPE SELECTORS FOLLOW -}  -- | selects a tag name, like @ h1 @ typeSelector :: ParsecT [Char] u I.Identity [Char]-typeSelector = many1 alphaNum+typeSelector = many1 (alphaNum <|> oneOf "_-")  -- | universal selector, selects @ * @ universalSelector :: ParsecT [Char] u I.Identity String@@ -46,19 +57,19 @@ -- | class selector, selects @ .foo @ classSelector :: ParsecT [Char] u I.Identity ([Char], [Char]) classSelector = do-    val <- char '.' >> many1 alphaNum+    val <- char '.' >> ident     return ("class", '~':val)  -- | id selector, selects @ #foo @ idSelector :: ParsecT [Char] u I.Identity ([Char], [Char]) idSelector = do-    val <- char '#' >> many1 alphaNum+    val <- char '#' >> many1 nmchar     return ("id", val)  -- | selects attributes, like @ [id] @ (element must have id) or @ [id=foo] @ (element must have id foo). attributeSelector :: ParsecT [Char] u I.Identity ([Char], [Char]) attributeSelector = do-      _contents <- between (char '[') (char ']') (many1 (alphaNum <|> oneOf "-_|~=\"'"))+      _contents <- between (char '[') (char ']') (many1 (alphaNum <|> oneOf "/-_|~=\"'."))       -- remove quotes       let contents = filter (\c -> c /= '"' && c /= '\'') _contents       if "~=" `isInfixOf` contents 
Text/HandsomeSoup.hs view
@@ -15,6 +15,8 @@ import Data.List import Control.Monad import Text.CSS.Parser hiding (css)+import Text.XML.HXT.Arrow.ReadDocument+import Text.XML.HXT.HTTP  -- | Helper function for getting page content. Example: --@@ -26,11 +28,14 @@  -- | Given a url, returns a document. Example: ----- > doc <- fromUrl "http://foo.com"-fromUrl :: String -> IO (IOSArrow XmlTree (NTree XNode))-fromUrl url = do-  contents <- runMaybeT $ openUrl url-  return $ parseHtml (fromMaybe "" contents)+-- > doc = fromUrl "http://foo.com"+-- > doc = fromUrl "tests/test.html"+fromUrl :: String -> IOSArrow XmlTree (NTree XNode)+fromUrl url = readDocument [withValidate        no,+                            withInputEncoding   isoLatin1,+                            withParseByMimeType yes,+                            withHTTP            [],+                            withWarnings        no] url  -- | Given a string, parses it and returns a document. Example: --