Adding sentence extraction code
This commit is contained in:
parent
19cc8fda33
commit
d26ecab0b5
@ -78,29 +78,8 @@ class Client {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
textSourceFromPoint(point) {
|
|
||||||
const element = document.elementFromPoint(point.x, point.y);
|
|
||||||
if (element !== null) {
|
|
||||||
switch (element.nodeName) {
|
|
||||||
case 'IMG':
|
|
||||||
return new TextSourceImage(element);
|
|
||||||
case 'INPUT':
|
|
||||||
case 'BUTTON':
|
|
||||||
case 'TEXTAREA':
|
|
||||||
return new TextSourceInput(element);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const range = document.caretRangeFromPoint(point.x, point.y);
|
|
||||||
if (range !== null) {
|
|
||||||
return new TextSourceRange(range);
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
searchAt(point) {
|
searchAt(point) {
|
||||||
const textSource = this.textSourceFromPoint(point);
|
const textSource = Client.textSourceFromPoint(point);
|
||||||
if (textSource === null || !textSource.containsPoint(point)) {
|
if (textSource === null || !textSource.containsPoint(point)) {
|
||||||
this.hidePopup();
|
this.hidePopup();
|
||||||
return;
|
return;
|
||||||
@ -218,6 +197,77 @@ class Client {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static textSourceFromPoint(point) {
|
||||||
|
const element = document.elementFromPoint(point.x, point.y);
|
||||||
|
if (element !== null) {
|
||||||
|
switch (element.nodeName) {
|
||||||
|
case 'IMG':
|
||||||
|
return new TextSourceImage(element);
|
||||||
|
case 'INPUT':
|
||||||
|
case 'BUTTON':
|
||||||
|
case 'TEXTAREA':
|
||||||
|
return new TextSourceInput(element);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const range = document.caretRangeFromPoint(point.x, point.y);
|
||||||
|
if (range !== null) {
|
||||||
|
return new TextSourceRange(range);
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
static extractSentence(content, position) {
|
||||||
|
const quotesFwd = {'「': '」', '『': '』', "'": "'", '"': '"'};
|
||||||
|
const quotesBwd = {'」': '「', '』': '『', "'": "'", '"': '"'};
|
||||||
|
const terminators = '…。..??!!';
|
||||||
|
|
||||||
|
let quoteStack = [];
|
||||||
|
|
||||||
|
let startPos = 0;
|
||||||
|
for (let i = position; i >= startPos; --i) {
|
||||||
|
const c = content[i];
|
||||||
|
|
||||||
|
if (quoteStack.length === 0 && (terminators.indexOf(c) !== -1 || 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 (quoteStack.length === 0) {
|
||||||
|
if (terminators.indexOf(c) !== -1) {
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return content.substring(startPos, endPos).trim();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
window.yomiClient = new Client();
|
window.yomiClient = new Client();
|
||||||
|
Loading…
Reference in New Issue
Block a user