Hier meine Lösung, die auf Rekursion basiert. Außerdem sieht man dem funktionsorientierten Code an, dass ich noch nicht ganz in der OOP angekommen bin...:
setTimeout(function(){
const SSHY = '\-' ; // Symbolic Soft Hyphen
// const SHY = '\u00AD' ; // Unicode "Soft Hyphen" U+00AD
const SHY = '|*|' ; // Test Soft Hypen
var dictionary = {
Streikende : 'Strei\-ken\-de',
Staubecken : 'Stau\-becken',
Teilerfolge : 'Teil\-erfolge',
Urinstinkt : 'Ur\-instinkt',
Analphabeten : 'An\-alpha\-beten',
};
regex = new RegExp( SSHY, 'g');
jQuery.each(dictionary,function(key,val){
dictionary[key] = val.replace(regex,SHY);
});
function applyDictionary(str) {
if ( str.trim === '' ){ return str }; \\ Text-Nodes überspringen, die nur aus Whitespaces bestehen
jQuery.each(dictionary,function(key,val){
regex = new RegExp(key, 'g');
str = str.replace(regex,val);
});
return str;
}
function replaceInText(element) {
for (let node of element.childNodes) {
if (node.id === 'wiki__text') { continue } \\ Editor-Fenster auslassen
switch (node.nodeType) {
case Node.ELEMENT_NODE:
replaceInText(node);
break;
case Node.TEXT_NODE:
node.textContent = applyDictionary(node.textContent);
}
}
}
replaceInText(document.querySelectorAll("body")[0]); \\ Trennungen nur innerhalb des BODYs
}, 50);
... und da ließe sich sicherlich noch einiges wesentlich eleganter formulieren. Zu meiner Entschuldigung: Das letzte Mal, wo ich ernsthaft programmiert habe, liegt gut drei Jahrzehnte zurück. Ich bin froh, es überhaupt irgendwie hingefrickelt bekommen zu haben... Immerhin scheint es erst einmal zu funktionieren.
- Michael Sy.