aboutsummaryrefslogtreecommitdiff
path: root/src/shared
diff options
context:
space:
mode:
Diffstat (limited to 'src/shared')
-rw-r--r--src/shared/settings/default.js (renamed from src/shared/default-settings.js)67
-rw-r--r--src/shared/settings/values.js100
-rw-r--r--src/shared/store/provider.jsx13
3 files changed, 171 insertions, 9 deletions
diff --git a/src/shared/default-settings.js b/src/shared/settings/default.js
index 608890b..69238e3 100644
--- a/src/shared/default-settings.js
+++ b/src/shared/settings/default.js
@@ -62,5 +62,70 @@ export default {
"wikipedia": "https://en.wikipedia.org/w/index.php?search={}"
}
}
-}`
+}`,
+
+ 'form': {
+ 'keymaps': {
+ 'scroll.vertically?{"count":1}': 'j',
+ 'scroll.vertically?{"count":-1}': 'k',
+ 'scroll.horizonally?{"count":-1}': 'h',
+ 'scroll.horizonally?{"count":1}': 'l',
+ 'scroll.home': '0',
+ 'scroll.end': '$',
+ 'scroll.pages?{"count":-0.5}': '<C-U>',
+ 'scroll.pages?{"count":0.5}': '<C-D>',
+ 'scroll.pages?{"count":-1}': '<C-B>',
+ 'scroll.pages?{"count":1}': '<C-F>',
+
+ 'tabs.close': 'd',
+ 'tabs.reopen': 'u',
+ 'tabs.next?{"count":1}': 'J',
+ 'tabs.prev?{"count":1}': 'K',
+ 'tabs.first': 'g0',
+ 'tabs.last': 'g$',
+ 'tabs.reload?{"cache":true}': 'r',
+ 'tabs.pin.toggle': 'zp',
+ 'tabs.duplicate': 'zd',
+
+ 'follow.start?{"newTab":false}': 'f',
+ 'follow.start?{"newTab":true}': 'F',
+ 'navigate.history.prev': 'H',
+ 'navigate.history.next': 'L',
+ 'navigate.link.next': ']]',
+ 'navigate.link.prev': '[[',
+ 'navigate.parent': 'gu',
+ 'navigate.root': 'gU',
+
+ 'find.start': '/',
+ 'find.next': 'n',
+ 'find.prev': 'N',
+
+ 'command.show': ':',
+ 'command.show.open?{"alter":false}': 'o',
+ 'command.show.open?{"alter":true}': 'O',
+ 'command.show.tabopen?{"alter":false}': 't',
+ 'command.show.tabopen?{"alter":true}': 'T',
+ 'command.show.winopen?{"alter":false}': 'w',
+ 'command.show.winopen?{"alter":true}': 'W',
+ 'command.show.buffer': 'b',
+
+ 'addon.toggle.enabled': '<S-Esc>',
+ 'urls.yank': 'y',
+ 'zoom.in': 'zi',
+ 'zoom.out': 'zo',
+ 'zoom.neutral': 'zz',
+ },
+ 'search': {
+ 'default': 'google',
+ 'engines': [
+ ['google', 'https,//google.com/search?q={}'],
+ ['yahoo', 'https,//search.yahoo.com/search?p={}'],
+ ['bing', 'https,//www.bing.com/search?q={}'],
+ ['duckduckgo', 'https,//duckduckgo.com/?q={}'],
+ ['twitter', 'https,//twitter.com/search?q={}'],
+ ['wikipedia', 'https,//en.wikipedia.org/w/index.php?search={}'],
+ ]
+ },
+ 'blacklist': [],
+ }
};
diff --git a/src/shared/settings/values.js b/src/shared/settings/values.js
new file mode 100644
index 0000000..4482fbb
--- /dev/null
+++ b/src/shared/settings/values.js
@@ -0,0 +1,100 @@
+import DefaultSettings from './default';
+
+const operationFromFormName = (name) => {
+ let [type, argStr] = name.split('?');
+ let args = {};
+ if (argStr) {
+ args = JSON.parse(argStr);
+ }
+ return Object.assign({ type }, args);
+};
+
+const operationToFormName = (op) => {
+ let type = op.type;
+ let args = Object.assign({}, op);
+ delete args.type;
+
+ if (Object.keys(args).length === 0) {
+ return type;
+ }
+ return op.type + '?' + JSON.stringify(args);
+};
+
+const valueFromJson = (json) => {
+ return JSON.parse(json);
+};
+
+const valueFromForm = (form) => {
+ let keymaps = undefined;
+ if (form.keymaps) {
+ keymaps = {};
+ for (let name of Object.keys(form.keymaps)) {
+ let keys = form.keymaps[name];
+ keymaps[keys] = operationFromFormName(name);
+ }
+ }
+
+ let search = undefined;
+ if (form.search) {
+ search = { default: form.search.default };
+
+ if (form.search.engines) {
+ search.engines = {};
+ for (let [name, url] of form.search.engines) {
+ search.engines[name] = url;
+ }
+ }
+ }
+
+ let blacklist = form.blacklist;
+
+ return { keymaps, search, blacklist };
+};
+
+const jsonFromValue = (value) => {
+ return JSON.stringify(value, undefined, 2);
+};
+
+const formFromValue = (value) => {
+
+ let keymaps = undefined;
+ if (value.keymaps) {
+ let allowedOps = new Set(Object.keys(DefaultSettings.form.keymaps));
+
+ keymaps = {};
+ for (let keys of Object.keys(value.keymaps)) {
+ let op = operationToFormName(value.keymaps[keys]);
+ if (allowedOps.has(op)) {
+ keymaps[op] = keys;
+ }
+ }
+ }
+
+ let search = undefined;
+ if (value.search) {
+ search = { default: value.search.default };
+ if (value.search.engines) {
+ search.engines = Object.keys(value.search.engines).map((name) => {
+ return [name, value.search.engines[name]];
+ });
+ }
+ }
+
+ let blacklist = value.blacklist;
+
+ return { keymaps, search, blacklist };
+};
+
+const jsonFromForm = (form) => {
+ return jsonFromValue(valueFromForm(form));
+};
+
+const formFromJson = (json) => {
+ let value = valueFromJson(json);
+ return formFromValue(value);
+};
+
+export {
+ valueFromJson, valueFromForm, jsonFromValue, formFromValue,
+ jsonFromForm, formFromJson
+};
diff --git a/src/shared/store/provider.jsx b/src/shared/store/provider.jsx
index 743f656..fe925aa 100644
--- a/src/shared/store/provider.jsx
+++ b/src/shared/store/provider.jsx
@@ -1,18 +1,15 @@
-import React from 'react';
-import PropTypes from 'prop-types';
+import { h, Component } from 'preact';
-class Provider extends React.PureComponent {
+class Provider extends Component {
getChildContext() {
return { store: this.props.store };
}
render() {
- return React.Children.only(this.props.children);
+ return <div>
+ { this.props.children }
+ </div>;
}
}
-Provider.childContextTypes = {
- store: PropTypes.any,
-};
-
export default Provider;