feat: attribute selection
							parent
							
								
									c923159d7a
								
							
						
					
					
						commit
						79d6a8f77d
					
				
							
								
								
									
										34
									
								
								css.lua
								
								
								
								
							
							
						
						
									
										34
									
								
								css.lua
								
								
								
								
							| 
						 | 
				
			
			@ -66,7 +66,8 @@ local function parse_compound_selector( tokeniser )
 | 
			
		|||
		tag_name = nil,
 | 
			
		||||
		id = nil,
 | 
			
		||||
		class = {},
 | 
			
		||||
		attributes = {},
 | 
			
		||||
		attributes_values = {},
 | 
			
		||||
		attributes_present = {},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	--local selectors = {}
 | 
			
		||||
| 
						 | 
				
			
			@ -106,6 +107,37 @@ local function parse_compound_selector( tokeniser )
 | 
			
		|||
			end
 | 
			
		||||
			--table.insert(selectors, {type = "id", value = name})
 | 
			
		||||
			selector.id = name
 | 
			
		||||
		elseif char == "[" then
 | 
			
		||||
			tokeniser.next() -- consume leading [
 | 
			
		||||
 | 
			
		||||
			local name = tokeniser.read_identifier()
 | 
			
		||||
 | 
			
		||||
			if tokeniser.peek() == "=" then
 | 
			
		||||
				tokeniser.next()
 | 
			
		||||
 | 
			
		||||
				if tokeniser.peek() ~= "\"" then
 | 
			
		||||
					error("Expected opening quote \" at pos " .. tokeniser.pos() )
 | 
			
		||||
				end
 | 
			
		||||
				tokeniser.next() -- consume leading "
 | 
			
		||||
 | 
			
		||||
				local value = ""
 | 
			
		||||
				while tokeniser.peek() ~= "\"" do
 | 
			
		||||
					value = value .. tokeniser.peek()
 | 
			
		||||
					tokeniser.next()
 | 
			
		||||
				end
 | 
			
		||||
 | 
			
		||||
				tokeniser.next() -- consume trailing "
 | 
			
		||||
 | 
			
		||||
				selector.attributes_values[name] = value
 | 
			
		||||
			else
 | 
			
		||||
				table.insert( selector.attributes_present, name )
 | 
			
		||||
			end
 | 
			
		||||
 | 
			
		||||
			if tokeniser.peek() ~= "]" then
 | 
			
		||||
				error("Expected closing bracket (']') at " .. tokeniser.pos())
 | 
			
		||||
			end
 | 
			
		||||
 | 
			
		||||
			tokeniser.next() -- consume trailing ]
 | 
			
		||||
		else
 | 
			
		||||
			break
 | 
			
		||||
		end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										16
									
								
								html.lua
								
								
								
								
							
							
						
						
									
										16
									
								
								html.lua
								
								
								
								
							| 
						 | 
				
			
			@ -422,8 +422,22 @@ function M.check_simple_selector(element, selector)
 | 
			
		|||
		end
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
		return true
 | 
			
		||||
	for attr_name, attr_value in pairs(selector.attributes_values) do
 | 
			
		||||
		local elem_attr_value = element.attributes[attr_name]
 | 
			
		||||
		if elem_attr_value ~= attr_value then
 | 
			
		||||
			return false
 | 
			
		||||
		end
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	-- Check attribute presence selectors
 | 
			
		||||
	for _, attr_name in ipairs(selector.attributes_present) do
 | 
			
		||||
		if not element.attributes[attr_name] then
 | 
			
		||||
			return false
 | 
			
		||||
		end
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	return true
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function M.query_simple_selector(document, selector)
 | 
			
		||||
	local matches = {}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue