Revision b7e2870f
Added by koszko about 2 years ago
background/settings_query.js | ||
---|---|---|
10 | 10 |
* IMPORT make_once |
11 | 11 |
* IMPORT get_storage |
12 | 12 |
* IMPORT TYPE_PREFIX |
13 |
* IMPORT for_each_possible_pattern |
|
13 | 14 |
* IMPORTS_END |
14 | 15 |
*/ |
15 | 16 |
|
16 | 17 |
var storage; |
17 | 18 |
|
18 |
var exports = {}; |
|
19 |
|
|
20 | 19 |
async function init(fun) |
21 | 20 |
{ |
22 | 21 |
storage = await get_storage(); |
... | ... | |
24 | 23 |
return fun; |
25 | 24 |
} |
26 | 25 |
|
27 |
// TODO: also support urls with specified ports |
|
28 |
function query(url, multiple) |
|
26 |
function check_pattern(pattern, multiple, matched) |
|
29 | 27 |
{ |
30 |
let proto_re = "[a-zA-Z]*:\/\/"; |
|
31 |
let domain_re = "[^/?#]+"; |
|
32 |
let segments_re = "/[^?#]*"; |
|
33 |
let query_re = "\\?[^#]*"; |
|
34 |
|
|
35 |
let url_regex = new RegExp(`\ |
|
36 |
^\ |
|
37 |
(${proto_re})\ |
|
38 |
(${domain_re})\ |
|
39 |
(${segments_re})?\ |
|
40 |
(${query_re})?\ |
|
41 |
#?.*\$\ |
|
42 |
`); |
|
43 |
|
|
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 = []; |
|
28 |
const settings = storage.get(TYPE_PREFIX.PAGE, pattern); |
|
59 | 29 |
|
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("***."); |
|
30 |
if (settings === undefined) |
|
31 |
return; |
|
70 | 32 |
|
71 |
for (let domain_wildcard of domain_wildcards) { |
|
72 |
let domain_pattern = domain_wildcard + domain_part; |
|
33 |
matched.push([pattern, settings]); |
|
73 | 34 |
|
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; |
|
97 |
|
|
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]; |
|
35 |
if (!multiple) |
|
36 |
return false; |
|
37 |
} |
|
107 | 38 |
|
108 |
matched.push([pattern, settings]); |
|
109 |
} |
|
110 |
} |
|
111 |
} |
|
112 |
} |
|
39 |
function query(url, multiple) |
|
40 |
{ |
|
41 |
const matched = []; |
|
42 |
for_each_possible_pattern(url, p => check_pattern(p, multiple, matched)); |
|
113 | 43 |
|
114 |
return multiple ? matched : [undefined, undefined];
|
|
44 |
return multiple ? matched : (matched[0] || [undefined, undefined]);
|
|
115 | 45 |
} |
116 | 46 |
|
117 | 47 |
function query_best(url) |
Also available in: Unified diff
show some settings of the current page in the popup