Skip to content

Commit 2bc7972

Browse files
committed
fix performance mouseover
1 parent d63e0a1 commit 2bc7972

File tree

4 files changed

+87
-84
lines changed

4 files changed

+87
-84
lines changed

doc/description.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@ Mouseover Translate Any Language At Once
1919
English, Russian, Japanese, Chinese and so on
2020

2121
# Change Log
22+
- 0.1.175
23+
- fix netflix lang detect
24+
- fix mouseover performance (requested by 한원민 (꿀호떡))
2225
- 0.1.174
2326
- support netflix dual sub (requested by IkiamJ)
2427
- 0.1.173

src/contentScript.js

Lines changed: 3 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ var listenText = "";
9090

9191
//determineTooltipShowHide based on hover, check mouse over word on every 700ms
9292
function startMouseoverDetector() {
93-
enableMouseoverTextEvent(window, setting["tooltipEventInterval"]);
93+
enableMouseoverTextEvent(window, setting);
9494
addEventHandler("mouseoverText", stageTooltipTextHover);
9595
}
9696

@@ -109,7 +109,7 @@ function stageTooltipTextHover(event, useEvent = true) {
109109
hoveredData &&
110110
!isOtherServiceActive()
111111
) {
112-
var { mouseoverText, mouseoverRange } = extractMouseoverText(hoveredData);
112+
var { mouseoverText, mouseoverRange } = hoveredData;
113113
stageTooltipText(mouseoverText, "mouseover", mouseoverRange);
114114
}
115115
}
@@ -201,36 +201,6 @@ async function handleTTS(text, sourceLang, targetText, targetLang, timestamp) {
201201
util.requestTTS(text, sourceLang, targetText, targetLang, timestamp + 100);
202202
}
203203

