Compare commits
8 Enmetoj
Author | SHA1 | Date | |
---|---|---|---|
Jaidyn Ann | 74735233b0 | ||
Jaidyn Ann | e721fcbc18 | ||
Jaidyn Ann | da847fc55c | ||
Jaidyn Ann | d2a98a0870 | ||
Jaidyn Ann | d98d7013dd | ||
Jaidyn Ann | 667116b1a5 | ||
Jaidyn Ann | 2a33fdaec1 | ||
Jaidyn Ann | a10c4a9d21 |
2
Makefile
|
@ -39,4 +39,4 @@ native-uninstall:
|
||||||
|
|
||||||
.PHONY: xpi
|
.PHONY: xpi
|
||||||
xpi:
|
xpi:
|
||||||
@rm -f shellfox.xpi && zip -r shellfox.xpi background.js manifest.json _locales html img/shellfox*.png
|
@rm -f shellfox.xpi && zip -r shellfox.xpi background.js manifest.json _locales html img/shellfox*.png img/shellfox.svg
|
||||||
|
|
17
README.md
|
@ -1,16 +1,19 @@
|
||||||
# ![](img/shellfox-38.png) Shellfox
|
# ![](img/shellfox-32.png) Shellfox
|
||||||
|
|
||||||
[Shellfox](https://hak.xwx.moe/jadedctrl/shellfox) is a simple add-on for [Firefox](https://firefox.com) that allows you to run shell commands at the click of a button.
|
[Shellfox](https://hak.xwx.moe/jadedctrl/shellfox) is a simple add-on for [Firefox](https://firefox.com) that allows you to run shell
|
||||||
|
commands at the click of a button.
|
||||||
|
|
||||||
<img alt="Screenshot of Shellfox." width=555px src="img/screenshot-youtube.png">
|
<img alt="Screenshot of Shellfox." width=555px src="img/screenshot-youtube.png">
|
||||||
|
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
Shellfox has two components: A Firefox extension, and a native script that the extension uses to run commands.
|
Shellfox has two components: A Firefox extension, and a native script that the
|
||||||
|
extension uses to run commands.
|
||||||
|
|
||||||
You can install the Firefox extension from [Firefox Add-ons (AMO)](https://addons.mozilla.org/en-US/firefox/addon/shellfox).
|
You can install the Firefox extension from [Firefox Add-ons (AMO)](https://addons.mozilla.org/en-US/firefox/addon/shellfox).
|
||||||
|
|
||||||
The native script has only been tested on GNU/Linux, though it is likely to work on BSDs, and potentially macOS. It can be installed like so:
|
The native script has only been tested on GNU/Linux, though it is likely to work
|
||||||
|
on BSDs, and potentially macOS. It can be installed like so:
|
||||||
|
|
||||||
1. Download the repository: [master.zip](https://hak.xwx.moe/jadedctrl/shellfox/archive/master.zip)
|
1. Download the repository: [master.zip](https://hak.xwx.moe/jadedctrl/shellfox/archive/master.zip)
|
||||||
2. Extract the ZIP-archive; this will make a folder called `shellfox/`.
|
2. Extract the ZIP-archive; this will make a folder called `shellfox/`.
|
||||||
|
@ -31,7 +34,11 @@ $ sudo make native-install
|
||||||
|
|
||||||
|
|
||||||
## Related projects
|
## Related projects
|
||||||
This add-on was inspired by [Textern](https://github.com/jlebon/textern/), which allows you to edit text-boxes with an external editor like [Emacs](https://gnu.org/software/emacs). It’s very useful, I highly recommend it!
|
This add-on was inspired by [Textern](https://github.com/jlebon/textern/), which allows you to edit text-boxes
|
||||||
|
with an external editor like [Emacs](https://gnu.org/software/emacs). It’s very useful, I highly recommend it!
|
||||||
|
|
||||||
|
If you like mixing web-browsing with shell, then you’ll probably also like
|
||||||
|
[TabFS](https://omar.website/tabfs/), a FUSE filesystem that exposes your browser tabs as files.
|
||||||
|
|
||||||
|
|
||||||
## Source code
|
## Source code
|
||||||
|
|
|
@ -107,7 +107,7 @@
|
||||||
},
|
},
|
||||||
|
|
||||||
"optionsDescDownload": {
|
"optionsDescDownload": {
|
||||||
"message": "Assign commands to be executed for certain URLs (by regex) when downloads are initiated or finished. In commands, $URL will be replaced with the download’s URL, and $FILE with the target file.",
|
"message": "Assign commands to be executed for certain URLs (by regex) when downloads are initiated or finished. In commands, $FILE will be replaced with the target file, $URL will be replaced with the download’s URL, and $REFERRER with the referring URL.",
|
||||||
"description": "Description of options-page section for download commands."
|
"description": "Description of options-page section for download commands."
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -151,6 +151,11 @@
|
||||||
"description": "Name of button in options-page to save changes."
|
"description": "Name of button in options-page to save changes."
|
||||||
},
|
},
|
||||||
|
|
||||||
|
"optionsPageTitle": {
|
||||||
|
"message": "Shellfox settings",
|
||||||
|
"description": "Title of the settings-page."
|
||||||
|
},
|
||||||
|
|
||||||
"errorPageTitle": {
|
"errorPageTitle": {
|
||||||
"message": "Shellfox error",
|
"message": "Shellfox error",
|
||||||
"description": "Title of the error-page."
|
"description": "Title of the error-page."
|
||||||
|
|
|
@ -107,7 +107,7 @@
|
||||||
},
|
},
|
||||||
|
|
||||||
"optionsDescDownload": {
|
"optionsDescDownload": {
|
||||||
"message": "Agordi ordonojn kiuj ruliĝu dum komenciĝo aŭ finiĝo de elŝutado, laŭ URL (regulesprime). En ordonoj, «$URL» anstataŭiĝos per la elŝuta URL, kaj «$FILE» per la elŝuta dosiervojo.",
|
"message": "Agordi ordonojn kiuj ruliĝu dum komenciĝo aŭ finiĝo de elŝutado, laŭ URL (regulesprime). En ordonoj, «$FILE» anstataŭiĝos per la elŝuta dosiervojo, «$URL» anstataŭiĝos per la elŝuta URL, kaj «$REFERRER» per la deelŝutita URL.",
|
||||||
"description": "Priskribo de agordo-parto por elŝutaj ordonoj."
|
"description": "Priskribo de agordo-parto por elŝutaj ordonoj."
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -151,6 +151,11 @@
|
||||||
"description": "Nomo de butono ĉe agordopaĝo por konservi ŝanĝojn."
|
"description": "Nomo de butono ĉe agordopaĝo por konservi ŝanĝojn."
|
||||||
},
|
},
|
||||||
|
|
||||||
|
"optionsPageTitle": {
|
||||||
|
"message": "Ŝelvulpaj agordoj",
|
||||||
|
"description": "Titolo de agordo-paĝo."
|
||||||
|
},
|
||||||
|
|
||||||
"errorPageTitle": {
|
"errorPageTitle": {
|
||||||
"message": "Ŝelvulpo eraris"
|
"message": "Ŝelvulpo eraris"
|
||||||
},
|
},
|
||||||
|
|
|
@ -17,6 +17,11 @@ function shellfoxFailed() {
|
||||||
port = undefined;
|
port = undefined;
|
||||||
|
|
||||||
// Tell the user about the error…
|
// Tell the user about the error…
|
||||||
|
openNewTab("/html/error.html?error=" + escape(error));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function openNewTab(url) {
|
||||||
browser.tabs.query({"active": true}).then((tabs) => {
|
browser.tabs.query({"active": true}).then((tabs) => {
|
||||||
let openerTab = undefined;
|
let openerTab = undefined;
|
||||||
if (tabs && tabs.length > 0)
|
if (tabs && tabs.length > 0)
|
||||||
|
@ -24,7 +29,7 @@ function shellfoxFailed() {
|
||||||
|
|
||||||
browser.tabs.create({
|
browser.tabs.create({
|
||||||
"active": true,
|
"active": true,
|
||||||
"url": "/html/error.html?error=" + escape(error),
|
"url": url,
|
||||||
"openerTabId": openerTab
|
"openerTabId": openerTab
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
@ -94,25 +99,27 @@ function getDownloadCommand(url, type) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Execute the given command string, subsituting “$URL” with url and
|
// Execute the given command string, subsituting “$URL” with url,
|
||||||
// “$FILE” with filepath.
|
// “$FILE” with filepath, and “$REFERRER” with referrer.
|
||||||
function runCommand(command, url, filepath) {
|
function runCommand(command, url, filepath, referrer) {
|
||||||
if (!port)
|
if (!port)
|
||||||
initShellfoxProgram();
|
initShellfoxProgram();
|
||||||
if (command && port)
|
if (command && port)
|
||||||
port.postMessage(command
|
port.postMessage(command
|
||||||
.replaceAll("$URL", url)
|
.replaceAll("$URL", url)
|
||||||
.replaceAll("${URL}", url)
|
.replaceAll("${URL}", url)
|
||||||
|
.replaceAll("$REFERRER", referrer || "")
|
||||||
|
.replaceAll("${REFERRER}", referrer || "")
|
||||||
.replaceAll("$FILE", filepath)
|
.replaceAll("$FILE", filepath)
|
||||||
.replaceAll("${FILE}", filepath));
|
.replaceAll("${FILE}", filepath));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Execute the shell command associated with the given URL, if any.
|
// Execute the shell command associated with the given URL, if any.
|
||||||
function runUrlCommand(url) {
|
function runUrlCommand(url, referrer) {
|
||||||
let commands = getUrlCommands(url);
|
let commands = getUrlCommands(url);
|
||||||
if (commands)
|
if (commands)
|
||||||
runCommand(commands[0], url);
|
runCommand(commands[0], url, "", referrer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -259,19 +266,23 @@ browser.menus.onClicked.addListener((info, tab) => {
|
||||||
if (itemName == "run-page-command")
|
if (itemName == "run-page-command")
|
||||||
runUrlCommand(tab.url);
|
runUrlCommand(tab.url);
|
||||||
else if (itemName == "run-link-command" && info.linkUrl)
|
else if (itemName == "run-link-command" && info.linkUrl)
|
||||||
runUrlCommand(info.linkUrl);
|
runUrlCommand(info.linkUrl, tab.url);
|
||||||
else if (itemName.startsWith("run-")) {
|
else if (itemName.startsWith("run-")) {
|
||||||
let command_i = itemName.split("-command-")[1];
|
let command_i = itemName.split("-command-")[1];
|
||||||
runCommand(savedArray("commands")[command_i][1], info.linkUrl || tab.url);
|
runCommand(savedArray("commands")[command_i][1], info.linkUrl || tab.url, tab.url);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
browser.browserAction.onClicked.addListener(() => {
|
||||||
|
openNewTab("/html/options.html");
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
// When a download starts, run any applicable download commands.
|
// When a download starts, run any applicable download commands.
|
||||||
browser.downloads.onCreated.addListener((downloadItem) => {
|
browser.downloads.onCreated.addListener((downloadItem) => {
|
||||||
let command = getDownloadCommand(downloadItem.url, 0);
|
let command = getDownloadCommand(downloadItem.url, 0);
|
||||||
if (command)
|
if (command)
|
||||||
runCommand(command, downloadItem.url, downloadItem.filename);
|
runCommand(command, downloadItem.url, downloadItem.filename, downloadItem.referrer);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
@ -281,7 +292,8 @@ browser.downloads.onChanged.addListener((downloadDelta) => {
|
||||||
if (downloadDelta.state.current == "complete" && downloadItems.length > 0) {
|
if (downloadDelta.state.current == "complete" && downloadItems.length > 0) {
|
||||||
let command = getDownloadCommand(downloadItems[0].url, 1);
|
let command = getDownloadCommand(downloadItems[0].url, 1);
|
||||||
if (command)
|
if (command)
|
||||||
runCommand(command, downloadItems[0].url, downloadItems[0].filename);
|
runCommand(command, downloadItems[0].url,
|
||||||
|
downloadItems[0].filename, downloadItems[0].referrer);
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,3 +1,11 @@
|
||||||
/* SPCSS theme by Susam Pal, under the MIT license
|
/* SPCSS theme by Susam Pal, under the MIT license
|
||||||
* https://github.com/susam/spcss */
|
* https://github.com/susam/spcss */
|
||||||
body{color:#333;font-family:helvetica,arial,sans-serif;line-height:1.5;margin:0 auto;max-width:40em;padding:0 1em}h1,h2,h3,h4,h5,h6{margin:1.25em 0 .5em;line-height:1.2}a:link{color:#00e}a:visited{color:#518}a:focus,a:hover{color:#03f}a:active{color:#e00}h1 a:empty:before,h2 a:empty:before,h3 a:empty:before,h4 a:empty:before,h5 a:empty:before,h6 a:empty:before{content:"#"}h1 a:empty,h2 a:empty,h3 a:empty,h4 a:empty,h5 a:empty,h6 a:empty{visibility:hidden;padding-left:.25em}h1:hover a:empty,h2:hover a:empty,h3:hover a:empty,h4:hover a:empty,h5:hover a:empty,h6:hover a:empty{visibility:visible}img{max-width:100%}figure{margin:1em 0;text-align:center}figcaption{font-size:small}code,kbd,pre,samp{color:#009;font-family:monospace,monospace}pre kbd{color:#060}blockquote,pre{background:#eee;padding:.5em}pre{overflow:auto}blockquote{border-left:medium solid #ccc;margin:1em 0}blockquote :first-child{margin-top:0}blockquote :last-child{margin-bottom:0}table{border-collapse:collapse}td,th{border:thin solid #999;padding:.3em .4em;text-align:left}@media (prefers-color-scheme:dark){body{background:#111;color:#bbb}a:link{color:#9bf}a:visited{color:#caf}a:focus,a:hover{color:#9cf}a:active{color:#faa}code,kbd,pre,samp{color:#6cf}pre kbd{color:#9c6}blockquote,pre{background:#000}blockquote{border-color:#333}td,th{border-color:#666}}
|
body{color:#333;font-family:helvetica,arial,sans-serif;line-height:1.5;margin:0 auto;max-width:40em;padding:0 1em}h1,h2,h3,h4,h5,h6{margin:1.25em 0 .5em;line-height:1.2}a:link{color:#00e}a:visited{color:#518}a:focus,a:hover{color:#03f}a:active{color:#e00}h1 a:empty:before,h2 a:empty:before,h3 a:empty:before,h4 a:empty:before,h5 a:empty:before,h6 a:empty:before{content:"#"}h1 a:empty,h2 a:empty,h3 a:empty,h4 a:empty,h5 a:empty,h6 a:empty{visibility:hidden;padding-left:.25em}h1:hover a:empty,h2:hover a:empty,h3:hover a:empty,h4:hover a:empty,h5:hover a:empty,h6:hover a:empty{visibility:visible}img{max-width:100%}figure{margin:1em 0;text-align:center}figcaption{font-size:small}code,kbd,pre,samp{color:#009;font-family:monospace,monospace}pre kbd{color:#060}blockquote,pre{background:#eee;padding:.5em}pre{overflow:auto}blockquote{border-left:medium solid #ccc;margin:1em 0}blockquote :first-child{margin-top:0}blockquote :last-child{margin-bottom:0}table{border-collapse:collapse}td,th{border:thin solid #999;padding:.3em .4em;text-align:left}@media (prefers-color-scheme:dark){body{background:#111;color:#bbb}a:link{color:#9bf}a:visited{color:#caf}a:focus,a:hover{color:#9cf}a:active{color:#faa}code,kbd,pre,samp{color:#6cf}pre kbd{color:#9c6}blockquote,pre{background:#000}blockquote{border-color:#333}td,th{border-color:#666}}
|
||||||
|
|
||||||
|
table {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
input {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
|
@ -3,13 +3,13 @@
|
||||||
<head>
|
<head>
|
||||||
<meta charset="utf8" />
|
<meta charset="utf8" />
|
||||||
<link href="error.css" rel="stylesheet" type="text/css">
|
<link href="error.css" rel="stylesheet" type="text/css">
|
||||||
<link rel="icon" type="image/png" href="../img/shellfox-38.png">
|
<link rel="icon" type="image/png" href="../img/shellfox-32.png">
|
||||||
<title id="errorPageTitle">Shellfox error</title>
|
<title id="errorPageTitle">Shellfox error</title>
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
<span>
|
<span>
|
||||||
<img style="display: inline; width: 3em;" src="../img/shellfox.png">
|
<img style="display: inline; width: 3em;" src="../img/shellfox.svg">
|
||||||
<h1 style="display: inline;" id="errorTitle">Shellfox failed to run command</h1>
|
<h1 style="display: inline;" id="errorTitle">Shellfox failed to run command</h1>
|
||||||
</span>
|
</span>
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,8 @@
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<meta charset="utf8">
|
<meta charset="utf8">
|
||||||
|
<link rel="icon" type="image/png" href="../img/shellfox-32.png">
|
||||||
|
<title>Shellfox settings</title>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<article>
|
<article>
|
||||||
|
@ -19,7 +21,7 @@
|
||||||
|
|
||||||
|
|
||||||
<section>
|
<section>
|
||||||
<h3 id="ruleTitle">URL/Page rules</h3>
|
<h4 id="ruleTitle">URL/Page rules</h4>
|
||||||
<p id="ruleP">Associate the above commands with URLs, based on regex rules. When a URL is tied to a command, a button will appear in context-menus and the address bar to run said command.</p>
|
<p id="ruleP">Associate the above commands with URLs, based on regex rules. When a URL is tied to a command, a button will appear in context-menus and the address bar to run said command.</p>
|
||||||
<table id="regexTable">
|
<table id="regexTable">
|
||||||
<tr>
|
<tr>
|
||||||
|
@ -35,7 +37,7 @@
|
||||||
|
|
||||||
<article>
|
<article>
|
||||||
<h3 id="downloadTitle">Download commands</h3>
|
<h3 id="downloadTitle">Download commands</h3>
|
||||||
<p id="downloadP">Assign commands to be executed for certain URLs (by regex) when downloads are initiated or finished. In commands, $URL will be replaced with the download’s URL, and $FILE with the target file.</p>
|
<p id="downloadP">Assign commands to be executed for certain URLs (by regex) when downloads are initiated or finished. In commands, $FILE will be replaced with the target file, $URL will be replaced with the download’s URL, and $REFERRER with the referring URL.</p>
|
||||||
<table id="downloadTable">
|
<table id="downloadTable">
|
||||||
<tr>
|
<tr>
|
||||||
<th id="downloadTypeTh">On start/finish</th>
|
<th id="downloadTypeTh">On start/finish</th>
|
||||||
|
|
|
@ -239,6 +239,7 @@ function createCommandTr(name, command) {
|
||||||
// Replace the HTML elements’ text with the extension’s translations.
|
// Replace the HTML elements’ text with the extension’s translations.
|
||||||
function i18nPage() {
|
function i18nPage() {
|
||||||
document.getElementsByTagName("html")[0].setAttribute("lang", browser.i18n.getMessage("@@ui_locale"));
|
document.getElementsByTagName("html")[0].setAttribute("lang", browser.i18n.getMessage("@@ui_locale"));
|
||||||
|
document.getElementsByTagName("title")[0].innerText = browser.i18n.getMessage("optionsPageTitle");
|
||||||
|
|
||||||
document.getElementById("commandTitle").innerText = browser.i18n.getMessage("optionsTitleShell");
|
document.getElementById("commandTitle").innerText = browser.i18n.getMessage("optionsTitleShell");
|
||||||
document.getElementById("commandP").innerText = browser.i18n.getMessage("optionsDescShell");
|
document.getElementById("commandP").innerText = browser.i18n.getMessage("optionsDescShell");
|
||||||
|
@ -280,3 +281,14 @@ populateCommandTable();
|
||||||
populateRegexTable();
|
populateRegexTable();
|
||||||
populateDownloadTable();
|
populateDownloadTable();
|
||||||
i18nPage();
|
i18nPage();
|
||||||
|
|
||||||
|
|
||||||
|
// Only add CSS if we’re not in the Firefox-embedded settings, but
|
||||||
|
// rather, in our own tab.
|
||||||
|
if (!(location.toString().includes("?in_ui"))) {
|
||||||
|
let cssElement = document.createElement("LINK");
|
||||||
|
cssElement.setAttribute("rel", "stylesheet");
|
||||||
|
cssElement.setAttribute("type", "text/css");
|
||||||
|
cssElement.setAttribute("href", "error.css");
|
||||||
|
document.getElementsByTagName("head")[0].appendChild(cssElement);
|
||||||
|
}
|
||||||
|
|
After Width: | Height: | Size: 32 KiB |
Before Width: | Height: | Size: 45 KiB After Width: | Height: | Size: 80 KiB |
After Width: | Height: | Size: 1008 B |
Before Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 3.9 KiB |
After Width: | Height: | Size: 2.3 KiB |
After Width: | Height: | Size: 11 KiB |
BIN
img/shellfox.png
Before Width: | Height: | Size: 34 KiB |
|
@ -0,0 +1,164 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
width="128"
|
||||||
|
height="128"
|
||||||
|
viewBox="0 0 33.866666 33.866666"
|
||||||
|
version="1.1"
|
||||||
|
id="svg5"
|
||||||
|
inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
|
||||||
|
sodipodi:docname="shellfox.svg"
|
||||||
|
inkscape:export-filename="shellfox16.png"
|
||||||
|
inkscape:export-xdpi="12"
|
||||||
|
inkscape:export-ydpi="12"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/">
|
||||||
|
<title
|
||||||
|
id="title2353">Shellfox logo</title>
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="namedview7"
|
||||||
|
pagecolor="#505050"
|
||||||
|
bordercolor="#eeeeee"
|
||||||
|
borderopacity="1"
|
||||||
|
inkscape:showpageshadow="0"
|
||||||
|
inkscape:pageopacity="0"
|
||||||
|
inkscape:pagecheckerboard="0"
|
||||||
|
inkscape:deskcolor="#505050"
|
||||||
|
inkscape:document-units="px"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:zoom="1.0717735"
|
||||||
|
inkscape:cx="90.970716"
|
||||||
|
inkscape:cy="36.854803"
|
||||||
|
inkscape:window-width="1232"
|
||||||
|
inkscape:window-height="750"
|
||||||
|
inkscape:window-x="48"
|
||||||
|
inkscape:window-y="26"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:current-layer="g17473" />
|
||||||
|
<defs
|
||||||
|
id="defs2" />
|
||||||
|
<g
|
||||||
|
inkscape:label="Layer 1"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer1">
|
||||||
|
<g
|
||||||
|
id="g2001"
|
||||||
|
transform="matrix(0,-1,-1,0,33.873882,33.984667)">
|
||||||
|
<g
|
||||||
|
id="g17466"
|
||||||
|
transform="matrix(1.0740477,-0.28784056,0.28779021,1.0742356,-5.9784989,1.1720718)"
|
||||||
|
style="stroke-width:0.899254">
|
||||||
|
<g
|
||||||
|
id="g17473"
|
||||||
|
transform="translate(0.1045793,0.49978971)">
|
||||||
|
<path
|
||||||
|
style="fill:#bad14b;fill-opacity:1;stroke:none;stroke-width:0.951707;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:8;stroke-dasharray:none;stop-color:#000000"
|
||||||
|
d="m 16.254746,5.7055183 c -0.436985,2.0988832 -1.125221,4.8860787 -1.214831,7.0168527 2.440283,0 4.64566,0.879919 6.240358,1.945865 1.832042,1.224594 3.644669,4.58705 3.64479,7.358522 2.08e-4,4.745436 -2.962706,7.557398 -6.371211,9.524901 -2.953238,1.704709 -6.642204,1.100374 -9.7925719,-0.204555 C 6.2534205,30.308318 4.2812779,28.03975 3.2424883,25.53189 1.7406468,21.906124 0.81032139,19.625197 3.2184677,14.326455 4.4390169,11.64083 6.1664543,9.8431253 9.3813261,7.984598 10.889949,7.1124584 14.289775,6.244048 16.254746,5.7055183 Z"
|
||||||
|
id="path1732"
|
||||||
|
sodipodi:nodetypes="ccsssssssc" />
|
||||||
|
<path
|
||||||
|
sodipodi:type="spiral"
|
||||||
|
style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#dddb46;stroke-width:1.18483;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
|
||||||
|
id="path18219"
|
||||||
|
sodipodi:cx="16.583284"
|
||||||
|
sodipodi:cy="16.401304"
|
||||||
|
sodipodi:expansion="1.7"
|
||||||
|
sodipodi:revolution="3.0022297"
|
||||||
|
sodipodi:radius="14.706082"
|
||||||
|
sodipodi:argument="-20.420353"
|
||||||
|
sodipodi:t0="0.17986631"
|
||||||
|
d="m 16.385328,17.172294 c -0.68848,0.149017 -1.224965,-0.524528 -1.274171,-1.148967 -0.09039,-1.147091 1.01171,-1.967918 2.07532,-1.971309 1.69284,-0.0054 2.856217,1.625353 2.785107,3.219251 -0.103566,2.321383 -2.354991,3.880312 -4.563967,3.708971 -3.028738,-0.234927 -5.032846,-3.193147 -4.737627,-6.097207 0.387468,-3.811494 4.134084,-6.307915 7.809435,-5.8667306 4.666744,0.56019 7.700631,5.1731876 7.092617,9.6929156 -0.752261,5.591989 -6.306629,9.206855 -11.741189,8.412132 C 7.245801,26.158385 3.0078416,19.5902 4.0083283,13.172615 4.9912458,6.8677265 10.50959,2.1740169 16.789293,1.6966649"
|
||||||
|
transform="matrix(0.80295813,-1.6331449e-4,-1.6331448e-4,0.80352387,1.6016955,8.25945)" />
|
||||||
|
<path
|
||||||
|
sodipodi:type="spiral"
|
||||||
|
style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#48521d;stroke-width:0.951707;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
|
||||||
|
id="path295"
|
||||||
|
sodipodi:cx="16.583284"
|
||||||
|
sodipodi:cy="16.401304"
|
||||||
|
sodipodi:expansion="1.4"
|
||||||
|
sodipodi:revolution="2.9825668"
|
||||||
|
sodipodi:radius="14.568163"
|
||||||
|
sodipodi:argument="-20.420353"
|
||||||
|
sodipodi:t0="0.18105213"
|
||||||
|
d="m 16.252163,17.690939 c -1.06038,0.149446 -1.842762,-0.881285 -1.865694,-1.853681 -0.03797,-1.610179 1.516623,-2.724971 3.025679,-2.664167 2.216358,0.0893 3.70518,2.242533 3.535703,4.348843 -0.231193,2.873332 -3.044444,4.770185 -5.800603,4.472366 -3.576208,-0.386429 -5.9107007,-3.912783 -5.468106,-7.365677 0.553872,-4.321026 4.840661,-7.1197567 9.032863,-6.5181433 5.104573,0.7325456 8.391887,5.8228223 7.618598,10.7935093 -0.921626,5.924198 -6.855093,9.72266 -12.640687,8.766245 C 6.9122385,26.549819 2.58152,19.736174 3.7315611,13.101544 4.7164692,7.4195733 9.366355,2.9677818 14.990728,1.9204502"
|
||||||
|
transform="translate(-1.543359,4.7539712)" />
|
||||||
|
<path
|
||||||
|
style="fill:#ff9f4d;fill-opacity:1;stroke:none;stroke-width:0.951707;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:8;stroke-dasharray:none;stroke-opacity:1;stop-color:#000000"
|
||||||
|
d="m 26.663198,14.408018 c -1.115202,1.692134 -2.284703,3.444457 -3.239777,4.959094 -1.063012,-1.387854 -0.902895,-4.942148 -0.794627,-7.692902"
|
||||||
|
id="path16679"
|
||||||
|
sodipodi:nodetypes="ccc" />
|
||||||
|
<path
|
||||||
|
id="path6415"
|
||||||
|
style="fill:#ff851a;fill-opacity:1;stroke:none;stroke-width:0.951707;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:8;stroke-dasharray:none;stroke-opacity:1;stop-color:#000000"
|
||||||
|
d="M 32.504193 11.143201 C 31.308041 11.175746 29.807982 11.676154 28.613058 11.612524 C 28.405182 12.503953 28.179798 13.05693 27.951761 13.561584 C 28.999345 16.111752 29.182665 16.786611 29.533521 18.275928 C 27.771683 17.345313 26.102114 16.400163 25.154009 15.340825 C 23.935738 15.669297 21.909536 15.931267 20.75397 16.134637 C 21.148309 15.052286 21.629024 13.485995 20.692427 13.144757 C 19.889028 12.581822 18.868029 12.075973 17.969021 12.394818 C 17.969021 12.394818 18.221999 13.973442 18.69162 14.786851 C 18.983713 15.292769 20.434946 16.309472 20.77055 17.229145 C 21.207355 18.426144 21.613041 20.728338 20.439702 21.037024 C 19.274381 21.343601 18.616479 18.850412 18.206077 18.139574 C 17.888659 17.589791 16.342707 16.363782 15.896042 15.590136 C 15.254729 14.479349 14.942034 12.860455 14.942034 12.860455 L 14.931605 12.091343 C 15.362997 10.904715 15.456811 8.7330645 16.19688 6.3960426 C 17.62136 6.3443884 19.638974 6.4363795 21.372825 7.0680882 C 22.196596 7.288817 22.987833 6.8712047 23.369206 5.4478991 C 24.832651 6.4733238 26.177229 7.4872529 27.23695 8.2064278 C 28.839919 8.6880672 30.90574 9.8871514 32.504193 11.143201 z " />
|
||||||
|
<path
|
||||||
|
style="fill:#ffc799;fill-opacity:1;stroke:#ffac66;stroke-width:0.475855;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:8;stroke-dasharray:none;stroke-opacity:1;stop-color:#000000"
|
||||||
|
d="m 17.968855,12.395007 c 0.406526,-0.944525 1.75783,-1.70828 2.725537,-1.760894 0.316578,0.772803 1.083363,1.733227 2.050292,2.243857 0.569779,-0.480961 1.135202,-0.968929 2.039582,-0.911789 -0.962099,2.172429 -1.226252,4.875481 -1.225152,7.186399 -0.848447,-0.855504 -0.950748,-2.424071 -1.04236,-3.339591 l -1.735987,0.270714 c 0.245255,-0.730852 0.578908,-1.963323 0.387159,-2.48343 -0.808783,-1.104745 -2.577997,-1.299397 -3.199071,-1.205266 z"
|
||||||
|
id="path1131"
|
||||||
|
sodipodi:nodetypes="ccccccccc" />
|
||||||
|
<path
|
||||||
|
style="fill:none;fill-opacity:1;stroke:#5c3009;stroke-width:0.951707;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:8;stroke-dasharray:none;stroke-opacity:1;stop-color:#000000"
|
||||||
|
d="m 25.521689,16.053711 c -0.571177,0.989208 -1.143194,1.798764 -2.098268,3.313401 -1.063012,-1.387854 -1.025242,-2.370647 -1.025285,-3.33711"
|
||||||
|
id="path1129"
|
||||||
|
sodipodi:nodetypes="ccc" />
|
||||||
|
<circle
|
||||||
|
style="fill:#141414;fill-opacity:1;stroke:none;stroke-width:0.951707;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:8;stroke-dasharray:none;stroke-opacity:1;stop-color:#000000"
|
||||||
|
id="path17459"
|
||||||
|
cx="-19.164043"
|
||||||
|
cy="-23.532482"
|
||||||
|
r="0.79374999"
|
||||||
|
transform="matrix(0,-1,-1,0,0,0)" />
|
||||||
|
<path
|
||||||
|
style="fill:#f27018;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:8;stroke-dasharray:none;stroke-opacity:1;stop-color:#000000"
|
||||||
|
d="m 112.06175,9.4671151 c -1.23847,0.06299 -1.88603,3.4015639 -2.38396,4.2870049 -1.20596,2.52127 -2.31798,5.096933 -3.05554,7.797666 -0.29034,0.651141 -0.72481,1.29823 -0.4984,2.0524 0.5251,3.144954 0.16626,8.112957 -0.30869,11.266768 0.14873,1.386324 1.51886,1.728404 2.09082,0.661016 0.88603,-1.212751 2.82502,-4.771628 3.68417,-5.922524 0.23265,5.842093 -0.96291,11.682816 -3.21799,17.062946 -0.32169,0.904803 -2.23708,4.32006 -1.36818,5.144986 0.89988,0.732225 3.24013,-2.196653 3.85952,-2.942942 0.19237,-0.138615 0.80744,-0.949428 0.68725,-0.256948 -0.17817,4.90339 -1.15669,9.784013 -2.57033,14.474769 -0.28987,1.186306 -1.92284,4.607363 -1.96383,5.837918 0.17852,1.199787 2.43422,-0.473295 3.12813,-1.277816 0.85569,-0.751751 1.92117,-2.215666 2.63018,-3.095178 0.80555,0.634567 2.12421,3.196931 2.15852,2.042918 0.33322,-3.226361 0.86582,-9.432641 1.00938,-12.65854 0.58988,-2.300463 1.79542,-4.168313 4.03258,-4.924525 0.92821,-0.446426 2.16855,-0.280275 2.87199,-1.118227 0.43019,-0.929817 -0.32675,-1.839712 -0.5335,-2.7334 -1.75454,-4.799691 -2.98689,-9.644533 -4.65534,-14.462711 -0.34923,-6.324873 -2.53314,-12.448358 -4.59297,-18.419052 -0.21828,-0.555641 -0.38851,-2.8657189 -1.00381,-2.8165289 z"
|
||||||
|
id="path1073"
|
||||||
|
transform="matrix(0.06157479,-0.22980025,-0.22984045,-0.06158556,27.000473,37.204922)"
|
||||||
|
sodipodi:nodetypes="ccccccccccccccccccccccc" />
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#f26100;stroke-width:0.475855;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:8;stroke-dasharray:none;stroke-opacity:1;stop-color:#000000"
|
||||||
|
d="m 28.613247,11.612626 c -1.136529,-0.587647 -2.364177,-1.001009 -3.872663,-0.877211 0.49937,-0.472286 1.558192,-0.7524604 2.350415,-0.9956628 -2.244337,-0.6595362 -3.763812,-0.415182 -6.152438,0.00666 L 22.779331,8.597794 C 21.291985,8.2262841 19.189933,8.1507158 17.377725,8.4624287 17.765704,8.0745081 18.47373,7.4929466 19.107067,7.3232959 17.760386,6.7712444 17.055483,6.8129636 16.052837,6.8266134"
|
||||||
|
id="path1002"
|
||||||
|
sodipodi:nodetypes="cccccccc" />
|
||||||
|
<path
|
||||||
|
style="fill:#ffc799;fill-opacity:1;stroke:#ffac66;stroke-width:0.475855;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:8;stroke-dasharray:none;stroke-opacity:1;stop-color:#000000"
|
||||||
|
d="m 21.020318,18.364116 c -0.97509,-0.210459 -1.313651,-0.453965 -1.959354,-0.710244 -0.824522,-0.327252 -2.554252,-2.474261 -4.158671,-4.926307 0,0 0.557388,2.308493 1.192333,3.285304 0.525737,0.808803 1.435815,1.293493 2.085362,2.006726 0.827854,0.909022 1.101723,3.166435 2.29852,2.884698 0.84285,-0.198415 0.961865,-1.78305 0.54181,-2.540177 z"
|
||||||
|
id="path1967"
|
||||||
|
sodipodi:nodetypes="cscsssc" />
|
||||||
|
<path
|
||||||
|
id="path946"
|
||||||
|
style="fill:none;fill-opacity:1;stroke:#5c3009;stroke-width:0.951707;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:8;stroke-dasharray:none;stroke-opacity:1;stop-color:#000000"
|
||||||
|
d="m 16.19688,6.3960426 c 1.42448,-0.051654 3.442094,0.040337 5.175945,0.6720456 0.823771,0.2207288 1.615008,-0.1968835 1.996381,-1.6201891 1.463445,1.0254247 2.808023,2.0393538 3.867744,2.7585287 1.602969,0.4816394 3.66879,1.6807236 5.267243,2.9367732 -1.196152,0.03255 -2.696211,0.532953 -3.891135,0.469323 -0.207876,0.891429 -0.43326,1.444406 -0.661297,1.94906 1.047584,2.550168 1.230904,3.225027 1.58176,4.714344 -1.761838,-0.930615 -3.431407,-1.875765 -4.379512,-2.935103 -1.218271,0.328472 -3.244473,0.590442 -4.400039,0.793812 0.394339,-1.082351 0.875054,-2.648642 -0.06154,-2.98988 -0.803399,-0.562935 -1.824398,-1.068784 -2.723406,-0.749939 0,0 0.252978,1.578624 0.722599,2.392033 0.292093,0.505918 1.743326,1.522621 2.07893,2.442294 0.436805,1.196999 0.842491,3.499193 -0.330848,3.807879 -1.165321,0.306577 -1.823223,-2.186612 -2.233625,-2.89745 -0.317418,-0.549783 -1.86337,-1.775792 -2.310035,-2.549438 -0.641313,-1.110787 -0.954008,-2.729681 -0.954008,-2.729681 l -0.01043,-0.769112"
|
||||||
|
sodipodi:nodetypes="ccccccccccccssssscc" />
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#48521d;stroke-width:0.95171;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:8;stroke-dasharray:none;stroke-opacity:1;stop-color:#000000"
|
||||||
|
d="M 13.033444,6.763516 C 13.941699,6.5929965 15.260076,6.2705608 16.56856,5.5152598 14.275653,10.710992 15.615428,12.65534 14.132723,13.005516"
|
||||||
|
id="path1013"
|
||||||
|
sodipodi:nodetypes="ccc" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<metadata
|
||||||
|
id="metadata2351">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:creator>
|
||||||
|
<cc:Agent>
|
||||||
|
<dc:title>Tirifto</dc:title>
|
||||||
|
</cc:Agent>
|
||||||
|
</dc:creator>
|
||||||
|
<dc:date>2024</dc:date>
|
||||||
|
<dc:title>Shellfox logo</dc:title>
|
||||||
|
<cc:license
|
||||||
|
rdf:resource="GNU General Public Later, version 3, or (at your option) any later version" />
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 14 KiB |
|
@ -1,5 +1,2 @@
|
||||||
Beautiful shell photo by H. Zell, 2014. Under the CC-BY-SA 3.0.
|
These charming icons were kindly made by Tirifto <tirifto@posteo.cz>!
|
||||||
https://commons.wikimedia.org/wiki/File:Cepaea_vindobonensis_-_Banding_variation.jpg
|
They are, like Shellfox in its entirety, under the GPLv3+.
|
||||||
|
|
||||||
Ears from Pleroma-tan: pleroma-tan-smol.jpg, © 2019 shitposter.club. Under the CC-BY-SA 4.0.
|
|
||||||
https://git.pleroma.social/pleroma/pleroma/-/blob/develop/priv/static/images/pleroma-fox-tan.png
|
|
||||||
|
|
BIN
img/shellfox.xcf
|
@ -1,17 +1,19 @@
|
||||||
{
|
{
|
||||||
"manifest_version": 2,
|
"manifest_version": 2,
|
||||||
"name": "__MSG_extensionName__",
|
"name": "__MSG_extensionName__",
|
||||||
"version": "0.12",
|
"version": "0.14",
|
||||||
|
|
||||||
"description": "__MSG_extensionDescription__",
|
"description": "__MSG_extensionDescription__",
|
||||||
"homepage_url": "https://hak.xwx.moe/jadedctrl/shellfox",
|
"homepage_url": "https://hak.xwx.moe/jadedctrl/shellfox",
|
||||||
|
"author": "Jaidyn Ann",
|
||||||
|
|
||||||
"default_locale": "en",
|
"default_locale": "en",
|
||||||
|
|
||||||
"icons": {
|
"icons": {
|
||||||
"250": "img/shellfox.png",
|
"512": "img/shellfox-512.png",
|
||||||
"38": "img/shellfox-38.png",
|
"48": "img/shellfox-48.png",
|
||||||
"19": "img/shellfox-19.png"
|
"32": "img/shellfox-32.png",
|
||||||
|
"16": "img/shellfox-16.png"
|
||||||
},
|
},
|
||||||
|
|
||||||
"page_action": {
|
"page_action": {
|
||||||
|
@ -23,6 +25,9 @@
|
||||||
"default_title": "__MSG_pageActionName__"
|
"default_title": "__MSG_pageActionName__"
|
||||||
},
|
},
|
||||||
|
|
||||||
|
"browser_action": {
|
||||||
|
},
|
||||||
|
|
||||||
"permissions": [
|
"permissions": [
|
||||||
"activeTab",
|
"activeTab",
|
||||||
"downloads",
|
"downloads",
|
||||||
|
@ -45,6 +50,6 @@
|
||||||
},
|
},
|
||||||
|
|
||||||
"options_ui": {
|
"options_ui": {
|
||||||
"page": "html/options.html"
|
"page": "html/options.html?in_ui"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|