lite version
This commit is contained in:
parent
2dcc107a5e
commit
791480e66a
1 changed files with 328 additions and 0 deletions
328
xkcdHans_lite.user.js
Normal file
328
xkcdHans_lite.user.js
Normal file
|
|
@ -0,0 +1,328 @@
|
|||
// ==UserScript==
|
||||
// @name xkcd-substitutions_lite
|
||||
// @namespace hans
|
||||
// @description SUBSTITUTIONS That make reading the news more "fun". (http://xkcd.com/1288/)
|
||||
// @updateURL https://gitea.bmsch.de/balthasar/Scripts/raw/branch/master/xkcdHans_lite.user.js
|
||||
// @downloadURL https://gitea.bmsch.de/balthasar/Scripts/raw/branch/master/xkcdHans_lite.user.js
|
||||
// @include *bbc.co.uk/*
|
||||
// @include *bbc.com/*
|
||||
// @include *cbc.ca/*
|
||||
// @include *theguardian.com/*
|
||||
// @include *telegraph.co.uk/*
|
||||
// @include *theonion.com/*
|
||||
// @include *foxnews.com/*
|
||||
// @include *wikipedia.org/*
|
||||
// @include *merkur-online.de
|
||||
// @include *computerbase.de/*
|
||||
// @include *facebook.com/*
|
||||
// @include *geeksaresexy.net/*
|
||||
// @include *golem.de/*
|
||||
// @include *gulli.com/*
|
||||
// @include *heise.de/*
|
||||
// @include *minecraft.gamepedia.com/*
|
||||
// @include *merkur.de/*
|
||||
// @include *spiegel.de/*
|
||||
// @include *sueddeutsche.de/*
|
||||
// @include *zeit.de/*
|
||||
// @include *ze.tt/*
|
||||
// @include *bento.de/*
|
||||
// @include *bigpanda.cern.ch/*
|
||||
// @include *bibleserver.com/*
|
||||
// @include *wikisource.org/*
|
||||
// @include file:///tmp/test.html
|
||||
// @version 1.1.44
|
||||
// @grant none
|
||||
// ==/UserScript==
|
||||
|
||||
(function() {
|
||||
var substitutions;
|
||||
var textNodes;
|
||||
var regexps = {};
|
||||
var swapregexps = {};
|
||||
var backswapregexps = {};
|
||||
|
||||
substitutions = {
|
||||
'witnesses': 'these dudes I know',
|
||||
'allegedgly': 'kinda probably',
|
||||
'new study': 'Tumblr post',
|
||||
'rebuild': 'avenge',
|
||||
'space': 'spaaace',
|
||||
'google glass': 'Virtual Boy',
|
||||
'smartphone': 'Pokédex',
|
||||
'senator': 'elf-lord',
|
||||
'car': 'cat',
|
||||
'election': 'eating contest',
|
||||
'congressional leaders': 'river spirits',
|
||||
'homeland security': 'homestar runner',
|
||||
'could not be reached for comment': 'is guilty and everyone knows it',
|
||||
'russland': 'deine Mutter',
|
||||
'Barack Obama': 'Darth Vader',
|
||||
'Obama': 'Vader',
|
||||
'million': 'melon',
|
||||
'ministerium' : 'hansdb97531',
|
||||
'ministerien' : '83497543niars',
|
||||
'mysterium' : 'ministerium',
|
||||
'mysterien' : 'ministerien',
|
||||
'hansdb97531' : 'mysterium',
|
||||
'83497543niars' : 'mysterien',
|
||||
'apple': 'banana',
|
||||
'polizei': 'prinzengarde',
|
||||
'papst': 'breznsepp',
|
||||
'päpst': 'breznsepp',
|
||||
'atom(en|e|)': 'rosinenkuchen',
|
||||
'ele(c|k)tr': 'atom',
|
||||
'nabla': 'blabla',
|
||||
'quanten': 'knödel',
|
||||
'deutschland': 'schland',
|
||||
'internet': 'neuland',
|
||||
'force': 'horse',
|
||||
'fu(ß|ss)ball': 'hallenhalma',
|
||||
'drohne': 'reichsflugscheibe',
|
||||
'bayreuth': 'Wo? Fraglos nur ein Ort: Bayreuth!',
|
||||
'microsoft': 'mordor',
|
||||
'laser': '"laser""',
|
||||
'prozent': 'bier',
|
||||
'%': ' Bier',
|
||||
'promille': 'bierchen',
|
||||
'‰': ' Bierchen',
|
||||
'waffe': 'waffel',
|
||||
'iphone': 'banana phone',
|
||||
'milliarde': 'marmelade',
|
||||
'window': 'door',
|
||||
'nuclear': 'nucular',
|
||||
'sparta': 'this is sparta',
|
||||
'Charles( Robert)* Darwin': 'Charles "Jerusalem" Darwin',
|
||||
'mi(c|k)ro': 'ma$1ro',
|
||||
'erzbischof': 'erdbeerschorsch',
|
||||
'weihbischof': 'weißbierschorsch',
|
||||
'erzbischöfe': 'erdberschorschs',
|
||||
'weihbischöfe': 'weißbierschorschs',
|
||||
'Margot Käßmann': 'Margot "1,54‰" Käßmann',
|
||||
'Joachim Gauck': 'Joachim "Hipster" Gauck',
|
||||
'Günter Grass': 'Günter "Anders" Grass',
|
||||
'broken' : 'screwed',
|
||||
'aborted' : 'ceased to be',
|
||||
'nuklear': 'nukular',
|
||||
'sehr' : 'anders',
|
||||
'debate': 'dance off',
|
||||
'candidate': 'airbender',
|
||||
'drone': 'dog',
|
||||
'vows to': 'probably won\'t',
|
||||
'at large': 'very large',
|
||||
'successfully': 'suddenly',
|
||||
'expands': 'physically expands',
|
||||
'an unknown number': 'like hundreds',
|
||||
'front runner': 'blade runner',
|
||||
'global': 'spherical',
|
||||
'no indication': 'lots of signs',
|
||||
'horsepower': 'tons of horsemeat'
|
||||
}
|
||||
|
||||
swaps ={
|
||||
'histo' : 'hyste',
|
||||
'years': 'minutes',
|
||||
'ortho': 'para',
|
||||
'link': 'recht',
|
||||
'right': 'left',
|
||||
'defense': 'offense',
|
||||
'defence': 'offence',
|
||||
'verteidigung': 'angriff',
|
||||
'ice': 'fire',
|
||||
'fence': 'bridge',
|
||||
'mauer':'brücke',
|
||||
'hetero': 'homo',
|
||||
'produktion': 'provokation',
|
||||
'production': 'provocation',
|
||||
'produce': 'provoke',
|
||||
'produz': 'provoz',
|
||||
'hyper': 'hypo',
|
||||
'amüsant' : 'relevant',
|
||||
'Bundestag' : 'Schützenverein',
|
||||
'kryptisch' : 'kritisch',
|
||||
'Mars' : 'Mond',
|
||||
'up' : 'down',
|
||||
'top+' : 'bottom',
|
||||
'over' : 'under',
|
||||
'online': 'offline'
|
||||
}
|
||||
|
||||
sometimesSubstitutions = [
|
||||
// [regex, subst, probability]
|
||||
['\\.(\\s)', '. Und Gott sah, dass es gut war.$1', 0.03],
|
||||
]
|
||||
|
||||
var tmpsub = {}
|
||||
// Add capitalized versions to map
|
||||
// Put lower and uppercase immediately after each other (hoping
|
||||
// that JS actually reads the dict later this order). This helps
|
||||
// sometimes avoiding successive replacements.
|
||||
for (var key in substitutions){
|
||||
tmpsub[key] = substitutions[key];
|
||||
tmpsub[key.charAt(0).toUpperCase() + key.slice(1)] = substitutions[key].charAt(0).toUpperCase() + substitutions[key].slice(1);
|
||||
}
|
||||
substitutions = tmpsub;
|
||||
|
||||
var tmpsometimessub = []
|
||||
for (var i in sometimesSubstitutions) {
|
||||
tmpsometimessub.push(sometimesSubstitutions[i]);
|
||||
var firstLetterRegex = sometimesSubstitutions[i][0].charAt(0).toUpperCase()
|
||||
var firstLetterSubst = sometimesSubstitutions[i][1].charAt(0).toUpperCase()
|
||||
if (firstLetterRegex.toLowerCase() != firstLetterRegex &&
|
||||
firstLetterSubst.toLowerCase() != firstLetterSubst) {
|
||||
// append capitalized versions if first symbol is a letter
|
||||
tmpsometimessub.push([
|
||||
sometimesSubstitutions[i][0].charAt(0).toUpperCase() + sometimesSubstitutions[i][0].slice(1),
|
||||
sometimesSubstitutions[i][1].charAt(0).toUpperCase() + sometimesSubstitutions[i][1].slice(1),
|
||||
sometimesSubstitutions[i][2]
|
||||
]);
|
||||
}
|
||||
}
|
||||
sometimesSubstitutions = tmpsometimessub
|
||||
|
||||
for (var key in swaps){
|
||||
swaps[key.charAt(0).toUpperCase() + key.slice(1)] = swaps[key].charAt(0).toUpperCase() + swaps[key].slice(1);
|
||||
}
|
||||
|
||||
for (var key in substitutions) {
|
||||
regexps[key] = new RegExp(key ,'g');
|
||||
}
|
||||
for (var key in swaps) {
|
||||
swapregexps[key] = new RegExp(key ,'g');
|
||||
backswapregexps[swaps[key]] = new RegExp(swaps[key] ,'g');
|
||||
}
|
||||
for (var i in sometimesSubstitutions) {
|
||||
sometimesSubstitutions[i][0] = new RegExp(sometimesSubstitutions[i][0], 'g');
|
||||
}
|
||||
|
||||
var t0 = performance.now();
|
||||
textNodes = document.evaluate("//text()", document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
|
||||
var totaltime_normal = 0;
|
||||
var totaltime_sometimes = 0;
|
||||
var totaltime_swap = 0;
|
||||
var totaltime_randQuotes = 0;
|
||||
var t0_sub = 0;
|
||||
var t1_sub = 0;
|
||||
for (var i = 0; i < textNodes.snapshotLength; i++) {
|
||||
var node = textNodes.snapshotItem(i);
|
||||
t0_sub = performance.now();
|
||||
node.data = substituteTextIn(node.data);
|
||||
t1_sub = performance.now();
|
||||
totaltime_normal += t1_sub - t0_sub;
|
||||
t0_sub = performance.now();
|
||||
node.data = substituteTextInSometimes(node.data);
|
||||
t1_sub = performance.now();
|
||||
totaltime_sometimes += t1_sub - t0_sub;
|
||||
t0_sub = performance.now();
|
||||
node.data = swapTextIn(node.data);
|
||||
t1_sub = performance.now();
|
||||
totaltime_swap += t1_sub - t0_sub;
|
||||
t0_sub = performance.now();
|
||||
node.data = randomQuotes(node.data);
|
||||
t1_sub = performance.now();
|
||||
totaltime_randQuotes += t1_sub - t0_sub;
|
||||
}
|
||||
var t1 = performance.now();
|
||||
console.log("Call xkcdHans took " + (t1 - t0) + " milliseconds.");
|
||||
console.log("Normal substitutions " + totaltime_normal + " milliseconds.");
|
||||
console.log("Sometimes substitutions " + totaltime_sometimes + " milliseconds.");
|
||||
console.log("Swap substitutions " + totaltime_swap + " milliseconds.");
|
||||
console.log("Random quote substitutions " + totaltime_randQuotes + " milliseconds.");
|
||||
|
||||
function substituteTextIn(text){
|
||||
for (var key in substitutions) {
|
||||
text = text.replace(regexps[key], substitutions[key]);
|
||||
}
|
||||
return text;
|
||||
}
|
||||
|
||||
function substituteTextInSometimes(text){
|
||||
for (var i in sometimesSubstitutions) {
|
||||
text = replaceSometimes(text,
|
||||
sometimesSubstitutions[i][0],
|
||||
sometimesSubstitutions[i][1],
|
||||
sometimesSubstitutions[i][2]);
|
||||
}
|
||||
return text;
|
||||
}
|
||||
|
||||
function swapTextIn(text){
|
||||
for (var key in swaps) {
|
||||
text = text.replace(swapregexps[key], 'superhans12342321');
|
||||
text = text.replace(backswapregexps[swaps[key]], removeRegexChars(key));
|
||||
var regex = new RegExp('superhans12342321', 'g');
|
||||
text = text.replace(regex, removeRegexChars(swaps[key]));
|
||||
}
|
||||
return text;
|
||||
}
|
||||
|
||||
function replaceRandomly(textList){
|
||||
var newList = [];
|
||||
for (var i in textList){
|
||||
var regex = new RegExp('([^\.,:\"\']+)', 'g');
|
||||
var wordMatch = regex.exec(textList[i]);
|
||||
var relativeProbability = 0.;
|
||||
if (wordMatch) {
|
||||
/*
|
||||
Turn-on curve for probability - for fine tuning try this in gnuplot:
|
||||
maxprob=0.1
|
||||
scaling=0.3
|
||||
threshold=10
|
||||
set xr [0:30]
|
||||
set yr [0:0.1]
|
||||
plot 0.5*maxprob*(tanh(scaling*(x-threshold))+1)
|
||||
*/
|
||||
var maxprob = 0.1; // maximum probability
|
||||
var scaling = 0.3; // scale the "turn-on" - smaller value means slower turn on
|
||||
var threshold = 10; // threshold where 0.5*maxprob is reached
|
||||
var relativeProbability = 0.5*maxprob*(Math.tanh(scaling*(wordMatch[0].length-threshold))+1)
|
||||
}
|
||||
if (Math.random() > (1-relativeProbability)) {
|
||||
newList.push(textList[i].replace(regex, '"$1"'));
|
||||
}
|
||||
else{
|
||||
newList.push(textList[i]);
|
||||
}
|
||||
}
|
||||
return newList;
|
||||
}
|
||||
|
||||
function randomQuotes(text){
|
||||
var spaceMatch = new RegExp('\\s+', 'g');
|
||||
var split = text.split(spaceMatch);
|
||||
text = replaceRandomly(split).join(' ');
|
||||
|
||||
return text;
|
||||
|
||||
}
|
||||
|
||||
function replaceSometimes(text, regex, substitution, probability){
|
||||
// replace the given regex by the given substitution only with a certain probability
|
||||
var match = 1;
|
||||
var nextPiece = text;
|
||||
var newText = "";
|
||||
while (match) {
|
||||
var nextMatchPos = nextPiece.search(regex);
|
||||
if (nextMatchPos < 0) {
|
||||
newText += nextPiece;
|
||||
break;
|
||||
}
|
||||
newText += nextPiece.substr(0, nextMatchPos);
|
||||
nextPiece = nextPiece.slice(nextMatchPos);
|
||||
match = nextPiece.match(regex);
|
||||
var stuffToReplace = nextPiece.substr(0, match[0].length);
|
||||
nextPiece = nextPiece.slice(match[0].length);
|
||||
if (Math.random() < probability) {
|
||||
newText += stuffToReplace.replace(regex, substitution);
|
||||
} else {
|
||||
newText += stuffToReplace;
|
||||
}
|
||||
}
|
||||
return newText;
|
||||
}
|
||||
|
||||
function removeRegexChars(text) {
|
||||
// adapt depending on what will be needed
|
||||
return text.replace("+", "").replace("*", "").replace(".", "")
|
||||
}
|
||||
|
||||
})();
|
||||
Loading…
Add table
Add a link
Reference in a new issue