{"id":2216,"date":"2024-07-11T21:08:41","date_gmt":"2024-07-11T19:08:41","guid":{"rendered":"https:\/\/175er-verlag.org\/.recherchiert\/?page_id=2216"},"modified":"2026-10-04T19:12:29","modified_gmt":"2026-10-04T17:12:29","slug":"serviceseite","status":"publish","type":"page","link":"https:\/\/175er-verlag.org\/.recherchiert\/serviceseite","title":{"rendered":"Ser\u00advice-Sei\u00adten f\u00fcr mei\u00adne Besucher"},"content":{"rendered":"\n<h3 class=\"wp-block-heading has-text-align-center\"><strong>Klei\u00adne Pro\u00adgram\u00adme mit gro\u00ad\u00dfer Wirkung<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Hier bie\u00adte ich al\u00adlen Be\u00adsu\u00adchern ei\u00adni\u00adge n\u00fctz\u00adli\u00adche Hilfs\u00admit\u00adtel an, die f\u00fcr den (fast) t\u00e4g\u00adli\u00adchen Ge\u00adbrauch vom Vor\u00adteil sind, da sie so man\u00adche Ar\u00adbei\u00adten er\u00adleich\u00adtern. <br>F\u00fcr den An\u00adfang die ers\u00adten klei\u00adnen HTML-Pro\u00adgram\u00adme, die ich er\u00adstellt ha\u00adbe, da ich sie st\u00e4n\u00addig nut\u00adze. Nach und nach fol\u00adgen wei\u00adte\u00adre HTML-Werkzeuge.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Sil\u00adben\u00adz\u00e4h\u00adler (nicht nur) f\u00fcr Liedtexte<\/strong><\/li>\n\n\n\n<li><strong>Zei\u00adlen (ePost- und an\u00adde\u00adre Adres\u00adsen \u2026) sor\u00adtie\u00adren und Du\u00adpli\u00adka\u00adte finden<\/strong><\/li>\n\n\n\n<li><strong>ePost-Adres\u00adsen aus ei\u00adnem x\u2011beliebigen Text extrahieren<\/strong><\/li>\n\n\n\n<li><strong>ePost-Adres\u00adsen be\u00adrei\u00adni\u00adgen (zwei Lis\u00adten ver\u00adglei\u00adchen und Neue erstellen)<\/strong><\/li>\n\n\n\n<li>und wei\u00adte\u00adre \u2026<\/li>\n\n\n\n<li><strong>In Ar\u00adbeit:<\/strong> Lan\u00adge In\u00adter\u00adnet-Adres\u00adsen (mit Wunsch\u00adna\u00admen) k\u00fcrzen<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<!-- RoZe-Programm: Ein HTML-Service vom 175er Verlag -->\n<meta charset=\"UTF-8\">\n  <title>RoZe-Programm*: Silbenz\u00e4hler (nicht nur) f\u00fcr Lied-Texte<\/title>\n  <style>\n    .roze-silbenzaehler {\n      font-family: Arial, sans-serif;\n      background-color: #fbe8f0;\n      padding: 20px;\n      border-radius: 12px;\n      box-shadow: 0 4px 14px rgba(0, 0, 0, 0.12);\n      box-sizing: border-box;\n    }\n    .roze-silbenzaehler * {\n      box-sizing: border-box;\n    }\n    .roze-silbenzaehler .titelbalken {\n      background-color: #ff6699;\n      color: #ffffff;\n      font-weight: bold;\n      font-size: 1.3em;\n      text-align: center;\n      padding: 12px 20px;\n      border-radius: 8px;\n      width: 100%;\n      margin-bottom: 12px;\n    }\n    .roze-silbenzaehler .titelbalken .sternchen {\n      font-weight: normal;\n    }\n    .roze-silbenzaehler .beschreibung {\n      font-size: 0.95em;\n      color: #333;\n      line-height: 1.4em;\n      margin: 0 0 15px 0;\n    }\n    .roze-silbenzaehler .beschreibung strong {\n      display: block;\n      margin-bottom: 8px;\n    }\n    .roze-silbenzaehler .spalten {\n      display: flex;\n      gap: 20px;\n      flex-wrap: wrap;\n      align-items: stretch;\n    }\n    .roze-silbenzaehler .spalte-eingabe {\n      flex: 3;\n      min-width: 280px;\n      display: flex;\n      flex-direction: column;\n    }\n    .roze-silbenzaehler .spalte-ergebnis {\n      flex: 2;\n      min-width: 160px;\n      display: flex;\n      flex-direction: column;\n    }\n    .roze-silbenzaehler h3 {\n      color: #ff6699;\n      font-weight: bold;\n      margin-top: 0;\n      margin-bottom: 8px;\n    }\n    .roze-silbenzaehler textarea,\n    .roze-silbenzaehler .ausgabefeld {\n      width: 100%;\n      height: 350px;\n      max-height: 350px;\n      padding: 10px;\n      border: 1px solid #e0b8c8;\n      border-radius: 8px;\n      background-color: #fffafc;\n      font-family: Arial, sans-serif;\n      font-size: 1em;\n      color: #333;\n      overflow-y: auto;\n      white-space: pre-wrap;\n      word-break: break-word;\n      margin: 0;\n      line-height: normal;\n    }\n    .roze-silbenzaehler textarea {\n      resize: none;\n      margin-bottom: 15px;\n    }\n    .roze-silbenzaehler .knopfreihe {\n      display: flex;\n      gap: 10px;\n      margin-top: 12px;\n      margin-bottom: 0;\n    }\n    .roze-silbenzaehler button {\n      background-color: #ff6699;\n      color: #ffffff;\n      font-weight: bold;\n      border: 2px solid #ff6699;\n      border-radius: 8px;\n      padding: 10px 20px;\n      font-size: 0.95em;\n      cursor: pointer;\n      flex: 1;\n      outline: none;\n    }\n    .roze-silbenzaehler button:hover,\n    .roze-silbenzaehler button:focus,\n    .roze-silbenzaehler button:active {\n      background-color: #ffffff;\n      color: #ff6699;\n      border: 2px solid #ff6699;\n      outline: none;\n      box-shadow: none;\n    }\n    .roze-silbenzaehler .knopfreihe-klein button {\n      font-size: 0.85em;\n      padding: 10px 10px;\n      white-space: nowrap;\n    }\n    .roze-silbenzaehler .reset-zeile {\n      margin-top: 12px;\n    }\n    .roze-silbenzaehler .reset-zeile button {\n      width: 100%;\n    }\n    .roze-silbenzaehler .note {\n      font-size: 0.9em;\n      font-style: italic;\n      color: #ff6699;\n      margin-top: 8px;\n    }\n  <\/style>\n\n  <div class=\"roze-silbenzaehler\">\n\n    <div class=\"titelbalken\">Ro\u00adZe-Pro\u00adgramm<span class=\"sternchen\">*<\/span>: Sil\u00adben\u00adz\u00e4h\u00adler (nicht nur) f\u00fcr Liedtexte<\/div>\n    <div class=\"beschreibung\">\n      <strong>Was macht die\u00adses klei\u00adne Hilfsprogramm:<\/strong> Z\u00e4hlt au\u00adto\u00adma\u00adtisch z. B. die Sil\u00adben ei\u00adnes Lied-Tex\u00adtes, wahl\u00adwei\u00adse als An\u00adzei\u00adge pro Wort, als Sum\u00adme pro Zei\u00adle und wei\u00adte\u00adre M\u00f6g\u00adlich\u00adkei\u00adten. Text ein\u00adge\u00adben, Mo\u00addus w\u00e4h\u00adlen, das Er\u00adgeb\u00adnis er\u00adscheint darunter.&nbsp;<\/div>\n\n    <div class=\"spalten\">\n      <div class=\"spalte-eingabe\">\n        <h3>Text-Ein\u00adga\u00adbe<\/h3>\n        <textarea id=\"lyrics-sz\" placeholder=\"Hier deinen Text eingeben...\"><\/textarea>\n        <div class=\"knopfreihe knopfreihe-klein\">\n          <button onclick=\"szSetMode('lines')\">Silben\/Zeile<\/button>\n          <button onclick=\"szSetMode('strophen')\">Silben\/Strophe<\/button>\n          <button onclick=\"szSetMode('summe')\">Gesamt\/Silben<\/button>\n        <\/div>\n        <div class=\"knopfreihe knopfreihe-klein\">\n          <button onclick=\"szSetMode('abweichung')\">Auff\u00e4llige Zeilen<\/button>\n          <button onclick=\"szSetMode('words')\">Silbenanzahl\/Wort<\/button>\n        <\/div>\n      <\/div>\n      <div class=\"spalte-ergebnis\">\n        <h3>Er\u00adgeb\u00adnis<\/h3>\n        <div class=\"ausgabefeld\" id=\"result-sz\"><\/div>\n        <div class=\"reset-zeile\">\n          <button onclick=\"szCopyResult()\">Ergebnis kopieren<\/button>\n        <\/div>\n        <div class=\"reset-zeile\">\n          <button onclick=\"szResetAll()\">Zur\u00fccksetzen<\/button>\n        <\/div>\n      <\/div>\n    <\/div>\n\n    <div class=\"note\">* Ro\u00adZe = (Herr) Ro\u00adsa von Zehn\u00adle (\u00far) \u2013 Ein kos\u00adten\u00adlo\u00adser HTML-Ser\u00advice vom 175er Verlag!<\/div>\n\n  <\/div>\n\n  <!-- Ein Service vom 175er Verlag -->\n\n  <script>\n  (function() {\n    let szMode = 'words'; \/\/ Standardmodus\n\n    function szEstimateSyllables(word) {\n        word = word.toLowerCase().replace(\/[^a-z\u00e4\u00f6\u00fc\u00df]\/g,''); \/\/ nur Buchstaben z\u00e4hlen\n        if(word.length <= 3) return 1;\n        let matches = word.match(\/[aeiou\u00e4\u00f6\u00fcy]{1,2}\/g);\n        return matches ? matches.length : 1;\n    }\n\n    \/\/ Alle Silben pro Wort + Gesamtsumme\n    function szCountSyllablesWords(text) {\n        let lines = text.split('\\n');\n        let output = \"\";\n        for(let line of lines) {\n            if (line.trim() === \"\") {\n                output += \"\\n\";\n                continue;\n            }\n            let words = line.trim().split(\/\\s+\/).filter(w => w.length > 0);\n            let syllsPerWord = words.map(w => szEstimateSyllables(w));\n            let lineResult = words.map((w,i) => `${w}(${syllsPerWord[i]})`).join(' ');\n            let total = syllsPerWord.reduce((a,b)=>a+b,0);\n            output += lineResult + ` = ${total}\\n`;\n        }\n        return output;\n    }\n\n    \/\/ Nur Silben pro Zeile\n    function szCountSyllablesLines(text) {\n        let lines = text.split('\\n');\n        let output = \"\";\n        for(let i=0;i<lines.length;i++){\n            if (lines[i].trim() === \"\") {\n                output += \"\\n\";\n                continue;\n            }\n            let words = lines[i].trim().split(\/\\s+\/).filter(w=>w.length>0);\n            let total = words.reduce((sum,w)=>sum+szEstimateSyllables(w),0);\n            output += `Zeile ${i+1}: ${total} Silben\\n`;\n        }\n        return output;\n    }\n\n    \/\/ Gesamtsumme aller Silben im Text\n    function szCountSyllablesSumme(text) {\n        let lines = text.split('\\n');\n        let total = 0;\n        lines.forEach(line => {\n            if (line.trim() === \"\") return;\n            let words = line.trim().split(\/\\s+\/).filter(w=>w.length>0);\n            total += words.reduce((sum,w)=>sum+szEstimateSyllables(w),0);\n        });\n        return `Gesamt: ${total} Silben`;\n    }\n\n    \/\/ Auff\u00e4llige Zeilen: starke Abweichung vom Durchschnitt farblich markieren\n    function szCountSyllablesAbweichung(text) {\n        let lines = text.split('\\n');\n        let counts = lines.map(line => {\n            if (line.trim() === \"\") return null;\n            let words = line.trim().split(\/\\s+\/).filter(w=>w.length>0);\n            return words.reduce((sum,w)=>sum+szEstimateSyllables(w),0);\n        });\n        let valide = counts.filter(c => c !== null);\n        let durchschnitt = valide.length ? valide.reduce((a,b)=>a+b,0)\/valide.length : 0;\n        let output = `Durchschnitt: ${durchschnitt.toFixed(1)} Silben pro Zeile\\n\\n`;\n        counts.forEach((c, i) => {\n            if (c === null) { output += \"\\n\"; return; }\n            let zeileText = `Zeile ${i+1}: ${c} Silben`;\n            if (Math.abs(c - durchschnitt) > 1) {\n                output += `<span style=\"color:#cc0033; font-weight:bold;\">${zeileText}<\/span>\\n`;\n            } else {\n                output += zeileText + \"\\n\";\n            }\n        });\n        return output;\n    }\n\n    \/\/ Silbensumme pro Strophe (Abs\u00e4tze, getrennt durch Leerzeilen)\n    function szCountSyllablesStrophen(text) {\n        let strophen = text.split(\/\\n\\s*\\n\/);\n        let output = \"\";\n        strophen.forEach((strophe, idx) => {\n            let lines = strophe.split('\\n').filter(l => l.trim() !== \"\");\n            let total = 0;\n            lines.forEach(line => {\n                let words = line.trim().split(\/\\s+\/).filter(w=>w.length>0);\n                total += words.reduce((sum,w)=>sum+szEstimateSyllables(w),0);\n            });\n            output += `Strophe ${idx+1}: ${total} Silben\\n`;\n        });\n        return output;\n    }\n\n    \/\/ Modus setzen\n    window.szSetMode = function(selectedMode){\n        szMode = selectedMode;\n        szUpdateOutput();\n    };\n\n    const szTextarea = document.getElementById('lyrics-sz');\n    szTextarea.addEventListener('input', () => {\n        szUpdateOutput();\n    });\n\n    function szUpdateOutput(){\n        let text = szTextarea.value;\n        let resultDiv = document.getElementById('result-sz');\n        if (szMode === 'abweichung') {\n            resultDiv.innerHTML = szCountSyllablesAbweichung(text);\n        } else {\n            let result;\n            switch(szMode) {\n                case 'lines':\n                    result = szCountSyllablesLines(text);\n                    break;\n                case 'summe':\n                    result = szCountSyllablesSumme(text);\n                    break;\n                case 'strophen':\n                    result = szCountSyllablesStrophen(text);\n                    break;\n                default:\n                    result = szCountSyllablesWords(text);\n            }\n            resultDiv.innerText = result;\n        }\n    }\n\n    \/\/ Initiales Update\n    szUpdateOutput();\n\n    \/\/ Ergebnis in die Zwischenablage kopieren\n    window.szCopyResult = function(){\n        const text = document.getElementById('result-sz').innerText;\n        if (!text) return;\n        navigator.clipboard.writeText(text)\n            .then(() => alert('Ergebnis wurde in die Zwischenablage kopiert!'))\n            .catch(err => alert('Fehler beim Kopieren: ' + err));\n    };\n\n    \/\/ Alles in den Urzustand zur\u00fcckversetzen\n    window.szResetAll = function(){\n        szTextarea.value = \"\";\n        document.getElementById('result-sz').innerText = \"\";\n        szMode = 'words';\n        if (document.activeElement && document.activeElement.blur) {\n            document.activeElement.blur();\n        }\n    };\n  })();\n  <\/script>\n<br><br><br>\n\n\n\n<!-- RoZe-Programm: Ein Service vom 175er Verlag -->\n<meta charset=\"UTF-8\">\n  <title>RoZe-Programm*: Zeilen sortieren und Duplikate finden<\/title>\n  <style>\n    .roze-zeilensortierer {\n      font-family: Arial, sans-serif;\n      background-color: #fbe8f0 !important;\n      padding: 20px !important;\n      border-radius: 12px !important;\n      box-shadow: 0 4px 14px rgba(0, 0, 0, 0.12) !important;\n      box-sizing: border-box;\n    }\n    .roze-zeilensortierer * {\n      box-sizing: border-box;\n    }\n    .roze-zeilensortierer .titelbalken {\n      background-color: #ff6699 !important;\n      color: #ffffff !important;\n      font-weight: bold;\n      font-size: 1.3em;\n      text-align: center;\n      padding: 12px 20px !important;\n      border-radius: 8px !important;\n      width: 100%;\n      margin-bottom: 12px;\n    }\n    .roze-zeilensortierer .titelbalken .sternchen {\n      font-weight: normal;\n    }\n    .roze-zeilensortierer .beschreibung {\n      font-size: 0.95em;\n      color: #333;\n      line-height: 1.4em;\n      margin: 0 0 15px 0;\n    }\n    .roze-zeilensortierer .beschreibung strong {\n      display: block;\n      margin-bottom: 8px;\n    }\n    .roze-zeilensortierer .spalten {\n      display: flex;\n      gap: 20px;\n      flex-wrap: wrap;\n      align-items: stretch;\n    }\n    .roze-zeilensortierer .spalte-eingabe,\n    .roze-zeilensortierer .spalte-ergebnis {\n      flex: 1;\n      min-width: 280px;\n      display: flex;\n      flex-direction: column;\n    }\n    .roze-zeilensortierer h3 {\n      color: #ff6699 !important;\n      font-weight: bold;\n      margin-top: 0;\n      margin-bottom: 8px;\n    }\n    .roze-zeilensortierer textarea,\n    .roze-zeilensortierer .ausgabefeld {\n      width: 100% !important;\n      height: 350px !important;\n      max-height: 350px !important;\n      padding: 10px !important;\n      border: 1px solid #e0b8c8 !important;\n      border-radius: 8px !important;\n      background-color: #fffafc !important;\n      font-family: Arial, sans-serif !important;\n      font-size: 1em !important;\n      color: #333 !important;\n      overflow-y: auto !important;\n      white-space: pre-wrap;\n      word-break: break-word;\n      margin: 0 !important;\n      line-height: normal !important;\n    }\n    .roze-zeilensortierer textarea {\n      resize: none;\n      margin-bottom: 10px !important;\n    }\n    .roze-zeilensortierer .zaehler {\n      margin: 8px 0;\n      font-weight: bold;\n      color: #333;\n    }\n    .roze-zeilensortierer .knopfreihe-gesamt {\n      display: flex;\n      gap: 10px;\n      margin-top: 15px;\n    }\n    .roze-zeilensortierer button {\n      background-color: #ff6699 !important;\n      color: #ffffff !important;\n      font-weight: bold;\n      border: 2px solid #ff6699 !important;\n      border-radius: 8px !important;\n      padding: 10px 14px !important;\n      font-size: 0.9em;\n      cursor: pointer;\n      flex: 1;\n      outline: none;\n      white-space: normal;\n      line-height: 1.3em;\n      text-align: center;\n    }\n    .roze-zeilensortierer button:hover,\n    .roze-zeilensortierer button:focus,\n    .roze-zeilensortierer button:active {\n      background-color: #ffffff !important;\n      color: #ff6699 !important;\n      border: 2px solid #ff6699 !important;\n      outline: none;\n      box-shadow: none;\n    }\n    .roze-zeilensortierer .duplicate {\n      color: #cc0033;\n      font-weight: bold;\n    }\n    .roze-zeilensortierer .note {\n      font-size: 0.9em;\n      font-style: italic;\n      color: #ff6699;\n      margin-top: 15px;\n    }\n  <\/style>\n\n  <div class=\"roze-zeilensortierer\">\n\n    <div class=\"titelbalken\">Ro\u00adZe-Pro\u00adgramm<span class=\"sternchen\">*<\/span>: Zei\u00adlen sor\u00adtie\u00adren und Du\u00adpli\u00adka\u00adte finden<\/div>\n    <div class=\"beschreibung\">\n      <strong>Was macht die\u00adses klei\u00adne Hilfsprogramm:<\/strong> Sor\u00adtiert ein\u00adge\u00adge\u00adbe\u00adne Zei\u00adlen al\u00adpha\u00adbe\u00adtisch und zeigt Du\u00adblet\u00adten deut\u00adlich an, wahl\u00adwei\u00adse mar\u00adkiert oder di\u00adrekt ent\u00adfernt. Text ein\u00adge\u00adben, ge\u00adw\u00fcnsch\u00adte Funk\u00adti\u00adon w\u00e4h\u00adlen, das Er\u00adgeb\u00adnis er\u00adscheint rechts.<br> N\u00fctz\u00adlich et\u00adwa f\u00fcr ePost-Ver\u00adtei\u00adler (dop\u00adpel\u00adte oder mehr\u00adfach glei\u00adche vor\u00adkom\u00admen\u00adde ePost-Adres\u00adsen), Post\u00adan\u00adschrif\u00adten, Na\u00admens- und Teil\u00adneh\u00admer\u00adlis\u00adten oder Quel\u00adlen\u00adver\u00adzeich\u00adnis\u00adse, wenn meh\u00adre\u00adre Lis\u00adten zu\u00adsam\u00admen\u00adge\u00adf\u00fchrt wer\u00adden sollen.&nbsp;<\/div>\n\n    <div class=\"spalten\">\n      <div class=\"spalte-eingabe\">\n        <h3>Text-Ein\u00adga\u00adbe<\/h3>\n        <textarea id=\"rzs-inputText\" placeholder=\"Hier Zeilen eingeben...\"><\/textarea>\n        <div class=\"zaehler\">Ein\u00adga\u00adbe\u00adzei\u00adlen: <span id=\"rzs-inputCount\">0<\/span><\/div>\n      <\/div>\n      <div class=\"spalte-ergebnis\">\n        <h3>Er\u00adgeb\u00adnis<\/h3>\n        <div class=\"ausgabefeld\" id=\"rzs-output\"><\/div>\n        <div class=\"zaehler\">Er\u00adgeb\u00adnis\u00adzei\u00adlen: <span id=\"rzs-outputCount\">0<\/span><\/div>\n      <\/div>\n    <\/div>\n\n    <div class=\"knopfreihe-gesamt\">\n      <button onclick=\"rzsSortLines()\">Duplikate<br>markieren<\/button>\n      <button onclick=\"rzsSortAndRemoveDuplicates()\">Duplikate<br>l\u00f6schen<\/button>\n      <button onclick=\"rzsCopyOutput()\">Ergebnis<br>kopieren<\/button>\n      <button onclick=\"rzsResetAll()\">Alles<br>l\u00f6schen<\/button>\n    <\/div>\n\n    <div class=\"note\">* Ro\u00adZe = (Herr) Ro\u00adsa von Zehn\u00adle (\u00far) \u2013 Ein kos\u00adten\u00adlo\u00adser HTML-Ser\u00advice vom 175er Verlag!<\/div>\n\n  <\/div>\n\n  <!-- Ein Service vom 175er Verlag -->\n\n  <script>\n  (function() {\n    let rzsOutputLines = [];\n\n    \/\/ Hilfsfunktion: Zeile bereinigen (Leerzeichen + , ; am Ende entfernen)\n    function rzsCleanLine(line) {\n      return line.trim()\n                 .replace(\/\\s*[;,]+$\/g, \"\")  \/\/ entfernt Leerzeichen + , ; am Ende\n                 .toLowerCase();             \/\/ optional: macht alles klein\n    }\n\n    function rzsUpdateCounts(inputLines, outputLinesCount) {\n      document.getElementById(\"rzs-inputCount\").textContent = inputLines.length;\n      document.getElementById(\"rzs-outputCount\").textContent = outputLinesCount;\n    }\n\n    window.rzsSortLines = function() {\n      let text = document.getElementById(\"rzs-inputText\").value;\n      let lines = text.split(\/\\r?\\n\/)\n                      .map(line => rzsCleanLine(line))\n                      .filter(line => line !== \"\");\n      lines.sort((a, b) => a.localeCompare(b, 'de', {sensitivity: 'base'}));\n\n      rzsOutputLines = [];\n      let outputHTML = \"\";\n      for (let i = 0; i < lines.length; i++) {\n        if (i > 0 && lines[i] === lines[i - 1]) {\n          outputHTML += `<span class=\"duplicate\">${lines[i]}  *Doppelt*<\/span><br>`;\n          rzsOutputLines.push(lines[i] + '  *Doppelt*');\n        } else {\n          outputHTML += lines[i] + \"<br>\";\n          rzsOutputLines.push(lines[i]);\n        }\n      }\n      document.getElementById(\"rzs-output\").innerHTML = outputHTML;\n      rzsUpdateCounts(lines, rzsOutputLines.length);\n    };\n\n    window.rzsSortAndRemoveDuplicates = function() {\n      let text = document.getElementById(\"rzs-inputText\").value;\n      let lines = text.split(\/\\r?\\n\/)\n                      .map(line => rzsCleanLine(line))\n                      .filter(line => line !== \"\");\n      lines.sort((a, b) => a.localeCompare(b, 'de', {sensitivity: 'base'}));\n\n      let unique = [];\n      lines.forEach(line => { if (!unique.includes(line)) unique.push(line); });\n\n      rzsOutputLines = [...unique];\n      document.getElementById(\"rzs-output\").textContent = unique.join(\"\\n\");\n      rzsUpdateCounts(lines, rzsOutputLines.length);\n    };\n\n    window.rzsCopyOutput = function() {\n      if (rzsOutputLines.length === 0) return;\n      const textToCopy = rzsOutputLines.join('\\n');\n      navigator.clipboard.writeText(textToCopy)\n        .then(() => alert('Ergebnis wurde in die Zwischenablage kopiert!'))\n        .catch(err => alert('Fehler beim Kopieren: ' + err));\n    };\n\n    window.rzsResetAll = function() {\n      document.getElementById(\"rzs-inputText\").value = \"\";\n      document.getElementById(\"rzs-output\").innerHTML = \"\";\n      document.getElementById(\"rzs-inputCount\").textContent = \"0\";\n      document.getElementById(\"rzs-outputCount\").textContent = \"0\";\n      rzsOutputLines = [];\n      if (document.activeElement && document.activeElement.blur) {\n        document.activeElement.blur();\n      }\n    };\n  })();\n  <\/script>\n<br><br><br>\n\n\n\n<!-- RoZe-Programm: Ein Service vom 175er Verlag -->\n<meta charset=\"UTF-8\">\n  <title>RoZe-Programm*: ePost-Adressen aus Text extrahieren<\/title>\n  <style>\n    .roze-epost-extrahieren {\n      font-family: Arial, sans-serif;\n      background-color: #fbe8f0 !important;\n      padding: 20px !important;\n      border-radius: 12px !important;\n      box-shadow: 0 4px 14px rgba(0, 0, 0, 0.12) !important;\n      box-sizing: border-box;\n    }\n    .roze-epost-extrahieren * {\n      box-sizing: border-box;\n    }\n    .roze-epost-extrahieren .titelbalken {\n      background-color: #ff6699 !important;\n      color: #ffffff !important;\n      font-weight: bold;\n      font-size: 1.3em;\n      text-align: center;\n      padding: 12px 20px !important;\n      border-radius: 8px !important;\n      width: 100%;\n      margin-bottom: 12px;\n    }\n    .roze-epost-extrahieren .titelbalken .sternchen {\n      font-weight: normal;\n    }\n    .roze-epost-extrahieren .beschreibung {\n      font-size: 0.95em;\n      color: #333;\n      line-height: 1.4em;\n      margin: 0 0 15px 0;\n    }\n    .roze-epost-extrahieren .beschreibung strong {\n      display: block;\n      margin-bottom: 8px;\n    }\n    .roze-epost-extrahieren .spalten {\n      display: flex;\n      gap: 20px;\n      flex-wrap: wrap;\n      align-items: stretch;\n    }\n    .roze-epost-extrahieren .spalte-eingabe,\n    .roze-epost-extrahieren .spalte-ergebnis {\n      flex: 1;\n      min-width: 280px;\n      display: flex;\n      flex-direction: column;\n    }\n    .roze-epost-extrahieren h3 {\n      color: #ff6699 !important;\n      font-weight: bold;\n      margin-top: 0;\n      margin-bottom: 8px;\n    }\n    .roze-epost-extrahieren textarea,\n    .roze-epost-extrahieren .ausgabefeld {\n      width: 100% !important;\n      height: 350px !important;\n      max-height: 350px !important;\n      padding: 10px !important;\n      border: 1px solid #e0b8c8 !important;\n      border-radius: 8px !important;\n      background-color: #fffafc !important;\n      font-family: Arial, sans-serif !important;\n      font-size: 1em !important;\n      color: #333 !important;\n      overflow-y: auto !important;\n      white-space: pre-wrap;\n      word-break: break-all;\n      margin: 0 !important;\n      line-height: normal !important;\n    }\n    .roze-epost-extrahieren textarea {\n      resize: none;\n      margin-bottom: 10px !important;\n    }\n    .roze-epost-extrahieren .zaehler {\n      margin: 8px 0;\n      font-weight: bold;\n      color: #333;\n    }\n    .roze-epost-extrahieren .knopfreihe-gesamt {\n      display: flex;\n      gap: 10px;\n      margin-top: 15px;\n    }\n    .roze-epost-extrahieren button {\n      background-color: #ff6699 !important;\n      color: #ffffff !important;\n      font-weight: bold;\n      border: 2px solid #ff6699 !important;\n      border-radius: 8px !important;\n      padding: 10px 14px !important;\n      font-size: 0.9em;\n      cursor: pointer;\n      flex: 1;\n      outline: none;\n      white-space: normal;\n      line-height: 1.3em;\n      text-align: center;\n    }\n    .roze-epost-extrahieren button:hover,\n    .roze-epost-extrahieren button:focus,\n    .roze-epost-extrahieren button:active {\n      background-color: #ffffff !important;\n      color: #ff6699 !important;\n      border: 2px solid #ff6699 !important;\n      outline: none;\n      box-shadow: none;\n    }\n    .roze-epost-extrahieren .note {\n      font-size: 0.9em;\n      font-style: italic;\n      color: #ff6699;\n      margin-top: 15px;\n    }\n  <\/style>\n\n  <div class=\"roze-epost-extrahieren\">\n\n    <div class=\"titelbalken\">Ro\u00adZe-Pro\u00adgramm<span class=\"sternchen\">*<\/span>: ePost-Adres\u00adsen aus Text extrahieren<\/div>\n    <div class=\"beschreibung\">\n      <strong>Was macht die\u00adses klei\u00adne Hilfsprogramm:<\/strong> Fil\u00adtert au\u00adto\u00adma\u00adtisch al\u00adle ePost-Adres\u00adsen aus ei\u00adnem be\u00adlie\u00adbig lan\u00adgen Text her\u00adaus, ent\u00adfernt Du\u00adblet\u00adten und sor\u00adtiert al\u00adpha\u00adbe\u00adtisch. Text ein\u00adge\u00adben, ex\u00adtra\u00adhie\u00adren, das Er\u00adgeb\u00adnis er\u00adscheint rechts.<br> N\u00fctz\u00adlich zum Bei\u00adspiel bei R\u00fcck\u00adl\u00e4u\u00adfern aus Gmail oder an\u00adde\u00adren ePost-Pro\u00adgram\u00admen: ein\u00adfach den kom\u00adplet\u00adten Text der un\u00adzu\u00adstell\u00adba\u00adren Nach\u00adrich\u00adten hier ein\u00adf\u00fc\u00adgen, statt je\u00adde Adres\u00adse ein\u00adzeln herauszusuchen.&nbsp;<\/div>\n\n    <div class=\"spalten\">\n      <div class=\"spalte-eingabe\">\n        <h3>Text-Ein\u00adga\u00adbe<\/h3>\n        <textarea id=\"epx-inputText\" placeholder=\"Hier Text mit ePost-Adressen einf\u00fcgen ...\"><\/textarea>\n        <div class=\"zaehler\">Zei\u00adchen: <span id=\"epx-inputCount\">0<\/span><\/div>\n      <\/div>\n      <div class=\"spalte-ergebnis\">\n        <h3>Er\u00adgeb\u00adnis<\/h3>\n        <div class=\"ausgabefeld\" id=\"epx-output\"><\/div>\n        <div class=\"zaehler\">ePost-Adres\u00adsen ge\u00adsam\u00admelt: <span id=\"epx-outputCount\">0<\/span><\/div>\n      <\/div>\n    <\/div>\n\n    <div class=\"knopfreihe-gesamt\">\n      <button onclick=\"epxExtractEmails()\">ePost-Adressen<br>extrahieren<\/button>\n      <button onclick=\"epxCopyOutput()\">Ergebnis<br>kopieren<\/button>\n      <button onclick=\"epxAlleLoeschen()\">Alles<br>l\u00f6schen<\/button>\n    <\/div>\n\n    <div class=\"note\">* Ro\u00adZe = (Herr) Ro\u00adsa von Zehn\u00adle (\u00far) \u2013 Ein kos\u00adten\u00adlo\u00adser HTML-Ser\u00advice vom 175er Verlag!<\/div>\n\n  <\/div>\n\n  <!-- Ein Service vom 175er Verlag -->\n\n  <script>\n  (function() {\n    let epxOutputLines = [];\n\n    const epxInput = document.getElementById(\"epx-inputText\");\n    epxInput.addEventListener(\"input\", function() {\n      document.getElementById(\"epx-inputCount\").textContent = this.value.length;\n    });\n\n    window.epxExtractEmails = function() {\n      let text = epxInput.value;\n\n      \/\/ Regul\u00e4rer Ausdruck zum Erkennen von ePost-Adressen\n      let regex = \/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}\/g;\n      let found = text.match(regex) || [];\n\n      \/\/ Alle klein schreiben, f\u00fcr einheitlichen Vergleich\n      let cleaned = found.map(mail => mail.trim().toLowerCase());\n\n      \/\/ Dubletten entfernen\n      let unique = [];\n      cleaned.forEach(mail => { if (!unique.includes(mail)) unique.push(mail); });\n\n      \/\/ Alphabetisch sortieren\n      unique.sort((a, b) => a.localeCompare(b, 'de', {sensitivity: 'base'}));\n\n      epxOutputLines = unique;\n      document.getElementById(\"epx-output\").textContent = unique.join(\"\\n\");\n      document.getElementById(\"epx-outputCount\").textContent = unique.length;\n      document.getElementById(\"epx-inputCount\").textContent = text.length;\n    };\n\n    window.epxCopyOutput = function() {\n      if (epxOutputLines.length === 0) return;\n      const textToCopy = epxOutputLines.join('\\n');\n      navigator.clipboard.writeText(textToCopy)\n        .then(() => alert('Ergebnis wurde in die Zwischenablage kopiert!'))\n        .catch(err => alert('Fehler beim Kopieren: ' + err));\n    };\n\n    window.epxAlleLoeschen = function() {\n      epxInput.value = \"\";\n      document.getElementById(\"epx-output\").textContent = \"\";\n      document.getElementById(\"epx-inputCount\").textContent = \"0\";\n      document.getElementById(\"epx-outputCount\").textContent = \"0\";\n      epxOutputLines = [];\n      if (document.activeElement && document.activeElement.blur) {\n        document.activeElement.blur();\n      }\n    };\n  })();\n  <\/script>\n<br><br><br>\n\n\n\n<!-- RoZe-Programm: Ein HTML-Service vom 175er Verlag -->\n<meta charset=\"UTF-8\">\n<title>RoZe-Programm*: ePost-Adressen bereinigen<\/title>\n<style>\n  .roze-epost-bereinigen {\n    font-family: Arial, sans-serif;\n    background-color: #fbe8f0 !important;\n    padding: 20px !important;\n    border-radius: 12px !important;\n    box-shadow: 0 4px 14px rgba(0, 0, 0, 0.12) !important;\n    box-sizing: border-box;\n  }\n  .roze-epost-bereinigen * {\n    box-sizing: border-box;\n  }\n  .roze-epost-bereinigen .titelbalken {\n    background-color: #ff6699 !important;\n    color: #ffffff !important;\n    font-weight: bold;\n    font-size: 1.3em;\n    text-align: center;\n    padding: 12px 20px !important;\n    border-radius: 8px !important;\n    width: 100%;\n    margin-bottom: 12px;\n  }\n  .roze-epost-bereinigen .titelbalken .sternchen {\n    font-weight: normal;\n  }\n  .roze-epost-bereinigen .beschreibung {\n    font-size: 0.95em;\n    color: #333;\n    line-height: 1.4em;\n    margin: 0 0 15px 0;\n  }\n  .roze-epost-bereinigen .beschreibung strong {\n    display: block;\n    margin-bottom: 8px;\n  }\n  .roze-epost-bereinigen .spalten {\n    display: flex;\n    gap: 16px;\n    flex-wrap: wrap;\n    align-items: stretch;\n  }\n  .roze-epost-bereinigen .spalte {\n    flex: 1;\n    min-width: 240px;\n    display: flex;\n    flex-direction: column;\n  }\n  .roze-epost-bereinigen h3 {\n    color: #ff6699 !important;\n    font-weight: bold;\n    margin-top: 0;\n    margin-bottom: 8px;\n  }\n  .roze-epost-bereinigen textarea {\n    width: 100% !important;\n    height: 350px !important;\n    max-height: 350px !important;\n    padding: 10px !important;\n    border: 1px solid #e0b8c8 !important;\n    border-radius: 8px !important;\n    background-color: #fffafc !important;\n    font-family: Arial, sans-serif !important;\n    font-size: 0.9em !important;\n    color: #333 !important;\n    overflow-y: auto !important;\n    resize: none;\n    margin: 0 0 8px 0 !important;\n    line-height: normal !important;\n    box-sizing: border-box !important;\n  }\n  .roze-epost-bereinigen .zaehler {\n    margin: 4px 0 0 0;\n    font-weight: bold;\n    color: #333;\n  }\n  .roze-epost-bereinigen .knopfreihe-gesamt {\n    display: flex;\n    gap: 10px;\n    margin-top: 15px;\n  }\n  .roze-epost-bereinigen button {\n    background-color: #ff6699 !important;\n    color: #ffffff !important;\n    font-weight: bold;\n    border: 2px solid #ff6699 !important;\n    border-radius: 8px !important;\n    padding: 10px 14px !important;\n    font-size: 0.9em;\n    cursor: pointer;\n    flex: 1;\n    outline: none;\n    white-space: normal;\n    line-height: 1.3em;\n    text-align: center;\n  }\n  .roze-epost-bereinigen button:hover,\n  .roze-epost-bereinigen button:focus,\n  .roze-epost-bereinigen button:active {\n    background-color: #ffffff !important;\n    color: #ff6699 !important;\n    border: 2px solid #ff6699 !important;\n    outline: none;\n    box-shadow: none;\n  }\n  .roze-epost-bereinigen .note {\n    font-size: 0.9em;\n    font-style: italic;\n    color: #ff6699;\n    margin-top: 15px;\n  }\n<\/style>\n\n<div class=\"roze-epost-bereinigen\">\n\n  <div class=\"titelbalken\">Ro\u00adZe-Pro\u00adgramm<span class=\"sternchen\">*<\/span>: ePost-Adres\u00adsen bereinigen<\/div>\n  <div class=\"beschreibung\">\n    <strong>Was macht die\u00adses klei\u00adne Hilfsprogramm:<\/strong> Ver\u00adgleicht ei\u00adne ak\u00adtu\u00adel\u00adle Lis\u00adte von ePost-Adres\u00adsen mit ei\u00adner Lis\u00adte zu l\u00f6\u00adschen\u00adder Adres\u00adsen und ent\u00adfernt al\u00adle \u00dcber\u00adein\u00adstim\u00admun\u00adgen au\u00adto\u00adma\u00adtisch, ganz oh\u00adne teu\u00adre Soft\u00adware, rein mit kos\u00adten\u00adlo\u00adsem&nbsp;HTML.<br> N\u00fctz\u00adlich zum Bei\u00adspiel, wenn R\u00fcck\u00adl\u00e4u\u00adfer oder ab\u00adge\u00admel\u00adde\u00adte Adres\u00adsen aus ei\u00adnem be\u00adstehen\u00adden Ver\u00adtei\u00adler ent\u00adfernt wer\u00adden sollen.&nbsp;<\/div>\n\n  <div class=\"spalten\">\n    <div class=\"spalte\">\n      <h3>Ak\u00adtu\u00adel\u00adle&nbsp;Liste<\/h3>\n      <textarea id=\"epb-listeAktuell\" placeholder=\"Hier alle aktuellen ePost-Adressen einf\u00fcgen ...\"><\/textarea>\n      <div class=\"zaehler\">Adres\u00adsen: <span id=\"epb-zahlAktuell\">0<\/span><\/div>\n    <\/div>\n    <div class=\"spalte\">\n      <h3>Zu l\u00f6\u00adschen\u00adde Adressen<\/h3>\n      <textarea id=\"epb-listeLoeschen\" placeholder=\"Hier die zu l\u00f6schenden ePost-Adressen einf\u00fcgen ...\"><\/textarea>\n      <div class=\"zaehler\">Adres\u00adsen: <span id=\"epb-zahlLoeschen\">0<\/span><\/div>\n    <\/div>\n    <div class=\"spalte\">\n      <h3>Be\u00adrei\u00adnig\u00adte&nbsp;Liste<\/h3>\n      <textarea id=\"epb-ergebnis\" readonly placeholder=\"Hier erscheint die bereinigte Liste ...\"><\/textarea>\n      <div class=\"zaehler\">Ver\u00adblei\u00adbend: <span id=\"epb-zahlErgebnis\">0<\/span> | Ent\u00adfernt: <span id=\"epb-zahlEntfernt\">0<\/span><\/div>\n    <\/div>\n  <\/div>\n\n  <div class=\"knopfreihe-gesamt\">\n    <button onclick=\"epbBereinigen()\">Liste<br>bereinigen<\/button>\n    <button onclick=\"epbKopieren()\">Ergebnis<br>kopieren<\/button>\n    <button onclick=\"epbAllesLoeschen()\">Alles<br>l\u00f6schen<\/button>\n  <\/div>\n\n  <div class=\"note\">* Ro\u00adZe = (Herr) Ro\u00adsa von Zehn\u00adle (\u00far) \u2013 Ein kos\u00adten\u00adlo\u00adser HTML-Ser\u00advice vom 175er Verlag!<\/div>\n\n<\/div>\n\n<!-- Ein Service vom 175er Verlag -->\n\n<script>\n(function() {\n  function epbAdressen(text) {\n    return text.split(\/[\\r\\n;,\\s]+\/)\n      .map(a => a.trim().toLowerCase().replace(\/^[\"'<]|[>\"',;]+$\/g, \"\"))\n      .filter(a => a.includes(\"@\") && a.includes(\".\"));\n  }\n\n  function epbZaehlen() {\n    document.getElementById(\"epb-zahlAktuell\").textContent =\n      epbAdressen(document.getElementById(\"epb-listeAktuell\").value).length;\n    document.getElementById(\"epb-zahlLoeschen\").textContent =\n      epbAdressen(document.getElementById(\"epb-listeLoeschen\").value).length;\n  }\n\n  document.getElementById(\"epb-listeAktuell\").addEventListener(\"input\", epbZaehlen);\n  document.getElementById(\"epb-listeLoeschen\").addEventListener(\"input\", epbZaehlen);\n\n  window.epbBereinigen = function() {\n    const aktuell = epbAdressen(document.getElementById(\"epb-listeAktuell\").value);\n    const loeschen = new Set(epbAdressen(document.getElementById(\"epb-listeLoeschen\").value));\n    const ergebnis = [...new Set(aktuell)].filter(a => !loeschen.has(a)).sort();\n    document.getElementById(\"epb-ergebnis\").value = ergebnis.join(\"\\n\");\n    document.getElementById(\"epb-zahlErgebnis\").textContent = ergebnis.length;\n    document.getElementById(\"epb-zahlEntfernt\").textContent = aktuell.length - ergebnis.length;\n  };\n\n  window.epbKopieren = function() {\n    const text = document.getElementById(\"epb-ergebnis\").value;\n    if (!text) return;\n    navigator.clipboard.writeText(text)\n      .then(() => alert(\"Ergebnis wurde in die Zwischenablage kopiert!\"))\n      .catch(err => alert(\"Fehler beim Kopieren: \" + err));\n  };\n\n  window.epbAllesLoeschen = function() {\n    document.getElementById(\"epb-listeAktuell\").value = \"\";\n    document.getElementById(\"epb-listeLoeschen\").value = \"\";\n    document.getElementById(\"epb-ergebnis\").value = \"\";\n    document.getElementById(\"epb-zahlAktuell\").textContent = \"0\";\n    document.getElementById(\"epb-zahlLoeschen\").textContent = \"0\";\n    document.getElementById(\"epb-zahlErgebnis\").textContent = \"0\";\n    document.getElementById(\"epb-zahlEntfernt\").textContent = \"0\";\n    if (document.activeElement && document.activeElement.blur) {\n      document.activeElement.blur();\n    }\n  };\n})();\n<\/script>\n<br><br><br>\n\n\n\n<!-- RoZe-Programm: Ein HTML-Service vom 175er Verlag -->\n<meta charset=\"UTF-8\">\n<title>RoZe-Programm*: ePost-Adressen nach Suchwort herausfischen<\/title>\n<style>\n  .roze-woertersuche {\n    font-family: Arial, sans-serif;\n    background-color: #fbe8f0 !important;\n    padding: 20px !important;\n    border-radius: 12px !important;\n    box-shadow: 0 4px 14px rgba(0, 0, 0, 0.12) !important;\n    box-sizing: border-box;\n  }\n  .roze-woertersuche * {\n    box-sizing: border-box;\n  }\n  .roze-woertersuche .titelbalken {\n    background-color: #ff6699 !important;\n    color: #ffffff !important;\n    font-weight: bold;\n    font-size: 1.3em;\n    text-align: center;\n    padding: 12px 20px !important;\n    border-radius: 8px !important;\n    width: 100%;\n    margin-bottom: 12px;\n  }\n  .roze-woertersuche .titelbalken .sternchen {\n    font-weight: normal;\n  }\n  .roze-woertersuche .beschreibung {\n    font-size: 0.95em;\n    color: #333;\n    line-height: 1.4em;\n    margin: 0 0 15px 0;\n  }\n  .roze-woertersuche .beschreibung strong {\n    display: block;\n    margin-bottom: 8px;\n  }\n  .roze-woertersuche .hinweis-technik {\n    font-size: 0.88em;\n    font-style: italic;\n    color: #7a4a5c;\n    line-height: 1.4em;\n    margin: 0 0 15px 0;\n    background-color: #fff0f5;\n    border: 1px solid #e0b8c8;\n    border-radius: 8px;\n    padding: 10px 12px;\n  }\n  .roze-woertersuche .spalten {\n    display: flex;\n    gap: 16px;\n    flex-wrap: wrap;\n    align-items: stretch;\n  }\n  .roze-woertersuche .spalte {\n    flex: 1;\n    min-width: 240px;\n    display: flex;\n    flex-direction: column;\n  }\n  .roze-woertersuche h3 {\n    color: #ff6699 !important;\n    font-weight: bold;\n    margin-top: 0;\n    margin-bottom: 8px;\n    text-align: center;\n  }\n  .roze-woertersuche .ablagefeld {\n    width: 100%;\n    flex: 1;\n    min-height: 190px;\n    padding: 10px !important;\n    border: 2px dashed #e0b8c8 !important;\n    border-radius: 8px !important;\n    background-color: #fffafc !important;\n    color: #999;\n    font-size: 0.9em;\n    text-align: center;\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    justify-content: center;\n    cursor: pointer;\n    overflow-y: auto;\n    margin: 0 0 8px 0;\n  }\n  .roze-woertersuche .ablagefeld.ueber-dem-feld {\n    background-color: #fdeaf1 !important;\n    border-color: #ff6699 !important;\n    color: #ff6699;\n  }\n  .roze-woertersuche .ablagefeld ul {\n    list-style: none;\n    padding: 0;\n    margin: 8px 0 0 0;\n    width: 100%;\n    text-align: left;\n    font-size: 0.95em;\n    color: #333;\n  }\n  .roze-woertersuche .ablagefeld li {\n    display: flex;\n    justify-content: space-between;\n    align-items: center;\n    padding: 3px 6px;\n    border-bottom: 1px solid #f0d0dc;\n  }\n  .roze-woertersuche .ablagefeld li .entfernen-datei {\n    color: #ff6699;\n    font-weight: bold;\n    cursor: pointer;\n    padding: 0 4px;\n  }\n  .roze-woertersuche input[type=\"text\"] {\n    width: 100% !important;\n    padding: 10px !important;\n    border: 1px solid #e0b8c8 !important;\n    border-radius: 8px !important;\n    background-color: #fffafc !important;\n    font-family: Arial, sans-serif !important;\n    font-size: 0.95em !important;\n    color: #333 !important;\n    margin: 0 0 10px 0 !important;\n  }\n  .roze-woertersuche textarea {\n    width: 100% !important;\n    flex: 1;\n    min-height: 190px;\n    padding: 10px !important;\n    border: 1px solid #e0b8c8 !important;\n    border-radius: 8px !important;\n    background-color: #fffafc !important;\n    font-family: Arial, sans-serif !important;\n    font-size: 0.9em !important;\n    color: #333 !important;\n    overflow-y: auto !important;\n    resize: none;\n    margin: 0 0 8px 0 !important;\n    line-height: normal !important;\n  }\n  .roze-woertersuche .zaehler {\n    margin: 4px 0 0 0;\n    font-weight: bold;\n    color: #333;\n    text-align: center;\n  }\n  .roze-woertersuche .knopfreihe-optionen {\n    display: flex;\n    gap: 8px;\n    margin-bottom: 10px;\n  }\n  .roze-woertersuche .knopfreihe-optionen button {\n    flex: 1;\n    font-size: 0.85em;\n    padding: 8px 6px !important;\n    white-space: nowrap;\n  }\n  .roze-woertersuche .knopfreihe-optionen button.gewaehlt {\n    background-color: #ffffff !important;\n    color: #ff6699 !important;\n    border: 2px solid #ff6699 !important;\n  }\n  .roze-woertersuche .ws-suchen-knopf {\n    flex: none !important;\n    width: 100%;\n    padding: 8px 14px !important;\n  }\n  .roze-woertersuche button {\n    background-color: #ff6699 !important;\n    color: #ffffff !important;\n    font-weight: bold;\n    border: 2px solid #ff6699 !important;\n    border-radius: 8px !important;\n    padding: 10px 14px !important;\n    font-size: 0.9em;\n    cursor: pointer;\n    flex: 1;\n    outline: none;\n    white-space: normal;\n    line-height: 1.3em;\n    text-align: center;\n  }\n  .roze-woertersuche button:hover,\n  .roze-woertersuche button:focus,\n  .roze-woertersuche button:active {\n    background-color: #ffffff !important;\n    color: #ff6699 !important;\n    border: 2px solid #ff6699 !important;\n    outline: none;\n    box-shadow: none;\n  }\n  .roze-woertersuche .ws-kopieren-knopf {\n    flex: none !important;\n    padding: 8px 14px !important;\n    margin-top: 10px;\n  }\n  .roze-woertersuche .ws-zuruecksetzen-knopf {\n    flex: none !important;\n    padding: 8px 14px !important;\n    margin-top: 10px;\n  }\n  .roze-woertersuche .bereinigte-dateien {\n    margin-top: 15px;\n  }\n  .roze-woertersuche .bereinigte-dateien h3 {\n    margin-bottom: 6px;\n  }\n  .roze-woertersuche .datei-download-zeile {\n    display: flex;\n    align-items: center;\n    gap: 10px;\n    background-color: #fffafc;\n    border: 1px solid #e0b8c8;\n    border-radius: 8px;\n    padding: 8px 10px;\n    margin-bottom: 6px;\n    font-size: 0.9em;\n    color: #333;\n  }\n  .roze-woertersuche .datei-download-zeile span {\n    flex: 1;\n    word-break: break-all;\n  }\n  .roze-woertersuche .datei-download-zeile button {\n    flex: none;\n    padding: 6px 12px !important;\n    font-size: 0.85em;\n  }\n  .roze-woertersuche .note {\n    font-size: 0.9em;\n    font-style: italic;\n    color: #ff6699;\n    margin-top: 15px;\n  }\n<\/style>\n\n<div class=\"roze-woertersuche\">\n\n  <div class=\"titelbalken\">Ro\u00adZe-Pro\u00adgramm<span class=\"sternchen\">*<\/span>: ePost-Adres\u00adsen nach Such\u00adwort herausfischen<\/div>\n  <div class=\"beschreibung\">\n    <strong>Was macht die\u00adses klei\u00adne Hilfsprogramm:<\/strong> Durch\u00adsucht meh\u00adre\u00adre hoch\u00adge\u00adla\u00adde\u00adne Da\u00adtei\u00aden gleich\u00adzei\u00adtig nach ei\u00adnem von Dir ein\u00adge\u00adge\u00adbe\u00adnen Such\u00adwort. Aus je\u00adder Zei\u00adle, in der das Such\u00adwort vor\u00adkommt, wird die ent\u00adhal\u00adte\u00adne ePost-Adres\u00adse her\u00adaus\u00adge\u00adfischt und in ei\u00adner ei\u00adge\u00adnen Er\u00adgeb\u00adnis\u00adlis\u00adte ge\u00adsam\u00admelt. F\u00fcr je\u00adde durch\u00adsuch\u00adte Da\u00adtei wird zu\u00ads\u00e4tz\u00adlich ei\u00adne be\u00adrei\u00adnig\u00adte Fas\u00adsung zum Her\u00adun\u00adter\u00adla\u00adden be\u00adreit\u00adge\u00adstellt, aus der die ge\u00adfun\u00adde\u00adnen Zei\u00adlen be\u00adreits ent\u00adfernt&nbsp;sind.&nbsp;<br><br>\n    <strong>Wich\u00adtig: die ePost-Adres\u00adsen m\u00fcs\u00adsen in je\u00adder hoch\u00adge\u00adla\u00adde\u00adnen Da\u00adtei ein\u00adzeln, ei\u00adne je Zei\u00adle, un\u00adter\u00adein\u00adan\u00adder ste\u00adhen, da\u00admit die\u00adses Werk\u00adzeug zu\u00adver\u00adl\u00e4s\u00adsig ar\u00adbei\u00adtet. Wer sei\u00adne Lis\u00adten noch nicht so auf\u00adbe\u00adrei\u00adtet hat, kann da\u00adf\u00fcr mein an\u00adde\u00adres klei\u00adnes Pro\u00adgramm nut\u00adzen: Ro\u00adZe-Pro\u00adgramm*: ePost-Adres\u00adsen aus Text extrahieren.<\/strong>\n  <\/div>\n  <div class=\"hinweis-technik\">Ein wich\u00adti\u00adger Hin\u00adweis zur Ar\u00adbeits\u00adwei\u00adse: die\u00adses Werk\u00adzeug l\u00e4uft al\u00adlein in Dei\u00adnem Brow\u00adser und kann aus tech\u00adni\u00adschen Gr\u00fcn\u00adden kei\u00adne Da\u00adtei auf Dei\u00adner Fest\u00adplat\u00adte selb\u00adst\u00e4n\u00addig ver\u00ad\u00e4n\u00addern oder l\u00f6\u00adschen. Es liest die hoch\u00adge\u00adla\u00adde\u00adnen Da\u00adtei\u00aden nur ein, durch\u00adsucht sie und bie\u00adtet Dir je Da\u00adtei ei\u00adne be\u00adrei\u00adnig\u00adte Fas\u00adsung zum Her\u00adun\u00adter\u00adla\u00adden an. Die al\u00adte Da\u00adtei auf Dei\u00adnem Rech\u00adner mu\u00dft Du da\u00adnach von Hand mit der her\u00adun\u00adter\u00adge\u00adla\u00adde\u00adnen be\u00adrei\u00adnig\u00adten Fas\u00adsung ersetzen.&nbsp;<\/div>\n\n  <div class=\"spalten\">\n    <div class=\"spalte\">\n      <h3>Da\u00adtei\u00aden hierher<\/h3>\n      <div class=\"ablagefeld\" id=\"ws-ablage\">\n        <div id=\"ws-ablage-text\">Da\u00adtei\u00aden hier hin\u00adein\u00adzie\u00adhen oder an\u00adkli\u00adcken, um sie aus\u00adzu\u00adw\u00e4h\u00adlen (meh\u00adre\u00adre Da\u00adtei\u00aden gleich\u00adzei\u00adtig m\u00f6glich)<\/div>\n        <ul id=\"ws-dateiliste\"><\/ul>\n      <\/div>\n      <input type=\"file\" id=\"ws-dateiauswahl\" multiple style=\"display:none;\">\n      <div class=\"zaehler\">Da\u00adtei\u00aden ge\u00adla\u00adden: <span id=\"ws-zahlDateien\">0<\/span><\/div>\n    <\/div>\n    <div class=\"spalte\">\n      <h3>Such\u00adwort<\/h3>\n      <input type=\"text\" id=\"ws-suchwort\" placeholder=\"Suchwort eingeben, zum Beispiel Garten\">\n      <div class=\"knopfreihe-optionen\">\n        <button id=\"ws-modus-ganz\" class=\"gewaehlt\" onclick=\"wsSetModus('ganz')\">Ganzes Wort<\/button>\n        <button id=\"ws-modus-teil\" onclick=\"wsSetModus('teil')\">Wortteil<\/button>\n      <\/div>\n      <button class=\"ws-suchen-knopf\" onclick=\"wsDurchsuchen()\">Dateien durchsuchen<\/button>\n      <button class=\"ws-kopieren-knopf\" onclick=\"wsKopieren()\">Ergebnis kopieren<\/button>\n      <button class=\"ws-zuruecksetzen-knopf\" onclick=\"wsAllesLoeschen()\">Alles zur\u00fccksetzen<\/button>\n    <\/div>\n    <div class=\"spalte\">\n      <h3>Ge\u00adfun\u00adde\u00adne Adressen<\/h3>\n      <textarea id=\"ws-ergebnis\" readonly placeholder=\"Hier erscheinen die gefundenen ePost-Adressen ...\"><\/textarea>\n      <div class=\"zaehler\">Ge\u00adfun\u00adde\u00adne Adres\u00adsen: <span id=\"ws-zahlGefunden\">0<\/span><\/div>\n    <\/div>\n  <\/div>\n\n  <div class=\"bereinigte-dateien\" id=\"ws-bereinigte-bereich\" style=\"display:none;\">\n    <h3>Be\u00adrei\u00adnig\u00adte Da\u00adtei\u00aden zum Herunterladen<\/h3>\n    <div id=\"ws-bereinigte-liste\"><\/div>\n  <\/div>\n\n  <div class=\"note\">* Ro\u00adZe = (Herr) Ro\u00adsa von Zehn\u00adle (\u00far) \u2013 Ein kos\u00adten\u00adlo\u00adser HTML-Ser\u00advice vom 175er Verlag!<\/div>\n\n<\/div>\n\n<!-- Ein Service vom 175er Verlag -->\n\n<script>\n(function() {\n  let wsDateien = []; \/\/ { name, inhalt }\n  let wsModus = 'ganz';\n  const wsEmailMuster = \/[a-zA-Z0-9_.+\\-]+@[a-zA-Z0-9\\-]+\\.[a-zA-Z0-9\\-.]+\/g;\n\n  const wsAblage = document.getElementById('ws-ablage');\n  const wsAuswahl = document.getElementById('ws-dateiauswahl');\n\n  function wsEscapeRegex(text) {\n    return text.replace(\/[.*+?^${}()|[\\]\\\\]\/g, '\\\\$&');\n  }\n\n  function wsTreffer(zeile, suchwort) {\n    if (!suchwort) return false;\n    if (wsModus === 'ganz') {\n      const muster = new RegExp('\\\\b' + wsEscapeRegex(suchwort) + '\\\\b', 'i');\n      return muster.test(zeile);\n    }\n    return zeile.toLowerCase().includes(suchwort.toLowerCase());\n  }\n\n  function wsDateiHinzufuegen(datei) {\n    if (wsDateien.some(d => d.name === datei.name)) return;\n    const eintrag = { name: datei.name, inhalt: null };\n    wsDateien.push(eintrag);\n    const reader = new FileReader();\n    reader.onload = e => {\n      eintrag.inhalt = e.target.result;\n      wsListeAktualisieren();\n    };\n    reader.readAsText(datei, 'UTF-8');\n    wsListeAktualisieren();\n  }\n\n  function wsListeAktualisieren() {\n    const liste = document.getElementById('ws-dateiliste');\n    liste.innerHTML = '';\n    wsDateien.forEach((d, i) => {\n      const li = document.createElement('li');\n      const name = document.createElement('span');\n      name.textContent = d.name;\n      const entfernen = document.createElement('span');\n      entfernen.className = 'entfernen-datei';\n      entfernen.textContent = '\u2715';\n      entfernen.onclick = (ev) => { ev.stopPropagation(); wsDateien.splice(i, 1); wsListeAktualisieren(); };\n      li.appendChild(name);\n      li.appendChild(entfernen);\n      liste.appendChild(li);\n    });\n    document.getElementById('ws-ablage-text').style.display = wsDateien.length ? 'none' : 'block';\n    document.getElementById('ws-zahlDateien').textContent = wsDateien.length;\n  }\n\n  wsAblage.addEventListener('click', () => wsAuswahl.click());\n  wsAblage.addEventListener('dragover', e => { e.preventDefault(); wsAblage.classList.add('ueber-dem-feld'); });\n  wsAblage.addEventListener('dragleave', () => wsAblage.classList.remove('ueber-dem-feld'));\n  wsAblage.addEventListener('drop', e => {\n    e.preventDefault();\n    wsAblage.classList.remove('ueber-dem-feld');\n    [...e.dataTransfer.files].forEach(wsDateiHinzufuegen);\n  });\n  wsAuswahl.addEventListener('change', e => {\n    [...e.target.files].forEach(wsDateiHinzufuegen);\n    wsAuswahl.value = '';\n  });\n\n  window.wsSetModus = function(m) {\n    wsModus = m;\n    document.getElementById('ws-modus-ganz').classList.toggle('gewaehlt', m === 'ganz');\n    document.getElementById('ws-modus-teil').classList.toggle('gewaehlt', m === 'teil');\n  };\n\n  window.wsDurchsuchen = function() {\n    const suchwort = document.getElementById('ws-suchwort').value.trim();\n    if (!suchwort) { alert('Bitte zuerst ein Suchwort eingeben.'); return; }\n    if (!wsDateien.length) { alert('Bitte zuerst mindestens eine Datei hineinschieben.'); return; }\n    if (wsDateien.some(d => d.inhalt === null)) { alert('Die Dateien werden noch eingelesen, bitte einen Augenblick warten und erneut versuchen.'); return; }\n\n    const gefundeneAdressen = new Set();\n    const bereinigteListe = document.getElementById('ws-bereinigte-liste');\n    bereinigteListe.innerHTML = '';\n    let anzahlMitTreffer = 0;\n\n    wsDateien.forEach(datei => {\n      const zeilen = datei.inhalt.split(\/\\r?\\n\/);\n      const behalteneZeilen = [];\n      let dateiHatTreffer = false;\n\n      zeilen.forEach(zeile => {\n        if (wsTreffer(zeile, suchwort)) {\n          dateiHatTreffer = true;\n          const adressen = zeile.match(wsEmailMuster);\n          if (adressen) adressen.forEach(a => gefundeneAdressen.add(a.toLowerCase()));\n        } else {\n          behalteneZeilen.push(zeile);\n        }\n      });\n\n      if (dateiHatTreffer) {\n        anzahlMitTreffer++;\n        const sortierteZeilen = behalteneZeilen\n          .filter(z => z.trim() !== '')\n          .sort((a, b) => a.localeCompare(b, 'de', { sensitivity: 'base' }));\n        const bereinigterInhalt = sortierteZeilen.join('\\n');\n        const zeile = document.createElement('div');\n        zeile.className = 'datei-download-zeile';\n        const name = document.createElement('span');\n        name.textContent = datei.name;\n        const knopf = document.createElement('button');\n        knopf.textContent = 'Bereinigte Fassung herunterladen';\n        knopf.onclick = () => wsHerunterladen('bereinigt_' + datei.name, bereinigterInhalt);\n        zeile.appendChild(name);\n        zeile.appendChild(knopf);\n        bereinigteListe.appendChild(zeile);\n      }\n    });\n\n    const ergebnisText = [...gefundeneAdressen].sort();\n    document.getElementById('ws-ergebnis').value = ergebnisText.join('\\n');\n    document.getElementById('ws-zahlGefunden').textContent = ergebnisText.length;\n    document.getElementById('ws-bereinigte-bereich').style.display = anzahlMitTreffer ? 'block' : 'none';\n\n    if (!ergebnisText.length) {\n      alert('Zu diesem Suchwort wurden in den hochgeladenen Dateien keine ePost-Adressen gefunden.');\n    }\n  };\n\n  function wsHerunterladen(dateiname, inhalt) {\n    const blob = new Blob([inhalt], { type: 'text\/plain;charset=utf-8' });\n    const url = URL.createObjectURL(blob);\n    const a = document.createElement('a');\n    a.href = url;\n    a.download = dateiname;\n    document.body.appendChild(a);\n    a.click();\n    document.body.removeChild(a);\n    URL.revokeObjectURL(url);\n  }\n\n  window.wsKopieren = function() {\n    const text = document.getElementById('ws-ergebnis').value;\n    if (!text) return;\n    navigator.clipboard.writeText(text)\n      .then(() => alert('Ergebnis wurde in die Zwischenablage kopiert!'))\n      .catch(err => alert('Fehler beim Kopieren: ' + err));\n  };\n\n  window.wsAllesLoeschen = function() {\n    wsDateien = [];\n    document.getElementById('ws-suchwort').value = '';\n    document.getElementById('ws-ergebnis').value = '';\n    document.getElementById('ws-zahlGefunden').textContent = '0';\n    document.getElementById('ws-zahlDateien').textContent = '0';\n    document.getElementById('ws-bereinigte-liste').innerHTML = '';\n    document.getElementById('ws-bereinigte-bereich').style.display = 'none';\n    wsSetModus('ganz');\n    wsListeAktualisieren();\n    if (document.activeElement && document.activeElement.blur) {\n      document.activeElement.blur();\n    }\n  };\n})();\n<\/script>\n<br><br><br>\n\n\n\n<!-- RoZe-Programm: Ein HTML-Service vom 175er Verlag -->\n<meta charset=\"UTF-8\">\n<title>RoZe-Programm*: Ordnerstruktur als Baum darstellen<\/title>\n<style>\n  .roze-baum {\n    font-family: Arial, sans-serif !important;\n    background-color: #fbe8f0 !important;\n    padding: 20px !important;\n    border-radius: 12px !important;\n    box-shadow: 0 4px 14px rgba(0, 0, 0, 0.12) !important;\n    box-sizing: border-box;\n  }\n  .roze-baum * {\n    box-sizing: border-box;\n  }\n  .roze-baum .titelbalken {\n    background-color: #ff6699 !important;\n    color: #ffffff !important;\n    font-weight: bold;\n    font-size: 1.3em;\n    text-align: center;\n    padding: 12px 20px !important;\n    border-radius: 8px !important;\n    width: 100%;\n    margin-bottom: 12px;\n  }\n  .roze-baum .titelbalken .sternchen {\n    font-weight: normal;\n  }\n  .roze-baum .beschreibung {\n    font-size: 0.95em;\n    color: #333;\n    line-height: 1.4em;\n    margin: 0 0 15px 0;\n  }\n  .roze-baum .beschreibung strong {\n    display: block;\n    margin-bottom: 8px;\n  }\n  .roze-baum .hinweis-null {\n    font-style: italic;\n    color: #777;\n    font-size: 0.9em;\n    margin: 0 0 15px 0;\n  }\n  .roze-baum h3 {\n    color: #ff6699 !important;\n    font-weight: bold;\n    margin-top: 0;\n    margin-bottom: 8px;\n  }\n  .roze-baum .feld {\n    margin-bottom: 16px;\n  }\n\n  .roze-baum .roze-baum-dropzone {\n    width: 100%;\n    padding: 26px 20px;\n    text-align: center;\n    background-color: #fffafc !important;\n    border: 2px dashed #ff6699 !important;\n    border-radius: 10px !important;\n    cursor: pointer;\n    transition: background-color 0.15s, border-color 0.15s;\n  }\n  .roze-baum .roze-baum-dropzone.roze-baum-drag-ueber {\n    background-color: #ffe0ec !important;\n    border-color: #d6337a !important;\n  }\n  .roze-baum .roze-baum-dropzone .dz-titel {\n    color: #ff6699;\n    font-weight: bold;\n    font-size: 1.05em;\n    letter-spacing: 0.5px;\n    margin-bottom: 6px;\n  }\n  .roze-baum .roze-baum-dropzone .dz-untertitel {\n    color: #999;\n    font-size: 0.9em;\n  }\n  .roze-baum input[type=\"file\"] {\n    display: none;\n  }\n\n  .roze-baum .knopfreihe-gesamt {\n    display: flex;\n    gap: 10px;\n    flex-wrap: wrap;\n    margin: 0 0 18px 0;\n  }\n  .roze-baum button {\n    background-color: #ff6699 !important;\n    color: #ffffff !important;\n    font-weight: bold;\n    border: 2px solid #ff6699 !important;\n    border-radius: 8px !important;\n    padding: 10px 16px !important;\n    font-size: 0.9em;\n    cursor: pointer;\n    flex: 1 1 auto;\n    outline: none;\n    white-space: nowrap;\n    line-height: 1.3em;\n    text-align: center;\n  }\n  .roze-baum button:hover,\n  .roze-baum button:focus,\n  .roze-baum button:active {\n    background-color: #ffffff !important;\n    color: #ff6699 !important;\n    border: 2px solid #ff6699 !important;\n    outline: none;\n    box-shadow: none;\n  }\n  .roze-baum button.knopf-ebene {\n    flex: 0 0 auto;\n    padding: 10px 14px !important;\n    min-width: 0;\n  }\n  .roze-baum .note {\n    font-size: 0.9em;\n    font-style: italic;\n    color: #ff6699;\n    margin-top: 15px;\n  }\n\n  .roze-baum .roze-dateien-schalter {\n    font-size: 0.9em;\n    color: #555;\n  }\n  .roze-baum .roze-dateien-schalter label {\n    cursor: pointer;\n    display: inline-flex;\n    align-items: center;\n    gap: 6px;\n  }\n  .roze-baum .roze-baum-ausgabe {\n    width: 100%;\n    box-sizing: border-box;\n    overflow-y: auto;\n    overflow-x: auto;\n    background-color: #fffafc !important;\n    border: 1px solid #e0b8c8 !important;\n    border-radius: 8px !important;\n    padding: 16px 20px;\n    font-family: \"Courier New\", Courier, monospace !important;\n    font-size: 0.92em !important;\n    letter-spacing: normal !important;\n    line-height: 1.55em;\n    color: #333;\n  }\n  .roze-baum .roze-baum-platzhalter {\n    color: #999;\n    white-space: normal;\n    font-family: Arial, sans-serif !important;\n  }\n\n  .roze-baum .roze-knoten { display: block !important; }\n  .roze-baum .roze-kinder { padding: 0 !important; }\n  .roze-baum .roze-knoten-zeile { display: flex !important; align-items: baseline !important; white-space: nowrap !important; }\n  .roze-baum .roze-toggle-zelle { flex-shrink: 0 !important; }\n  .roze-baum .roze-nummer-zelle { display: inline-block !important; font-weight: bold !important; color: #222222 !important; text-align: left !important; flex-shrink: 0 !important; }\n  .roze-baum .roze-icon-zelle { display: inline-block !important; width: 20px !important; text-align: center !important; flex-shrink: 0 !important; }\n  .roze-baum .roze-name-zelle { color: #222222 !important; }\n  .roze-baum .roze-anzahl { color: #808080; font-weight: normal; font-size: 0.85em; }\n  .roze-baum .roze-toggle {\n    color: #999999;\n    cursor: pointer;\n    display: inline-block;\n    width: 14px;\n    user-select: none;\n    font-weight: bold;\n  }\n  .roze-baum .roze-toggle.roze-leer { cursor: default; color: transparent; }\n  .roze-baum .roze-zeile-klickbar { cursor: pointer; }\n  .roze-baum .roze-zeile-klickbar:hover { background-color: #fdeaf1 !important; }\n\n  @media print {\n    body * { visibility: hidden; }\n    .roze-baum-ausgabe, .roze-baum-ausgabe * { visibility: visible; }\n    .roze-baum-ausgabe {\n      position: absolute;\n      left: 0;\n      top: 0;\n      width: 100% !important;\n      height: auto !important;\n      max-height: none !important;\n      overflow: visible !important;\n      border: none !important;\n      box-shadow: none !important;\n    }\n  }\n<\/style>\n\n<div class=\"roze-baum\">\n\n  <div class=\"titelbalken\">Ro\u00adZe-Pro\u00adgramm<span class=\"sternchen\">*<\/span>: Ord\u00adner\u00adstruk\u00adtur als Baum darstellen<\/div>\n  <div class=\"beschreibung\">\n    <strong>Was macht die\u00adses klei\u00adne Hilfsprogramm:<\/strong> Ver\u00adwan\u00addelt ei\u00adne Ord\u00adner\u00adstruk\u00adtur in ei\u00adne far\u00adbig ge\u00adglie\u00adder\u00adte, num\u00adme\u00adrier\u00adte Baum\u00addar\u00adstel\u00adlung, ganz oh\u00adne zu\u00ads\u00e4tz\u00adli\u00adche Soft\u00adware, rein mit kos\u00adten\u00adlo\u00adsem&nbsp;HTML.<br> Ein Ord\u00adner wird per Drag &amp;&nbsp;Drop in das Feld un\u00adten ge\u00adzo\u00adgen, die Struk\u00adtur wird au\u00adto\u00adma\u00adtisch ein\u00adge\u00adle\u00adsen. Der obers\u00adte Ord\u00adner er\u00adh\u00e4lt die Null, sein ge\u00adsam\u00adter In\u00adhalt be\u00adginnt eben\u00adfalls mit Null (0.1., 0.2. \u2026), erst die Ebe\u00adne dar\u00adun\u00adter z\u00e4hlt wie\u00adder ab Eins wei\u00adter. Ein\u00adzel\u00adne Ord\u00adner las\u00adsen sich auf- und zu\u00adklap\u00adpen, das Er\u00adgeb\u00adnis kann als TXT-Da\u00adtei her\u00adun\u00adter\u00adge\u00adla\u00adden werden.&nbsp;<\/div>\n  <div class=\"hinweis-null\">\n    <em>Hin\u00adweis: Die\u00adses Werk\u00adzeug wur\u00adde in ers\u00adter Li\u00adnie f\u00fcr die ei\u00adge\u00adnen Zwe\u00adcke des Ro\u00adsa Ar\u00adchivs ent\u00adwi\u00adckelt, des\u00adhalb be\u00adginnt be\u00adwusst schon die ers\u00adte Ebe\u00adne mit der&nbsp;Null.<\/em>\n  <\/div>\n\n  <div class=\"feld\">\n    <div id=\"rozeBaumDropzone\" class=\"roze-baum-dropzone\">\n      <div class=\"dz-titel\">ORDNER HIER ABLEGEN<\/div>\n      <div class=\"dz-untertitel\">Drag &amp;&nbsp;Drop ei\u00adnes Ord\u00adners zum Einlesen<\/div>\n    <\/div>\n    <input type=\"file\" id=\"rozeBaumDateiauswahl\" webkitdirectory directory multiple>\n  <\/div>\n\n  <div class=\"feld roze-dateien-schalter\">\n    <label><input type=\"checkbox\" id=\"rozeDateienAnzeigen\" checked> Da\u00adtei\u00aden anzeigen<\/label>\n  <\/div>\n\n  <div class=\"knopfreihe-gesamt\">\n    <button id=\"rozeBaumAufklappen\">Alles aufklappen<\/button>\n    <button class=\"knopf-ebene\" data-ebene=\"1\">E1<\/button>\n    <button class=\"knopf-ebene\" data-ebene=\"2\">E2<\/button>\n    <button class=\"knopf-ebene\" data-ebene=\"3\">E3<\/button>\n    <button class=\"knopf-ebene\" data-ebene=\"4\">E4<\/button>\n    <button class=\"knopf-ebene\" data-ebene=\"5\">E5<\/button>\n    <button class=\"knopf-ebene\" data-ebene=\"6\">E6<\/button>\n    <button class=\"knopf-ebene\" data-ebene=\"7\">E7<\/button>\n    <button id=\"rozeBaumZuklappen\">Alles zuklappen<\/button>\n  <\/div>\n\n  <div class=\"feld\">\n    <h3>Baum\u00addar\u00adstel\u00adlung<\/h3>\n    <div id=\"rozeBaumAusgabe\" class=\"roze-baum-ausgabe\">\n      <div class=\"roze-baum-platzhalter\">Hier er\u00adscheint die Baumdarstellung&nbsp;\u2026<\/div>\n    <\/div>\n  <\/div>\n\n  <div class=\"knopfreihe-gesamt\">\n    <button id=\"rozeBaumDownload\">Download TXT<\/button>\n    <button id=\"rozeBaumDrucken\">Drucken<\/button>\n    <button id=\"rozeBaumLoeschen\">Alles l\u00f6schen<\/button>\n  <\/div>\n\n  <div class=\"note\">* Ro\u00adZe = (Herr) Ro\u00adsa von Zehn\u00adle (\u00far) \u2013 Ein kos\u00adten\u00adlo\u00adser HTML-Ser\u00advice vom 175er Verlag!<\/div>\n\n<\/div>\n\n<!-- Ein Service vom 175er Verlag -->\n\n<script>\n(function(){\n  var EXT_TYPEN = {\n    html:'html', htm:'html',\n    txt:'txt',\n    pdf:'pdf',\n    jpg:'img', jpeg:'img', png:'img', gif:'img', bmp:'img', svg:'img', webp:'img', psd:'img',\n    ttf:'font', otf:'font', woff:'font', woff2:'font',\n    doc:'sonst', docx:'sonst', xls:'sonst', xlsx:'sonst', ppt:'sonst', pptx:'sonst',\n    odt:'sonst', ods:'sonst', odp:'sonst', rtf:'sonst', csv:'sonst', xml:'sonst',\n    css:'sonst', js:'sonst', json:'sonst', zip:'sonst', rar:'sonst', ini:'sonst', bak:'sonst',\n    mp3:'sonst', mp4:'sonst', wav:'sonst', mov:'sonst', avi:'sonst', m4a:'sonst'\n  };\n  var TYP_ICON = {\n    ordner:'\ud83d\udcc1', html:'\ud83c\udf10', txt:'\ud83d\udcdd', pdf:'\ud83d\udcd5',\n    img:'\ud83d\uddbc\ufe0f', font:'\ud83d\udd24', sonst:'\ud83d\udcc4'\n  };\n\n  function klassifiziere(name){\n    var m = name.match(\/\\.([A-Za-z0-9]{2,5})$\/);\n    if(!m) return 'ordner';\n    var ext = m[1].toLowerCase();\n    return EXT_TYPEN[ext] || 'ordner';\n  }\n\n  function escapeHtml(s){\n    return s.replace(\/&\/g,'&amp;').replace(\/<\/g,'&lt;').replace(\/>\/g,'&gt;');\n  }\n\n  \/\/ ----- Ordner per Drag & Drop einlesen (Dateisystem-Schnittstelle des Browsers) -----\n\n  function liesVerzeichnis(dirEntry){\n    return new Promise(function(resolve){\n      var reader = dirEntry.createReader();\n      var alleEintraege = [];\n      function weiterlesen(){\n        reader.readEntries(function(stapel){\n          if(!stapel.length){\n            alleEintraege.sort(function(a,b){\n              if(a.isDirectory !== b.isDirectory) return a.isDirectory ? -1 : 1;\n              return a.name.localeCompare(b.name, 'de');\n            });\n            var versprechen = alleEintraege.map(function(e){\n              return e.isDirectory ? liesVerzeichnis(e) : Promise.resolve({ name: e.name, kinder: [] });\n            });\n            Promise.all(versprechen).then(function(kinder){\n              resolve({ name: dirEntry.name, kinder: kinder });\n            });\n          } else {\n            alleEintraege = alleEintraege.concat(stapel);\n            weiterlesen();\n          }\n        }, function(){ resolve({ name: dirEntry.name, kinder: [] }); });\n      }\n      weiterlesen();\n    });\n  }\n\n  function liesAusDateiliste(dateien){\n    \/\/ Fallback \u00fcber die Dateiauswahl (webkitdirectory): webkitRelativePath rekonstruieren\n    var wurzelName = null;\n    var wurzel = { name:'', kinder:[] };\n    var karte = {};\n    for(var i=0;i<dateien.length;i++){\n      var pfad = dateien[i].webkitRelativePath || dateien[i].name;\n      var teile = pfad.split('\/');\n      if(!wurzelName){ wurzelName = teile[0]; wurzel.name = wurzelName; karte[teile[0]] = wurzel; }\n      var aktuellerPfad = teile[0];\n      var aktuellerKnoten = wurzel;\n      for(var j=1;j<teile.length;j++){\n        var istDatei = (j === teile.length - 1);\n        aktuellerPfad += '\/' + teile[j];\n        if(!karte[aktuellerPfad]){\n          var neu = { name: teile[j], kinder: [] };\n          aktuellerKnoten.kinder.push(neu);\n          karte[aktuellerPfad] = neu;\n        }\n        aktuellerKnoten = karte[aktuellerPfad];\n      }\n    }\n    return wurzel;\n  }\n\n  \/\/ ----- Darstellung -----\n\n  var idZaehler = 0;\n\n  function teilNummer(index, gesamt){\n    if(gesamt >= 10){\n      var stellen = String(gesamt).length;\n      var s = String(index);\n      while(s.length < stellen) s = '0' + s;\n      return s;\n    }\n    return String(index);\n  }\n\n  function ordnerIndizes(kinder){\n    var gesamtOrdner = 0;\n    kinder.forEach(function(k){ if(klassifiziere(k.name) === 'ordner') gesamtOrdner++; });\n    var zaehler = 0;\n    return kinder.map(function(k){\n      if(klassifiziere(k.name) === 'ordner'){\n        zaehler++;\n        return { istOrdner: true, index: zaehler, gesamt: gesamtOrdner };\n      }\n      return { istOrdner: false };\n    });\n  }\n\n  function zaehleInhalt(kinder){\n    var o = 0, d = 0;\n    kinder.forEach(function(k){\n      if(klassifiziere(k.name) === 'ordner') o++; else d++;\n    });\n    return { o: o, d: d };\n  }\n\n  function kindNummernBerechnen(knoten, nummer, ebene){\n    var indizes = ordnerIndizes(knoten.kinder);\n    return knoten.kinder.map(function(kind, idx){\n      var info = indizes[idx];\n      if(!info.istOrdner) return null;\n      var teil = teilNummer(info.index, info.gesamt);\n      return (ebene === 0) ? teil : (nummer + '.' + teil);\n    });\n  }\n\n  function ermittleSpaltenbreitenProEbene(knoten, nummer, ebene, statObj){\n    if(nummer !== null){\n      var bisher = statObj[ebene] || 0;\n      statObj[ebene] = Math.max(bisher, nummer.length + 1);\n    }\n    var kindNummern = kindNummernBerechnen(knoten, nummer, ebene);\n    knoten.kinder.forEach(function(kind, idx){\n      ermittleSpaltenbreitenProEbene(kind, kindNummern[idx], ebene+1, statObj);\n    });\n  }\n\n  function spaltenbreitenBerechnen(wurzel){\n    var statObj = {};\n    ermittleSpaltenbreitenProEbene(wurzel, '0', 0, statObj);\n    var maxEbene = 0;\n    Object.keys(statObj).forEach(function(k){ maxEbene = Math.max(maxEbene, parseInt(k,10)); });\n    for(var e = 1; e <= maxEbene + 1; e++){\n      var vorherige = statObj[e-1] || 2;\n      statObj[e] = Math.max(statObj[e] || 0, vorherige);\n    }\n    if(statObj[0] === undefined) statObj[0] = 2;\n    return statObj;\n  }\n\n  function textPixelBreite(text, font){\n    var canvas = textPixelBreite._canvas || (textPixelBreite._canvas = document.createElement('canvas'));\n    var ctx = canvas.getContext('2d');\n    ctx.font = font;\n    return ctx.measureText(text).width;\n  }\n\n  function ermittleNummernProEbene(knoten, nummer, ebene, sammlung){\n    if(nummer !== null){\n      if(!sammlung[ebene]) sammlung[ebene] = [];\n      sammlung[ebene].push(nummer + '.');\n    }\n    var kindNummern = kindNummernBerechnen(knoten, nummer, ebene);\n    knoten.kinder.forEach(function(kind, idx){\n      ermittleNummernProEbene(kind, kindNummern[idx], ebene+1, sammlung);\n    });\n  }\n\n  function spaltenbreitenInPixelBerechnen(wurzel, font){\n    var sammlung = {};\n    ermittleNummernProEbene(wurzel, '0', 0, sammlung);\n    var breiten = {};\n    var maxEbene = 0;\n    Object.keys(sammlung).forEach(function(k){ maxEbene = Math.max(maxEbene, parseInt(k,10)); });\n    for(var e = 0; e <= maxEbene + 1; e++){\n      var maxDieserEbene = 0;\n      (sammlung[e] || []).forEach(function(text){\n        maxDieserEbene = Math.max(maxDieserEbene, textPixelBreite(text, font));\n      });\n      var vorherige = breiten[e-1] || 0;\n      breiten[e] = Math.max(maxDieserEbene, vorherige) + 8;\n    }\n    return breiten;\n  }\n\n  var zaehlerGlobal = 0;\n  var alleKnotenListe = [];\n\n  function renderKnoten(knoten, nummer, tiefe, spaltenbreiten){\n    zaehlerGlobal++;\n    var eigeneId = 'zr' + zaehlerGlobal;\n    var typ = (tiefe === 0) ? 'ordner' : klassifiziere(knoten.name);\n    var icon = tiefe === 0 ? '\ud83d\udcc1' : TYP_ICON[typ];\n    var hatKinder = knoten.kinder.length > 0;\n    var anzahl = hatKinder ? zaehleInhalt(knoten.kinder) : null;\n    var breite = spaltenbreiten[tiefe] || 20;\n\n    alleKnotenListe.push({ id: eigeneId, tiefe: tiefe, hatKinder: hatKinder });\n\n    var toggleHtml = hatKinder\n      ? '<span class=\"roze-toggle\" data-id=\"' + eigeneId + '\">\u25be<\/span>'\n      : '<span class=\"roze-toggle roze-leer\">\u00b7<\/span>';\n    var anzahlHtml = (typ === 'ordner' && anzahl)\n      ? ' <span class=\"roze-anzahl\">(' + anzahl.o + '\/' + anzahl.d + ')<\/span>'\n      : '';\n    var klasse = 'roze-knoten-zeile' + (typ !== 'ordner' ? ' roze-datei-zeile' : '') + (hatKinder ? ' roze-zeile-klickbar' : '');\n\n    var html = '<div class=\"roze-knoten\">';\n    html += '<div class=\"' + klasse + '\" data-id=\"' + eigeneId + '\">';\n    html += '<span class=\"roze-toggle-zelle\">' + toggleHtml + '<\/span>';\n    html += '<span class=\"roze-nummer-zelle\" style=\"min-width:' + breite + 'px\">' + (nummer !== null ? nummer + '.' : '') + '<\/span>';\n    html += '<span class=\"roze-icon-zelle\">' + icon + '<\/span>';\n    html += '<span class=\"roze-name-zelle\">' + escapeHtml(knoten.name) + anzahlHtml + '<\/span>';\n    html += '<\/div>';\n\n    if(hatKinder){\n      html += '<div class=\"roze-kinder\" id=\"kinder-' + eigeneId + '\" style=\"margin-left:24px;\">';\n      var kindNummern = kindNummernBerechnen(knoten, nummer, tiefe);\n      knoten.kinder.forEach(function(kind, idx){\n        html += renderKnoten(kind, kindNummern[idx], tiefe+1, spaltenbreiten);\n      });\n      html += '<\/div>';\n    }\n    html += '<\/div>';\n    return html;\n  }\n\n  function rozeSichtbarkeitAktualisieren(){\n    var ausgabe = document.getElementById('rozeBaumAusgabe');\n    var schalter = document.getElementById('rozeDateienAnzeigen');\n    var dateienSichtbar = schalter ? schalter.checked : true;\n    ausgabe.querySelectorAll('.roze-datei-zeile').forEach(function(zeile){\n      zeile.style.display = dateienSichtbar ? '' : 'none';\n    });\n    alleKnotenListe.forEach(function(k){\n      if(!k.hatKinder) return;\n      var kinderBereich = document.getElementById('kinder-' + k.id);\n      var zustand = window.__rozeExpandState[k.id];\n      var versteckt = (zustand === false);\n      if(kinderBereich) kinderBereich.style.display = versteckt ? 'none' : '';\n      var eigeneZeile = document.querySelector('.roze-knoten-zeile[data-id=\"' + k.id + '\"]');\n      if(eigeneZeile){\n        var toggle = eigeneZeile.querySelector('.roze-toggle');\n        if(toggle) toggle.textContent = versteckt ? '\u25b8' : '\u25be';\n      }\n    });\n  }\n\n  function zeigeBaum(wurzel){\n    var ausgabe = document.getElementById('rozeBaumAusgabe');\n    zaehlerGlobal = 0;\n    alleKnotenListe = [];\n    window.__rozeExpandState = {};\n\n    var font = getComputedStyle(ausgabe).fontWeight + ' ' + getComputedStyle(ausgabe).fontSize + ' ' + getComputedStyle(ausgabe).fontFamily;\n    var spaltenbreiten = spaltenbreitenInPixelBerechnen(wurzel, font);\n\n    var html = renderKnoten(wurzel, '0', 0, spaltenbreiten);\n    ausgabe.innerHTML = html;\n    ausgabe.dataset.baum = JSON.stringify(wurzel);\n\n    ausgabe.querySelectorAll('.roze-zeile-klickbar').forEach(function(zeile){\n      zeile.addEventListener('click', function(){\n        var id = zeile.dataset.id;\n        var aktuell = window.__rozeExpandState[id];\n        window.__rozeExpandState[id] = (aktuell === false) ? true : false;\n        rozeSichtbarkeitAktualisieren();\n      });\n    });\n\n    rozeSichtbarkeitAktualisieren();\n  }\n\n  function alleUmschalten(anzeigen){\n    alleKnotenListe.forEach(function(k){\n      if(k.hatKinder) window.__rozeExpandState[k.id] = anzeigen;\n    });\n    rozeSichtbarkeitAktualisieren();\n  }\n\n  function ebeneOeffnen(zielEbene){\n    alleKnotenListe.forEach(function(k){\n      if(!k.hatKinder) return;\n      window.__rozeExpandState[k.id] = (k.tiefe < zielEbene);\n    });\n    rozeSichtbarkeitAktualisieren();\n  }\n\n  function alsTextExportieren(knoten, nummer, ebene, dateienZeigen, spaltenbreiten){\n    var einzug = '  '.repeat(ebene);\n    var typ = klassifiziere(knoten.name);\n    var icon = ebene === 0 ? '\ud83d\udcc1' : TYP_ICON[typ];\n    if(typ !== 'ordner' && !dateienZeigen) return '';\n    var breite = spaltenbreiten[ebene] || 2;\n    var nummerRoh = (nummer === null) ? '' : (nummer + '.');\n    while(nummerRoh.length < breite) nummerRoh += ' ';\n    var anzahlText = '';\n    if(typ === 'ordner' && knoten.kinder.length){\n      var anzahl = zaehleInhalt(knoten.kinder);\n      anzahlText = ' (' + anzahl.o + '\/' + anzahl.d + ')';\n    }\n    var zeile = einzug + nummerRoh + icon + ' ' + knoten.name + anzahlText + '\\n';\n    var kindNummern = kindNummernBerechnen(knoten, nummer, ebene);\n    knoten.kinder.forEach(function(kind, idx){\n      zeile += alsTextExportieren(kind, kindNummern[idx], ebene+1, dateienZeigen, spaltenbreiten);\n    });\n    return zeile;\n  }\n\n  function downloadErzeugen(){\n    var ausgabe = document.getElementById('rozeBaumAusgabe');\n    if(!ausgabe.dataset.baum){\n      alert('Es liegt noch kein eingelesener Ordner vor.');\n      return;\n    }\n    var wurzel = JSON.parse(ausgabe.dataset.baum);\n    var schalter = document.getElementById('rozeDateienAnzeigen');\n    var dateienZeigen = schalter ? schalter.checked : true;\n    var spaltenbreiten = spaltenbreitenBerechnen(wurzel);\n    var text = alsTextExportieren(wurzel, '0', 0, dateienZeigen, spaltenbreiten);\n    var blob = new Blob([text], { type: 'text\/plain;charset=utf-8' });\n    var url = URL.createObjectURL(blob);\n    var a = document.createElement('a');\n    a.href = url;\n    a.download = 'ordnerstammbaum.txt';\n    document.body.appendChild(a);\n    a.click();\n    document.body.removeChild(a);\n    URL.revokeObjectURL(url);\n  }\n\n  function loeschen(){\n    var ausgabe = document.getElementById('rozeBaumAusgabe');\n    ausgabe.innerHTML = '<div class=\"roze-baum-platzhalter\">Hier erscheint die Baumdarstellung ...<\/div>';\n    delete ausgabe.dataset.baum;\n  }\n\n  \/\/ ----- Ereignisse -----\n\n  var dropzone = document.getElementById('rozeBaumDropzone');\n  var dateiauswahl = document.getElementById('rozeBaumDateiauswahl');\n\n  dropzone.addEventListener('click', function(){ dateiauswahl.click(); });\n\n  dropzone.addEventListener('dragover', function(e){\n    e.preventDefault();\n    dropzone.classList.add('roze-baum-drag-ueber');\n  });\n  dropzone.addEventListener('dragleave', function(){\n    dropzone.classList.remove('roze-baum-drag-ueber');\n  });\n  dropzone.addEventListener('drop', function(e){\n    e.preventDefault();\n    dropzone.classList.remove('roze-baum-drag-ueber');\n    var items = e.dataTransfer.items;\n    if(!items || !items.length) return;\n    var eintrag = items[0].webkitGetAsEntry ? items[0].webkitGetAsEntry() : null;\n    var ausgabe = document.getElementById('rozeBaumAusgabe');\n    if(!eintrag){\n      ausgabe.innerHTML = '<div class=\"roze-baum-platzhalter\">Dieser Browser unterst\u00fctzt das direkte Einlesen von Ordnern per Drag &amp; Drop nicht. Die Dateiauswahl kann stattdessen \u00fcber einen Klick auf das Feld ge\u00f6ffnet werden.<\/div>';\n      return;\n    }\n    if(!eintrag.isDirectory){\n      ausgabe.innerHTML = '<div class=\"roze-baum-platzhalter\">Es wird ein Ordner ben\u00f6tigt, keine einzelne Datei.<\/div>';\n      return;\n    }\n    ausgabe.innerHTML = '<div class=\"roze-baum-platzhalter\">Ordner wird eingelesen ...<\/div>';\n    liesVerzeichnis(eintrag).then(zeigeBaum);\n  });\n\n  dateiauswahl.addEventListener('change', function(){\n    if(!dateiauswahl.files || !dateiauswahl.files.length) return;\n    var ausgabe = document.getElementById('rozeBaumAusgabe');\n    ausgabe.innerHTML = '<div class=\"roze-baum-platzhalter\">Ordner wird eingelesen ...<\/div>';\n    var wurzel = liesAusDateiliste(dateiauswahl.files);\n    zeigeBaum(wurzel);\n  });\n\n  document.getElementById('rozeBaumAufklappen').addEventListener('click', function(){ alleUmschalten(true); });\n  document.getElementById('rozeBaumZuklappen').addEventListener('click', function(){ alleUmschalten(false); });\n  document.querySelectorAll('.knopf-ebene').forEach(function(knopf){\n    knopf.addEventListener('click', function(){\n      ebeneOeffnen(parseInt(knopf.dataset.ebene, 10));\n    });\n  });\n  document.getElementById('rozeBaumDownload').addEventListener('click', downloadErzeugen);\n  document.getElementById('rozeBaumDrucken').addEventListener('click', function(){ window.print(); });\n  document.getElementById('rozeBaumLoeschen').addEventListener('click', loeschen);\n  document.getElementById('rozeDateienAnzeigen').addEventListener('change', function(){\n    rozeSichtbarkeitAktualisieren();\n  });\n})();\n<\/script>\n<br><br><br>\n\n\n\n<div style=\"text-align:center;\">\n    <img decoding=\"async\" id=\"gifImage\" border=\"0\" style=\"border:0; display:block; margin:0 auto;\" src=\"https:\/\/www.123gif.de\/gifs\/verkehrsschilder\/verkehrsschild-0016.gif\" alt=\"Verkehrsschild von 123gif.de\" aria-describedby=\"bildinfo\"><!-- RoZe-Programm: Ein HTML-Service vom 175er Verlag -->\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<title>RoZe-Programm*: Linkk\u00fcrzer<\/title>\n<style>\n  .roze-linkkuerzer {\n    font-family: Arial, sans-serif;\n    background-color: #fbe8f0 !important;\n    padding: 20px !important;\n    border-radius: 12px !important;\n    box-shadow: 0 4px 14px rgba(0, 0, 0, 0.12) !important;\n    box-sizing: border-box;\n  }\n  .roze-linkkuerzer * {\n    box-sizing: border-box;\n  }\n  .roze-linkkuerzer .titelbalken {\n    background-color: #ff6699 !important;\n    color: #ffffff !important;\n    font-weight: bold;\n    font-size: 1.3em;\n    text-align: center;\n    padding: 12px 20px !important;\n    border-radius: 8px !important;\n    width: 100%;\n    margin-bottom: 12px;\n  }\n  .roze-linkkuerzer .titelbalken .sternchen {\n    font-weight: normal;\n  }\n  .roze-linkkuerzer .beschreibung {\n    font-size: 0.95em;\n    color: #333;\n    line-height: 1.4em;\n    margin: 0 0 15px 0;\n  }\n  .roze-linkkuerzer .beschreibung strong {\n    display: block;\n    margin-bottom: 8px;\n  }\n  .roze-linkkuerzer .note {\n    font-size: 0.9em;\n    font-style: italic;\n    color: #ff6699;\n    margin-top: 15px;\n  }\n<\/style>\n\n<div class=\"roze-linkkuerzer\">\n\n  <div class=\"titelbalken\">Ro\u00adZe-Pro\u00adgramm<span class=\"sternchen\">*<\/span>: Link\u00adk\u00fcr\u00adzer<\/div>\n  <div class=\"beschreibung\">\n    <strong>Was macht die\u00adses klei\u00adne Hilfsprogramm:<\/strong> Ver\u00adk\u00fcrzt ei\u00adne lan\u00adge In\u00adter\u00adnet\u00adadres\u00adse in ei\u00adnen kur\u00adzen, leicht zu mer\u00adken\u00adden Link mit der Do\u00admain rab\u2011k.de. Der er\u00adzeug\u00adte Link ist zeit\u00adlich un\u00adbe\u00adgrenzt g\u00fcltig.<br> Lan\u00adge URL ein\u00adf\u00fc\u00adgen und ent\u00adwe\u00adder di\u00adrekt auf \u201eK\u00fcr\u00adzen\u201c kli\u00adcken, oder im zwei\u00adten Feld ei\u00adnen ei\u00adge\u00adnen Wunsch\u00adlink ein\u00adtra\u00adgen und dann \u201eK\u00fcr\u00adzen\u201c. <\/div>\n\n  <!-- WordPress Plugin Shortcode --> [link\u00adkuer\u00adzer] <div class=\"note\">* Ro\u00adZe = (Herr) Ro\u00adsa von Zehn\u00adle (\u00far) \u2013 Ein kos\u00adten\u00adlo\u00adser HTML-Ser\u00advice vom 175er Verlag!<\/div>\n\n<\/div>\n\n<!-- Ein Service vom 175er Verlag -->\n<br><br><br>\n\n\n\n<!-- RoZe-Programm: Ein HTML-Service vom 175er Verlag -->\n<meta charset=\"UTF-8\">\n<title>RoZe-Programm*: Unsichtbare Zeichen und Sonderzeichen sichtbar machen<\/title>\n<style>\n  .roze-zeichen { font-family: Arial, sans-serif; background-color: #fbe8f0 !important; padding: 20px !important; border-radius: 12px !important; box-shadow: 0 4px 14px rgba(0,0,0,0.12) !important; box-sizing: border-box; }\n  .roze-zeichen * { box-sizing: border-box; }\n  .roze-zeichen .titelbalken { background-color: #ff6699 !important; color: #ffffff !important; font-weight: bold; font-size: 1.3em; text-align: center; padding: 12px 20px !important; border-radius: 8px !important; width: 100%; margin-bottom: 12px; }\n  .roze-zeichen .titelbalken .sternchen { font-weight: normal; }\n  .roze-zeichen .beschreibung { font-size: 0.95em; color: #333; line-height: 1.4em; margin: 0 0 15px 0; }\n  .roze-zeichen .beschreibung strong { display: block; margin-bottom: 8px; }\n  .roze-zeichen .hinweis-technik { font-size: 0.88em; font-style: italic; color: #7a4a5c; line-height: 1.4em; margin: 0 0 15px 0; background-color: #fff0f5; border: 1px solid #e0b8c8; border-radius: 8px; padding: 10px 12px; }\n  .roze-zeichen .spalten { display: flex; gap: 16px; flex-wrap: wrap; align-items: stretch; }\n  .roze-zeichen .spalte { flex: 1; min-width: 260px; display: flex; flex-direction: column; }\n  .roze-zeichen h3 { color: #ff6699 !important; font-weight: bold; margin-top: 0; margin-bottom: 8px; text-align: center; }\n  .roze-zeichen .eingabefeld { width: 100%; flex: 1; min-height: 230px; max-height: 420px; padding: 10px !important; border: 1px solid #e0b8c8 !important; border-radius: 8px !important; background-color: #fffafc !important; color: #333; font-family: Arial, sans-serif; font-size: 0.9em; overflow-y: auto; white-space: pre-wrap; word-break: break-word; margin: 0 0 8px 0 !important; outline: none; }\n  .roze-zeichen .eingabefeld:empty:before { content: attr(data-ph); color: #999; }\n  .roze-zeichen .zaehler { margin: 4px 0 0 0; font-weight: bold; color: #333; text-align: center; }\n  .roze-zeichen button { background-color: #ff6699 !important; color: #ffffff !important; font-weight: bold; border: 2px solid #ff6699 !important; border-radius: 8px !important; padding: 10px 14px !important; font-size: 0.9em; cursor: pointer; outline: none; white-space: normal; line-height: 1.3em; text-align: center; width: 100%; margin: 0 0 8px 0; }\n  .roze-zeichen button:hover, .roze-zeichen button:focus, .roze-zeichen button:active { background-color: #ffffff !important; color: #ff6699 !important; border: 2px solid #ff6699 !important; outline: none; box-shadow: none; }\n  .roze-zeichen .befunde { background-color: #fffafc; border: 1px solid #e0b8c8; border-radius: 8px; padding: 8px; min-height: 120px; font-size: 0.9em; color: #333; flex: 1; overflow-y: auto; }\n  .roze-zeichen .befund-zeile { display: flex; gap: 8px; align-items: center; padding: 4px 2px; border-bottom: 1px solid #f0d0dc; }\n  .roze-zeichen .befund-zeile .bf-text { flex: 1; }\n  .roze-zeichen .vorschau { margin-top: 15px; }\n  .roze-zeichen .vorschau-feld { background-color: #fffafc; border: 1px solid #e0b8c8; border-radius: 8px; padding: 10px; max-height: 360px; overflow-y: auto; white-space: pre-wrap; word-break: break-word; font-size: 0.9em; color: #333; line-height: 1.6em; }\n  .roze-zeichen .m-entf, .roze-zeichen .m-leer, .roze-zeichen .m-punkte, .roze-zeichen .m-hand { border-radius: 4px; padding: 0 3px; font-weight: bold; }\n  .roze-zeichen .m-entf { background-color: #fbd0d0; color: #a01818; border: 1px solid #a01818; }\n  .roze-zeichen .m-leer { background-color: #ffe3c2; color: #a04a00; border: 1px solid #a04a00; }\n  .roze-zeichen .m-punkte { background-color: #d6e6fb; color: #134b9a; border: 1px solid #134b9a; }\n  .roze-zeichen .m-hand { background-color: #ecd9f6; color: #6a1b9a; border: 1px solid #6a1b9a; }\n  .roze-zeichen .legende { display: flex; flex-wrap: wrap; gap: 8px; margin: 0 0 8px 0; font-size: 0.85em; color: #333; }\n  .roze-zeichen .note { font-size: 0.9em; font-style: italic; color: #ff6699; margin-top: 15px; }\n<\/style>\n\n<div class=\"roze-zeichen\">\n\n  <div class=\"titelbalken\">Ro\u00adZe-Pro\u00adgramm<span class=\"sternchen\">*<\/span>: Un\u00adsicht\u00adba\u00adre Zei\u00adchen und Son\u00adder\u00adzei\u00adchen sicht\u00adbar machen<\/div>\n  <div class=\"beschreibung\">\n    <strong>Was macht die\u00adses klei\u00adne Hilfsprogramm:<\/strong> Du f\u00fcgst ei\u00adnen Text ein (am bes\u00adten di\u00adrekt aus Word oder Libre\u00adOf\u00adfice ko\u00adpiert, dann blei\u00adben Schrift, Gr\u00f6\u00ad\u00dfe, Fett\u00addruck, Kur\u00adsiv\u00adschrift und Far\u00adben er\u00adhal\u00adten) oder l\u00e4dst ei\u00adne Da\u00adtei (DOC, DOCX, ODT, OTT, TXT, HTML), und das Pro\u00adgramm zeigt Dir je\u00addes un\u00adsicht\u00adba\u00adre oder un\u00ader\u00adw\u00fcnsch\u00adte Zei\u00adchen far\u00adbig an der Stel\u00adle, an der es steht, dar\u00adun\u00adter null\u00adbrei\u00adte und be\u00adson\u00adde\u00adre Leer\u00adzei\u00adchen, Rich\u00adtungs\u00admar\u00adken, ver\u00adsteck\u00adte Tag-Zei\u00adchen, wei\u00adche Trenn\u00adstri\u00adche, das ein\u00adzel\u00adne Aus\u00adlas\u00adsungs\u00adzei\u00adchen, Ge\u00adviert\u00adstri\u00adche, zer\u00adleg\u00adte Buch\u00adsta\u00adben, Pfeil, Auf\u00adz\u00e4h\u00adlungs\u00adpunkt, Ko\u00addie\u00adrungs\u00adsch\u00e4\u00adden, Mark\u00addown-Res\u00adte und nicht deut\u00adsche An\u00adf\u00fch\u00adrungs\u00adzei\u00adchen. Dar\u00adun\u00adter steht ei\u00adne Z\u00e4h\u00adlung, und auf Wunsch er\u00adh\u00e4ltst Du ei\u00adne be\u00adrei\u00adnig\u00adte Fas\u00adsung. Um\u00adlau\u00adte, \u00df&nbsp;und al\u00adle un\u00adga\u00adri\u00adschen Buch\u00adsta\u00adben wie \u0151&nbsp;und \u0171&nbsp;blei\u00adben stets unber\u00fchrt.&nbsp;<\/div>\n  <div class=\"hinweis-technik\">Dein Text ver\u00adl\u00e4\u00dft Dei\u00adnen Rech\u00adner nicht, das Pro\u00adgramm l\u00e4uft nur in Dei\u00adnem Brow\u00adser. Das Was\u00adser\u00adzei\u00adchen man\u00adcher Sprach\u00admo\u00addel\u00adle steckt in der Wort\u00adwahl, ist kein Zei\u00adchen und wird hier nicht an\u00adge\u00adzeigt. Ent\u00adfernt: un\u00adsicht\u00adba\u00adre Zei\u00adchen, Rich\u00adtungs\u00admar\u00adken. Er\u00adsetzt: be\u00adson\u00adde\u00adre Leer\u00adzei\u00adchen durch das ge\u00adw\u00f6hn\u00adli\u00adche, Aus\u00adlas\u00adsungs\u00adzei\u00adchen durch drei Punk\u00adte, ge\u00adra\u00adde und eng\u00adli\u00adsche An\u00adf\u00fch\u00adrungs\u00adzei\u00adchen durch deut\u00adsche, Ge\u00adviert\u00adstri\u00adche durch Halb\u00adge\u00adviert\u00adstri\u00adche (zwi\u00adschen W\u00f6r\u00adtern mit Leer\u00adzei\u00adchen da\u00advor und da\u00adnach), zer\u00adleg\u00adte Buch\u00adsta\u00adben zu\u00adsam\u00admen\u00adge\u00adsetzt. Nor\u00adma\u00adler Bin\u00adde\u00adstrich: zwi\u00adschen Zif\u00adfern (1955\u200a\u2013\u200a2025), als Er\u00adg\u00e4n\u00adzungs\u00adstrich (Haus- und Hof\u00adge\u00adb\u00e4u\u00adde), auch statt ei\u00adnes dort ge\u00adfun\u00adde\u00adnen Halb\u00adge\u00adviert\u00adstrichs. Nur mar\u00adkiert, von Hand zu ent\u00adschei\u00adden: Pfeil, Auf\u00adz\u00e4h\u00adlungs\u00adpunkt, Er\u00adsatz\u00adzei\u00adchen, Ko\u00addie\u00adrungs\u00adsch\u00e4\u00adden, Mark\u00addown-Res\u00adte. Ein Halb\u00adge\u00adviert\u00adstrich als Ge\u00addan\u00adken\u00adstrich bleibt un\u00adbe\u00adan\u00adstan\u00addet. Da\u00adtei\u00aden: DOCX, ODT und OTT wer\u00adden mit Schrift, Gr\u00f6\u00ad\u00dfe, Fett, Kur\u00adsiv, Un\u00adter\u00adstri\u00adchen, Far\u00adbe und Aus\u00adrich\u00adtung \u00fcber\u00adnom\u00admen, nicht \u00fcber\u00adnom\u00admen wer\u00adden Bil\u00adder, Kopf- und Fu\u00df\u00adzei\u00adlen, Fu\u00df\u00adno\u00adten, Nu\u00adme\u00adrie\u00adrun\u00adgen und Sei\u00adten\u00adlay\u00adout. DOC und PDF liest das Pro\u00adgramm nicht: in Word als DOCX spei\u00adchern (Word \u00f6ff\u00adnet auch PDF) oder Text ko\u00adpie\u00adren und ein\u00adf\u00fc\u00adgen, der Brow\u00adser kann da\u00adbei Lay\u00adout\u00adan\u00adga\u00adben vereinfachen.&nbsp;<\/div>\n\n  <div class=\"spalten\">\n    <div class=\"spalte\">\n      <h3>Text hier\u00adher<\/h3>\n      <div id=\"zp-eingabe\" class=\"eingabefeld\" contenteditable=\"true\" data-ph=\"Text hier einf\u00fcgen. Aus Word oder LibreOffice kopierter Text beh\u00e4lt Schrift, Gr\u00f6\u00dfe, Fettdruck, Kursivschrift und Farben ...\"><\/div>\n      <input type=\"file\" id=\"zp-dateiauswahl\" accept=\".docx,.odt,.ott,.doc,.pdf,.txt,.md,.html,.htm,.csv\" style=\"display:none;\">\n      <button id=\"zp-datei-knopf\">Datei laden (DOCX, ODT, OTT, TXT, HTML)<\/button>\n      <div class=\"zaehler\">Zei\u00adchen im Text: <span id=\"zp-zahl-zeichen\">0<\/span><\/div>\n    <\/div>\n    <div class=\"spalte\">\n      <h3>Be\u00adfund<\/h3>\n      <button id=\"zp-pruefen-knopf\">Text pr\u00fcfen<\/button>\n      <div class=\"befunde\" id=\"zp-befunde\">Hier er\u00adscheint der Befund.<\/div>\n      <div class=\"zaehler\">Fun\u00adde ins\u00adge\u00adsamt: <span id=\"zp-zahl-funde\">0<\/span><\/div>\n      <button id=\"zp-kopieren-knopf\" style=\"margin-top:10px;\">Bereinigte Fassung mit Layout kopieren<\/button>\n      <button id=\"zp-download-knopf\">Bereinigte Fassung mit Layout herunterladen (HTML)<\/button>\n      <button id=\"zp-txt-knopf\">Nur den bereinigten Text herunterladen (TXT)<\/button>\n      <button id=\"zp-zuruecksetzen-knopf\">Alles zur\u00fccksetzen<\/button>\n    <\/div>\n  <\/div>\n\n  <div class=\"vorschau\">\n    <h3>Mar\u00adkier\u00adter&nbsp;Text<\/h3>\n    <div class=\"legende\">\n      <span class=\"m-entf\">rot: un\u00adsicht\u00adbar, wird entfernt<\/span>\n      <span class=\"m-leer\">oran\u00adge: Son\u00adder\u00adleer\u00adzei\u00adchen, wird zum ge\u00adw\u00f6hn\u00adli\u00adchen Leerzeichen<\/span>\n      <span class=\"m-punkte\">blau: wird er\u00adsetzt oder zusammengesetzt<\/span>\n      <span class=\"m-hand\">vio\u00adlett: nur mar\u00adkiert, von Hand \u00e4ndern<\/span>\n    <\/div>\n    <div class=\"vorschau-feld\" id=\"zp-vorschau\">Nach dem Pr\u00fc\u00adfen er\u00adscheint hier Dein Text mit den mar\u00adkier\u00adten Zeichen.<\/div>\n  <\/div>\n\n  <div class=\"note\">* Ro\u00adZe = (Herr) Ro\u00adsa von Zehn\u00adle (\u00far) \u2013 Ein kos\u00adten\u00adlo\u00adser HTML-Ser\u00advice vom 175er Verlag!<\/div>\n\n<\/div>\n\n<!-- Ein Service vom 175er Verlag -->\n\n<script>\n(function() {\n  var R = {};\n  var BEH = { entf: 'wird entfernt', leer: 'wird zum Leerzeichen', punkte: 'wird ersetzt', hand: 'von Hand \u00e4ndern' };\n  function regel(codes, name, typ, ers, beh) {\n    codes.forEach(function(c) { R[c] = { name: name, typ: typ, ers: ers, beh: beh || BEH[typ] }; });\n  }\n  function bereich(von, bis) { var l = []; for (var c = von; c <= bis; c++) l.push(c); return l; }\n  regel([0x200B], 'Nullbreites Leerzeichen', 'entf', '');\n  regel([0x200C], 'Bindehemmer', 'entf', '');\n  regel([0x200D], 'Nullbreiter Verbinder', 'entf', '');\n  regel([0x2060], 'Wortverbinder', 'entf', '');\n  regel([0xFEFF], 'Byte-Order-Mark im Text', 'entf', '');\n  regel([0x00AD], 'Weicher Trennstrich', 'entf', '');\n  regel([0x2061], 'Function Application', 'entf', '');\n  regel([0x2062], 'Unsichtbares Malzeichen', 'entf', '');\n  regel([0x2063], 'Unsichtbares Trennzeichen', 'entf', '');\n  regel([0x2064], 'Unsichtbares Pluszeichen', 'entf', '');\n  regel([0x034F], 'Graphemverbinder', 'entf', '');\n  regel(bereich(0x206A, 0x206F), 'Veraltetes Steuerzeichen', 'entf', '');\n  regel([0x180E], 'Mongolisches Trennzeichen', 'entf', '');\n  regel([0x200E, 0x200F, 0x061C], 'Richtungsmarke', 'entf', '');\n  regel(bereich(0x202A, 0x202E), 'Richtungssteuerzeichen', 'entf', '');\n  regel(bereich(0x2066, 0x2069), 'Richtungsisolierung', 'entf', '');\n  regel(bereich(0xE0000, 0xE007F), 'Tag-Zeichen (kann versteckten Text tragen)', 'entf', '');\n  regel([0x202F], 'Schmales gesch\u00fctztes Leerzeichen', 'leer', ' ');\n  regel([0x2009], 'Schmales Leerzeichen', 'leer', ' ');\n  regel([0x00A0], 'Gesch\u00fctztes Leerzeichen', 'leer', ' ');\n  regel(bereich(0x2000, 0x2008).concat([0x200A, 0x205F, 0x3000, 0x1680]), 'Besonderes Leerzeichen', 'leer', ' ');\n  regel([0x2028, 0x2029], 'Zeilen- oder Absatztrenner', 'leer', '\\n', 'wird zum Zeilenumbruch');\n  regel([0x2026], 'Auslassungszeichen', 'punkte', '...', 'wird zu drei Punkten');\n  var GEVIERT = {};\n  [0x2014, 0x2015, 0x2E3A, 0x2E3B, 0xFE58].forEach(function(c) { GEVIERT[c] = true; });\n  regel([0x2014, 0x2015, 0x2E3A, 0x2E3B, 0xFE58], 'Geviertstrich', 'punkte', '\\u2013', 'wird zum Halbgeviertstrich');\n  regel([0x2192], 'Pfeil', 'hand', null);\n  regel([0x2022], 'Aufz\u00e4hlungspunkt', 'hand', null);\n  regel([0xFFFD], 'Ersatzzeichen (Kodierungsschaden)', 'hand', null);\n  var ZERLEGT = { name: 'Zerlegter Buchstabe (Akzent einzeln)', typ: 'punkte', ers: null, beh: 'wird zusammengesetzt' };\n  var MOJ = { name: 'M\u00f6glicher Kodierungsschaden', typ: 'hand', ers: null, beh: 'von Hand pr\u00fcfen' };\n  var MD = { name: 'Markdown-Rest', typ: 'hand', ers: null, beh: 'von Hand \u00e4ndern' };\n  var ANF_O = { name: 'Anf\u00fchrungszeichen nicht deutsch (\u00f6ffnend)', typ: 'punkte', ers: '\\u201E', beh: 'wird zum deutschen \u00f6ffnenden Zeichen' };\n  var ANF_S = { name: 'Anf\u00fchrungszeichen nicht deutsch (schlie\u00dfend)', typ: 'punkte', ers: '\\u201C', beh: 'wird zum deutschen schlie\u00dfenden Zeichen' };\n  var BINDE = { name: 'Halbgeviertstrich als Bereichs- oder Erg\u00e4nzungsstrich', typ: 'punkte', ers: '-', beh: 'wird zum Bindestrich' };\n  var BINDE_G = { name: 'Geviertstrich als Bereichs- oder Erg\u00e4nzungsstrich', typ: 'punkte', ers: '-', beh: 'wird zum Bindestrich' };\n  var MOJFOLGE = \/[\\u00A0-\\u00BF\\u0152\\u0153\\u0160\\u0161\\u0178\\u017D\\u017E\\u0192\\u02C6\\u02DC\\u2013\\u2014\\u2018-\\u201E\\u2020-\\u2022\\u2026\\u2030\\u2039\\u203A\\u20AC\\u2122]\/;\n\n  var bereinigtHtml = '';\n  var bereinigtText = '';\n  var dateiname = 'text';\n\n  function $(id) { return document.getElementById(id); }\n  function hex(c) { var h = c.toString(16).toUpperCase(); while (h.length < 4) h = '0' + h; return 'U+' + h; }\n\n  function textKnoten(wurzel) {\n    var liste = [];\n    var w = document.createTreeWalker(wurzel, NodeFilter.SHOW_TEXT, null, false);\n    var n;\n    while ((n = w.nextNode())) liste.push(n);\n    return liste;\n  }\n\n  function hashAnfang(zeichen, i) {\n    var k = i;\n    while (k > 0 && zeichen[k - 1] === '#') k--;\n    return (k === 0 || zeichen[k - 1] === '\\n') && \/^#{1,6}\\s\/.test(zeichen.slice(k, k + 8).join(''));\n  }\n  function linie(zeichen, i) {\n    var a = i, e = i;\n    while (a > 0 && zeichen[a - 1] !== '\\n') a--;\n    while (e < zeichen.length && zeichen[e] !== '\\n') e++;\n    return \/^\\s*-{3,}\\s*$\/.test(zeichen.slice(a, e).join(''));\n  }\n  function strich(zeichen, i) {\n    var v = zeichen[i - 1], n = zeichen[i + 1];\n    if (v && n && !\/\\s\/.test(v) && !\/\\s\/.test(n) && !(\/[0-9]\/.test(v) && \/[0-9]\/.test(n))) return ' \\u2013 ';\n    return '\\u2013';\n  }\n\n  function bindestrichFall(zeichen, i) {\n    var v = zeichen[i - 1] || '', n = zeichen[i + 1] || '';\n    if (\/[0-9]\/.test(v) && \/[0-9]\/.test(n)) return true;\n    if (\/[A-Za-z\\u00C0-\\u024F]\/.test(v)) {\n      if (n === ',') return true;\n      if (n === ' ' && \/^ (und|oder|sowie|bzw\\.|beziehungsweise)(\\s|$)\/i.test(zeichen.slice(i + 1, i + 18).join(''))) return true;\n    }\n    return false;\n  }\n  function blockVon(knoten, wurzel) {\n    var p = knoten.parentNode;\n    while (p && p !== wurzel && !\/^(P|DIV|LI|TD|TH|H[1-6]|BLOCKQUOTE|PRE)$\/.test(p.nodeName)) p = p.parentNode;\n    return p;\n  }\n\n  function regelFuer(z, zeichen, i, zust) {\n    var c = z.codePointAt(0);\n    if (GEVIERT[c] || c === 0x2013) {\n      if (bindestrichFall(zeichen, i)) return GEVIERT[c] ? BINDE_G : BINDE;\n      return GEVIERT[c] ? R[c] : null;\n    }\n    if (R[c]) return R[c];\n    if (c >= 0x300 && c <= 0x36F) {\n      var v = zeichen[i - 1];\n      return (v && (v + z).normalize('NFC').length === 1) ? ZERLEGT : null;\n    }\n    var n = zeichen[i + 1] || '';\n    if ((z === '\\u00C3' || z === '\\u00C5') && MOJFOLGE.test(n)) return MOJ;\n    if (z === '\\u00E2' && n === '\\u20AC') return MOJ;\n    if (c === 0x22) { var o = !zust.offen; zust.offen = o; return o ? ANF_O : ANF_S; }\n    if (c === 0x201E) { zust.offen = true; return null; }\n    if (c === 0x201C) { if (zust.offen) { zust.offen = false; return null; } zust.offen = true; return ANF_O; }\n    if (c === 0x201D) { zust.offen = false; return ANF_S; }\n    if (z === '`') return MD;\n    if ((z === '*' || z === '_') && (zeichen[i - 1] === z || n === z)) return MD;\n    if (z === '#' && hashAnfang(zeichen, i)) return MD;\n    if (z === '-' && (zeichen[i - 1] === '-' || n === '-') && linie(zeichen, i)) return MD;\n    return null;\n  }\n\n  function verarbeiten(wurzel, markieren, zaehl) {\n    var funde = 0;\n    var zust = { offen: false, block: null };\n    textKnoten(wurzel).forEach(function(knoten) {\n      var bl = blockVon(knoten, wurzel);\n      if (bl !== zust.block) { zust.block = bl; zust.offen = false; }\n      var orig = knoten.nodeValue;\n      var wert = markieren ? orig : orig.normalize('NFC');\n      var zeichen = Array.from(wert);\n      var puffer = '';\n      var teile = document.createDocumentFragment();\n      var geaendert = (wert !== orig);\n      function leeren() {\n        if (puffer) { teile.appendChild(document.createTextNode(puffer)); puffer = ''; }\n      }\n      zeichen.forEach(function(z, i) {\n        if (z === '\\n') zust.offen = false;\n        var r = regelFuer(z, zeichen, i, zust);\n        if (!r) { puffer += z; return; }\n        geaendert = true;\n        var c = z.codePointAt(0);\n        if (markieren) {\n          leeren();\n          var s = document.createElement('span');\n          s.className = 'm-' + r.typ;\n          s.title = hex(c) + ' ' + r.name + ', ' + r.beh;\n          s.textContent = (r.typ === 'entf' || r.typ === 'leer' || r === ZERLEGT) ? '[' + hex(c) + ']' : z;\n          teile.appendChild(s);\n          var k = hex(c) + r.name;\n          if (!zaehl[k]) zaehl[k] = { n: 0, r: r, c: c };\n          zaehl[k].n++;\n          funde++;\n        } else {\n          puffer += (r === BINDE || r === BINDE_G) ? '-' : (GEVIERT[c] ? strich(zeichen, i) : (r.ers === null ? z : r.ers));\n        }\n      });\n      if (geaendert) { leeren(); knoten.parentNode.replaceChild(teile, knoten); }\n    });\n    return funde;\n  }\n\n  function zeichenZahl() {\n    $('zp-zahl-zeichen').textContent = Array.from($('zp-eingabe').textContent).length;\n  }\n\n  function pruefen() {\n    var feld = $('zp-eingabe');\n    var gesamt = Array.from(feld.textContent).length;\n    if (!gesamt) { alert('Bitte zuerst einen Text einf\u00fcgen oder eine Datei laden.'); return; }\n    var zaehl = {};\n    var ansicht = feld.cloneNode(true);\n    var funde = verarbeiten(ansicht, true, zaehl);\n    var vorschau = $('zp-vorschau');\n    vorschau.textContent = '';\n    while (ansicht.firstChild) vorschau.appendChild(ansicht.firstChild);\n\n    var sauber = feld.cloneNode(true);\n    verarbeiten(sauber, false, {});\n    bereinigtHtml = sauber.innerHTML;\n    var halter = document.createElement('div');\n    halter.style.cssText = 'position:absolute;left:-9999px;top:0;white-space:pre-wrap;';\n    halter.innerHTML = bereinigtHtml;\n    document.body.appendChild(halter);\n    bereinigtText = halter.innerText || halter.textContent;\n    document.body.removeChild(halter);\n\n    var befunde = $('zp-befunde');\n    befunde.textContent = '';\n    var codes = Object.keys(zaehl).sort();\n    if (!codes.length) {\n      befunde.textContent = 'Keines der unerw\u00fcnschten Zeichen gefunden. Der Text ist sauber.';\n    } else {\n      codes.forEach(function(k) {\n        var e = zaehl[k];\n        var zeile = document.createElement('div');\n        zeile.className = 'befund-zeile';\n        var marke = document.createElement('span');\n        marke.className = 'm-' + e.r.typ;\n        marke.textContent = hex(e.c);\n        var t = document.createElement('span');\n        t.className = 'bf-text';\n        t.textContent = e.r.name + ', ' + e.r.beh;\n        var n = document.createElement('strong');\n        n.textContent = e.n + 'x';\n        zeile.appendChild(marke);\n        zeile.appendChild(t);\n        zeile.appendChild(n);\n        befunde.appendChild(zeile);\n      });\n    }\n    $('zp-zahl-funde').textContent = funde;\n    $('zp-zahl-zeichen').textContent = gesamt;\n  }\n\n  function zipLesen(buf) {\n    var v = new DataView(buf), u8 = new Uint8Array(buf);\n    var e = buf.byteLength - 22;\n    while (e >= 0 && v.getUint32(e, true) !== 0x06054b50) e--;\n    if (e < 0) throw new Error('kein g\u00fcltiges Archiv');\n    var anz = v.getUint16(e + 10, true), off = v.getUint32(e + 16, true), dat = {};\n    for (var i = 0; i < anz; i++) {\n      var nl = v.getUint16(off + 28, true), xl = v.getUint16(off + 30, true), kl = v.getUint16(off + 32, true);\n      var name = new TextDecoder().decode(u8.subarray(off + 46, off + 46 + nl));\n      dat[name] = { meth: v.getUint16(off + 10, true), cs: v.getUint32(off + 20, true), lh: v.getUint32(off + 42, true) };\n      off += 46 + nl + xl + kl;\n    }\n    return { u8: u8, v: v, dat: dat };\n  }\n  function zipEntnehmen(z, name) {\n    var d = z.dat[name];\n    if (!d) return Promise.resolve(null);\n    var start = d.lh + 30 + z.v.getUint16(d.lh + 26, true) + z.v.getUint16(d.lh + 28, true);\n    var roh = z.u8.subarray(start, start + d.cs);\n    if (d.meth === 0) return Promise.resolve(new TextDecoder().decode(roh));\n    if (typeof DecompressionStream === 'undefined') return Promise.reject(new Error('Dein Browser ist zu alt f\u00fcr diese Dateien'));\n    return new Response(new Blob([roh]).stream().pipeThrough(new DecompressionStream('deflate-raw'))).text();\n  }\n  function xml(s) { return new DOMParser().parseFromString(s, 'application\/xml'); }\n  function el(name, css) { var e = document.createElement(name); if (css) e.style.cssText = css; return e; }\n  function txt(s) { return document.createTextNode(s); }\n\n  var W = 'http:\/\/schemas.openxmlformats.org\/wordprocessingml\/2006\/main';\n  var stile = {};\n  function wKinder(e, l) { var r = []; for (var c = e && e.firstElementChild; c; c = c.nextElementSibling) if (c.localName === l) r.push(c); return r; }\n  function wAttr(e, a) { return e ? (e.getAttributeNS(W, a) || e.getAttribute('w:' + a)) : null; }\n  function wJc(v) { return 'text-align:' + ({ both: 'justify', center: 'center', right: 'right', end: 'right' }[v] || 'left') + ';'; }\n  function wRpr(rpr) {\n    var css = '';\n    if (!rpr) return css;\n    function an(l) { var e = wKinder(rpr, l)[0]; if (!e) return false; var v = wAttr(e, 'val'); return !(v === '0' || v === 'false' || v === 'none'); }\n    function wert(l) { return wAttr(wKinder(rpr, l)[0], 'val'); }\n    if (an('b')) css += 'font-weight:bold;';\n    if (an('i')) css += 'font-style:italic;';\n    if (an('u') || an('strike')) css += 'text-decoration:' + (an('u') ? 'underline ' : '') + (an('strike') ? 'line-through' : '') + ';';\n    var col = wert('color'); if (col && col !== 'auto') css += 'color:#' + col + ';';\n    var sz = parseInt(wert('sz'), 10); if (sz) css += 'font-size:' + (sz \/ 2) + 'pt;';\n    var f = wKinder(rpr, 'rFonts')[0], fv = f && (wAttr(f, 'ascii') || wAttr(f, 'hAnsi'));\n    if (fv) css += \"font-family:'\" + fv.replace(\/['\"]\/g, '') + \"';\";\n    var va = wert('vertAlign');\n    if (va === 'superscript') css += 'vertical-align:super;font-size:smaller;';\n    if (va === 'subscript') css += 'vertical-align:sub;font-size:smaller;';\n    return css;\n  }\n  function wStile(doc) {\n    Array.prototype.forEach.call(doc.getElementsByTagNameNS(W, 'style'), function(s) {\n      var ppr = wKinder(s, 'pPr')[0], jc = ppr && wAttr(wKinder(ppr, 'jc')[0], 'val');\n      stile[wAttr(s, 'styleId')] = { bo: wAttr(wKinder(s, 'basedOn')[0], 'val'), css: wRpr(wKinder(s, 'rPr')[0]) + (jc ? wJc(jc) : '') };\n    });\n  }\n  function wStilCss(id, t) { var s = stile[id]; t = t || 0; return (!s || t > 8) ? '' : (s.bo ? wStilCss(s.bo, t + 1) : '') + s.css; }\n  function wLaeufe(knoten, ziel) {\n    for (var c = knoten.firstElementChild; c; c = c.nextElementSibling) {\n      if (c.localName === 'r') {\n        var rpr = wKinder(c, 'rPr')[0], rs = rpr && wKinder(rpr, 'rStyle')[0];\n        var sp = el('span', (rs ? wStilCss(wAttr(rs, 'val')) : '') + wRpr(rpr));\n        for (var k = c.firstElementChild; k; k = k.nextElementSibling) {\n          if (k.localName === 't') sp.appendChild(txt(k.textContent));\n          else if (k.localName === 'tab') sp.appendChild(txt('\\t'));\n          else if (k.localName === 'br' || k.localName === 'cr') sp.appendChild(el('br'));\n          else if (k.localName === 'noBreakHyphen') sp.appendChild(txt('-'));\n        }\n        ziel.appendChild(sp);\n      } else if (\/^(hyperlink|ins|smartTag|sdt|sdtContent|fldSimple|customXml)$\/.test(c.localName)) wLaeufe(c, ziel);\n    }\n  }\n  function wAbsatz(p) {\n    var ppr = wKinder(p, 'pPr')[0], ps = ppr && wKinder(ppr, 'pStyle')[0], jc = ppr && wAttr(wKinder(ppr, 'jc')[0], 'val');\n    var css = 'margin:0 0 0.6em 0;' + (ps ? wStilCss(wAttr(ps, 'val')) : '') + (jc ? wJc(jc) : '');\n    if (ppr && wKinder(ppr, 'numPr')[0]) css += 'display:list-item;list-style-type:disc;margin-left:1.5em;';\n    var a = el('p', css);\n    wLaeufe(p, a);\n    return a;\n  }\n  function wTabelle(tbl) {\n    var t = el('table', 'border-collapse:collapse;margin:0 0 0.6em 0;');\n    wKinder(tbl, 'tr').forEach(function(tr) {\n      var r = t.insertRow(-1);\n      wKinder(tr, 'tc').forEach(function(tc) { var z = r.insertCell(-1); z.style.cssText = 'border:1px solid #ccc;padding:4px;vertical-align:top;'; wKoerper(tc, z); });\n    });\n    return t;\n  }\n  function wKoerper(e, ziel) {\n    for (var c = e.firstElementChild; c; c = c.nextElementSibling) {\n      if (c.localName === 'p') ziel.appendChild(wAbsatz(c));\n      else if (c.localName === 'tbl') ziel.appendChild(wTabelle(c));\n      else if (c.localName === 'sdt' || c.localName === 'sdtContent') wKoerper(c, ziel);\n    }\n  }\n  function docxLesen(z) {\n    return Promise.all([zipEntnehmen(z, 'word\/document.xml'), zipEntnehmen(z, 'word\/styles.xml')]).then(function(t) {\n      if (!t[0]) throw new Error('kein Word-Dokument');\n      stile = {};\n      if (t[1]) wStile(xml(t[1]));\n      var frag = document.createDocumentFragment();\n      wKoerper(xml(t[0]).getElementsByTagNameNS(W, 'body')[0], frag);\n      return frag;\n    });\n  }\n\n  var os = {};\n  function oStile(doc) {\n    Array.prototype.forEach.call(doc.getElementsByTagName('style:style'), function(s) {\n      var tp = s.getElementsByTagName('style:text-properties')[0], pp = s.getElementsByTagName('style:paragraph-properties')[0], css = '';\n      function a(e, n) { return e ? e.getAttribute(n) : null; }\n      if (a(tp, 'fo:font-weight') === 'bold') css += 'font-weight:bold;';\n      if (a(tp, 'fo:font-style') === 'italic') css += 'font-style:italic;';\n      var u = a(tp, 'style:text-underline-style'), d = a(tp, 'style:text-line-through-style');\n      if ((u && u !== 'none') || (d && d !== 'none')) css += 'text-decoration:' + (u && u !== 'none' ? 'underline ' : '') + (d && d !== 'none' ? 'line-through' : '') + ';';\n      if (a(tp, 'fo:color')) css += 'color:' + a(tp, 'fo:color') + ';';\n      if (a(tp, 'fo:font-size')) css += 'font-size:' + a(tp, 'fo:font-size') + ';';\n      var f = a(tp, 'style:font-name') || a(tp, 'fo:font-family');\n      if (f) css += \"font-family:'\" + f.replace(\/['\"]\/g, '') + \"';\";\n      var ta = a(pp, 'fo:text-align');\n      if (ta) css += 'text-align:' + ({ start: 'left', end: 'right' }[ta] || ta) + ';';\n      os[s.getAttribute('style:name')] = { parent: s.getAttribute('style:parent-style-name'), css: css };\n    });\n  }\n  function oStilCss(n, t) { var s = os[n]; t = t || 0; return (!s || t > 8) ? '' : (s.parent ? oStilCss(s.parent, t + 1) : '') + s.css; }\n  function oInline(knoten, ziel) {\n    for (var n = knoten.firstChild; n; n = n.nextSibling) {\n      if (n.nodeType === 3) ziel.appendChild(txt(n.nodeValue.replace(\/[ \\t\\r\\n]+\/g, ' ')));\n      else if (n.nodeType === 1) {\n        var l = n.localName;\n        if (l === 'span') { var sp = el('span', oStilCss(n.getAttribute('text:style-name'))); oInline(n, sp); ziel.appendChild(sp); }\n        else if (l === 'a') oInline(n, ziel);\n        else if (l === 's') { var m = parseInt(n.getAttribute('text:c') || '1', 10), r = ''; while (m-- > 0) r += ' '; ziel.appendChild(txt(r)); }\n        else if (l === 'tab') ziel.appendChild(txt('\\t'));\n        else if (l === 'line-break') ziel.appendChild(el('br'));\n      }\n    }\n  }\n  function oTabelle(tab) {\n    var t = el('table', 'border-collapse:collapse;margin:0 0 0.6em 0;');\n    (function zeilen(e) {\n      for (var c = e.firstElementChild; c; c = c.nextElementSibling) {\n        if (c.localName === 'table-row') {\n          var r = t.insertRow(-1);\n          for (var z = c.firstElementChild; z; z = z.nextElementSibling) {\n            if (z.localName === 'table-cell') { var ce = r.insertCell(-1); ce.style.cssText = 'border:1px solid #ccc;padding:4px;vertical-align:top;'; oKoerper(z, ce, false); }\n          }\n        } else if (\/^table-(header-rows|row-group|rows)$\/.test(c.localName)) zeilen(c);\n      }\n    })(tab);\n    return t;\n  }\n  function oKoerper(e, ziel, liste) {\n    for (var c = e.firstElementChild; c; c = c.nextElementSibling) {\n      var l = c.localName;\n      if (l === 'p' || l === 'h') {\n        var a = el('p', 'margin:0 0 0.6em 0;' + oStilCss(c.getAttribute('text:style-name')) + (liste ? 'display:list-item;list-style-type:disc;margin-left:1.5em;' : ''));\n        oInline(c, a);\n        ziel.appendChild(a);\n      } else if (l === 'table') ziel.appendChild(oTabelle(c));\n      else if (\/^(list|list-item|list-header|section|table-of-content|index-body)$\/.test(l)) oKoerper(c, ziel, liste || \/^list\/.test(l));\n    }\n  }\n  function odtLesen(z) {\n    return Promise.all([zipEntnehmen(z, 'content.xml'), zipEntnehmen(z, 'styles.xml')]).then(function(t) {\n      if (!t[0]) throw new Error('kein ODF-Dokument');\n      os = {};\n      if (t[1]) oStile(xml(t[1]));\n      var doc = xml(t[0]);\n      oStile(doc);\n      var frag = document.createDocumentFragment();\n      oKoerper(doc.getElementsByTagName('office:text')[0], frag, false);\n      return frag;\n    });\n  }\n\n  function dateiLaden(datei) {\n    var endung = (datei.name.split('.').pop() || '').toLowerCase();\n    var feld = $('zp-eingabe');\n    function fertig() { dateiname = datei.name.replace(\/\\.[^.]*$\/, ''); zeichenZahl(); }\n    if (endung === 'doc' || endung === 'pdf') {\n      alert('DOC- und PDF-Dateien kann dieses Programm nicht lesen. Speichere die Datei in Word oder LibreOffice als DOCX oder ODT (Word \u00f6ffnet auch PDF-Dateien) oder kopiere den Text und f\u00fcge ihn hier ein.');\n      return;\n    }\n    var reader = new FileReader();\n    if (endung === 'docx' || endung === 'odt' || endung === 'ott') {\n      reader.onload = function(e) {\n        var z;\n        try { z = zipLesen(e.target.result); } catch (x) { alert('Die Datei konnte nicht gelesen werden.'); return; }\n        (endung === 'docx' ? docxLesen(z) : odtLesen(z)).then(function(frag) {\n          feld.textContent = '';\n          feld.appendChild(frag);\n          fertig();\n        }).catch(function(x) { alert('Die Datei konnte nicht gelesen werden: ' + x.message); });\n      };\n      reader.readAsArrayBuffer(datei);\n      return;\n    }\n    reader.onload = function(e) {\n      var inhalt = e.target.result;\n      if (\/\\.html?$\/i.test(datei.name)) {\n        var doc = new DOMParser().parseFromString(inhalt, 'text\/html');\n        var weg = doc.body.querySelectorAll('script,style,link,meta,iframe,object,embed,title');\n        Array.prototype.forEach.call(weg, function(x) { x.parentNode.removeChild(x); });\n        Array.prototype.forEach.call(doc.body.querySelectorAll('*'), function(x) {\n          Array.prototype.slice.call(x.attributes).forEach(function(a) {\n            if (\/^on\/i.test(a.name) || (a.name === 'href' && \/^\\s*javascript:\/i.test(a.value))) x.removeAttribute(a.name);\n          });\n        });\n        feld.innerHTML = doc.body.innerHTML;\n      } else {\n        feld.textContent = inhalt;\n      }\n      fertig();\n    };\n    reader.readAsText(datei, 'UTF-8');\n  }\n\n  function kopieren() {\n    if (!bereinigtHtml) { alert('Bitte zuerst den Text pr\u00fcfen.'); return; }\n    function fertig() { alert('Die bereinigte Fassung wurde mit Layout in die Zwischenablage kopiert!'); }\n    function ersatz() {\n      var h = document.createElement('div');\n      h.style.cssText = 'position:absolute;left:-9999px;top:0;';\n      h.innerHTML = bereinigtHtml;\n      document.body.appendChild(h);\n      var b = document.createRange();\n      b.selectNodeContents(h);\n      var s = window.getSelection();\n      s.removeAllRanges();\n      s.addRange(b);\n      var ok = false;\n      try { ok = document.execCommand('copy'); } catch (e) {}\n      s.removeAllRanges();\n      document.body.removeChild(h);\n      if (ok) fertig(); else alert('Kopieren war nicht m\u00f6glich. Bitte die Fassung herunterladen.');\n    }\n    if (window.ClipboardItem && navigator.clipboard && navigator.clipboard.write) {\n      navigator.clipboard.write([new ClipboardItem({\n        'text\/html': new Blob([bereinigtHtml], { type: 'text\/html' }),\n        'text\/plain': new Blob([bereinigtText], { type: 'text\/plain' })\n      })]).then(fertig).catch(ersatz);\n    } else { ersatz(); }\n  }\n\n  function herunterladen(name, inhalt, typ) {\n    var blob = new Blob([inhalt], { type: typ + ';charset=utf-8' });\n    var url = URL.createObjectURL(blob);\n    var a = document.createElement('a');\n    a.href = url;\n    a.download = name;\n    document.body.appendChild(a);\n    a.click();\n    document.body.removeChild(a);\n    URL.revokeObjectURL(url);\n  }\n\n  function zuruecksetzen() {\n    $('zp-eingabe').innerHTML = '';\n    $('zp-befunde').textContent = 'Hier erscheint der Befund.';\n    $('zp-vorschau').textContent = 'Nach dem Pr\u00fcfen erscheint hier Dein Text mit den markierten Zeichen.';\n    $('zp-zahl-funde').textContent = '0';\n    $('zp-zahl-zeichen').textContent = '0';\n    bereinigtHtml = '';\n    bereinigtText = '';\n    dateiname = 'text';\n    if (document.activeElement && document.activeElement.blur) document.activeElement.blur();\n  }\n\n  $('zp-datei-knopf').addEventListener('click', function() { $('zp-dateiauswahl').click(); });\n  $('zp-dateiauswahl').addEventListener('change', function(e) {\n    if (e.target.files[0]) dateiLaden(e.target.files[0]);\n    e.target.value = '';\n  });\n  $('zp-eingabe').addEventListener('input', zeichenZahl);\n  $('zp-pruefen-knopf').addEventListener('click', pruefen);\n  $('zp-kopieren-knopf').addEventListener('click', kopieren);\n  $('zp-download-knopf').addEventListener('click', function() {\n    if (!bereinigtHtml) { alert('Bitte zuerst den Text pr\u00fcfen.'); return; }\n    herunterladen('bereinigt_' + dateiname + '.html', '<!DOCTYPE html>\\n<html><head><meta charset=\"UTF-8\"><title>bereinigt_' + dateiname + '<\/title><\/head>\\n<body>' + bereinigtHtml + '<\/body><\/html>', 'text\/html');\n  });\n  $('zp-txt-knopf').addEventListener('click', function() {\n    if (!bereinigtHtml) { alert('Bitte zuerst den Text pr\u00fcfen.'); return; }\n    herunterladen('bereinigt_' + dateiname + '.txt', bereinigtText, 'text\/plain');\n  });\n  $('zp-zuruecksetzen-knopf').addEventListener('click', zuruecksetzen);\n})();\n<\/script>\n<br><br><br>\n<p>Views: 67<\/p><\/div>","protected":false},"excerpt":{"rendered":"<p>Klei\u00adne Pro\u00adgram\u00adme mit gro\u00ad\u00dfer Wir\u00adkung Hier bie\u00adte ich al\u00adlen Be\u00adsu\u00adchern ei\u00adni\u00adge n\u00fctz\u00adli\u00adche Hilfs\u00admit\u00adtel an, die f\u00fcr den (fast) t\u00e4g\u00adli\u00adchen Ge\u00adbrauch vom Vor\u00adteil sind, da sie so man\u00adche Ar\u00adbei\u00adten er\u00adleich\u00adtern. F\u00fcr den An\u00adfang die ers\u00adten klei\u00adnen \u2026 <a title=\"Ser\u00advice-Sei\u00adten f\u00fcr mei\u00adne Besucher\" class=\"hm-read-more\" href=\"https:\/\/175er-verlag.org\/.recherchiert\/serviceseite\"><span class=\"screen-reader-text\">Ser\u00ad\u00advice-Sei\u00ad\u00adten f\u00fcr mei\u00adne Be\u00adsu\u00adcher<\/span>Wei\u00adter\u00adle\u00adsen<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"open","ping_status":"closed","template":"","meta":{"_uag_custom_page_level_css":"","wp_typography_post_enhancements_disabled":false,"footnotes":""},"class_list":["post-2216","page","type-page","status-publish","hentry"],"uagb_featured_image_src":{"full":false,"thumbnail":false,"medium":false,"medium_large":false,"large":false,"1536x1536":false,"2048x2048":false,"hybridmag-featured-image":false,"hybridmag-archive-image":false,"hybridmag-archive-image-large":false,"hybridmag-thumbnail":false},"uagb_author_info":{"display_name":"RoZe-recherchiert","author_link":"https:\/\/175er-verlag.org\/.recherchiert\/archive\/author\/roze-recherchiert"},"uagb_comment_info":0,"uagb_excerpt":"Klei\u00adne Pro\u00adgram\u00adme mit gro\u00ad\u00dfer Wirkung Hier bie\u00adte ich al\u00adlen Be\u00adsu\u00adchern ei\u00adni\u00adge n\u00fctz\u00adli\u00adche Hilfs\u00admit\u00adtel an, die f\u00fcr den (fast) t\u00e4g\u00adli\u00adchen Ge\u00adbrauch vom Vor\u00adteil sind, da sie so man\u00adche Ar\u00adbei\u00adten er\u00adleich\u00adtern. F\u00fcr den An\u00adfang die ers\u00adten klei\u00adnen &hellip; Ser\u00advice-Sei\u00adten f\u00fcr mei\u00adne BesucherWeiterlesen","_links":{"self":[{"href":"https:\/\/175er-verlag.org\/.recherchiert\/wp-json\/wp\/v2\/pages\/2216","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/175er-verlag.org\/.recherchiert\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/175er-verlag.org\/.recherchiert\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/175er-verlag.org\/.recherchiert\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/175er-verlag.org\/.recherchiert\/wp-json\/wp\/v2\/comments?post=2216"}],"version-history":[{"count":6,"href":"https:\/\/175er-verlag.org\/.recherchiert\/wp-json\/wp\/v2\/pages\/2216\/revisions"}],"predecessor-version":[{"id":12213,"href":"https:\/\/175er-verlag.org\/.recherchiert\/wp-json\/wp\/v2\/pages\/2216\/revisions\/12213"}],"wp:attachment":[{"href":"https:\/\/175er-verlag.org\/.recherchiert\/wp-json\/wp\/v2\/media?parent=2216"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}