NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript==
// @name JR's Utils
// @namespace http://openuserjs.org/users/zarjay/scripts
// @author zarjay
// @version 1.4.1
// @description Library of functions runnable in the browser console.
// @match http://*/*
// @match https://*/*
// @license MIT License; https://github.com/zarjay/userscripts/blob/master/LICENSE
// @updateURL https://openuserjs.org/meta/zarjay/JRs_Utils.meta.js
// ==/UserScript==
const exec = fn => {
const script = document.createElement('script');
script.textContent = `(${fn})()`;
document.head.appendChild(script);
};
const main = () => {
// add CSS to the page
function css(content) {
const element = document.createElement('style');
element.textContent = content;
document.head.appendChild(element);
}
// copy JavaScript to the clipboard
function copyJS(js) {
copy(stringifyJS(js));
}
// copy JSON to the clipboard
function copyJSON(js) {
copy(stringifyJSON(js));
}
// make the page editable or non-editable
function edit(canEdit = true) {
document.designMode = canEdit ? 'on' : 'off';
}
// count occurrences of each value
function frequency(...values) {
return values.reduce((obj, val) => Object.assign(obj, { [val]: (obj[val] || 0) + 1 }), {});
}
// add HTML to the page
function html(content, position = 'beforeend') {
document.body.insertAdjacentHTML(position, content);
}
// include JS/CSS from URL or CDN
function include(asset, type) {
if (!asset.includes('/')) return includeFromCDN(asset);
return includeFromURL(asset, type);
}
// include JS/CSS file from CDN
function includeFromCDN(library) {
return fetch(`https://api.cdnjs.com/libraries?search=${library}`)
.then(response => response.json())
.then(json => json.results[0].latest)
.then(includeFromURL)
.catch(error => console.error(`Couldn't load ${library}`, error))
}
// include JS/CSS file from URL
function includeFromURL(url, type = url.split('.').pop().toLowerCase()) {
return new Promise((resolve, reject) => {
let element;
if (type === 'css') {
element = document.createElement('link');
element.rel = 'stylesheet';
element.href = url;
} else if (type === 'js') {
element = document.createElement('script');
element.src = url;
element.async = false;
} else {
throw new Error(`Failed to include ${url} due to unknown file type.`);
}
element.onload = resolve;
element.onerror = reject;
document.head.appendChild(element);
}).then(() => console.log('Loaded', url));
}
const defaultEvents = [
'contextmenu',
'copy',
'keydown',
'keypress',
'keyup',
'mousedown',
'mouseup',
'paste',
'selectstart'
];
// block bubble events with a capture event
function intercept(target = document.documentElement, events = defaultEvents) {
const stopEvents = event => event.stopPropagation();
query(target).forEach(element =>
events.forEach(event => element.addEventListener(event, stopEvents, true)));
}
// add JS to the page
function js(content, isImmediate = false) {
const script = document.createElement('script');
script.textContent = isImmediate ? `(${content})()` : content;
document.head.appendChild(script);
}
// calculate the mean
function mean(...values) {
return sum(...values) / values.length;
}
// calculate the median
function median(...values) {
values.sort((a, b) => a - b);
const low = (values.length - 1) >> 1;
const high = values.length >> 1;
return (values[low] + values[high]) / 2;
}
// calculate the mode
function mode(...values) {
const counted = frequency(...values);
const keys = unique(...values);
const vals = keys.map(x => counted[x]);
if (vals.every(x => x < 2)) return [];
const max = Math.max(...vals);
return keys.reduce((array, key) => counted[key] === max ? [...array, key] : array, []);
}
// pause audio/video (pause everything by default)
function pause(target = 'audio, video') {
const elements = query(target);
elements.forEach(element => typeof element.pause === 'function' ? element.pause() : null);
}
// play audio/video (plays first found by default)
function play(target = 'audio, video') {
const element = query(target)[0];
if (element && typeof element.play === 'function') element.play();
}
// kinda like jQuery's $()
function query(target) {
if (typeof target === 'string') return [...document.querySelectorAll(target)];
if (target instanceof Node) return [target];
return Array.from(target); // hopefully a NodeList, HTMLCollection, or Array
}
// format JS into a string
function stringifyJS(js) {
if (typeof js === 'function') {
return js.toString();
} else if (typeof js === 'object') {
return stringifyJSON(js).replace(/"(\w+)":/g, '$1:').replace(/"/g, '\'');
} else {
return js;
}
}
// format JSON into a string
function stringifyJSON(js) {
return JSON.stringify(js, null, '\t');
}
// calculate the sum
function sum(...values) {
return values.reduce((a, b) => a + b);
}
// filter out duplicate values
function unique(...values) {
return values.filter((x, i) => values.indexOf(x) === i)
}
const jr = {
css,
copyJS,
copyJSON,
edit,
frequency,
html,
include,
intercept,
js,
mean,
median,
mode,
pause,
play,
query,
sum,
unique
};
if (window.jr) {
console.warn('Userscript: jr variable is taken.');
} else {
window.jr = jr;
console.log('Userscript: jr is loaded.');
}
};
exec(main);