diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/luatex/generic/luaxml/luaxml-parse-query.lua |
Initial commit
Diffstat (limited to 'macros/luatex/generic/luaxml/luaxml-parse-query.lua')
-rw-r--r-- | macros/luatex/generic/luaxml/luaxml-parse-query.lua | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/macros/luatex/generic/luaxml/luaxml-parse-query.lua b/macros/luatex/generic/luaxml/luaxml-parse-query.lua new file mode 100644 index 0000000000..7931fa193f --- /dev/null +++ b/macros/luatex/generic/luaxml/luaxml-parse-query.lua @@ -0,0 +1,46 @@ +-- Source: https://github.com/leafo/web_sanitize +-- Author: Leaf Corcoran +local R, S, V, P +do + local _obj_0 = require("lpeg") + R, S, V, P = _obj_0.R, _obj_0.S, _obj_0.V, _obj_0.P +end +local C, Cs, Ct, Cmt, Cg, Cb, Cc, Cp +do + local _obj_0 = require("lpeg") + C, Cs, Ct, Cmt, Cg, Cb, Cc, Cp = _obj_0.C, _obj_0.Cs, _obj_0.Ct, _obj_0.Cmt, _obj_0.Cg, _obj_0.Cb, _obj_0.Cc, _obj_0.Cp +end +local alphanum = R("az", "AZ", "09") +local num = R("09") +local white = S(" \t\n") ^ 0 +-- this is a deviation from the upstream, we allow ":" in the tag name, because +-- luaxml doesn't support XML namespaces and elements must be queried using +-- dom:query_selector("namespace:element") +local word = (alphanum + S("_-") + S("|")) ^ 1 +local mark +mark = function(name) + return function(...) + return { + name, + ... + } + end +end +local parse_query +parse_query = function(query) + local tag = word / mark("tag") + local cls = P(".") * (word / mark("class")) + local id = P("#") * (word / mark("id")) + local any = P("*") / mark("any") + local nth = P(":nth-child(") * C(num ^ 1) * ")" / mark("nth-child") + local first = P(":first-child") / mark("first-child") + local attr = P("[") * C(word) * P("]") / mark("attr") + local selector = Ct((any + nth + first + tag + cls + id + attr) ^ 1) + local pq = Ct(selector * (white * selector) ^ 0) + local pqs = Ct(pq * (white * P(",") * white * pq) ^ 0) + pqs = pqs * (white * -1) + return pqs:match(query) +end +return { + parse_query = parse_query +} |