Andrew Dolgov 1 month ago
commit
2049f0b573
8 changed files with 10819 additions and 0 deletions
  1. 297 0
      .eslintrc.js
  2. 32 0
      content.js
  3. BIN
      images/icon_128.png
  4. 44 0
      js/background.js
  5. 29 0
      js/options.js
  6. 10364 0
      lib/jquery.js
  7. 23 0
      manifest.json
  8. 30 0
      options.html

+ 297 - 0
.eslintrc.js

@@ -0,0 +1,297 @@
+module.exports = {
+    "env": {
+        "browser": true,
+        "es6": true,
+		 "jquery": true,
+		 "webextensions": true
+    },
+    "extends": "eslint:recommended",
+    "parserOptions": {
+        "ecmaVersion": 2016
+    },
+    "rules": {
+        "accessor-pairs": "error",
+        "array-bracket-newline": "off",
+        "array-bracket-spacing": "off",
+        "array-callback-return": "error",
+        "array-element-newline": "off",
+        "arrow-body-style": "error",
+        "arrow-parens": "error",
+        "arrow-spacing": "error",
+        "block-scoped-var": "off",
+        "block-spacing": [
+            "error",
+            "always"
+        ],
+        "brace-style": "off",
+        "callback-return": "off",
+        "camelcase": "off",
+        "capitalized-comments": "off",
+        "class-methods-use-this": "error",
+        "comma-dangle": "off",
+        "comma-spacing": "off",
+        "comma-style": [
+            "error",
+            "last"
+        ],
+        "complexity": "off",
+        "computed-property-spacing": [
+            "error",
+            "never"
+        ],
+        "consistent-return": "off",
+        "consistent-this": "off",
+        "curly": "off",
+        "default-case": "off",
+        "dot-location": "off",
+        "dot-notation": "off",
+        "eol-last": "error",
+        "eqeqeq": "off",
+        "func-call-spacing": "error",
+        "func-name-matching": "error",
+        "func-names": "off",
+        "func-style": "off",
+        "function-paren-newline": "off",
+        "generator-star-spacing": "error",
+        "global-require": "error",
+        "guard-for-in": "off",
+        "handle-callback-err": "off",
+        "id-blacklist": "error",
+        "id-length": "off",
+        "id-match": "error",
+        "implicit-arrow-linebreak": "error",
+        "indent": "off",
+        "indent-legacy": "off",
+        "init-declarations": "off",
+        "jsx-quotes": "error",
+        "key-spacing": "off",
+        "keyword-spacing": [
+            "error",
+            {
+                "after": true,
+                "before": true
+            }
+        ],
+        "line-comment-position": "off",
+        "linebreak-style": "off",
+        "lines-around-comment": "off",
+        "lines-around-directive": "error",
+        "lines-between-class-members": "error",
+        "max-classes-per-file": "off",
+        "max-depth": "off",
+        "max-len": "off",
+        "max-lines": "off",
+        "max-lines-per-function": "off",
+        "max-nested-callbacks": "error",
+        "max-params": "off",
+        "max-statements": "off",
+        "max-statements-per-line": "error",
+        "multiline-comment-style": "off",
+        "multiline-ternary": "off",
+        "new-cap": "error",
+        "new-parens": "error",
+        "newline-after-var": "off",
+        "newline-before-return": "off",
+        "newline-per-chained-call": "off",
+        "no-alert": "off",
+        "no-array-constructor": "error",
+        "no-async-promise-executor": "off",
+        "no-await-in-loop": "error",
+        "no-bitwise": "off",
+        "no-buffer-constructor": "error",
+        "no-caller": "error",
+        "no-catch-shadow": "off",
+        "no-confusing-arrow": "error",
+        "no-continue": "off",
+		  "no-console": "off",
+        "no-div-regex": "error",
+        "no-duplicate-imports": "error",
+        "no-else-return": "off",
+        "no-empty": [
+            "error",
+            {
+                "allowEmptyCatch": true
+            }
+        ],
+        "no-empty-function": "error",
+        "no-eq-null": "off",
+        "no-eval": "error",
+        "no-extend-native": "off",
+        "no-extra-bind": "error",
+        "no-extra-label": "error",
+        "no-extra-parens": "off",
+        "no-floating-decimal": "error",
+        "no-implicit-globals": "off",
+        "no-implied-eval": "off",
+        "no-inline-comments": "off",
+        "no-inner-declarations": [
+            "error",
+            "functions"
+        ],
+        "no-invalid-this": "error",
+        "no-iterator": "error",
+        "no-label-var": "error",
+        "no-labels": "error",
+        "no-lone-blocks": "error",
+        "no-lonely-if": "error",
+        "no-loop-func": "off",
+        "no-magic-numbers": "off",
+        "no-misleading-character-class": "off",
+        "no-mixed-operators": "off",
+        "no-mixed-requires": "error",
+        "no-multi-assign": "error",
+        "no-multi-spaces": "off",
+        "no-multi-str": "error",
+        "no-multiple-empty-lines": "error",
+        "no-native-reassign": "error",
+        "no-negated-condition": "off",
+        "no-negated-in-lhs": "error",
+        "no-nested-ternary": "error",
+        "no-new": "error",
+        "no-new-func": "error",
+        "no-new-object": "off",
+        "no-new-require": "error",
+        "no-new-wrappers": "error",
+        "no-octal-escape": "error",
+        "no-param-reassign": "off",
+        "no-path-concat": "error",
+        "no-plusplus": "off",
+        "no-process-env": "error",
+        "no-process-exit": "error",
+        "no-proto": "error",
+        "no-prototype-builtins": "error",
+        "no-restricted-globals": "error",
+        "no-restricted-imports": "error",
+        "no-restricted-modules": "error",
+        "no-restricted-properties": "error",
+        "no-restricted-syntax": "error",
+        "no-return-assign": [
+            "error",
+            "except-parens"
+        ],
+        "no-return-await": "error",
+        "no-script-url": "error",
+        "no-self-compare": "error",
+        "no-sequences": "error",
+        "no-shadow": "off",
+        "no-shadow-restricted-names": "error",
+        "no-spaced-func": "error",
+        "no-sync": "error",
+        "no-tabs": "off",
+        "no-template-curly-in-string": "error",
+        "no-ternary": "off",
+        "no-throw-literal": "error",
+        "no-trailing-spaces": "error",
+        "no-undef-init": "error",
+        "no-undefined": "off",
+		  "no-undef": "warn",
+        "no-underscore-dangle": "off",
+        "no-unmodified-loop-condition": "error",
+        "no-unneeded-ternary": [
+            "error",
+            {
+                "defaultAssignment": true
+            }
+        ],
+        "no-unused-expressions": "off",
+		  "no-unused-vars": "warn",
+        "no-use-before-define": "off",
+        "no-useless-call": "error",
+        "no-useless-computed-key": "error",
+        "no-useless-concat": "error",
+        "no-useless-constructor": "error",
+        "no-useless-rename": "error",
+        "no-useless-return": "off",
+        "no-var": "warn",
+        "no-void": "error",
+        "no-warning-comments": "off",
+        "no-whitespace-before-property": "error",
+        "no-with": "error",
+        "nonblock-statement-body-position": [
+            "error",
+            "any"
+        ],
+        "object-curly-newline": "off",
+        "object-curly-spacing": "off",
+        "object-property-newline": "off",
+        "object-shorthand": "off",
+        "one-var": "off",
+        "one-var-declaration-per-line": "error",
+        "operator-assignment": "off",
+        "operator-linebreak": [
+            "error",
+            "after"
+        ],
+        "padded-blocks": "off",
+        "padding-line-between-statements": "error",
+        "prefer-arrow-callback": "off",
+        "prefer-const": "error",
+        "prefer-destructuring": "off",
+        "prefer-numeric-literals": "error",
+        "prefer-object-spread": "off",
+        "prefer-promise-reject-errors": "error",
+        "prefer-reflect": "off",
+        "prefer-rest-params": "error",
+        "prefer-spread": "error",
+        "prefer-template": "off",
+        "quote-props": "off",
+        "quotes": "off",
+        "radix": [
+            "error",
+            "as-needed"
+        ],
+        "require-atomic-updates": "off",
+        "require-await": "error",
+        "require-jsdoc": "off",
+        "require-unicode-regexp": "off",
+        "rest-spread-spacing": "error",
+        "semi": "off",
+        "semi-spacing": [
+            "error",
+            {
+                "after": true,
+                "before": false
+            }
+        ],
+        "semi-style": [
+            "error",
+            "last"
+        ],
+        "sort-imports": "error",
+        "sort-keys": "off",
+        "sort-vars": "off",
+        "space-before-blocks": "off",
+        "space-before-function-paren": "off",
+        "space-in-parens": "off",
+        "space-infix-ops": "off",
+        "space-unary-ops": [
+            "error",
+            {
+                "nonwords": false,
+                "words": false
+            }
+        ],
+        "spaced-comment": "off",
+        "strict": [
+            "off",
+            "never"
+        ],
+        "switch-colon-spacing": "error",
+        "symbol-description": "error",
+        "template-curly-spacing": "error",
+        "template-tag-spacing": "error",
+        "unicode-bom": [
+            "error",
+            "never"
+        ],
+        "valid-jsdoc": "error",
+        "vars-on-top": "off",
+        "wrap-iife": "error",
+        "wrap-regex": "error",
+        "yield-star-spacing": "error",
+        "yoda": [
+            "error",
+            "never"
+        ]
+    }
+};

