local scan_html scan_html = require("web_sanitize.query.scan_html").scan_html local parse_query parse_query = require("web_sanitize.query.parse_query").parse_query local unpack = unpack or table.unpack local test_el test_el = function(el, q) local el_classes for _index_0 = 1, #q do local _des_0 = q[_index_0] local t, expected t, expected = _des_0[1], _des_0[2] local _exp_0 = t if "class" == _exp_0 then if not (el_classes) then if not (el.attr and el.attr.class) then return false end do local _tbl_0 = { } for cls in el.attr.class:gmatch("[^%s]+") do _tbl_0[cls] = true end el_classes = _tbl_0 end end if not (el_classes[expected]) then return false end elseif "id" == _exp_0 then local id = el.attr and el.attr.id if not (id == expected) then return false end elseif "tag" == _exp_0 then if not (expected:lower() == el.tag) then return false end elseif "any" == _exp_0 then local _ = nil elseif "nth-child" == _exp_0 then if not (tonumber(expected) == el.num) then return false end else error("unknown selector type: " .. tostring(t)) end end return true end local match_query_single match_query_single = function(stack, query) if #query > #stack then return false end local stack_idx = #stack local first = true for query_idx = #query, 1, -1 do local query_el = query[query_idx] local matched = false while stack_idx >= 1 do local stack_el = stack[stack_idx] stack_idx = stack_idx - 1 if test_el(stack_el, query_el) then matched = true break else if first then return false end end end first = false if not (matched) then return false end end return true end local match_query match_query = function(stack, query) for _index_0 = 1, #query do local q = query[_index_0] if match_query_single(stack, q) then return true end end return false end local query_all query_all = function(html, q) q = parse_query(q) local res = { } scan_html(html, function(stack) if match_query(stack, q) then return table.insert(res, stack[#stack]) end end) return res end local query query = function(...) return unpack(query_all(...)) end return { query_all = query_all, query = query, match_query = match_query }