Revision 261548ff
Added by koszko about 2 years ago
| background/settings_query.js | ||
|---|---|---|
| 5 | 5 |
* Redistribution terms are gathered in the `copyright' file. |
| 6 | 6 |
*/ |
| 7 | 7 |
|
| 8 |
"use strict"; |
|
| 9 |
|
|
| 10 |
(() => {
|
|
| 11 |
const make_once = window.make_once; |
|
| 12 |
const get_storage = window.get_storage; |
|
| 8 |
/* |
|
| 9 |
* IMPORTS_START |
|
| 10 |
* IMPORT make_once |
|
| 11 |
* IMPORT get_storage |
|
| 12 |
* IMPORT TYPE_PREFIX |
|
| 13 |
* IMPORTS_END |
|
| 14 |
*/ |
|
| 13 | 15 |
|
| 14 |
var storage;
|
|
| 16 |
var storage; |
|
| 15 | 17 |
|
| 16 |
var exports = {};
|
|
| 18 |
var exports = {};
|
|
| 17 | 19 |
|
| 18 |
async function init(fun)
|
|
| 19 |
{
|
|
| 20 |
storage = await get_storage();
|
|
| 20 |
async function init(fun) |
|
| 21 |
{
|
|
| 22 |
storage = await get_storage();
|
|
| 21 | 23 |
|
| 22 |
return fun;
|
|
| 23 |
}
|
|
| 24 |
return fun;
|
|
| 25 |
} |
|
| 24 | 26 |
|
| 25 |
// TODO: also support urls with specified ports as well as `data:' urls
|
|
| 26 |
function query(url, multiple)
|
|
| 27 |
{
|
|
| 28 |
let proto_re = "[a-zA-Z]*:\/\/";
|
|
| 29 |
let domain_re = "[^/?#]+";
|
|
| 30 |
let segments_re = "/[^?#]*";
|
|
| 31 |
let query_re = "\\?[^#]*";
|
|
| 27 |
// TODO: also support urls with specified ports
|
|
| 28 |
function query(url, multiple) |
|
| 29 |
{
|
|
| 30 |
let proto_re = "[a-zA-Z]*:\/\/";
|
|
| 31 |
let domain_re = "[^/?#]+";
|
|
| 32 |
let segments_re = "/[^?#]*";
|
|
| 33 |
let query_re = "\\?[^#]*";
|
|
| 32 | 34 |
|
| 33 |
let url_regex = new RegExp(`\
|
|
| 35 |
let url_regex = new RegExp(`\
|
|
| 34 | 36 |
^\ |
| 35 | 37 |
(${proto_re})\
|
| 36 | 38 |
(${domain_re})\
|
| ... | ... | |
| 39 | 41 |
#?.*\$\ |
| 40 | 42 |
`); |
| 41 | 43 |
|
| 42 |
let regex_match = url_regex.exec(url); |
|
| 43 |
if (regex_match === null) {
|
|
| 44 |
console.log("bad url format", url);
|
|
| 45 |
return multiple ? [] : [undefined, undefined]; |
|
| 46 |
} |
|
| 44 |
let regex_match = url_regex.exec(url); |
|
| 45 |
if (regex_match === null) {
|
|
| 46 |
console.log("bad url format", url);
|
|
| 47 |
return multiple ? [] : [undefined, undefined]; |
|
| 48 |
} |
|
| 49 |
|
|
| 50 |
let [_, proto, domain, segments, query] = regex_match; |
|
| 51 |
|
|
| 52 |
domain = domain.split(".");
|
|
| 53 |
let segments_trailing_dash = |
|
| 54 |
segments && segments[segments.length - 1] === "/"; |
|
| 55 |
segments = (segments || "").split("/").filter(s => s !== "");
|
|
| 56 |
segments.unshift("");
|
|
| 57 |
|
|
| 58 |
let matched = []; |
|
| 59 |
|
|
| 60 |
for (let d_slice = 0; d_slice < domain.length; d_slice++) {
|
|
| 61 |
let domain_part = domain.slice(d_slice).join(".");
|
|
| 62 |
let domain_wildcards = []; |
|
| 63 |
if (d_slice === 0) |
|
| 64 |
domain_wildcards.push("");
|
|
| 65 |
if (d_slice === 1) |
|
| 66 |
domain_wildcards.push("*.");
|
|
| 67 |
if (d_slice > 0) |
|
| 68 |
domain_wildcards.push("**.");
|
|
| 69 |
domain_wildcards.push("***.");
|
|
| 70 |
|
|
| 71 |
for (let domain_wildcard of domain_wildcards) {
|
|
| 72 |
let domain_pattern = domain_wildcard + domain_part; |
|
| 73 |
|
|
| 74 |
for (let s_slice = segments.length; s_slice > 0; s_slice--) {
|
|
| 75 |
let segments_part = segments.slice(0, s_slice).join("/");
|
|
| 76 |
let segments_wildcards = []; |
|
| 77 |
if (s_slice === segments.length) {
|
|
| 78 |
if (segments_trailing_dash) |
|
| 79 |
segments_wildcards.push("/");
|
|
| 80 |
segments_wildcards.push("");
|
|
| 81 |
} |
|
| 82 |
if (s_slice === segments.length - 1) {
|
|
| 83 |
if (segments[s_slice] !== "*") |
|
| 84 |
segments_wildcards.push("/*");
|
|
| 85 |
} |
|
| 86 |
if (s_slice < segments.length && |
|
| 87 |
(segments[s_slice] !== "**" || |
|
| 88 |
s_slice < segments.length - 1)) |
|
| 89 |
segments_wildcards.push("/**");
|
|
| 90 |
if (segments[s_slice] !== "***" || |
|
| 91 |
s_slice < segments.length) |
|
| 92 |
segments_wildcards.push("/***");
|
|
| 93 |
|
|
| 94 |
for (let segments_wildcard of segments_wildcards) {
|
|
| 95 |
let segments_pattern = |
|
| 96 |
segments_part + segments_wildcard; |
|
| 47 | 97 |
|
| 48 |
let [_, proto, domain, segments, query] = regex_match; |
|
| 49 |
|
|
| 50 |
domain = domain.split(".");
|
|
| 51 |
let segments_trailing_dash = |
|
| 52 |
segments && segments[segments.length - 1] === "/"; |
|
| 53 |
segments = (segments || "").split("/").filter(s => s !== "");
|
|
| 54 |
segments.unshift("");
|
|
| 55 |
|
|
| 56 |
let matched = []; |
|
| 57 |
|
|
| 58 |
for (let d_slice = 0; d_slice < domain.length; d_slice++) {
|
|
| 59 |
let domain_part = domain.slice(d_slice).join(".");
|
|
| 60 |
let domain_wildcards = []; |
|
| 61 |
if (d_slice === 0) |
|
| 62 |
domain_wildcards.push("");
|
|
| 63 |
if (d_slice === 1) |
|
| 64 |
domain_wildcards.push("*.");
|
|
| 65 |
if (d_slice > 0) |
|
| 66 |
domain_wildcards.push("**.");
|
|
| 67 |
domain_wildcards.push("***.");
|
|
| 68 |
|
|
| 69 |
for (let domain_wildcard of domain_wildcards) {
|
|
| 70 |
let domain_pattern = domain_wildcard + domain_part; |
|
| 71 |
|
|
| 72 |
for (let s_slice = segments.length; s_slice > 0; s_slice--) {
|
|
| 73 |
let segments_part = segments.slice(0, s_slice).join("/");
|
|
| 74 |
let segments_wildcards = []; |
|
| 75 |
if (s_slice === segments.length) {
|
|
| 76 |
if (segments_trailing_dash) |
|
| 77 |
segments_wildcards.push("/");
|
|
| 78 |
segments_wildcards.push("");
|
|
| 79 |
} |
|
| 80 |
if (s_slice === segments.length - 1) {
|
|
| 81 |
if (segments[s_slice] !== "*") |
|
| 82 |
segments_wildcards.push("/*");
|
|
| 83 |
} |
|
| 84 |
if (s_slice < segments.length && |
|
| 85 |
(segments[s_slice] !== "**" || |
|
| 86 |
s_slice < segments.length - 1)) |
|
| 87 |
segments_wildcards.push("/**");
|
|
| 88 |
if (segments[s_slice] !== "***" || |
|
| 89 |
s_slice < segments.length) |
|
| 90 |
segments_wildcards.push("/***");
|
|
| 91 |
|
|
| 92 |
for (let segments_wildcard of segments_wildcards) {
|
|
| 93 |
let segments_pattern = |
|
| 94 |
segments_part + segments_wildcard; |
|
| 95 |
|
|
| 96 |
let pattern = proto + domain_pattern + segments_pattern; |
|
| 97 |
console.log("trying", pattern);
|
|
| 98 |
let settings = storage.get(TYPE_PREFIX.PAGE, pattern); |
|
| 99 |
|
|
| 100 |
if (settings === undefined) |
|
| 101 |
continue; |
|
| 102 |
|
|
| 103 |
if (!multiple) |
|
| 104 |
return [pattern, settings]; |
|
| 105 |
|
|
| 106 |
matched.push([pattern, settings]); |
|
| 107 |
} |
|
| 98 |
let pattern = proto + domain_pattern + segments_pattern; |
|
| 99 |
console.log("trying", pattern);
|
|
| 100 |
let settings = storage.get(TYPE_PREFIX.PAGE, pattern); |
|
| 101 |
|
|
| 102 |
if (settings === undefined) |
|
| 103 |
continue; |
|
| 104 |
|
|
| 105 |
if (!multiple) |
|
| 106 |
return [pattern, settings]; |
|
| 107 |
|
|
| 108 |
matched.push([pattern, settings]); |
|
| 108 | 109 |
} |
| 109 | 110 |
} |
| 110 | 111 |
} |
| 111 |
|
|
| 112 |
return multiple ? matched : [undefined, undefined]; |
|
| 113 | 112 |
} |
| 114 | 113 |
|
| 115 |
function query_best(url) |
|
| 116 |
{
|
|
| 117 |
return query(url, false); |
|
| 118 |
} |
|
| 114 |
return multiple ? matched : [undefined, undefined]; |
|
| 115 |
} |
|
| 119 | 116 |
|
| 120 |
function query_all(url) |
|
| 121 |
{
|
|
| 122 |
return query(url, true); |
|
| 123 |
} |
|
| 117 |
function query_best(url) |
|
| 118 |
{
|
|
| 119 |
return query(url, false); |
|
| 120 |
} |
|
| 121 |
|
|
| 122 |
function query_all(url) |
|
| 123 |
{
|
|
| 124 |
return query(url, true); |
|
| 125 |
} |
|
| 124 | 126 |
|
| 125 |
window.get_query_best = make_once(() => init(query_best)); |
|
| 126 |
window.get_query_all = make_once(() => init(query_all)); |
|
| 127 |
})(); |
|
| 127 |
const get_query_best = make_once(() => init(query_best)); |
|
| 128 |
const get_query_all = make_once(() => init(query_all)); |
|
| 129 |
|
|
| 130 |
/* |
|
| 131 |
* EXPORTS_START |
|
| 132 |
* EXPORT get_query_best |
|
| 133 |
* EXPORT get_query_all |
|
| 134 |
* EXPORTS_END |
|
| 135 |
*/ |
|
Also available in: Unified diff
emply an sh-based build system; make some changes to blocking