forked from stuartpb/s-keyboard-leopard-g
-
Notifications
You must be signed in to change notification settings - Fork 0
/
leopard.user.js
85 lines (73 loc) · 2.74 KB
/
leopard.user.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
// ==UserScript==
// @name s/keyboard/leopard/g
// @version 3.1
// @description Replaces the word "keyboard" with "leopard".
// @match *://*/*
// @license License In Three Lines
// @updateURL http://userscripts.org/scripts/source/128626.meta.js
// @downloadURL https://userscripts.org/scripts/source/128626.user.js
// ==/UserScript==
// Copyright 2013 Stuart P. Bentley.
// This work may be used freely as long as this notice is included.
// The work is provided "as is" without warranty, express or implied.
// The pattern to match
var keyboard_pattern = /(k)(e)(y)(b)o(ard)/ig
// which letters in "keyboard" get replaced with which in "leopard"
var leopard_subs = {
'k': 'l', 'K': 'L',
'y': 'o', 'Y': 'O',
'b': 'p', 'B': 'P'
};
// construct "leopard" replacement for "keyboard" components
function replacement_leopard(match,k,e,y,b,ard){
return leopard_subs[k] + e + leopard_subs[y] + leopard_subs[b] + ard
}
// Transform all instances of 'keyboard' in a string into 'leopard'
function leopardize(str) {
return str.replace(keyboard_pattern, replacement_leopard)
}
// define the noteType value for TEXT_NODEs (the kind we want to replace)
// Some browsers may fail to make this value available - it's 3
var TEXT_NODE = Node.TEXT_NODE || 3
// Flag to signal that we're replacing text, so that change doesn't trigger
// another replacement (technically, that can't happen if all the instances
// of "keyboard" that would trigger a replacement have been replaced with
// "leopard", but it's still good practice)
var replacingContent = false
function replaceTextContent(node) {
if (~node.textContent.search(keyboard_pattern)) {
//flag that content is being replaced so the event it generates
//won't trigger another replacement
replacingContent = true
node.textContent = leopardize(node.textContent)
replacingContent = false
}
}
function changeTextNodes(node) {
var length, childNodes
//If this is a text node, leopardize it
if (node.nodeType == TEXT_NODE) {
replaceTextContent(node)
//If this is anything other than a text node, recurse any children
} else {
childNodes = node.childNodes
length = childNodes.length
for(var i=0; i<length; ++i){
changeTextNodes(childNodes[i])
}
}
}
function insertion_listener(event) {
//change any new text nodes in a node that is added to the body
changeTextNodes(event.target)
}
function cdm_listener(event) {
//avoid infinite loop by ignoring events triggered by replacement
if(!replacingContent){
replaceTextContent(event.target)
}
}
changeTextNodes(document.body)
document.title = leopardize(document.title)
document.body.addEventListener ("DOMNodeInserted", insertion_listener, false)
document.body.addEventListener ("DOMCharacterDataModified", cdm_listener, false)