diff --git a/html.lua b/html.lua
index 58e2d57..4c68f33 100644
--- a/html.lua
+++ b/html.lua
@@ -74,6 +74,18 @@ function M.make_dom_element( tag_name, parent_elem )
return nil
end,
+
+ check_simple_selector = function( self, selector )
+ return M.check_simple_selector( self, selector )
+ end,
+
+ foreach = function( self, fn )
+ fn( self )
+
+ for _, child in ipairs(self.children or {}) do
+ child:foreach( fn )
+ end
+ end
}
if parent_elem then
@@ -295,6 +307,64 @@ function M.tokenise( content )
end
+function M.check_simple_selector(element, selector)
+ -- Skip text nodes
+ if element.tag_name == ":text" then
+ return false
+ end
+
+ -- Check tag name if specified
+ if selector.tag_name and element.tag_name ~= selector.tag_name then
+ return false
+ end
+
+ -- Check ID if specified
+ if selector.id and element.attributes.id ~= selector.id then
+ return false
+ end
+
+ -- Check classes if specified
+ if selector.class and #selector.class > 0 then
+ local element_classes = element.attributes.class
+ if not element_classes then
+ return false
+ end
+
+ for _, class in ipairs(selector.class) do
+ local found = false
+ for _, elem_class in ipairs(element_classes) do
+ if elem_class == class then
+ found = true
+ break
+ end
+ end
+ if not found then
+ return false
+ end
+ end
+ end
+
+ return true
+ end
+
+function M.query_simple_selector(document, selector)
+ local matches = {}
+
+ local function traverse(node)
+ if M.check_simple_selector(node, selector) then
+ table.insert(matches, node)
+ end
+
+ for _, child in ipairs(node.children) do
+ traverse(child)
+ end
+ end
+
+ traverse(document)
+ return matches
+end
+
+
function M.parse_tokens_into_document( TOKENS )
local DOCUMENT = M.make_dom_element(nil, nil)
local current_doc_element = DOCUMENT