@@ -3,8 +3,8 @@
33-- | A module for first-approximation parsing of XML.
44-- Note that entities, e.g. @&@, 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