feat: match selector to document,+ helper methods
							parent
							
								
									8cf41c6c6d
								
							
						
					
					
						commit
						82c0038580
					
				
							
								
								
									
										70
									
								
								html.lua
								
								
								
								
							
							
						
						
									
										70
									
								
								html.lua
								
								
								
								
							| 
						 | 
					@ -74,6 +74,18 @@ function M.make_dom_element( tag_name, parent_elem )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			return nil
 | 
								return nil
 | 
				
			||||||
		end,
 | 
							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
 | 
						if parent_elem then
 | 
				
			||||||
| 
						 | 
					@ -295,6 +307,64 @@ function M.tokenise( content )
 | 
				
			||||||
end
 | 
					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 )
 | 
					function M.parse_tokens_into_document( TOKENS )
 | 
				
			||||||
	local DOCUMENT = M.make_dom_element(nil, nil)
 | 
						local DOCUMENT = M.make_dom_element(nil, nil)
 | 
				
			||||||
	local current_doc_element = DOCUMENT
 | 
						local current_doc_element = DOCUMENT
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue