summaryrefslogtreecommitdiff
path: root/ext/fg/js/util.js
diff options
context:
space:
mode:
authorAlex Yatskov <alex@foosoft.net>2017-08-17 19:39:32 -0700
committerAlex Yatskov <alex@foosoft.net>2017-08-17 19:39:32 -0700
commit39fbabfe626e7ae2c2e0c1dd45bda33dd5dab66c (patch)
tree334bc2282389c910ed9f7d724458b6d8b650311a /ext/fg/js/util.js
parent65c100fe16c4829971055da384da90b1a1cddcd5 (diff)
parent7586572fbaab7de698ec13f8712cc95e24ab6273 (diff)
Merge branch 'master' into firefox-amo
Diffstat (limited to 'ext/fg/js/util.js')
-rw-r--r--ext/fg/js/util.js191
1 files changed, 8 insertions, 183 deletions
diff --git a/ext/fg/js/util.js b/ext/fg/js/util.js
index c6270ce6..5eff4018 100644
--- a/ext/fg/js/util.js
+++ b/ext/fg/js/util.js
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2016 Alex Yatskov <alex@foosoft.net>
+ * Copyright (C) 2016-2017 Alex Yatskov <alex@foosoft.net>
* Author: Alex Yatskov <alex@foosoft.net>
*
* This program is free software: you can redistribute it and/or modify
@@ -17,11 +17,13 @@
*/
-/*
- * Background
- */
+function utilAsync(func) {
+ return function(...args) {
+ func.apply(this, args);
+ };
+}
-function bgInvoke(action, params) {
+function utilInvoke(action, params={}) {
return new Promise((resolve, reject) => {
try {
chrome.runtime.sendMessage({action, params}, ({result, error}) => {
@@ -32,185 +34,8 @@ function bgInvoke(action, params) {
}
});
} catch (e) {
- window.orphaned = true;
+ window.yomichan_orphaned = true;
reject(e.message);
}
});
}
-
-function bgOptionsGet() {
- return bgInvoke('optionsGet', {});
-}
-
-function bgTermsFind(text) {
- return bgInvoke('termsFind', {text});
-}
-
-function bgKanjiFind(text) {
- return bgInvoke('kanjiFind', {text});
-}
-
-function bgTemplateRender(template, data) {
- return bgInvoke('templateRender', {data, template});
-}
-
-function bgDefinitionsAddable(definitions, modes) {
- return bgInvoke('definitionsAddable', {definitions, modes}).catch(() => null);
-}
-
-function bgDefinitionAdd(definition, mode) {
- return bgInvoke('definitionAdd', {definition, mode});
-}
-
-
-/*
- * Document
- */
-
-function docOffsetCalc(element) {
- const scrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop;
- const scrollLeft = window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft;
-
- const clientTop = document.documentElement.clientTop || document.body.clientTop || 0;
- const clientLeft = document.documentElement.clientLeft || document.body.clientLeft || 0;
-
- const rect = element.getBoundingClientRect();
- const top = Math.round(rect.top + scrollTop - clientTop);
- const left = Math.round(rect.left + scrollLeft - clientLeft);
-
- return {top, left};
-}
-
-function docImposterCreate(element) {
- const styleProps = window.getComputedStyle(element);
- const stylePairs = [];
- for (const key of styleProps) {
- stylePairs.push(`${key}: ${styleProps[key]};`);
- }
-
- const offset = docOffsetCalc(element);
- const imposter = document.createElement('div');
- imposter.className = 'yomichan-imposter';
- imposter.innerText = element.value;
- imposter.style.cssText = stylePairs.join('\n');
- imposter.style.position = 'absolute';
- imposter.style.top = `${offset.top}px`;
- imposter.style.left = `${offset.left}px`;
- imposter.style.zIndex = 2147483646;
- if (element.nodeName === 'TEXTAREA' && styleProps.overflow === 'visible') {
- imposter.style.overflow = 'auto';
- }
-
- document.body.appendChild(imposter);
- imposter.scrollTop = element.scrollTop;
- imposter.scrollLeft = element.scrollLeft;
-}
-
-function docImposterDestroy() {
- for (const element of document.getElementsByClassName('yomichan-imposter')) {
- element.parentNode.removeChild(element);
- }
-}
-
-function docRangeFromPoint(point) {
- const element = document.elementFromPoint(point.x, point.y);
- if (element !== null) {
- if (element.nodeName === 'IMG' || element.nodeName === 'BUTTON') {
- return new TextSourceElement(element);
- } else if (element.nodeName === 'INPUT' || element.nodeName === 'TEXTAREA') {
- docImposterCreate(element);
- }
- }
-
- if (!document.caretRangeFromPoint) {
- document.caretRangeFromPoint = (x, y) => {
- const position = document.caretPositionFromPoint(x,y);
- if (position === null) {
- return null;
- }
-
- const range = document.createRange();
- range.setStart(position.offsetNode, position.offset);
- range.setEnd(position.offsetNode, position.offset);
- return range;
- };
- }
-
- const range = document.caretRangeFromPoint(point.x, point.y);
- if (range !== null) {
- return new TextSourceRange(range);
- }
-
- return null;
-}
-
-function docSentenceExtract(source, extent) {
- const quotesFwd = {'「': '」', '『': '』', "'": "'", '"': '"'};
- const quotesBwd = {'」': '「', '』': '『', "'": "'", '"': '"'};
- const terminators = '…。..??!!';
-
- const sourceLocal = source.clone();
- const position = sourceLocal.setStartOffset(extent);
- sourceLocal.setEndOffset(position + extent);
- const content = sourceLocal.text();
-
- let quoteStack = [];
-
- let startPos = 0;
- for (let i = position; i >= startPos; --i) {
- const c = content[i];
-
- if (c === '\n') {
- startPos = i + 1;
- break;
- }
-
- if (quoteStack.length === 0 && (terminators.includes(c) || c in quotesFwd)) {
- startPos = i + 1;
- break;
- }
-
- if (quoteStack.length > 0 && c === quoteStack[0]) {
- quoteStack.pop();
- } else if (c in quotesBwd) {
- quoteStack = [quotesBwd[c]].concat(quoteStack);
- }
- }
-
- quoteStack = [];
-
- let endPos = content.length;
- for (let i = position; i <= endPos; ++i) {
- const c = content[i];
-
- if (c === '\n') {
- endPos = i + 1;
- break;
- }
-
- if (quoteStack.length === 0) {
- if (terminators.includes(c)) {
- endPos = i + 1;
- break;
- }
- else if (c in quotesBwd) {
- endPos = i;
- break;
- }
- }
-
- if (quoteStack.length > 0 && c === quoteStack[0]) {
- quoteStack.pop();
- } else if (c in quotesFwd) {
- quoteStack = [quotesFwd[c]].concat(quoteStack);
- }
- }
-
- const text = content.substring(startPos, endPos);
- const padding = text.length - text.replace(/^\s+/, '').length;
-
- return {
- text: text.trim(),
- offset: position - startPos - padding
- };
-}