-
Notifications
You must be signed in to change notification settings - Fork 11
/
content.js
98 lines (91 loc) · 3.41 KB
/
content.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
// clear evaluations when user clicks away
$("html").on("blur focus keydown mousedown", function() {
$(".GPT2Message").remove();
$(".afterMeGpt2").removeClass("afterMeGpt2");
});
// communicate with popup
browser.runtime.onMessage.addListener(gotMessage);
function gotMessage(message) {
if (message.type === "selection-check") {
return checkSelection();
} else if (message.type === "evaluate") {
return evaluateSelection();
}
}
// determines how real a portion of selected text is
function evaluateSelection() {
// initiate element variable
let element;
// get the selected text
let selection = window.getSelection();
// determine which node is at the bottom of the selection and assign it to the element
if (selection.anchorOffset) {
element = selection.anchorNode.parentNode;
} else if (selection.focusOffset) {
element = selection.focusNode.parentNode;
}
// parse the selected text
let text = selection.toString();
// mark the element after which to insert the result of the evaluation
element.className += " " + "afterMeGpt2";
// prepare the message element
let message_element = $("<p class='GPT2Message'>Loading...</p>");
message_element.css("border", "2px dashed grey");
message_element.css("border-top", "5px solid grey");
message_element.css("font-family", "monospace");
message_element.css("font-size", "14px");
// insert the message element
message_element.insertAfter(".afterMeGpt2");
// evaluate
fetch(
"https://huggingface.co/openai-detector/?" +
encodeURI(text.replace(/[\r\n]+/g, " "))
)
.then(response => response.json())
.then(json => {
// parse the response from Hugging Face
let all_tokens = json.all_tokens;
let used_tokens = json.used_tokens;
let realness = Math.round(json.real_probability * 100 * 100) / 100;
let css_color_string = generateHSLString(realness, 0, 120);
// prepare the message
let message_text = `According to the detector, there is a ${realness} % chance that the selected text is real. ${used_tokens} out of ${all_tokens} tokens were considered`;
// update the message element with the outcome
message_element.text(message_text);
message_element.css("border", `2px dashed ${css_color_string}`);
message_element.css("border-top", `5px solid ${css_color_string}`);
})
.catch(err => console.log(err));
}
// checks whether the selected text is satisfactory for our needs and sends response
function checkSelection() {
// get selected text in the current page
let text = getSelectedText().toString();
// if there is any selected text
if (text) {
// get the tokens in selected text
let words = text.match(/\w+/g) || [];
// respond with whether text is selected and how long it is
return Promise.resolve({ token_number: words.length });
} else {
return Promise.resolve({ token_number: 0 });
}
}
// gets the selected text in the current page
function getSelectedText() {
// initialize text as false
let text = false;
// set text to selected text, if there is selected text
if (window.getSelection) {
text = window.getSelection();
}
return text;
}
// generates HSL string given a percentage between a start and end color
function generateHSLString(percent, start, end) {
let fraction = percent / 100;
let offset = (end - start) * fraction;
let hue = offset + start;
// Return a CSS HSL string
return `hsl(${hue}, 100%, 50%)`;
}