on master help sign in
Remove the idea of Document from the API at all, just use Node
commit025189dd875995820ac8a80669395069d44fe7e7 authorNeil Mitchell <ndmitchell@gmail.com> dateWed 30 Nov 2016, 19:08 (10 years ago) parent88c7e25
2 files changed+15−25
src/Main.hs+7−7 src/Text/XML/Hexml.hs+8−18
src/Main.hs+7−7
@@ -23,18 +23,18 @@ main :: IO ()
2323main = do
2424 forM_ examples $ \(parses, src) -> do
2525 print src
26− case documentParse src of
26+ case nodeParse src of
2727 Left err -> when parses $ fail $ "Unexpected parse failure, " ++ show err
2828 Right doc -> do
2929 unless parses $ fail "Unexpected parse success"
30− let r = documentRender doc
30+ let r = nodeRender doc
3131 print r
3232 print $ rerender doc
3333 when (r /= rerender doc) $ fail "Different rerender"
34− let Right d = documentParse r
35− when (r /= documentRender d) $ fail "Different after rerendering"
34+ let Right d = nodeParse r
35+ when (r /= nodeRender d) $ fail "Different after rerendering"
3636
37− let Right doc = fmap documentNode $ documentParse "<test id=\"1\" extra=\"2\" /><test id=\"2\" /><b><test id=\"3\" /></b><test id=\"4\" /><test />"
37+ let Right doc = nodeParse "<test id=\"1\" extra=\"2\" /><test id=\"2\" /><b><test id=\"3\" /></b><test id=\"4\" /><test />"
3838 map nodeName (nodeChildren doc) === ["test","test","b","test","test"]
3939 length (nodeChildrenBy doc "test") === 4
4040 length (nodeChildrenBy doc "b") === 1
@@ -45,8 +45,8 @@ main = do
4545
4646a === b = if a == b then putStrLn "success" else fail "mismatch"
4747
48−rerender :: Document -> BS.ByteString
49−rerender = contents . documentNode
48+rerender :: Node -> BS.ByteString
49+rerender = contents
5050 where
5151 contents x = BS.concat $ map (either validStr node) $ nodeContents x
5252 node x = "<" <> BS.unwords (validName (nodeName x) : map attr (nodeAttributes x)) <> ">" <>
src/Text/XML/Hexml.hs+8−18
@@ -3,8 +3,8 @@
33-- | A module for first-approximation parsing of XML.
44-- Note that entities, e.g. @&amp;@, are not expanded.
55module Text.XML.Hexml(
6− Document, Node, Attribute(..),
7− documentParse, documentRender, documentNode,
6+ Node, Attribute(..),
7+ nodeParse, nodeRender,
88 nodeName, nodeInner, nodeOuter,
99 nodeAttributes, nodeChildren, nodeContents,
1010 nodeAttributeBy, nodeChildrenBy
@@ -59,21 +59,16 @@ foreign import ccall node_childBy :: Ptr CDocument -> Ptr CNode -> Ptr CNode ->
5959foreign import ccall node_attributeBy :: Ptr CDocument -> Ptr CNode -> CString -> CInt -> IO (Ptr CAttr)
6060
6161-- | An XML document, created by 'documentParse'.
62−data Document = Document BS.ByteString (ForeignPtr CDocument)
63−
6462data Node = Node BS.ByteString (ForeignPtr CDocument) (Ptr CNode)
6563
6664data Attribute = Attribute BS.ByteString BS.ByteString deriving (Show, Eq, Ord)
6765
68−instance Show Document where
69− show d = "Document " ++ show (BS.unpack $ nodeOuter $ documentNode d)
70−
7166instance Show Node where
7267 show d = "Node " ++ show (BS.unpack $ nodeOuter d)
7368
7469
75−documentParse :: BS.ByteString -> Either BS.ByteString Document
76−documentParse src = unsafePerformIO $ BS.unsafeUseAsCStringLen (src <> BS.singleton '\0') $ \(str, len) -> do
70+nodeParse :: BS.ByteString -> Either BS.ByteString Node
71+nodeParse src = unsafePerformIO $ BS.unsafeUseAsCStringLen (src <> BS.singleton '\0') $ \(str, len) -> do
7772 doc <- document_parse str (fromIntegral len - 1)
7873 err <- document_error doc
7974 if err /= nullPtr then do
@@ -81,20 +76,15 @@ documentParse src = unsafePerformIO $ BS.unsafeUseAsCStringLen (src <> BS.single
8176 document_free doc
8277 return $ Left bs
8378 else do
79+ node <- document_node doc
8480 doc <- newForeignPtr document_free_funptr doc
85− return $ Right $ Document src doc
81+ return $ Right $ Node src doc node
8682
87−documentRender :: Document -> BS.ByteString
88−documentRender (Document _ doc) = unsafePerformIO $ withForeignPtr doc $ \d -> do
89− n <- document_node d
83+nodeRender :: Node -> BS.ByteString
84+nodeRender (Node _ doc n) = unsafePerformIO $ withForeignPtr doc $ \d -> do
9085 i <- node_render d n nullPtr 0
9186 BS.create (fromIntegral i) $ \ptr -> void $ node_render d n (castPtr ptr) i
9287
93−
94−documentNode :: Document -> Node
95−documentNode d@(Document src doc) = unsafePerformIO $ withForeignPtr doc $ \d -> do
96− Node src doc <$> document_node d
97−
9888applyStr :: BS.ByteString -> Str -> BS.ByteString
9989applyStr bs Str{..} = BS.take (fromIntegral strLength) $ BS.drop (fromIntegral strStart) bs
10090