NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript==
// @name Straight2ThePoint
// @description Scroll web page to the sentence shown in search engine results.
// @version 0.2.21
// @author Burn
// @namespace https://openuserjs.org/users/burn
// @copyright 2022, burn (https://openuserjs.org/users/burn)
// @include https://*
// @match https://*
// @license MIT
// @updateURL https://openuserjs.org/meta/burn/Straight2ThePoint.meta.js
// @downloadURL https://openuserjs.org/install/burn/Straight2ThePoint.user.js
// @require https://greasemonkey.github.io/gm4-polyfill/gm4-polyfill.js
// @run-at document-end
// @grant GM_getValue
// @grant GM_setValue
// @grant GM_deleteValue
// @grant GM.getValue
// @grant GM.setValue
// @grant GM.deleteValue
// @noframes
// ==/UserScript==
(async function(W) {
const DBG = false;
let storeName = GM_info.script.name,
myLog = (msg) => {
DBG && console.log(storeName + " | " + msg);
},
qS = (el, scope) => {
scope = (scope instanceof HTMLElement) ? scope : document;
return scope.querySelector(el) || false;
},
qSall = (els, scope) => {
scope = (scope instanceof HTMLElement) ? scope : document;
return scope.querySelectorAll(els) || false;
},
openedPage = {
title : "",
url : "",
sentence : ""
},
setGmValue = (name, val) => {
myLog('setting Value');
GM.setValue(name, JSON.stringify(val));
},
getGmValue = async (name, def) => {
def = def || '{}';
let tmpOut = await GM.getValue(name, def);
myLog("getting Value");
return JSON.parse(tmpOut);
},
isSearchResultsPage = () => {
if (/^https:\/\/[^\.]+\.google\.[a-z]{2,3}\/search\?q=/i.exec(location.href))
return true;
else return false;
},
linksElements = false,
prepareSnippetSearch = (sentence) => {
myLog("preparing search");
sentence = sentence.toString();
let snippets = sentence.split(/\.\s|\s\.\.\.\s?/g);
snippets.filter(el => (el !== "" && el.length > 3)).forEach(searchSnippet);
GM.deleteValue(storeName);
},
searchSnippet = (snippet) => {
snippet = snippet.trim();
myLog("now searching for " + snippet);
((a, b) => {
if (W.find) {
while (W.find(a)) {
let rng = W.getSelection().getRangeAt(0);
rng.deleteContents();
let newNode = document.createElement("mark");
newNode.setAttribute("class","straight-to-this-point");
newNode.appendChild(document.createTextNode(snippet));
rng.insertNode(newNode);
myLog("after highlighting snippet with mark");
}
W.getSelection().removeAllRanges();
} else if (document.body.createTextRange) {
let rng=document.body.createTextRange();
while (rng.findText(a))
rng.pasteHTML(b);
myLog("after calling pasteHTML");
}
})(snippet, '<mark class="straight-to-this-point">' + snippet + '</mark>');
},
setClickListener = (el) => {
el.addEventListener("click", () => {
let child = Object.create(openedPage),
tmpUrl = "";
if (el.href.indexOf("&url=") >= 0) {
tmpUrl = decodeURIComponent((el.href.split("&url=")[1]));
} else tmpUrl = el.href;
child.url = tmpUrl.replace(/&usg=[\w\-]+$/i, "");
myLog("url: " + child.url);
child.title = qS("h3", el).innerText;
myLog("title: " + child.title);
let sentence = qS(
"div:last-child span ~ span",
el.parentNode.parentNode.nextSibling).innerText;
if (undefined === sentence) {
sentence = qS(
"div:last-child span:last-child",
el.parentNode.parentNode.nextSibling).innerText;
}
if (undefined === sentence) {
sentence = qS("div:last-child span:last-child",
el.parentNode.parentNode.nextSibling.nextSibling).innerText;
}
child.sentence = sentence;
myLog("child.sentence: " + child.sentence);
setGmValue(storeName, child);
});
};
let valStored = await getGmValue(storeName);
let child;
if (isSearchResultsPage()) {
myLog("found search results page, now looking for links");
if (false !== (linksElements = qSall('#search #rso div div div div div a:first-child'))) {
myLog("found " + linksElements.length + " links, now adding click listener");
linksElements.forEach(setClickListener);
}
} else {
myLog("Found target page, now looking for stored sentence info");
if (undefined !== valStored.title) {
myLog("found stored sentence object: " + JSON.stringify(valStored));
prepareSnippetSearch(valStored.sentence);
}
}
})(window || unsafeWindow);