-
Notifications
You must be signed in to change notification settings - Fork 1
/
background.js
124 lines (104 loc) · 2.82 KB
/
background.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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
let genderPairs
let parser = new cssjs();
getGenderedDatabase().then(csv => {
genderPairs = csv
walk(document.body);
})
setTimeout(function () {
getGenderedDatabase().then(csv => {
genderPairs = csv
walk(document.body);
})
}, 1000);
/**
* Gets the gendered database by reading the .csv file.
*
* @returns {Promise<Object>} contains the word pairs from data.csv
*/
async function getGenderedDatabase() {
let csvData = await $.get(chrome.runtime.getURL('data.csv'))
return $.csv.toObjects(csvData)
}
/**
* Walks through a given DOM element.
* Source: http://is.gd/mwZp7E
*
* @param node A DOM element
*/
function walk(node) {
var child, next;
switch (node.nodeType) {
case 1: // Element
case 9: // Document
case 11: // Document fragment
child = node.firstChild;
while (child) {
next = child.nextSibling;
walk(child);
child = next;
}
break;
case 3: // Text node
handleText(node);
break;
}
}
/**
* Handles the text of a given node by replacing all gendered words.
*
* @param {String} textNode A DOM element containing text
*/
function handleText(textNode) {
var v = textNode.nodeValue;
if (!v.startsWith('(function') &&
!v.startsWith('https://') &&
!v.startsWith('http://') &&
// a dirty hack because google search results pages contain *used* CSS
// as text nodes
parser.parseCSS(v).length === 0
) {
genderPairs.forEach(entry => {
v = replaceFromDatabase(v, entry)
})
v = replaceDefaults(v)
}
textNode.nodeValue = v;
}
/**
* Replaces words from the given .csv database
*
* @param text A String
* @param entry An entry from the database
* @returns {text} A possibly de-gendered String
*/
function replaceFromDatabase(text, entry) {
// Creates a Regex for multiple different gender possibilities
let generalized = entry['gegendert'].replace(':', '\[:*_\]')
// Replaces complete words
text = text.replace(
RegExp(`${generalized}`, 'g'),
entry['generisch']
)
return text
}
/**
* Replaces generic gendered suffixes.
*
* @param {String} text A String
* @returns {String} The de-gendered String
*/
function replaceDefaults(text) {
// Replaces :innen, *innen and _innen.
text = text.replace(/[:*_]innen[:*_]?/g, '')
// Replaces :in, *in and _in
text = text.replace(/[:*_]in[:*_]?/g, '')
// Replaces -Innen
text = text.replace(/([A-z]+)Innen\b/g, '$1')
// Replaces -In
text = text.replace(/([A-z]+)In\b/g, '$1')
// Replaces Nominativ
text = text.replace(/([A-z]+)[:*_]e/g, '$1')
// // Replaces Akkusativ
text = text.replace(/([A-z]+)e[:*_]n/g, '$1en')
return text
}