#!/bin/env lua local html = require(".html") local css = require(".css") local file = io.open("small.html", "r") if file == nil then error("File doesn't exist") end local content = file:read("a") local doc = html.parse( content ) print("Write a css selector:") local whole_selector = css.parse( io.read() ) local current_selector = whole_selector local elements = {} -- start with all elements matching the first selector doc:foreach(function( el ) if el:check_simple_selector( current_selector.selector ) then table.insert( elements, el ) end end) while current_selector.combinator ~= nil do local next_selector = current_selector.next local new_elements = {} if current_selector.combinator == css.COMBINATORS.DESCENDANT then for _, element in ipairs( elements ) do element:foreach(function( el ) if el:check_simple_selector( next_selector.selector ) then table.insert( new_elements, el ) end end) end goto continue end if current_selector.combinator == css.COMBINATORS.DIRECT_DESCENDANT then for _, element in ipairs( elements ) do for _, child in ipairs( element.children ) do if child:check_simple_selector( next_selector.selector ) then table.insert( new_elements, child ) end end end goto continue end if current_selector.combinator == css.COMBINATORS.NEXT_SIBLING then for _, element in ipairs( elements ) do local next_sibling = element:get_next_sibling() while next_sibling and next_sibling.tag_name == ":text" do next_sibling = next_sibling:get_next_sibling() end if next_sibling and next_sibling:check_simple_selector( next_selector.selector ) then table.insert( new_elements, next_sibling ) end end goto continue end if current_selector.combinator == css.COMBINATORS.SUBSEQUENT_SIBLING then for _, element in ipairs( elements ) do local sibling = element:get_next_sibling() while sibling ~= nil do if sibling:check_simple_selector( next_selector.selector ) then table.insert( new_elements, sibling ) end sibling = sibling:get_next_sibling() end end goto continue end ::continue:: elements = new_elements current_selector = next_selector end for _, el in ipairs(elements) do print( html.tostring( el ) ) end