+ 32 - 0
content.js

@@ -0,0 +1,32 @@
+'use strict'
+
+chrome.storage.sync.get('settings', (rv) => {
+   if (typeof rv.settings !== "undefined") {
+      const settings = rv.settings;
+
+      if (settings.url) {
+         const url = settings.url + '/?post=' + encodeURIComponent(window.location.href) +
+            '&title=' + encodeURIComponent(document.title) +
+            '&source=save-to-shaarli';
+
+         const width = 600;
+         const height = 400;
+
+         const left = screen.width/2 - width/2;
+         const top = screen.height/2 - height/2;
+
+         //console.log('url', url);
+
+         window.open(url,
+            '_save_to_shaarli',
+            `left=${left},top=${top},width=${width},height=${height},
+            status=no,location=no,toolbar=no,directories=no,menubar=no,resizable=yes`);
+
+      } else {
+         alert("Please configure the extension first.");
+      }
+   } else {
+      alert("Please configure the extension first.");
+   }
+});
+

BIN
images/icon_128.png


+ 44 - 0
js/background.js

@@ -0,0 +1,44 @@
+'use strict'
+
+chrome.browserAction.onClicked.addListener((/*tab*/) => {
+	chrome.tabs.executeScript({file: 'jquery.js'	}, function() {
+		chrome.tabs.executeScript({file: 'content.js'});
+	});
+});
+
+function post_clicked_url(info/*, tab*/) {
+	chrome.storage.sync.get('settings', (rv) => {
+		if (typeof rv.settings !== "undefined") {
+			const settings = rv.settings;
+			const link_url = info["srcUrl"] ? info["srcUrl"] : info["linkUrl"];
+
+			if (settings.url) {
+				const url = settings.url + '/?post=' + encodeURIComponent(link_url) +
+					'&source=save-to-shaarli';
+
+				const width = 600;
+				const height = 400;
+
+				const left = screen.width/2 - width/2;
+				const top = screen.height/2 - height/2;
+
+				//console.log('url', url);
+
+				window.open(url,
+					'_save_to_shaarli',
+					`left=${left},top=${top},width=${width},height=${height},
+					status=no,location=no,toolbar=no,directories=no,menubar=no,resizable=yes`);
+
+			} else {
+				alert("Please configure the extension first.");
+			}
+
+		} else {
+			alert("Please configure the extension first");
+		}
+	});
+}
+
+chrome.contextMenus.create({"title": "Save to Shaarli",
+	"contexts":[ "link" ],
+	"onclick": post_clicked_url});

