Compare commits

..

5 Commits

Author SHA1 Message Date
856a715130 ✏️ Add Opera doc
For #8
2020-07-21 10:06:10 +02:00
b8717bd08f ✏️ Rename the project
For #6
2020-07-21 09:54:09 +02:00
a0af8e31a5 🐛 Delete trailing slash
Fix #10
2020-07-21 09:53:32 +02:00
78680fac49 📝 Add the privacy policy draft
Fix #7
2020-07-07 14:54:24 +02:00
bedb5a22b6 🚚 Rename the project
For #6
2020-07-07 11:35:17 +02:00
12 changed files with 54 additions and 109 deletions

View File

@ -51,10 +51,16 @@ The following tasks can be used when you want to start developing the extension
Run `npm run dist` to create a zipped, production-ready extension for each browser. You can then upload that to the appstore.
#### Firefox
Run `npm run sourcezip` for firefox submission
Update <https://addons.mozilla.org/fr/developers/addon/shikiryu-readlater/versions/submit/>
#### Opera
Update <https://addons.opera.com/developer/package/250537/?tab=versions>
## :sparkles: Features
<dl>

View File

@ -1,5 +1,5 @@
{
"name": "Shikiryu Read Later",
"name": "Read Later by Email",
"version": "0.0.3",
"manifest_version": 2,
"description": "__MSG_extensionDescription__",
@ -11,7 +11,7 @@
"background": {
"scripts": ["scripts/background.js"]
},
"permissions": ["activeTab", "storage", "contextMenus"],
"permissions": ["activeTab", "storage"],
"options_ui": {
"page": "options.html"
},
@ -20,7 +20,7 @@
"matches": ["http://*/*", "https://*/*"],
"js": ["scripts/contentscript.js"],
"run_at": "document_end",
"all_frames": true
"all_frames": false
}
],
"browser_action": {
@ -29,7 +29,7 @@
"32": "icons/favicon-32x32.png",
"96": "icons/favicon-96x96.png"
},
"default_title": "Shikiryu Bookmarklet",
"default_title": "Read Later by Email",
"default_popup": "popup.html"
},
"applications": {

27
privacy_policy.md Executable file
View File

@ -0,0 +1,27 @@
#English
This extension collect the instance URL you'll be sending your page to and the token used to identify yourself on this instance.
This will be saved on your browser local storage.
The following elements are sent to the instance:
- title
- description
- image
They are automatically generated with the current tab content. With your current token, you can also send a comment which will reach the instance.
---
# French
Cette extension collecte l'URL de l'instance vers laquelle vous allez envoyer les informations and le jeton vous permettant de vous identifier sur cette instance.
Ces deux données sont enregistrées localement dans le local storage de votre navigateur.
Les éléments suivant seront envoyés à l'instance :
- titre
- description
- image
Ils seront générés automatiquement à partir des mêmes informations utilisées sur l'onglet actuellement ouvert.
Avec votre jeton en cours, vous pourrez aussi envoyer un commentaire de cet onglet vers l'instance.

View File

@ -1,6 +1,6 @@
{
"extensionName": {
"message": "Shikiryu Read Later",
"message": "Read Later by Email",
"description": "The name of the extension."
},
"extensionDescription": {
@ -58,9 +58,5 @@
"excerpt": {
"message": "Add content",
"description": "Option to add the webpage content into the email"
},
"selectDomToSend": {
"message": "Select DOM To Send",
"description": "Select DOM To Send"
}
}

View File

@ -1,6 +1,6 @@
{
"extensionName": {
"message": "Shikiryu Read Later",
"message": "Read Later by Email",
"description": "The name of the extension."
},
"extensionDescription": {
@ -58,9 +58,5 @@
"excerpt": {
"message": "Ajouter le contenu",
"description": "Option to add the webpage content into the email"
},
"selectDomToSend": {
"message": "Partie à envoyer par email",
"description": "Select DOM To Send"
}
}

View File

@ -53,7 +53,7 @@
<div class="grid">
<div class="unit whole center-on-mobiles">
<p class="text-center text-muted">
&copy; <a href="https://readlater.shikiryu.com">Shikiryu</a>
&copy; <a href="https://readlater.shikiryu.com">ReadLaterByEmail</a>
</p>
</div>
</div>

View File

@ -30,7 +30,8 @@
<div class="grid">
<div class="unit whole center-on-mobiles">
<p class="text-center text-muted">
&copy; <a href="https://readlater.shikiryu.com">Shikiryu</a>
&copy;
<a href="https://readlater.shikiryu.com">ReadLaterByEmail</a>
</p>
<p class="js-options" data-message="optionsAndSettings"></p>
</div>

View File

@ -1,46 +1,6 @@
import ext from "./utils/ext";
import storage from "./utils/storage";
let onMenuAdded = function() {
if (ext.browser.runtime.lastError) {
console.log(`Error: ${ext.browser.runtime.lastError}`);
} else {
console.log("Readlater menu created successfully");
}
};
ext.contextMenus.create(
{
id: "dom-selection",
title: ext.i18n.getMessage("selectDomToSend"),
contexts: ["all"]
},
onMenuAdded
);
ext.contextMenus.onClicked.addListener(function(info, tab) {
if ("dom-selection" === info.menuItemId) {
var page_data = {
title: "",
description: "",
image: "",
comment: "",
url: document.location.href
};
ext.tabs.sendMessage(tab.id, { action: "process-page" }, function(data) {
ext.tabs.sendMessage(tab.id, { action: "DOM", data: data }, function(
response
) {
if (response && response.action === "saved") {
console.log(ext.i18n.getMessage("savedSuccessfully"));
} else {
console.log(response.error + " (" + response.status + ")");
}
});
});
}
});
ext.runtime.onMessage.addListener(function(request, sender, sendResponse) {
if (request.action === "perform-save") {
var data = request.data;

View File

@ -1,67 +1,35 @@
import ext from "./utils/ext";
import storage from "./utils/storage";
let extractDOM = () => {
let indexInParent = node => {
let children = node.parentNode.childNodes;
let num = 0;
for (let i = 0; i < children.length; i++) {
if (children[i] === node) return num;
if (children[i].nodeType === 1) num++;
}
return -1;
};
let gx = el => {
let xp = "";
for (; el && el.nodeType === 1; el = el.parentNode) {
let id = indexInParent(el) + 1; // jQuery(el.parentNode).children(el.tagName).index(el)+1;
id = id > 1 ? "[" + id + "]" : "";
xp = "/" + el.tagName.toLowerCase() + id + xp;
}
return xp;
};
document.addEventListener("click", function(evt) {
let tar = evt.target;
while (tar && tar !== this) {
if (tar.matches(".shikihover")) {
let data = extractTags();
data.xpath = gx(tar);
}
}
});
};
let extractTags = () => {
let url = document.location.href;
var extractTags = () => {
var url = document.location.href;
if (!url || !url.match(/^http/)) {
console.error("Invalid URL : " + url);
return;
}
let data = {
var data = {
title: "",
description: "",
image: "",
url: url
};
let ogTitle = document.querySelector("meta[property='og:title']");
var ogTitle = document.querySelector("meta[property='og:title']");
if (ogTitle) {
data.title = ogTitle.getAttribute("content");
} else {
data.title = document.title;
}
let descriptionTag =
var descriptionTag =
document.querySelector("meta[property='og:description']") ||
document.querySelector("meta[name='description']");
if (descriptionTag) {
data.description = descriptionTag.getAttribute("content");
}
let imgTag =
var imgTag =
document.querySelector("meta[property='og:image']") ||
document.querySelector("meta[property='twitter-image']");
if (imgTag) {
@ -82,10 +50,6 @@ function onRequest(request, sender, sendResponse) {
if (request.action === "process-page") {
sendResponse(extractTags());
}
if (request.action === "DOM") {
console.log("DOM");
sendResponse(extractDOM());
}
}
ext.runtime.onMessage.addListener(onRequest);

View File

@ -19,6 +19,9 @@ storage.get("extract", function(resp) {
});
urlInput.addEventListener("blur", function(e) {
if (this.value.endsWith("/")) {
this.value = this.value.substring(0, this.value.length - 1);
}
var value = this.value;
storage.set({ url: value }, function() {
message.textContent = ext.i18n.getMessage("URLChanged");

View File

@ -20,7 +20,8 @@ storage.get("extract", function(resp) {
});
var renderMessage = message => {
document.getElementById("display-container").textContent = message;
var displayContainer = document.getElementById("display-container");
displayContainer.textContent = message;
};
var renderBookmark = data => {

View File

@ -1,9 +0,0 @@
div:hover,
section:hover {
border: 3px solid yellow;
}
div,
section {
border: none;
}