hquery 0.1.0.1 → 0.1.0.2
raw patch · 3 files changed
+47/−8 lines, 3 filesPVP: minor bump suggested
API additions: PVP suggests at least a minor version bump
API changes (from Hackage documentation)
+ Text.Hquery: Group :: [Node] -> Group
+ Text.Hquery: data Group
+ Text.Hquery: instance MakeTransformer Group
+ Text.Hquery: instance MakeTransformer a => MakeTransformer (Maybe a)
+ Text.Hquery: nothing :: [Node]
Files
- hquery.cabal +2/−2
- src/Text/Hquery.hs +33/−6
- tests/TransformTests.hs +12/−0
hquery.cabal view
@@ -1,5 +1,5 @@ name: hquery-version: 0.1.0.1+version: 0.1.0.2 synopsis: A query language for transforming HTML5 license: MIT license-file: LICENSE@@ -36,7 +36,7 @@ type: exitcode-stdio-1.0 build-depends: base ==4.*, hquery >= 0.1.0.0, xmlhtml >= 0.2, HUnit, filepath >= 1.3.0.0, bytestring >= 0.9.2.1, test-framework,- test-framework-hunit+ test-framework-hunit, text >= 0.11 extensions: DeriveDataTypeable test-suite ParserTests
src/Text/Hquery.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE OverloadedStrings #-} {- | This module exports the top level constructors used for building node transformations. For example, if your template is@@ -46,7 +47,13 @@ module Text.Hquery ( -- * Constructors- MakeTransformer(..)+ MakeTransformer(..),+ Group(..),++ -- * Values+ -- | nothing is handy for deleting a node from the tree, you cna replace it+ -- with nothing, e.g. @ hq \".foo\" nothing @+ nothing, ) where import Data.List@@ -68,9 +75,18 @@ Left _ -> id -- TODO: error handling? invalid sel Right (css, attr) -> transform css (builder attr) +nothing :: [Node]+nothing = []++data Group = Group [Node]+ class MakeTransformer a where hq :: String -> a -> [Node] -> [Node] +instance MakeTransformer a => MakeTransformer (Maybe a) where+ hq sel Nothing = hq sel ([] :: [Node])+ hq sel (Just t) = hq sel t+ instance MakeTransformer String where hq sel target = parseSel sel nodeXform where@@ -81,11 +97,19 @@ (Nothing, _) -> (setNode (TextNode (T.pack target))) c instance MakeTransformer [String] where- hq sel xs = hq sel (map (TextNode . T.pack) xs)+ hq sel xs = hq sel $ map (TextNode . T.pack) xs instance MakeTransformer Node where hq sel target = hq sel [target] +instance MakeTransformer Group where+ hq sel (Group ns) = parseSel sel groupXform+ where+ groupXform attr c = case (attr, current c) of+ (Just CData, e @ Element {}) -> setNode (e { elementChildren = ns }) c+ (Just _, _) -> c -- TODO: error handling?+ (Nothing, _) -> replaceCurrent ns c+ instance MakeTransformer ([Node] -> [Node]) where hq sel f = hq sel [f] @@ -117,12 +141,15 @@ pn@Element { elementChildren = kids } -> do ix <- elemIndex curN kids let next = setNode (pn { elementChildren = concatMap replaceN kids }) p- getChild (ix - 1 + (length ns)) next+ let childIdx = (ix - 1 + (length ns))+ -- FIXME: xmlhtml <= 0.2.0.3 crashes on negative indicies+ return $ fromMaybe next $ if childIdx < 0 then Nothing else getChild childIdx next _ -> raise "should be no non-Element parents!" where curN = current c replaceN n2 = if n2 == curN then ns else [n2]- dflt = fromMaybe c $ do+ -- FIXME: replacing a root node with no elements generates a bogus comment+ empty = fromNode (Comment "FIXME: hquery: replaced root with empty node")+ dflt = fromMaybe empty $ do newCur <- (fromNodes ns)- endCur <- findRight isLast newCur- return endCur+ return (fromMaybe newCur $ findRight isLast newCur)
tests/TransformTests.hs view
@@ -4,6 +4,7 @@ import Data.Typeable import Data.Maybe import qualified Data.ByteString.Char8 as BS+import qualified Data.Text as T import Test.HUnit hiding (Node, Test) import Text.XmlHtml @@ -30,6 +31,11 @@ in hq ".person" (map bind people) +groupTest :: [Node]+groupTest = map (mkSpan . show) [1..3]++mkSpan s = Element (T.pack "span") [] $ [TextNode $ T.pack s]+ tests :: [([Node] -> [Node], String)] tests = [ (hq "#foo [class+]" "bar", "AddClass") , (hq "div [class+]" "bar", "AddClass")@@ -46,6 +52,12 @@ , (peopleTest, "PeopleOccupations") , (hq ".foo *" "bar", "NestXform") , (hq ".foo" "bar", "NestReplace")+ , (hq "#foo" nothing, "RemoveNode")+ , (hq ".foo *" $ Group groupTest, "GroupNodes")+ , (hq "*" nothing, "RemoveStar")+ , (hq "li *" $ map (hq "li *") ["a", "b", "c"], "ListOfFs")+ , (hq "li *" $ map (hq "li *") ["a"], "SingleF")+ , (hq "div" [mkSpan ""], "ReplaceRoot") ] makeTests :: [([Node] -> [Node], String)] -> IO [Test]