+ 29 - 0
js/options.js

@@ -0,0 +1,29 @@
+'use strict'
+
+$(document).ready(() => {
+
+	$("#options").on("submit", () => {
+
+		const settings = {};
+
+		$.each($("#options").serializeArray(), (i, a) => {
+			settings[a.name] = a.value;
+		});
+
+		chrome.storage.sync.set({'settings' : settings}, () => {
+			$("#message").text("Configuration saved.");
+		});
+
+		return false;
+	});
+
+	chrome.storage.sync.get('settings', (rv) => {
+		if (typeof rv.settings !== "undefined") {
+			const settings = rv.settings;
+
+			$.each(settings, (k, v) => {
+				$("#" + k).val(v);
+			});
+		}
+	});
+});

File diff suppressed because it is too large
+ 10364 - 0
lib/jquery.js


+ 23 - 0
manifest.json

@@ -0,0 +1,23 @@
+{
+	"applications": {
+		"gecko": { "id": "[email protected]", "update_url": "https://fakecake.org/xpi/updates.php" }
+	},
+   "background": {
+      "scripts": [ "lib/jquery.js", "js/background.js" ]
+   },
+   "description": "Saves links to a Shaarli instance",
+   "icons": {
+      "128": "images/icon_128.png"
+   },
+   "browser_action": {
+      "default_icon": "images/icon_128.png"
+   },
+   "manifest_version": 2,
+   "name": "Save to Shaarli",
+   "options_ui": {
+		"open_in_tab": true,
+		"page": "options.html"
+	},
+   "permissions": [ "contextMenus", "storage", "activeTab" ],
+   "version": "0.1"
+}

+ 30 - 0
options.html

@@ -0,0 +1,30 @@
+<html>
+<head>
+	<title>Save to Shaarli options</title>
+
+	<script type="text/javascript" src="lib/jquery.js"></script>
+	<script type="text/javascript" src="js/options.js"></script>
+
+	<style type="text/css">
+		body { margin : 16px; }
+		fieldset { border-width : 0px; }
+		fieldset label { width : 200px; display : inline-block; font-weight : bold; }
+		#message { color : red; }
+		</style>
+</head>
+<body>
+
+	<h1>Save to Shaarli options</h1>
+
+	<form name="options" id="options">
+		<fieldset>
+			<label>Shaarli instance URL:</label>
+			<input id="url" name="url" required size="60" placeholder="https://example.com/shaarli"/>
+		</fieldset>
+
+		<p><input type="submit" value="Save"/> <span id="message"></span></p>
+
+	</form>
+
+</body>
+</html>