Revision 2bd35bc4
Added by koszko almost 2 years ago
README.txt | ||
---|---|---|
1 |
# Hachette - Make The Web Great Again! #
|
|
1 |
# Haketilo - Make The Web Great Again! #
|
|
2 | 2 |
|
3 | 3 |
This extension's goal is to allow replacing javascript served by websites |
4 | 4 |
with scripts specified by user. Something like NoScript and Greasemonkey |
... | ... | |
9 | 9 |
and various forks of Firefox (version 60+). |
10 | 10 |
|
11 | 11 |
This extension is still in an early stage. Also see |
12 |
`https://hachettebugs.koszko.org/projects/hachette/wiki/' for documentation in
|
|
12 |
`https://hydrillabugs.koszko.org/projects/haketilo/wiki/' for documentation in
|
|
13 | 13 |
development. |
14 | 14 |
|
15 | 15 |
## Installation ## |
... | ... | |
28 | 28 |
|
29 | 29 |
## Contributing ## |
30 | 30 |
Get the code from: https://git.koszko.org/browser-extension/ |
31 |
Come to: https://hachettebugs.koszko.org/projects/hachette
|
|
31 |
Come to: https://hydrillabugs.koszko.org/projects/haketilo
|
|
32 | 32 |
|
33 | 33 |
Optionally, write to $(echo a29zemtvQGtvc3prby5vcmcK | base64 -d) |
background/cookie_filter.js | ||
---|---|---|
1 | 1 |
/** |
2 |
* part of Hachette |
|
3 |
* Filtering request headers to remove hachette cookies that might have slipped |
|
4 |
* through. |
|
2 |
* This file is part of Haketilo. |
|
3 |
* |
|
4 |
* Function: Filtering request headers to remove haketilo cookies that might |
|
5 |
* have slipped through. |
|
5 | 6 |
* |
6 | 7 |
* Copyright (C) 2021 Wojtek Kosior |
7 | 8 |
* Redistribution terms are gathered in the `copyright' file. |
... | ... | |
13 | 14 |
* IMPORTS_END |
14 | 15 |
*/ |
15 | 16 |
|
16 |
function is_valid_hachette_cookie(cookie)
|
|
17 |
function is_valid_haketilo_cookie(cookie)
|
|
17 | 18 |
{ |
18 |
const match = /^hachette-(\w*)=(.*)$/.exec(cookie);
|
|
19 |
const match = /^haketilo-(\w*)=(.*)$/.exec(cookie);
|
|
19 | 20 |
if (!match) |
20 | 21 |
return false; |
21 | 22 |
|
22 | 23 |
return !extract_signed(match.slice(1, 3)).fail; |
23 | 24 |
} |
24 | 25 |
|
25 |
function remove_hachette_cookies(header)
|
|
26 |
function remove_haketilo_cookies(header)
|
|
26 | 27 |
{ |
27 | 28 |
if (header.name !== "Cookie") |
28 | 29 |
return header; |
29 | 30 |
|
30 | 31 |
const cookies = header.value.split("; "); |
31 |
const value = cookies.filter(c => !is_valid_hachette_cookie(c)).join("; ");
|
|
32 |
const value = cookies.filter(c => !is_valid_haketilo_cookie(c)).join("; ");
|
|
32 | 33 |
|
33 | 34 |
return value ? {name: "Cookie", value} : null; |
34 | 35 |
} |
35 | 36 |
|
36 | 37 |
function filter_cookie_headers(headers) |
37 | 38 |
{ |
38 |
return headers.map(remove_hachette_cookies).filter(h => h);
|
|
39 |
return headers.map(remove_haketilo_cookies).filter(h => h);
|
|
39 | 40 |
} |
40 | 41 |
|
41 | 42 |
/* |
background/main.js | ||
---|---|---|
1 | 1 |
/** |
2 |
* Hachette main background script |
|
2 |
* This file is part of Haketilo. |
|
3 |
* |
|
4 |
* Function: Main background script. |
|
3 | 5 |
* |
4 | 6 |
* Copyright (C) 2021 Wojtek Kosior |
5 | 7 |
* Redistribution terms are gathered in the `copyright' file. |
background/page_actions_server.js | ||
---|---|---|
1 | 1 |
/** |
2 |
* Hachette serving of page actions to content scripts |
|
2 |
* This file is part of Haketilo. |
|
3 |
* |
|
4 |
* Function: Serving page actions to content scripts. |
|
3 | 5 |
* |
4 | 6 |
* Copyright (C) 2021 Wojtek Kosior |
5 | 7 |
* Redistribution terms are gathered in the `copyright' file. |
background/policy_injector.js | ||
---|---|---|
1 | 1 |
/** |
2 |
* Hachette injecting policy to page using webRequest |
|
2 |
* This file is part of Haketilo. |
|
3 |
* |
|
4 |
* Function: Injecting policy to page by modifying HTTP headers. |
|
3 | 5 |
* |
4 | 6 |
* Copyright (C) 2021 Wojtek Kosior |
5 | 7 |
* Copyright (C) 2021 jahoti |
... | ... | |
19 | 21 |
{ |
20 | 22 |
let csp_headers; |
21 | 23 |
let old_signature; |
22 |
let hachette_header;
|
|
24 |
let haketilo_header;
|
|
23 | 25 |
|
24 |
for (const header of headers.filter(h => h.name === "x-hachette")) {
|
|
25 |
/* x-hachette header has format: <signature>_0_<data> */
|
|
26 |
for (const header of headers.filter(h => h.name === "x-haketilo")) {
|
|
27 |
/* x-haketilo header has format: <signature>_0_<data> */
|
|
26 | 28 |
const match = /^([^_]+)_(0_.*)$/.exec(header.value); |
27 | 29 |
if (!match) |
28 | 30 |
continue; |
... | ... | |
38 | 40 |
csp_headers = old_data.csp_headers; |
39 | 41 |
old_signature = old_data.policy_sig; |
40 | 42 |
|
41 |
hachette_header = header;
|
|
43 |
haketilo_header = header;
|
|
42 | 44 |
break; |
43 | 45 |
} |
44 | 46 |
|
... | ... | |
53 | 55 |
headers.push(...csp_headers || []); |
54 | 56 |
} |
55 | 57 |
|
56 |
if (!hachette_header) {
|
|
57 |
hachette_header = {name: "x-hachette"};
|
|
58 |
headers.push(hachette_header);
|
|
58 |
if (!haketilo_header) {
|
|
59 |
haketilo_header = {name: "x-haketilo"};
|
|
60 |
headers.push(haketilo_header);
|
|
59 | 61 |
} |
60 | 62 |
|
61 | 63 |
if (old_signature) |
... | ... | |
66 | 68 |
const later_30sec = new Date(new Date().getTime() + 30000).toGMTString(); |
67 | 69 |
headers.push({ |
68 | 70 |
name: "Set-Cookie", |
69 |
value: `hachette-${signed_policy.join("=")}; Expires=${later_30sec};`
|
|
71 |
value: `haketilo-${signed_policy.join("=")}; Expires=${later_30sec};`
|
|
70 | 72 |
}); |
71 | 73 |
|
72 | 74 |
/* |
... | ... | |
74 | 76 |
* These are signed with a time of 0, as it's not clear there is a limit on |
75 | 77 |
* how long Firefox might retain headers in the cache. |
76 | 78 |
*/ |
77 |
let hachette_data = {csp_headers, policy_sig: signed_policy[0]};
|
|
78 |
hachette_data = encodeURIComponent(JSON.stringify(hachette_data));
|
|
79 |
hachette_header.value = sign_data(hachette_data, 0).join("_");
|
|
79 |
let haketilo_data = {csp_headers, policy_sig: signed_policy[0]};
|
|
80 |
haketilo_data = encodeURIComponent(JSON.stringify(haketilo_data));
|
|
81 |
haketilo_header.value = sign_data(haketilo_data, 0).join("_");
|
|
80 | 82 |
|
81 | 83 |
if (!policy.allow) { |
82 | 84 |
headers.push({ |
background/storage.js | ||
---|---|---|
1 | 1 |
/** |
2 |
* Hachette storage manager |
|
2 |
* This file is part of Haketilo. |
|
3 |
* |
|
4 |
* Function: Storage manager. |
|
3 | 5 |
* |
4 | 6 |
* Copyright (C) 2021 Wojtek Kosior |
5 | 7 |
* Redistribution terms are gathered in the `copyright' file. |
background/storage_server.js | ||
---|---|---|
1 | 1 |
/** |
2 |
* Hachette storage through connection (server side) |
|
2 |
* This file is part of Haketilo. |
|
3 |
* |
|
4 |
* Function: Storage through messages (server side). |
|
3 | 5 |
* |
4 | 6 |
* Copyright (C) 2021 Wojtek Kosior |
5 | 7 |
* Redistribution terms are gathered in the `copyright' file. |
background/stream_filter.js | ||
---|---|---|
1 | 1 |
/** |
2 |
* Hachette modifying a web page using the StreamFilter API |
|
2 |
* This file is part of Haketilo. |
|
3 |
* |
|
4 |
* Function: Modifying a web page using the StreamFilter API. |
|
3 | 5 |
* |
4 | 6 |
* Copyright (C) 2018 Giorgio Maone <giorgio@maone.net> |
5 | 7 |
* Copyright (C) 2021 Wojtek Kosior |
... | ... | |
173 | 175 |
*/ |
174 | 176 |
|
175 | 177 |
const dummy_script = |
176 |
`<script data-hachette-deleteme="${properties.policy.nonce}" nonce="${properties.policy.nonce}">null</script>`;
|
|
178 |
`<script data-haketilo-deleteme="${properties.policy.nonce}" nonce="${properties.policy.nonce}">null</script>`;
|
|
177 | 179 |
const doctype_decl = /^(\s*<!doctype[^<>"']*>)?/i.exec(decoded)[0]; |
178 | 180 |
decoded = doctype_decl + dummy_script + |
179 | 181 |
decoded.substring(doctype_decl.length); |
common/ajax.js | ||
---|---|---|
1 | 1 |
/** |
2 |
* part of Hachette |
|
3 |
* Wrapping XMLHttpRequest into a Promise. |
|
2 |
* This file is part of Haketilo. |
|
3 |
* |
|
4 |
* Function: Wrapping XMLHttpRequest into a Promise. |
|
4 | 5 |
* |
5 | 6 |
* Copyright (C) 2021 Wojtek Kosior |
6 | 7 |
* Redistribution terms are gathered in the `copyright' file. |
common/connection_types.js | ||
---|---|---|
1 | 1 |
/** |
2 |
* Hachette background scripts message connection types "enum" |
|
2 |
* This file is part of Haketilo. |
|
3 |
* |
|
4 |
* Function: Define an "enum" of message connection types. |
|
3 | 5 |
* |
4 | 6 |
* Copyright (C) 2021 Wojtek Kosior |
5 | 7 |
* Redistribution terms are gathered in the `copyright' file. |
common/lock.js | ||
---|---|---|
1 | 1 |
/** |
2 |
* Hachette lock (aka binary semaphore aka mutex) |
|
2 |
* This file is part of Haketilo. |
|
3 |
* |
|
4 |
* Function: Implement a lock (aka binary semaphore aka mutex). |
|
3 | 5 |
* |
4 | 6 |
* Copyright (C) 2021 Wojtek Kosior |
5 | 7 |
* Redistribution terms are gathered in the `copyright' file. |
common/message_server.js | ||
---|---|---|
1 | 1 |
/** |
2 |
* Hachette message server |
|
2 |
* This file is part of Haketilo. |
|
3 |
* |
|
4 |
* Function: Message server. |
|
3 | 5 |
* |
4 | 6 |
* Copyright (C) 2021 Wojtek Kosior |
5 | 7 |
* Redistribution terms are gathered in the `copyright' file. |
common/misc.js | ||
---|---|---|
1 | 1 |
/** |
2 |
* Hachette miscellaneous operations refactored to a separate file |
|
2 |
* This file is part of Haketilo. |
|
3 |
* |
|
4 |
* Function: Miscellaneous operations refactored to a separate file. |
|
3 | 5 |
* |
4 | 6 |
* Copyright (C) 2021 Wojtek Kosior |
5 | 7 |
* Copyright (C) 2021 jahoti |
common/observable.js | ||
---|---|---|
1 | 1 |
/** |
2 |
* part of Hachette |
|
3 |
* Facilitate listening to events |
|
2 |
* This file is part of Haketilo. |
|
3 |
* |
|
4 |
* Function: Facilitate listening to (internal, self-generated) events. |
|
4 | 5 |
* |
5 | 6 |
* Copyright (C) 2021 Wojtek Kosior |
6 | 7 |
* Redistribution terms are gathered in the `copyright' file. |
common/once.js | ||
---|---|---|
1 | 1 |
/** |
2 |
* Hachette feature initialization promise |
|
2 |
* This file is part of Haketilo. |
|
3 |
* |
|
4 |
* Function: Wrap APIs that depend on some asynchronous initialization into |
|
5 |
* promises. |
|
3 | 6 |
* |
4 | 7 |
* Copyright (C) 2021 Wojtek Kosior |
5 | 8 |
* Redistribution terms are gathered in the `copyright' file. |
common/patterns.js | ||
---|---|---|
1 | 1 |
/** |
2 |
* Hachette operations on page url patterns |
|
2 |
* This file is part of Haketilo. |
|
3 |
* |
|
4 |
* Function: Operations on page URL patterns. |
|
3 | 5 |
* |
4 | 6 |
* Copyright (C) 2021 Wojtek Kosior |
5 | 7 |
* Redistribution terms are gathered in the `copyright' file. |
common/sanitize_JSON.js | ||
---|---|---|
1 | 1 |
/** |
2 |
* part of Hachette |
|
3 |
* Powerful, full-blown format enforcer for externally-obtained JSON |
|
2 |
* This file is part of Haketilo. |
|
3 |
* |
|
4 |
* Function: Powerful, full-blown format enforcer for externally-obtained JSON. |
|
4 | 5 |
* |
5 | 6 |
* Copyright (C) 2021 Wojtek Kosior |
6 | 7 |
* Redistribution terms are gathered in the `copyright' file. |
common/settings_query.js | ||
---|---|---|
1 | 1 |
/** |
2 |
* Hachette querying page settings with regard to wildcard records |
|
2 |
* This file is part of Haketilo. |
|
3 |
* |
|
4 |
* Function: Querying page settings. |
|
3 | 5 |
* |
4 | 6 |
* Copyright (C) 2021 Wojtek Kosior |
5 | 7 |
* Redistribution terms are gathered in the `copyright' file. |
common/signing.js | ||
---|---|---|
1 | 1 |
/** |
2 |
* part of Hachette |
|
3 |
* Functions related to "signing" of data, refactored to a separate file. |
|
2 |
* This file is part of Haketilo. |
|
3 |
* |
|
4 |
* Functions: Operations related to "signing" of data. |
|
4 | 5 |
* |
5 | 6 |
* Copyright (C) 2021 Wojtek Kosior |
6 | 7 |
* Redistribution terms are gathered in the `copyright' file. |
... | ... | |
16 | 17 |
|
17 | 18 |
/* |
18 | 19 |
* In order to make certain data synchronously accessible in certain contexts, |
19 |
* hachette smuggles it in string form in places like cookies, URLs and headers.
|
|
20 |
* Haketilo smuggles it in string form in places like cookies, URLs and headers.
|
|
20 | 21 |
* When using the smuggled data, we first need to make sure it isn't spoofed. |
21 | 22 |
* For that, we use this pseudo-signing mechanism. |
22 | 23 |
* |
common/storage_client.js | ||
---|---|---|
1 | 1 |
/** |
2 |
* Hachette storage through connection (client side) |
|
2 |
* This file is part of Haketilo. |
|
3 |
* |
|
4 |
* Function: Storage through messages (client side). |
|
3 | 5 |
* |
4 | 6 |
* Copyright (C) 2021 Wojtek Kosior |
5 | 7 |
* Redistribution terms are gathered in the `copyright' file. |
common/storage_light.js | ||
---|---|---|
1 | 1 |
/** |
2 |
* part of Hachette |
|
3 |
* Storage manager, lighter than the previous one. |
|
2 |
* This file is part of Haketilo. |
|
3 |
* |
|
4 |
* Function: Storage manager, lighter than the previous one. |
|
4 | 5 |
* |
5 | 6 |
* Copyright (C) 2021 Wojtek Kosior |
6 | 7 |
* Redistribution terms are gathered in the `copyright' file. |
common/storage_raw.js | ||
---|---|---|
1 | 1 |
/** |
2 |
* part of Hachette |
|
3 |
* Basic wrappers for storage API functions. |
|
2 |
* This file is part of Haketilo. |
|
3 |
* |
|
4 |
* Function: Basic wrappers for storage API functions. |
|
4 | 5 |
* |
5 | 6 |
* Copyright (C) 2021 Wojtek Kosior |
6 | 7 |
* Redistribution terms are gathered in the `copyright' file. |
common/stored_types.js | ||
---|---|---|
1 | 1 |
/** |
2 |
* Hachette stored item types "enum" |
|
2 |
* This file is part of Haketilo. |
|
3 |
* |
|
4 |
* Function: Define an "enum" of stored item types. |
|
3 | 5 |
* |
4 | 6 |
* Copyright (C) 2021 Wojtek Kosior |
5 | 7 |
* Redistribution terms are gathered in the `copyright' file. |
content/activity_info_server.js | ||
---|---|---|
1 | 1 |
/** |
2 |
* part of Hachette |
|
3 |
* Informing about activities performed by content script (script injection, |
|
4 |
* script blocking). |
|
2 |
* This file is part of Haketilo. |
|
3 |
* |
|
4 |
* Function: Informing the popup about what happens in the content script |
|
5 |
* (script injection, script blocking, etc.). |
|
5 | 6 |
* |
6 | 7 |
* Copyright (C) 2021 Wojtek Kosior |
7 | 8 |
* Redistribution terms are gathered in the `copyright' file. |
content/main.js | ||
---|---|---|
1 | 1 |
/** |
2 |
* Hachette main content script run in all frames |
|
2 |
* This file is part of Haketilo. |
|
3 |
* |
|
4 |
* Function: Main content script that runs in all frames. |
|
3 | 5 |
* |
4 | 6 |
* Copyright (C) 2021 Wojtek Kosior |
5 | 7 |
* Copyright (C) 2021 jahoti |
... | ... | |
33 | 35 |
let policy = null; |
34 | 36 |
const extracted_signatures = []; |
35 | 37 |
|
36 |
for (const match of cookie.matchAll(/hachette-(\w*)=([^;]*)/g)) {
|
|
38 |
for (const match of cookie.matchAll(/haketilo-(\w*)=([^;]*)/g)) {
|
|
37 | 39 |
const new_result = extract_signed(...match.slice(1, 3)); |
38 | 40 |
if (new_result.fail) |
39 | 41 |
continue; |
... | ... | |
60 | 62 |
const [base_url, payload, anchor] = |
61 | 63 |
/^([^#]*)#?([^#]*)(#?.*)$/.exec(url).splice(1, 4); |
62 | 64 |
|
63 |
const match = /^hachette_([^_]+)_(.*)$/.exec(payload);
|
|
65 |
const match = /^haketilo_([^_]+)_(.*)$/.exec(payload);
|
|
64 | 66 |
if (!match) |
65 | 67 |
return [null, url]; |
66 | 68 |
|
... | ... | |
83 | 85 |
policy.nonce = gen_nonce(); |
84 | 86 |
const [base_url, target] = /^([^#]*)(#?.*)$/.exec(policy.url).slice(1, 3); |
85 | 87 |
const encoded_policy = encodeURIComponent(JSON.stringify(policy)); |
86 |
const payload = "hachette_" +
|
|
88 |
const payload = "haketilo_" +
|
|
87 | 89 |
sign_data(encoded_policy, new Date().getTime()).join("_"); |
88 | 90 |
const resulting_url = `${base_url}#${payload}${target}`; |
89 | 91 |
location.href = resulting_url; |
... | ... | |
187 | 189 |
|
188 | 190 |
function sanitize_script(script) |
189 | 191 |
{ |
190 |
script.hachette_blocked_type = script.getAttribute("type");
|
|
192 |
script.haketilo_blocked_type = script.getAttribute("type");
|
|
191 | 193 |
script.type = "text/plain"; |
192 | 194 |
} |
193 | 195 |
|
... | ... | |
197 | 199 |
*/ |
198 | 200 |
function desanitize_script(script) |
199 | 201 |
{ |
200 |
script.setAttribute("type", script.hachette_blocked_type);
|
|
202 |
script.setAttribute("type", script.haketilo_blocked_type);
|
|
201 | 203 |
|
202 |
if ([null, undefined].includes(script.hachette_blocked_type))
|
|
204 |
if ([null, undefined].includes(script.haketilo_blocked_type))
|
|
203 | 205 |
script.removeAttribute("type"); |
204 | 206 |
|
205 |
delete script.hachette_blocked_type;
|
|
207 |
delete script.haketilo_blocked_type;
|
|
206 | 208 |
} |
207 | 209 |
|
208 | 210 |
const bad_url_reg = /^data:([^,;]*ml|unknown-content-type)/i; |
... | ... | |
235 | 237 |
*/ |
236 | 238 |
function prevent_script_execution(event) |
237 | 239 |
{ |
238 |
if (!event.target._hachette_payload)
|
|
240 |
if (!event.target.haketilo_payload)
|
|
239 | 241 |
event.preventDefault(); |
240 | 242 |
} |
241 | 243 |
|
... | ... | |
336 | 338 |
let signatures; |
337 | 339 |
[policy, signatures] = extract_cookie_policy(document.cookie, min_time); |
338 | 340 |
for (const signature of signatures) |
339 |
document.cookie = `hachette-${signature}=; Max-Age=-1;`;
|
|
341 |
document.cookie = `haketilo-${signature}=; Max-Age=-1;`;
|
|
340 | 342 |
} else { |
341 | 343 |
const scheme = /^([^:]*)/.exec(document.URL)[1]; |
342 | 344 |
const known_scheme = ["file", "ftp"].includes(scheme); |
content/page_actions.js | ||
---|---|---|
1 | 1 |
/** |
2 |
* Hachette handling of page actions in content scripts |
|
2 |
* This file is part of Haketilo. |
|
3 |
* |
|
4 |
* Function: Handle page actions in a content script. |
|
3 | 5 |
* |
4 | 6 |
* Copyright (C) 2021 Wojtek Kosior |
5 | 7 |
* Redistribution terms are gathered in the `copyright' file. |
... | ... | |
60 | 62 |
let script = document.createElement("script"); |
61 | 63 |
script.textContent = script_text; |
62 | 64 |
script.setAttribute("nonce", nonce); |
63 |
script._hachette_payload = true;
|
|
65 |
script.haketilo_payload = true;
|
|
64 | 66 |
document.body.appendChild(script); |
65 | 67 |
|
66 | 68 |
report_script(script_text); |
content/repo_query.js | ||
---|---|---|
1 | 1 |
/** |
2 |
* part of Hachette |
|
3 |
* Getting available content for site from remote repositories. |
|
2 |
* This file is part of Haketilo. |
|
3 |
* |
|
4 |
* Function: Getting available content for site from remote repositories. |
|
4 | 5 |
* |
5 | 6 |
* Copyright (C) 2021 Wojtek Kosior |
6 | 7 |
* Redistribution terms are gathered in the `copyright' file. |
copyright | ||
---|---|---|
1 | 1 |
Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ |
2 |
Upstream-Name: Hachette
|
|
2 |
Upstream-Name: Haketilo
|
|
3 | 3 |
Source: https://git.koszko.org/browser-extension/ |
4 | 4 |
|
5 | 5 |
Files: * |
html/DOM_helpers.js | ||
---|---|---|
1 | 1 |
/** |
2 |
* Hachette operations on DOM elements |
|
2 |
* This file is part of Haketilo. |
|
3 |
* |
|
4 |
* Function: Operations on DOM elements. |
|
3 | 5 |
* |
4 | 6 |
* Copyright (C) 2021 Wojtek Kosior |
5 | 7 |
* Redistribution terms are gathered in the `copyright' file. |
html/MOZILLA_scrollbar_fix.css | ||
---|---|---|
1 | 1 |
/** |
2 |
* Hachette |
|
3 |
* Hacky fix for vertical scrollbar width being included in child's width. |
|
2 |
* This file is part of Haketilo. |
|
3 |
* |
|
4 |
* Function: Hacky fix for vertical scrollbar width being included in child's |
|
5 |
* width. |
|
4 | 6 |
* |
5 | 7 |
* Copyright (C) 2021 Wojtek Kosior |
6 | 8 |
* Redistribution terms are gathered in the `copyright' file. |
html/back_button.css | ||
---|---|---|
1 | 1 |
/** |
2 |
* part of Hachette |
|
3 |
* Style for a "back" button with a CSS arrow image. |
|
2 |
* This file is part of Haketilo. |
|
3 |
* |
|
4 |
* Function: Style for a "back" button with a CSS arrow image. |
|
4 | 5 |
* |
5 | 6 |
* Copyright (C) 2021 Wojtek Kosior |
6 | 7 |
* Redistribution terms are gathered in the `copyright' file. |
html/base.css | ||
---|---|---|
1 | 1 |
/** |
2 |
* Hachette base styles |
|
2 |
* This file is part of Haketilo. |
|
3 |
* |
|
4 |
* Function: Base styles. |
|
3 | 5 |
* |
4 | 6 |
* Copyright (C) 2021 Wojtek Kosior |
5 | 7 |
* Copyright (C) 2021 Nicholas Johnson |
html/default_blocking_policy.js | ||
---|---|---|
1 | 1 |
/** |
2 |
* part of Hachette |
|
3 |
* Default policy dialog logic. |
|
2 |
* This file is part of Haketilo. |
|
3 |
* |
|
4 |
* Function: Logic for the dialog of default policy selection. |
|
4 | 5 |
* |
5 | 6 |
* Copyright (C) 2021 Wojtek Kosior |
6 | 7 |
* Redistribution terms are gathered in the `copyright' file. |
html/display-panel.html | ||
---|---|---|
1 | 1 |
<!doctype html> |
2 | 2 |
<!-- |
3 |
This file is part of Haketilo. |
|
4 |
|
|
5 |
Function: Extension's popup page. |
|
6 |
|
|
3 | 7 |
Copyright (C) 2021 Wojtek Kosior |
4 | 8 |
Redistribution terms are gathered in the `copyright' file. |
5 | 9 |
--> |
6 | 10 |
<html> |
7 | 11 |
<head> |
8 | 12 |
<meta charset="utf-8"/> |
9 |
<title>Hachette - page settings</title>
|
|
13 |
<title>Haketilo - page settings</title>
|
|
10 | 14 |
<link type="text/css" rel="stylesheet" href="reset.css" /> |
11 | 15 |
<link type="text/css" rel="stylesheet" href="base.css" /> |
12 | 16 |
<link type="text/css" rel="stylesheet" href="back_button.css" /> |
... | ... | |
331 | 335 |
|
332 | 336 |
<div class="footer padding_inline has_upper_thin_line"> |
333 | 337 |
<button id="settings_but" type="button"> |
334 |
Open Hachette settings
|
|
338 |
Open Haketilo settings
|
|
335 | 339 |
</button> |
336 | 340 |
</div> |
337 | 341 |
</div> |
html/display-panel.js | ||
---|---|---|
1 | 1 |
/** |
2 |
* Hachette display panel logic |
|
2 |
* This file is part of Haketilo. |
|
3 |
* |
|
4 |
* Function: Popup logic. |
|
3 | 5 |
* |
4 | 6 |
* Copyright (C) 2021 Wojtek Kosior |
5 | 7 |
* Redistribution terms are gathered in the `copyright' file. |
html/import_frame.js | ||
---|---|---|
1 | 1 |
/** |
2 |
* Hachette HTML import frame script |
|
2 |
* This file is part of Haketilo. |
|
3 |
* |
|
4 |
* Function: Logic for the settings import frame. |
|
3 | 5 |
* |
4 | 6 |
* Copyright (C) 2021 Wojtek Kosior |
5 | 7 |
* Redistribution terms are gathered in the `copyright' file. |
html/options.html | ||
---|---|---|
1 | 1 |
<!doctype html> |
2 | 2 |
<!-- |
3 |
This file is part of Haketilo. |
|
4 |
|
|
5 |
Function: Extension's settings page. |
|
6 |
|
|
3 | 7 |
Copyright (C) 2021 Wojtek Kosior |
4 | 8 |
Redistribution terms are gathered in the `copyright' file. |
5 | 9 |
--> |
6 | 10 |
<html> |
7 | 11 |
<head> |
8 | 12 |
<meta charset="utf-8"/> |
9 |
<title>Hachette options</title>
|
|
13 |
<title>Haketilo options</title>
|
|
10 | 14 |
<link type="text/css" rel="stylesheet" href="reset.css" /> |
11 | 15 |
<link type="text/css" rel="stylesheet" href="base.css" /> |
12 | 16 |
<link type="text/css" rel="stylesheet" href="table.css" /> |
html/options_main.js | ||
---|---|---|
1 | 1 |
/** |
2 |
* Hachette HTML options page main script |
|
2 |
* This file is part of Haketilo. |
|
3 |
* |
|
4 |
* Function: Settings page logic. |
|
3 | 5 |
* |
4 | 6 |
* Copyright (C) 2021 Wojtek Kosior |
5 | 7 |
* Redistribution terms are gathered in the `copyright' file. |
icons/hachette.svg | ||
---|---|---|
1 |
<?xml version="1.0" encoding="UTF-8" standalone="no"?> |
|
2 |
<svg |
|
3 |
xmlns:dc="http://purl.org/dc/elements/1.1/" |
|
4 |
xmlns:cc="http://creativecommons.org/ns#" |
|
5 |
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" |
|
6 |
xmlns:svg="http://www.w3.org/2000/svg" |
|
7 |
xmlns="http://www.w3.org/2000/svg" |
|
8 |
width="128" |
|
9 |
height="128" |
|
10 |
viewBox="0 -0.6 33.866668 33.866666" |
|
11 |
version="1.1" |
|
12 |
id="svg8"> |
|
13 |
<title |
|
14 |
id="title1418">Hatchet</title> |
|
15 |
<defs |
|
16 |
id="defs2"> |
|
17 |
<filter |
|
18 |
style="color-interpolation-filters:sRGB" |
|
19 |
id="filter994" |
|
20 |
x="-0.78125864" |
|
21 |
width="2.5625174" |
|
22 |
y="-0.25392297" |
|
23 |
height="1.5078459"> |
|
24 |
<feGaussianBlur |
|
25 |
stdDeviation="1.7304741" |
|
26 |
id="feGaussianBlur996" /> |
|
27 |
</filter> |
|
28 |
<filter |
|
29 |
style="color-interpolation-filters:sRGB" |
|
30 |
id="filter1401" |
|
31 |
x="-0.43681362" |
|
32 |
width="1.8736273" |
|
33 |
y="-0.032828163" |
|
34 |
height="1.0656563"> |
|
35 |
<feGaussianBlur |
|
36 |
stdDeviation="2.2606587" |
|
37 |
id="feGaussianBlur1403" /> |
|
38 |
</filter> |
|
39 |
</defs> |
|
40 |
<metadata |
|
41 |
id="metadata5"> |
|
42 |
<rdf:RDF> |
|
43 |
<cc:Work |
|
44 |
rdf:about=""> |
|
45 |
<dc:format>image/svg+xml</dc:format> |
|
46 |
<dc:type |
|
47 |
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> |
|
48 |
<dc:title>Hatchet</dc:title> |
|
49 |
<dc:creator> |
|
50 |
<cc:Agent> |
|
51 |
<dc:title>David Lyons</dc:title> |
|
52 |
</cc:Agent> |
|
53 |
</dc:creator> |
|
54 |
<dc:publisher> |
|
55 |
<cc:Agent> |
|
56 |
<dc:title>dlyons</dc:title> |
|
57 |
</cc:Agent> |
|
58 |
</dc:publisher> |
|
59 |
<cc:license |
|
60 |
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" /> |
|
61 |
<dc:date>2017-05</dc:date> |
|
62 |
<dc:subject> |
|
63 |
<rdf:Bag> |
|
64 |
<rdf:li>hatchet</rdf:li> |
|
65 |
<rdf:li>ax</rdf:li> |
|
66 |
<rdf:li>wood</rdf:li> |
|
67 |
</rdf:Bag> |
|
68 |
</dc:subject> |
|
69 |
<dc:description>Hatchet</dc:description> |
|
70 |
</cc:Work> |
|
71 |
<cc:License |
|
72 |
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/"> |
|
73 |
<cc:permits |
|
74 |
rdf:resource="http://creativecommons.org/ns#Reproduction" /> |
|
75 |
<cc:permits |
|
76 |
rdf:resource="http://creativecommons.org/ns#Distribution" /> |
|
77 |
<cc:requires |
|
78 |
rdf:resource="http://creativecommons.org/ns#Notice" /> |
|
79 |
<cc:requires |
|
80 |
rdf:resource="http://creativecommons.org/ns#Attribution" /> |
|
81 |
<cc:permits |
|
82 |
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" /> |
|
83 |
<cc:requires |
|
84 |
rdf:resource="http://creativecommons.org/ns#ShareAlike" /> |
|
85 |
</cc:License> |
|
86 |
</rdf:RDF> |
|
87 |
</metadata> |
|
88 |
<g |
|
89 |
transform="matrix(0.18053177,-0.14666587,0.14666587,0.18053177,-0.67884005,5.998568)" |
|
90 |
id="g4514"> |
|
91 |
<path |
|
92 |
style="fill:#d38d5f;stroke-width:0.23824416" |
|
93 |
d="M 7.30405,153.7586 C 20.54927,112.215 15.59359,34.229537 16.31646,33.113187 c 0.87975,-1.35862 11.98736,-0.3859 11.70824,-0.21673 0.17326,45.22237 7.01132,84.510963 -0.71993,131.991763 l -9.29885,-5.88681 z" |
|
94 |
id="rect7" /> |
|
95 |
<path |
|
96 |
style="stroke-width:0.27389684" |
|
97 |
d="m 63.328435,18.175599 c 0,0 -18.017818,8.640905 -27.631388,12.644707 -3.823279,1.592294 -7.11998,3.047871 -9.996289,4.376476 -11.35319,0.247708 -19.4479991,0.01005 -19.8799245,1.450041 l 0.01602,16.049149 c 0.1225108,1.704999 8.9933655,2.136989 19.9713905,3.333131 6.538886,4.233937 13.307605,8.532834 17.153475,10.714075 9.058079,5.13742 18.504813,7.823295 18.504813,7.823295 0,0 5.056977,-21.237215 4.911847,-31.707625 C 66.23324,32.388436 63.328435,18.175599 63.328435,18.175599 Z" |
|
98 |
id="rect9" /> |
|
99 |
<path |
|
100 |
id="path35" |
|
101 |
d="m 63.328435,18.175599 c 0,0 2.905055,14.268926 3.050195,24.739336 0.14513,10.47041 -4.912098,31.651538 -4.912098,31.651538 -11.67798,-3.788669 -16.221256,-6.527691 -16.221256,-6.527691 0,0 7.434244,-7.591907 9.174294,-22.366997 1.1592,-16.80443 -4.045711,-21.40711 -4.045711,-21.40711 3.905919,-1.879065 11.01257,-5.216217 12.954576,-6.089076 z" |
|
102 |
style="opacity:0.45500004;fill:#ffffff;stroke-width:0.26458335" /> |
|
103 |
<path |
|
104 |
style="opacity:0.45500004;fill:#ffffff;stroke-width:0.26458335" |
|
105 |
d="m 63.208938,17.51176 c 0,0 3.024552,14.932765 3.169692,25.403175 0.14513,10.47041 -4.912098,31.621519 -4.912098,31.621519 -1.568463,-0.523507 -1.541936,-0.491688 -1.541936,-0.491688 0,0 5.456154,-26.034461 5.211644,-30.225191 -0.0315,-4.2355 -1.218109,-20.314453 -3.453104,-24.783592 0,0 0.723943,-0.407792 1.645299,-0.860384 z" |
|
106 |
id="path1427" /> |
|
107 |
<path |
|
108 |
style="fill:#784421;stroke:none;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" |
|
109 |
d="m 7.30405,153.7586 10.40103,5.0627 c 0,0 9.14195,5.35641 9.55606,6.02467 0.41411,0.66827 -4.66818,-0.88342 -7.90926,-2.11367 -3.24108,-1.23026 -8.21159,-4.9245 -10.36004,-6.6929 -2.14844,-1.76841 -1.68779,-2.2808 -1.68779,-2.2808 z" |
|
110 |
id="path1407" /> |
|
111 |
<path |
|
112 |
id="path999" |
|
113 |
d="M 7.30405,153.7586 C 17.372688,112.40594 21.015256,78.343761 17.898744,32.568697 l 3.350934,-0.138515 c 0.131707,45.014525 3.851339,79.911868 -2.025736,127.174438 z" |
|
114 |
style="opacity:0.3;fill:#2b1100;stroke-width:0.20724197" /> |
|
115 |
<path |
|
116 |
style="opacity:1;fill:#1a1a1a;stroke:none;stroke-width:0.1832249" |
|
117 |
d="m 37.364038,35.560531 9.400174,-5.992052 c 4.831746,9.986754 3.508267,19.973509 -0.303231,29.960263 l -9.096943,-5.992051 z" |
|
118 |
id="rect4493" /> |
|
119 |
<rect |
|
120 |
style="opacity:1;fill:#1a1a1a;stroke:none;stroke-width:0.37082145" |
|
121 |
id="rect4504" |
|
122 |
width="7.4658442" |
|
123 |
height="15.338916" |
|
124 |
x="23.754957" |
|
125 |
y="38.224262" /> |
|
126 |
</g> |
|
127 |
</svg> |
icons/haketilo.svg | ||
---|---|---|
1 |
<?xml version="1.0" encoding="UTF-8" standalone="no"?> |
|
2 |
<svg |
|
3 |
xmlns:dc="http://purl.org/dc/elements/1.1/" |
|
4 |
xmlns:cc="http://creativecommons.org/ns#" |
|
5 |
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" |
|
6 |
xmlns:svg="http://www.w3.org/2000/svg" |
|
7 |
xmlns="http://www.w3.org/2000/svg" |
|
8 |
width="128" |
|
9 |
height="128" |
|
10 |
viewBox="0 -0.6 33.866668 33.866666" |
|
11 |
version="1.1" |
|
12 |
id="svg8"> |
|
13 |
<title |
|
14 |
id="title1418">Hatchet</title> |
|
15 |
<defs |
|
16 |
id="defs2"> |
|
17 |
<filter |
|
18 |
style="color-interpolation-filters:sRGB" |
|
19 |
id="filter994" |
|
20 |
x="-0.78125864" |
|
21 |
width="2.5625174" |
|
22 |
y="-0.25392297" |
|
23 |
height="1.5078459"> |
|
24 |
<feGaussianBlur |
|
25 |
stdDeviation="1.7304741" |
|
26 |
id="feGaussianBlur996" /> |
|
27 |
</filter> |
|
28 |
<filter |
|
29 |
style="color-interpolation-filters:sRGB" |
|
30 |
id="filter1401" |
|
31 |
x="-0.43681362" |
|
32 |
width="1.8736273" |
|
33 |
y="-0.032828163" |
|
34 |
height="1.0656563"> |
|
35 |
<feGaussianBlur |
|
36 |
stdDeviation="2.2606587" |
|
37 |
id="feGaussianBlur1403" /> |
|
38 |
</filter> |
|
39 |
</defs> |
|
40 |
<metadata |
|
41 |
id="metadata5"> |
|
42 |
<rdf:RDF> |
|
43 |
<cc:Work |
|
44 |
rdf:about=""> |
|
45 |
<dc:format>image/svg+xml</dc:format> |
|
46 |
<dc:type |
|
47 |
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> |
|
48 |
<dc:title>Hatchet</dc:title> |
|
49 |
<dc:creator> |
|
50 |
<cc:Agent> |
|
51 |
<dc:title>David Lyons</dc:title> |
|
52 |
</cc:Agent> |
|
53 |
</dc:creator> |
|
54 |
<dc:publisher> |
|
55 |
<cc:Agent> |
|
56 |
<dc:title>dlyons</dc:title> |
|
57 |
</cc:Agent> |
|
58 |
</dc:publisher> |
|
59 |
<cc:license |
|
60 |
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" /> |
|
61 |
<dc:date>2017-05</dc:date> |
|
62 |
<dc:subject> |
|
63 |
<rdf:Bag> |
|
64 |
<rdf:li>hatchet</rdf:li> |
|
65 |
<rdf:li>ax</rdf:li> |
|
66 |
<rdf:li>wood</rdf:li> |
|
67 |
</rdf:Bag> |
|
68 |
</dc:subject> |
|
69 |
<dc:description>Hatchet</dc:description> |
|
70 |
</cc:Work> |
|
71 |
<cc:License |
|
72 |
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/"> |
|
73 |
<cc:permits |
|
74 |
rdf:resource="http://creativecommons.org/ns#Reproduction" /> |
|
75 |
<cc:permits |
|
76 |
rdf:resource="http://creativecommons.org/ns#Distribution" /> |
|
77 |
<cc:requires |
|
78 |
rdf:resource="http://creativecommons.org/ns#Notice" /> |
|
79 |
<cc:requires |
|
80 |
rdf:resource="http://creativecommons.org/ns#Attribution" /> |
|
81 |
<cc:permits |
|
82 |
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" /> |
|
83 |
<cc:requires |
|
84 |
rdf:resource="http://creativecommons.org/ns#ShareAlike" /> |
|
85 |
</cc:License> |
|
86 |
</rdf:RDF> |
|
87 |
</metadata> |
|
88 |
<g |
|
89 |
transform="matrix(0.18053177,-0.14666587,0.14666587,0.18053177,-0.67884005,5.998568)" |
|
90 |
id="g4514"> |
|
91 |
<path |
|
92 |
style="fill:#d38d5f;stroke-width:0.23824416" |
|
93 |
d="M 7.30405,153.7586 C 20.54927,112.215 15.59359,34.229537 16.31646,33.113187 c 0.87975,-1.35862 11.98736,-0.3859 11.70824,-0.21673 0.17326,45.22237 7.01132,84.510963 -0.71993,131.991763 l -9.29885,-5.88681 z" |
|
94 |
id="rect7" /> |
|
95 |
<path |
|
96 |
style="stroke-width:0.27389684" |
|
97 |
d="m 63.328435,18.175599 c 0,0 -18.017818,8.640905 -27.631388,12.644707 -3.823279,1.592294 -7.11998,3.047871 -9.996289,4.376476 -11.35319,0.247708 -19.4479991,0.01005 -19.8799245,1.450041 l 0.01602,16.049149 c 0.1225108,1.704999 8.9933655,2.136989 19.9713905,3.333131 6.538886,4.233937 13.307605,8.532834 17.153475,10.714075 9.058079,5.13742 18.504813,7.823295 18.504813,7.823295 0,0 5.056977,-21.237215 4.911847,-31.707625 C 66.23324,32.388436 63.328435,18.175599 63.328435,18.175599 Z" |
|
98 |
id="rect9" /> |
|
99 |
<path |
|
100 |
id="path35" |
|
101 |
d="m 63.328435,18.175599 c 0,0 2.905055,14.268926 3.050195,24.739336 0.14513,10.47041 -4.912098,31.651538 -4.912098,31.651538 -11.67798,-3.788669 -16.221256,-6.527691 -16.221256,-6.527691 0,0 7.434244,-7.591907 9.174294,-22.366997 1.1592,-16.80443 -4.045711,-21.40711 -4.045711,-21.40711 3.905919,-1.879065 11.01257,-5.216217 12.954576,-6.089076 z" |
|
102 |
style="opacity:0.45500004;fill:#ffffff;stroke-width:0.26458335" /> |
|
103 |
<path |
|
104 |
style="opacity:0.45500004;fill:#ffffff;stroke-width:0.26458335" |
|
105 |
d="m 63.208938,17.51176 c 0,0 3.024552,14.932765 3.169692,25.403175 0.14513,10.47041 -4.912098,31.621519 -4.912098,31.621519 -1.568463,-0.523507 -1.541936,-0.491688 -1.541936,-0.491688 0,0 5.456154,-26.034461 5.211644,-30.225191 -0.0315,-4.2355 -1.218109,-20.314453 -3.453104,-24.783592 0,0 0.723943,-0.407792 1.645299,-0.860384 z" |
|
106 |
id="path1427" /> |
|
107 |
<path |
|
108 |
style="fill:#784421;stroke:none;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" |
|
109 |
d="m 7.30405,153.7586 10.40103,5.0627 c 0,0 9.14195,5.35641 9.55606,6.02467 0.41411,0.66827 -4.66818,-0.88342 -7.90926,-2.11367 -3.24108,-1.23026 -8.21159,-4.9245 -10.36004,-6.6929 -2.14844,-1.76841 -1.68779,-2.2808 -1.68779,-2.2808 z" |
|
110 |
id="path1407" /> |
|
111 |
<path |
|
112 |
id="path999" |
|
113 |
d="M 7.30405,153.7586 C 17.372688,112.40594 21.015256,78.343761 17.898744,32.568697 l 3.350934,-0.138515 c 0.131707,45.014525 3.851339,79.911868 -2.025736,127.174438 z" |
|
114 |
style="opacity:0.3;fill:#2b1100;stroke-width:0.20724197" /> |
|
115 |
<path |
|
116 |
style="opacity:1;fill:#1a1a1a;stroke:none;stroke-width:0.1832249" |
|
117 |
d="m 37.364038,35.560531 9.400174,-5.992052 c 4.831746,9.986754 3.508267,19.973509 -0.303231,29.960263 l -9.096943,-5.992051 z" |
|
118 |
id="rect4493" /> |
|
119 |
<rect |
|
120 |
style="opacity:1;fill:#1a1a1a;stroke:none;stroke-width:0.37082145" |
|
121 |
id="rect4504" |
|
122 |
width="7.4658442" |
|
123 |
height="15.338916" |
|
124 |
x="23.754957" |
|
125 |
y="38.224262" /> |
|
126 |
</g> |
|
127 |
</svg> |
manifest.json | ||
---|---|---|
1 |
// This is the manifest file of Haketilo. |
|
2 |
// |
|
1 | 3 |
// Copyright (C) 2021 Wojtek Kosior |
2 | 4 |
// Redistribution terms are gathered in the `copyright' file. |
3 | 5 |
{ |
4 | 6 |
"manifest_version": 2, |
5 |
"name": "Hachette",
|
|
6 |
"short_name": "Hachette",
|
|
7 |
"name": "Haketilo",
|
|
8 |
"short_name": "Haketilo",
|
|
7 | 9 |
"version": "0.0.1", |
8 | 10 |
"author": "various", |
9 | 11 |
"description": "Control your \"Web\" browsing.",_GECKO_APPLICATIONS_ |
10 | 12 |
"icons":{ |
11 |
"128": "icons/hachette128.png",
|
|
12 |
"64": "icons/hachette64.png",
|
|
13 |
"48": "icons/hachette48.png",
|
|
14 |
"32": "icons/hachette32.png",
|
|
15 |
"16": "icons/hachette16.png"
|
|
13 |
"128": "icons/haketilo128.png",
|
|
14 |
"64": "icons/haketilo64.png",
|
|
15 |
"48": "icons/haketilo48.png",
|
|
16 |
"32": "icons/haketilo32.png",
|
|
17 |
"16": "icons/haketilo16.png"
|
|
16 | 18 |
}, |
17 | 19 |
"permissions": [ |
18 | 20 |
"contextMenus", |
... | ... | |
29 | 31 |
"browser_action": { |
30 | 32 |
"browser_style": true, |
31 | 33 |
"default_icon": { |
32 |
"128": "icons/hachette128.png",
|
|
33 |
"64": "icons/hachette64.png",
|
|
34 |
"48": "icons/hachette48.png",
|
|
35 |
"32": "icons/hachette32.png",
|
|
36 |
"16": "icons/hachette16.png"
|
|
34 |
"128": "icons/haketilo128.png",
|
|
35 |
"64": "icons/haketilo64.png",
|
|
36 |
"48": "icons/haketilo48.png",
|
|
37 |
"32": "icons/haketilo32.png",
|
|
38 |
"16": "icons/haketilo16.png"
|
|
37 | 39 |
}, |
38 |
"default_title": "Hachette",
|
|
40 |
"default_title": "Haketilo",
|
|
39 | 41 |
"default_popup": "html/display-panel.html" |
40 | 42 |
}, |
41 | 43 |
"options_ui": { |
re-generate_icons.sh | ||
---|---|---|
4 | 4 |
# Redistribution terms are gathered in the `copyright' file. |
5 | 5 |
|
6 | 6 |
for SIZE in 128 64 48 32 16; do |
7 |
inkscape -z -e icons/hachette$SIZE.png -w $SIZE -h $SIZE icons/hachette.svg
|
|
7 |
inkscape -z -e icons/haketilo$SIZE.png -w $SIZE -h $SIZE icons/haketilo.svg
|
|
8 | 8 |
done |
Also available in: Unified diff
rename the extension to "Haketilo"