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