204-
function extractMouseoverText(hoveredData) {
205-
var mouseoverType = getMouseoverType();
206-
var mouseoverText = hoveredData[mouseoverType];
207-
var mouseoverRange = hoveredData[mouseoverType + "_range"];
208-
return { mouseoverText, mouseoverRange };
209-
}
210-
211-
function getMouseoverType() {
212-
//if swap key pressed, swap detect type
213-
//if mouse target is special web block, handle as block
214-
var detectType = setting["mouseoverTextType"];
215-
detectType = keyDownList[setting["keyDownMouseoverTextSwap"]]
216-
? detectType == "word"
217-
? "sentence"
218-
: "word"
219-
: detectType;
220-
221-
detectType = checkMouseTargetIsSpecialWebBlock() ? "container" : detectType;
222-
return detectType;
223-
}
224-
225-
function checkMouseTargetIsSpecialWebBlock() {
226-
// if mouse targeted web element contain particular class name, return true
227-
//mousetooltip ocr block
228-
var classList = mouseTarget?.classList;
229-
return ["ocr_text_div", "textFitted"].some((className) =>
230-
classList?.contains(className)
231-
);
232-
}
233-
234204
function checkMouseTargetIsTooltip() {
235205
try {
236206
return $(tooltip?.popper)?.get(0)?.contains(mouseTarget);
@@ -609,7 +579,7 @@ async function startAutoReader() {
609579
util.requestKillAutoReaderTabs();
610580
await killAutoReader();
611581
var hoveredData = await getMouseoverText(clientX, clientY);
612-
var { mouseoverRange } = extractMouseoverText(hoveredData);
582+
var { mouseoverText, mouseoverRange } = hoveredData;
613583
processAutoReader(mouseoverRange);
614584
}
615585

src/event/mouseover.js

Lines changed: 81 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
// 3. expand range for char -> string
55
// 4. range to text
66

7+
import { detect } from "tesseract.js";
78
import * as util from "/src/util";
89
import { debounce } from "lodash";
910

@@ -13,11 +14,14 @@ var _win;
1314
var _isIframe = false;
1415
var styleElement;
1516
const PARENT_TAGS_TO_EXCLUDE = ["STYLE", "SCRIPT", "TITLE"];
17+
var setting = {};
18+
var mouseTarget = null;
19+
20+
export function enableMouseoverTextEvent(_window = window, settingPointer) {
21+
var textDetectTime = setting?.["tooltipEventInterval"] || 0.7;
22+
23+
setting = settingPointer;
1624

17-
export function enableMouseoverTextEvent(
18-
_window = window,
19-
textDetectTime = 0.7
20-
) {
2125
_win = _window;
2226
textDetectTime = Number(textDetectTime) * 1000;
2327
const triggerMouseoverTextWithDelay = debounce(async () => {
@@ -33,6 +37,29 @@ export function enableMouseoverTextEvent(
3337
});
3438
}
3539

40+
function getMouseoverType() {
41+
//if swap key pressed, swap detect type
42+
//if mouse target is special web block, handle as block
43+
var detectType = setting["mouseoverTextType"];
44+
// detectType = keyDownList[setting["keyDownMouseoverTextSwap"]]
45+
// ? detectType == "word"
46+
// ? "sentence"
47+
// : "word"
48+
// : detectType;
49+
50+
detectType = checkMouseTargetIsSpecialWebBlock() ? "container" : detectType;
51+
return detectType;
52+
}
53+
54+
function checkMouseTargetIsSpecialWebBlock() {
55+
// if mouse targeted web element contain particular class name, return true
56+
//mousetooltip ocr block
57+
var classList = mouseTarget?.classList;
58+
return ["ocr_text_div", "textFitted"].some((className) =>
59+
classList?.contains(className)
60+
);
61+
}
62+
3663
function updateMouseoverXY(e) {
3764
updateEbookWindowPos(e);
3865
updateWindowPos(e);
@@ -44,6 +71,7 @@ function updateEbookWindowPos(e) {
4471
_isIframe = true;
4572
clientX = e.iframeX;
4673
clientY = e.iframeY;
74+
mouseTarget = e.target;
4775
}
4876
}
4977
function updateWindowPos(e) {
@@ -52,6 +80,7 @@ function updateWindowPos(e) {
5280
}
5381
clientX = e.clientX;
5482
clientY = e.clientY;
83+
mouseTarget = e.target;
5584
}
5685

5786
export const triggerMouseoverText = (mouseoverText) => {
@@ -64,39 +93,44 @@ export const triggerMouseoverText = (mouseoverText) => {
6493
};
6594

6695
export async function getMouseoverText(x, y) {
96+
var mouseoverType = getMouseoverType();
97+
6798
//get google doc select
6899
if (util.isGoogleDoc()) {
69-
return await getGoogleDocText(x, y);
100+
return await getGoogleDocText(x, y, mouseoverType);
70101
}
71102

72103
//get range
73104
var range = getPointedRange(x, y);
74105

75106
//get text from range
76-
var mouseoverText = await getTextFromRange(range, x, y);
107+
var mouseoverText = await getTextFromRange(range, x, y, false, mouseoverType);
77108
// if fail detect using expand range use seg range
78109
if (
79110
!isFirefox() &&
80-
!mouseoverText["word"] &&
81-
!mouseoverText["sentence"] &&
82-
mouseoverText["container"]
111+
(mouseoverType === "word" || mouseoverType === "sentence") &&
112+
!mouseoverText["mouseoverText"]
83113
) {
84114
return await getTextFromRange(range, x, y, true);
85115
}
86116

87117
return mouseoverText;
88118
}
89119

90-
async function getTextFromRange(range, x, y, useSegmentation = false) {
91-
var output = {};
92-
for (const detectType of ["word", "sentence", "container"]) {
93-
output[detectType] = "";
94-
var wordRange = expandRange(range, detectType, useSegmentation, x, y);
95-
if (checkXYInElement(wordRange, clientX, clientY)) {
96-
output[detectType] = util.extractTextFromRange(wordRange);
97-
output[detectType + "_range"] = wordRange;
98-
}
120+
async function getTextFromRange(
121+
range,
122+
x,
123+
y,
124+
useSegmentation = false,
125+
mouseoverType
126+
) {
127+
var output = { mouseoverText: "", mouseoverRange: range };
128+
var wordRange = expandRange(range, mouseoverType, useSegmentation, x, y);
129+
if (checkXYInElement(wordRange, clientX, clientY)) {
130+
output["mouseoverText"] = util.extractTextFromRange(wordRange);
131+
output["mouseoverRange"] = wordRange;
99132
}
133+
console.log(output);
100134
return output;
101135
}
102136

@@ -108,7 +142,7 @@ function expandRange(range, type, useSegmentation, x, y) {
108142
if (type == "container") {
109143
// get whole text paragraph
110144
range = getContainerRange(range);
111-
} else if (!range.expand || useSegmentation) {
145+
} else if (isFirefox() || useSegmentation) {
112146
// for firefox, use segmentation to extract word
113147
range = expandRangeWithSeg(range, type, x, y);
114148
} else {
@@ -297,11 +331,7 @@ function expandRangeWithSeg(rangeOri, type = "word", x, y) {
297331
// var wholeText2 = getNodeText(textNode);
298332
var wordSliceInfo = getWordSegmentInfo(wholeText, type);
299333
// get all word range by segment
300-
const wordSliceRanges = createWordRanges(wordSliceInfo, textNode);
301-
// get pointed pos range
302-
var currentWordNode = wordSliceRanges.find((range) =>
303-
isPointInRange(range, x, y)
304-
);
334+
const currentWordNode = findWordRange(wordSliceInfo, textNode, x, y);
305335
return currentWordNode;
306336
}
307337

@@ -326,9 +356,9 @@ function getWordSegmentInfo(text, type) {
326356
return wordsMeta;
327357
}
328358

329-
function createWordRanges(wordSegInfo, textNode) {
359+
function findWordRange(wordSegInfo, textNode, x, y) {
330360
var newLineCount = 0;
331-
return wordSegInfo
361+
var wordSegInfoExtract = wordSegInfo
332362
.map((wordMeta) => {
333363
var word = wordMeta.segment;
334364
var index = wordMeta.index;
@@ -348,23 +378,28 @@ function createWordRanges(wordSegInfo, textNode) {
348378
newLine: newLine,
349379
};
350380
})
351-
.filter((wordMeta) => wordMeta.segment.length > 0)
352-
.map((wordMeta) => {
353-
try {
354-
var wordRange = document.createRange();
355-
var index = wordMeta.index + wordMeta.newLine;
356-
var word = wordMeta.segment;
357-
var wordLen = word.length;
358-
const selectedNode1 = selectNode(textNode, index);
359-
const selectedNode2 = selectNode(textNode, index + wordLen);
360-
361-
wordRange.setStart(selectedNode1.node, selectedNode1.index);
362-
wordRange.setEnd(selectedNode2.node, selectedNode2.index);
363-
} catch (error) {
364-
console.log(error);
381+
.filter((wordMeta) => wordMeta.segment.trim().length > 0);
382+
383+
for (const wordMeta of wordSegInfoExtract) {
384+
try {
385+
var wordRange = document.createRange();
386+
var index = wordMeta.index + wordMeta.newLine;
387+
var word = wordMeta.segment;
388+
var wordLen = word.length;
389+
const selectedNode1 = selectNode(textNode, index);
390+
const selectedNode2 = selectNode(textNode, index + wordLen);
391+
392+
wordRange.setStart(selectedNode1.node, selectedNode1.index);
393+
wordRange.setEnd(selectedNode2.node, selectedNode2.index);
394+
395+
if (isPointInRange(wordRange, x, y)) {
396+
return wordRange;
365397
}
366-
return wordRange;
367-
});
398+
} catch (error) {
399+
console.log(error);
400+
}
401+
}
402+
return null;
368403
}
369404

370405
function selectNode(node, offset) {
@@ -456,17 +491,18 @@ function getNextEle(ele) {
456491
}
457492

458493
function isFirefox() {
459-
return typeof InstallTrigger !== "undefined";
494+
return !document.createRange().expand;
495+
// return true;
460496
}
461497

462498
//google doc hover =========================================================
463499
// https://github.com/Amaimersion/google-docs-utils/issues/10
464500

465-
async function getGoogleDocText(x, y) {
501+
async function getGoogleDocText(x, y, mouseoverType) {
466502
var textElement;
467503
var rect = getGoogleDocRect(x, y);
468504
var { textElement, range } = getGoogleDocCaretRange(rect, x, y);
469-
var mouseoverText = await getTextFromRange(range);
505+
var mouseoverText = await getTextFromRange(range, x, y, false, mouseoverType);
470506
textElement?.remove();
471507
return mouseoverText;
472508
}

src/util/setting_default.js

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -213,12 +213,6 @@ export var settingDict = {
213213
optionList: keyListWithAlways,
214214
settingTab: "keyboard",
215215
},
216-
keyDownMouseoverTextSwap: {
217-
default: "null",
218-
i18nKey: "Mouseover_Text_Type_Swap_Key",
219-
optionList: keyList,
220-
settingTab: "keyboard",
221-
},
222216
keySpeechRecognition: {
223217
default: "ControlRight",
224218
i18nKey: "Speech_Recognition_When",

0 commit comments

Comments
 (0)