Skip to content

Instantly share code, notes, and snippets.

@fichtennadel
Last active May 26, 2023 22:21
Show Gist options
  • Star 5 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save fichtennadel/2fd33e35a34fcdd9ada68bb7133048c4 to your computer and use it in GitHub Desktop.
Save fichtennadel/2fd33e35a34fcdd9ada68bb7133048c4 to your computer and use it in GitHub Desktop.
Binnen-I be gone
// ==UserScript==
// @name Binnen-I be gone
// @namespace https://gist.github.com/fichtennadel/2fd33e35a34fcdd9ada68bb7133048c4
// @description Removes BinnenI
// @version 2.1
// @license CC by Attribution-Noncommercial-No Derivative Works 3.0 Unported (http://creativecommons.org/licenses/by-nc-nd/3.0/)
// @include *://d*standard.at/*
// @include *://*.d*standard.at/*
// ==/UserScript==
// from https://gist.github.com/fichtennadel/2fd33e35a34fcdd9ada68bb7133048c4/raw/BinnenI.user.js
(function () {
//Suche ob Doppelformen auf der Seite vorhanden sind
if (document.body != null && document.body.textContent.search(/( und |innen | oder | bzw)/) != -1) {
var textnodes = document.evaluate("//*[not(self::textarea) and not(self::script) and not(self::style) and not(descendant-or-self::code)]/text()", document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
for (var i = 0; i < textnodes.snapshotLength; i++) {
var node = textnodes.snapshotItem(i);
var s = node.data;
s = s.replace(/\bsie\/er|er\/sie\b/ig, "er");
s = s.replace(/\bihr\/ihm|ihm\/ihr\b/ig, "ihm");
s = s.replace(/\bsie\/ihn|ihn\/sie\b/ig, "ihn");
s = s.replace(/\bihre?[rnms]?\/(seine?[rnms]?)|(seine?[rnms]?)\/ihre?[rnms]?\b/ig, "$1$2");
s = s.replace(/\jede[rnms]?\/(jede[rnms]?)\b/ig, "$1");
s = s.replace(/\b(deren\/dessen|dessen\/deren)\b/ig, "dessen");
s = s.replace(/\bdiese[r]?\/(diese[rnms])|(diese[rnms])\/diese[r]?\b/ig, "$1$2");
s = s.replace(/\b((von |für |mit )?((d|jed|ein|ihr|zum|sein)(e[rn]?|ie) )?([a-zäöüß]{4,20} )?)([a-zäöüß]{2,})innen( und | oder | & | bzw.? |\/)\2?((d|jed|ein|ihr|zum|sein)(e[rmns]?|ie) )?\6?(\7(e?n?))\b/ig, "$1$12"); //Bürgerinnen und Bürger
s = s.replace(/\b(von |für |mit |als )?(((zu )?d|jed|ein|ihr|zur|sein)(e|er|ie) )?(([a-zäöüß]{4,20}[en]) )?([a-zäöüß]{2,})(en?|in)( und | oder | & | bzw.? |\/)(\1|vom )?((((zu )?d|jed|ein|ihr|zum|sein)(e[nrms])? )?(\7[nrms]? )?(\8(e?(s|n|r)?)))\b/ig, "$1$12"); //die Bürgerin und der Bürger
s = s.replace(/\b((von |für |mit |als )?((d|jed|ein|ihr|zum|sein)(e[rnms]?|ie) )?([a-zäöüß]{4,20}[en] )?([a-zäöüß]{2,})(e?(n|s|r)?))( und | oder | & | bzw.? |\/)(\2|von der )?(((von |zu )?d|jed|ein|ihr|zur|sein)(e[rn]?|ie) )?\6?\7(in(nen)?|en?)\b/ig, "$1"); //Bürger und Bürgerinnen, Bürger und Bürgerin
node.data = s;
}
}
//Suche ob Binnen-Is auf der Seite vorhanden sind
if (document.body != null && document.body.textContent.search(/[a-zäöüß]{2}((\/-?|_|\*| und -)?In|(\/-?|_|\*| und -)in|\([Ii]n*(en\)|\)en)?)(?!(\w{1,2}\b)|[cf]o|stance|te[gr]|dex|dia|dia|put|vent|vit)|[A-ZÄÖÜß]{3}(\/-?|_|\*)IN[(NEN)\b]|\b(frau\/m|man\/frau)\b/) != -1) { //SchülerIn,Schüler/in,Schüler(in),SCHÜLER/IN
var textnodes = document.evaluate("//*[not(self::textarea) and not(self::script) and not(self::style) and not(descendant-or-self::code)]/text()", document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
for (var i = 0; i < textnodes.snapshotLength; i++) {
var node = textnodes.snapshotItem(i);
//Untersuche Text genau auf alles was gefiltert werden soll, zur Weiterverarbeitung...
if (node !== null && /[a-zäöüß]{2}((\/-?|_|\*| und -)?In|(\/-?|_|\*| und -)in(n\*en)?|\([Ii]n*(en\)|\)en)?)(?!(\w{1,2}\b)|[cf]o|stance|te[gr]|dex|dia|dia|put|vent|vit)|[A-ZÄÖÜß]{3}(\/-?|_|\*)IN\b|der\/|die\/|den\/|dem\/|ein[Ee]?\/|zur\/|zum\/|sie|eR |em?\/e?r |em?\(e?r\) |frau\/m|man+\/frau/.test(node.nodeValue)) {
var s = node.data;
//Prüfung auf Ersetzung
if (s.search(/[a-zäöüß](\/-?|_|\*| und -)in(n(\*|\))en)?\b/i) || s.search(/[a-zäöüß]\(in/i) != -1) {
s = s.replace(/(\/-?|_|\*)inn\*?en\b/ig, "Innen"); //Schüler/innen
s = s.replace(/([a-zäöüß])\(inn(en\)|\)en)/i, "$1Innen"); //Schüler(innen)
s = s.replace(/ und -innen\b/ig, ""); //und -innen
s = s.replace(/(\/-?|_|\*)in\b/ig, "In"); //Schüler/in
s = s.replace(/([a-zäöüß])\(in\)/i, "$1In"); //Schüler(in)
}
//Plural
if (s.search(/[a-zäöüß]Innen/i) != -1) {
//Prüfung auf Sonderfälle
if (s.search(/(chef|gött|verbesser|äur|äs)innen/i) != -1) {
s = s.replace(/(C|c)hefInnen/g, "$1hefs");
s = s.replace(/([Gg]ött|verbesser)(?=Innen)/g, "$1er");
s = s.replace(/äurInnen/g, "auern");
s = s.replace(/äsInnen/g, "asen");
}
s = s.replace(/\b(([Dd]en|[Aa]us|[Aa]ußer|[Bb]ei|[Dd]ank|[Gg]egenüber|[Ll]aut|[Mm]it(samt)?|[Nn]ach|[Ss]amt|[Vv]on|[Zz]u) ([a-zäöüß]+en )?[A-ZÄÖÜ][a-zäöüß]+)erInnen\b/g, "$1ern"); //unregelmäßiger Dativ bei Wörtern auf ...erInnen
s = s.replace(/(er?|ER?)Innen/g, "$1");
s = s.replace(/([Aa]nwält|[Ää]rzt|e[iu]nd|rät|amt|äst|würf|äus|[ai(eu)]r|irt)Innen/g, "$1e");
s = s.replace(/([nrtsmdfghpbklvwNRTSMDFGHPBKLVW])Innen/g, "$1en");
}
//Singular
if (s.search(/[a-zäöüß]In/) != -1 && s.search(/([Pp]lug|[Ll]og|[Aa]dd|Linked)In\b/) == -1) {
//Prüfung auf Sonderfälle
if (s.search(/amtIn|stIn\B|verbesser(?=In)/) != -1) {
s = s.replace(/verbesser(?=In)/g, "verbesserer");
s = s.replace(/amtIn/g, "amter");
s = s.replace(/stIn\B/g, "sten"); //JournalistInfrage
}
//Prüfung auf Umlaute
if (s.search(/[äöüÄÖÜ][a-z]{0,3}In/) != -1) {
s = s.replace(/ä(?=s(t)?In|tIn|ltIn|rztIn)/g, "a");
s = s.replace(/ÄrztIn/g, "Arzt");
s = s.replace(/ö(?=ttIn|chIn)/g, "o");
s = s.replace(/ü(?=rfIn)/g, "u");
s = s.replace(/ündIn/g, "und");
s = s.replace(/äurIn/g, "auer");
}
s = s.replace(/([skgvwzSKGVWZ]|ert|[Bb]rit|[Kk]und|ach)In(?!(\w{1,2}\b)|[cf]o|stance|te[gr]|dex|dia|dia|put|vent|vit)/g, "$1e"); //ExpertIn, BritIn, KundIn, WachIn
s = s.replace(/([nrtmdbplhfcNRTMDBPLHFC])In(?!(\w{1,2}\b)|[cf]o|stance|te[gr]|dex|dia|dia|put|vent|vit)/g, "$1");
}
//Artikel
if (s.search(/\/der |\/die |ein(\/|\()e|zu[rm] /i) != -1) {
s = s.replace(/\b(die\/der|der\/die)\b/ig, "der");
s = s.replace(/\b(den\/die|die\/den)\b/ig, "den");
s = s.replace(/\b(des\/der|der\/des)\b/ig, "des");
s = s.replace(/\b(der\/dem|dem\/der)\b/ig, "dem");
s = s.replace(/\bein(\/e |\(e\) |E )/g, "ein ");
s = s.replace(/\beine(\/n |\(n\) |N )/g, "einen ");
s = s.replace(/\b(zum\/zur|zur\/zum)\b/ig, "zum");
}
//Stuff
if (s.search(/eR |em?\/e?r |em?\(e?r\) /) != -1) {
s = s.replace(/e\/r|e\(r\)|eR\b/g, "er"); //jede/r,jede(r),jedeR,
s = s.replace(/em\(e?r\)|em\/r\b/g, "em"); //jedem/r
s = s.replace(/er\(e?s\)|es\/r\b/g, "es"); //jedem/r
}
//man
if (s.search(/\/(frau|man|mensch)/) != -1) {
s = s.replace(/\b(frau|man+|mensch)+\/(frau|man+|mensch|\/)*/, "man");
}
node.data = s; }}
}
})();
@DrDustwolf
Copy link

Damit es auf allen Internetseiten funktioniert habe ich dem Userscript folgende Zeile hinzugefügt:
"// @include *"

Aber leider sind immer noch einige innen im Text vorhanden z.B. auf dieser Internetseite:
https://www.gentechnikfreie-regionen.de/
Aus dem Wort "Bäuer
innen" wird "Bäuer".
Ein Beispielsatz wie er nun etwas sonderlich angezeigt wird:
"Die Gründung einer Gentechnik­freien Region kommt vor allem durch die Aktivitäten von Land- und Forstwirte, Gärtner­innen und Imker­innen zustande."

Ich verwende den Firfox-Fork Iceraven auf einem LineageOS-Gerät. Vielleicht wäre es neben einem Update des Userscripts auch möglich das Add-on zur von diesem Browser verwendeten Sammlung der unterstützten Erweiterungen hinzuzufügen?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment