@@ -3,8 +3,8 @@
3-- | A module for first-approximation parsing of XML.
3-- | A module for first-approximation parsing of XML.
4-- Note that entities, e.g. @&@, are not expanded.
4-- Note that entities, e.g. @&@, are not expanded.
5module Text.XML.Hexml(
5module Text.XML.Hexml(
6− Document, Node, Attribute(..),
6+ Node, Attribute(..),
7− documentParse, documentRender, documentNode,
7+ nodeParse, nodeRender,
8 nodeName, nodeInner, nodeOuter,
8 nodeName, nodeInner, nodeOuter,
9 nodeAttributes, nodeChildren, nodeContents,
9 nodeAttributes, nodeChildren, nodeContents,
10 nodeAttributeBy, nodeChildrenBy
10 nodeAttributeBy, nodeChildrenBy
@@ -59,21 +59,16 @@ foreign import ccall node_childBy :: Ptr CDocument -> Ptr CNode -> Ptr CNode ->
59foreign import ccall node_attributeBy :: Ptr CDocument -> Ptr CNode -> CString -> CInt -> IO (Ptr CAttr)
59foreign import ccall node_attributeBy :: Ptr CDocument -> Ptr CNode -> CString -> CInt -> IO (Ptr CAttr)
61-- | An XML document, created by 'documentParse'.
61-- | An XML document, created by 'documentParse'.
62−data Document = Document BS.ByteString (ForeignPtr CDocument)
64data Node = Node BS.ByteString (ForeignPtr CDocument) (Ptr CNode)
62data Node = Node BS.ByteString (ForeignPtr CDocument) (Ptr CNode)
66data Attribute = Attribute BS.ByteString BS.ByteString deriving (Show, Eq, Ord)
64data Attribute = Attribute BS.ByteString BS.ByteString deriving (Show, Eq, Ord)
68−instance Show Document where
69− show d = "Document " ++ show (BS.unpack $ nodeOuter $ documentNode d)
71instance Show Node where
66instance Show Node where
72 show d = "Node " ++ show (BS.unpack $ nodeOuter d)
67 show d = "Node " ++ show (BS.unpack $ nodeOuter d)
75−documentParse :: BS.ByteString -> Either BS.ByteString Document
70+nodeParse :: BS.ByteString -> Either BS.ByteString Node
76−documentParse src = unsafePerformIO $ BS.unsafeUseAsCStringLen (src <> BS.singleton '\0') $ \(str, len) -> do
71+nodeParse src = unsafePerformIO $ BS.unsafeUseAsCStringLen (src <> BS.singleton '\0') $ \(str, len) -> do
77 doc <- document_parse str (fromIntegral len - 1)
72 doc <- document_parse str (fromIntegral len - 1)
78 err <- document_error doc
73 err <- document_error doc
79 if err /= nullPtr then do
74 if err /= nullPtr then do
@@ -81,20 +76,15 @@ documentParse src = unsafePerformIO $ BS.unsafeUseAsCStringLen (src <> BS.single
81 document_free doc
76 document_free doc
82 return $ Left bs
77 return $ Left bs
79+ node <- document_node doc
84 doc <- newForeignPtr document_free_funptr doc
80 doc <- newForeignPtr document_free_funptr doc
85− return $ Right $ Document src doc
81+ return $ Right $ Node src doc node
87−documentRender :: Document -> BS.ByteString
83+nodeRender :: Node -> BS.ByteString
88−documentRender (Document _ doc) = unsafePerformIO $ withForeignPtr doc $ \d -> do
84+nodeRender (Node _ doc n) = unsafePerformIO $ withForeignPtr doc $ \d -> do
90 i <- node_render d n nullPtr 0
85 i <- node_render d n nullPtr 0
91 BS.create (fromIntegral i) $ \ptr -> void $ node_render d n (castPtr ptr) i
86 BS.create (fromIntegral i) $ \ptr -> void $ node_render d n (castPtr ptr) i
94−documentNode :: Document -> Node
95−documentNode d@(Document src doc) = unsafePerformIO $ withForeignPtr doc $ \d -> do
96− Node src doc <$> document_node d
98applyStr :: BS.ByteString -> Str -> BS.ByteString
88applyStr :: BS.ByteString -> Str -> BS.ByteString
99applyStr bs Str{..} = BS.take (fromIntegral strLength) $ BS.drop (fromIntegral strStart) bs
89applyStr bs Str{..} = BS.take (fromIntegral strLength) $ BS.drop (fromIntegral strStart) bs