{"id":15570,"date":"2026-09-05T14:51:39","date_gmt":"2026-09-05T12:51:39","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/blog\/toolbox\/page-structure-readability-inspector-headings-sentences\/"},"modified":"2026-09-05T14:51:39","modified_gmt":"2026-09-05T12:51:39","slug":"page-structure-readability-inspector-headings-sentences","status":"publish","type":"page","link":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/page-structure-readability-inspector-headings-sentences\/","title":{"rendered":"Page Structure &#038; Readability Inspector: Headings, Sentences, Abbreviations"},"content":{"rendered":"<div class=\"gtm-analyser-container\" style=\"background: var(--bg-panel, #1e1e24); padding: 25px; border-radius: 8px; border: 1px solid var(--border, #2a2a35);\">\n<p style=\"color: var(--text-secondary, #a0a0b0); margin-bottom: 20px;\">Readability scores count syllables and punish every German compound word, including ordinary ones. This check measures what actually decides whether a page can be read and navigated: is there one h1, does the heading tree skip levels or contain empty headings, is the main content marked as such, how long are the sentences and paragraphs, which abbreviations appear in the introduction without ever being explained in brackets, do images carry alt text, and how much of the HTML is text at all. Sentences are measured strictly inside paragraphs, with code removed first, because a configuration file counted as prose produces a 140-word sentence that never existed.<\/p>\n<div style=\"margin-bottom: 14px;\">\n        <label for=\"st-url\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">Page address<\/label><br \/>\n        <input id=\"st-url\" type=\"text\" value=\"https:\/\/en.wikipedia.org\/wiki\/Readability\" class=\"form-control\" style=\"width: 100%; padding: 10px; background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); color: var(--text-primary, #e8e8ee); border-radius: 6px; box-sizing: border-box; font-family: monospace;\">\n    <\/div>\n<p style=\"color: var(--text-secondary, #a0a0b0); font-size: 0.82rem; margin-bottom: 16px;\">One request of at most 1.5 MB goes from this server to the address entered; nothing on the page is executed. Hosts in private, loopback and link-local networks are refused. The query is protected by reCAPTCHA v3; the calling IP address and the target are stored for one hour to limit the rate.<\/p>\n<p>    <button id=\"st-btn\" class=\"button\" style=\"background: var(--accent, #7ee787); color: var(--on-accent, #0b1114); border: none; padding: 12px 24px; border-radius: 6px; font-weight: 700; cursor: pointer;\">Inspect the page<\/button><\/p>\n<div id=\"st-ausgabe\" style=\"margin-top: 22px;\"><\/div>\n<p style=\"color: var(--text-secondary, #a0a0b0); font-size: 0.8rem; margin: 24px 0 0;\">Limits worth knowing: only server-rendered HTML is measured, content that JavaScript inserts later is invisible; the main content is taken from main, article or a role=main element, otherwise from the body without navigation, header, footer and aside; sentence splitting is a heuristic that keeps single-letter abbreviations and day numbers together but has no dictionary; the abbreviation check accepts a bracket explanation anywhere on the page and skips a list of everyday acronyms; and there is no syllable count on purpose.<\/p>\n<\/div>\n<p><script>\n(function () {\n    'use strict';<\/p>\n<p>    const T = {\"einleitung\":\"Readability scores count syllables and punish every German compound word, including ordinary ones. This check measures what actually decides whether a page can be read and navigated: is there one h1, does the heading tree skip levels or contain empty headings, is the main content marked as such, how long are the sentences and paragraphs, which abbreviations appear in the introduction without ever being explained in brackets, do images carry alt text, and how much of the HTML is text at all. Sentences are measured strictly inside paragraphs, with code removed first, because a configuration file counted as prose produces a 140-word sentence that never existed.\",\"label_url\":\"Page address\",\"datenschutz\":\"One request of at most 1.5 MB goes from this server to the address entered; nothing on the page is executed. Hosts in private, loopback and link-local networks are refused. The query is protected by reCAPTCHA v3; the calling IP address and the target are stored for one hour to limit the rate.\",\"knopf\":\"Inspect the page\",\"laeuft\":\"Fetching and measuring...\",\"grenze\":\"Limits worth knowing: only server-rendered HTML is measured, content that JavaScript inserts later is invisible; the main content is taken from main, article or a role=main element, otherwise from the body without navigation, header, footer and aside; sentence splitting is a heuristic that keeps single-letter abbreviations and day numbers together but has no dictionary; the abbreviation check accepts a bracket explanation anywhere on the page and skips a list of everyday acronyms; and there is no syllable count on purpose.\",\"h_kopf\":\"Head\",\"zeile_url\":\"Measured address\",\"zeile_title\":\"Title\",\"zeile_description\":\"Meta description\",\"zeile_lang\":\"Language (lang)\",\"zeile_landmark\":\"Main content\",\"zeile_canonical\":\"Canonical\",\"zeile_dauer\":\"Took\",\"zeile_limit\":\"Checks left this hour\",\"zeichen\":\"{n} characters\",\"wert_fehlt\":\"missing\",\"landmark_main\":\"main element\",\"landmark_article\":\"article element\",\"landmark_role\":\"role=main\",\"landmark_id\":\"id=content or id=main\",\"h_masse\":\"Measures\",\"m_woerter\":\"Words in paragraphs\",\"m_absaetze\":\"Paragraphs\",\"m_saetze\":\"Sentences\",\"m_lesezeit\":\"Reading time\",\"m_bilder\":\"Images\",\"m_links\":\"Links internal \\\/ external\",\"m_listen\":\"Lists \\\/ tables \\\/ code blocks\",\"m_html\":\"HTML size\",\"minuten\":\"{n} min\",\"ohne_alt\":\"{n} without alt\",\"h_gliederung\":\"Heading tree ({n})\",\"leere_ueberschrift\":\"(empty heading)\",\"h_befunde\":\"Findings\",\"stufe_hoch\":\"High\",\"stufe_mittel\":\"Medium\",\"stufe_niedrig\":\"Low\",\"stufe_info\":\"Information\",\"stufe_gut\":\"In order\",\"keine_befunde\":\"Nothing to report.\",\"urteil_gut\":\"The page has a usable structure; what remains are details.\",\"urteil_warnung\":\"Something basic is missing: a title, an h1, a text, or the page did not answer 200.\",\"urteil_kritisch\":\"The address did not deliver an HTML page.\",\"fehler_kein_token\":\"The check could not be started because reCAPTCHA did not load.\",\"fehler_captcha\":\"reCAPTCHA classified the request as automated. Reloading the page normally helps.\",\"fehler_zu_viele\":\"The limit of {limit} checks per hour for this address has been reached.\",\"fehler_adresse\":\"That address cannot be used.\",\"fehler_abruf\":\"The page could not be fetched.\",\"fehler_zaehler\":\"The rate counter is unavailable, so nothing was checked.\",\"fehler_pruefdienst\":\"The reCAPTCHA service could not be reached.\",\"fehler_aufbau\":\"The service is not configured correctly. The fault is on this side.\",\"fehler_eingabe\":\"The request could not be read.\",\"fehler_methode\":\"Wrong request method.\",\"fehler_netz\":\"The service could not be reached.\",\"fehler_antwort\":\"The answer could not be read.\",\"fehler_unbekannt\":\"Something went wrong that has no message of its own.\",\"grund_leer\":\"Nothing was entered.\",\"grund_zu_lang\":\"The input is too long.\",\"grund_unlesbar\":\"It does not parse as an address.\",\"grund_schema\":\"Only http and https addresses are checked.\",\"grund_benutzerinfo\":\"Inputs with credentials in them are refused.\",\"grund_kein_punkt\":\"The host name needs at least one dot.\",\"grund_hostform\":\"Enter a host name, not an IP address.\",\"grund_port\":\"Only the ports 80, 443, 8080 and 8443 are checked.\",\"grund_gesperrter_bereich\":\"That host resolves into a private or reserved network. Those are never contacted.\",\"grund_kein_dns\":\"The host name does not resolve.\",\"grund_abruf\":\"The address did not answer.\",\"grund_zu_viele_spruenge\":\"The address redirects too often.\",\"befund_status\":\"The server answered with status {status} || The measurements describe an error page, not the intended one.\",\"befund_kein_html\":\"The address delivers {typ}, not HTML || Only HTML pages can be measured here.\",\"befund_weiterleitung\":\"Redirected {n} time(s) to {ziel} || The page measured is the final one in the chain.\",\"befund_gekappt\":\"Page cut at {mb} MB || The HTML is larger than the limit; measurements cover the first part only.\",\"befund_title_fehlt\":\"No title || The title element names the page in tabs, bookmarks and search results. Without it, the address takes its place.\",\"befund_title_lang\":\"Title with {n} characters || Search results cut titles at roughly 60 characters. The beginning should carry the meaning.\",\"befund_title_kurz\":\"Title with only {n} characters || Very short titles rarely say what the page is about.\",\"befund_title_ok\":\"Title with {n} characters || A length that fits tabs and search results.\",\"befund_description_fehlt\":\"No meta description || Search engines then pick a snippet themselves, often a random sentence. A description of 100 to 160 characters says what the page delivers.\",\"befund_description_lang\":\"Meta description with {n} characters || Longer than what search results usually show; the end is cut off.\",\"befund_description_kurz\":\"Meta description with only {n} characters || Too short to say what the page delivers.\",\"befund_description_ok\":\"Meta description with {n} characters || A length search results show in full.\",\"befund_lang_fehlt\":\"No lang attribute on the html element || Screen readers pick a voice by it, browsers offer translation by it, and hyphenation depends on it. One attribute, no cost.\",\"befund_lang\":\"Language: {lang} || Declared on the html element.\",\"befund_landmark_fehlt\":\"No main content landmark || Without a main or article element, assistive technology cannot jump to the content, and reader modes guess. The measurements used the body without navigation, header, footer and aside.\",\"befund_landmark\":\"Main content found via {art} || The measurements are taken from this element.\",\"befund_ueberschriften_fehlen\":\"No headings in the main content || A page without headings has no structure to navigate by. Screen reader users move by headings; without them, the page is one block.\",\"befund_h1_fehlt\":\"No h1 || The h1 names what the page is about. Every page should have exactly one.\",\"befund_h1_mehrfach\":\"{n} h1 headings || One h1 per page is the convention. Several dilute what the page is about; the others usually belong at h2.\",\"befund_h1_ok\":\"One h1: {text} || The page names its subject once.\",\"befund_erste_nicht_h1\":\"The first heading is an h{ebene} || The heading tree should start at h1; a structure that begins deeper confuses outlines and screen readers.\",\"befund_h_sprung\":\"{n} level skip(s) in the heading tree || An h4 directly after an h2 skips a level. Outlines and screen readers show a gap, and a table of contents built from headings breaks.\",\"befund_h_leer\":\"{n} empty heading(s) || A heading without text is an entry in the outline that says nothing. A table of contents built from h2 elements stops at an empty one.\",\"befund_h_lang\":\"{n} heading(s) longer than 80 characters || Headings are labels, not sentences. Long ones wrap badly and make the outline hard to scan.\",\"befund_gliederung\":\"{n} headings, {h2} at level 2, deepest level h{tiefe} || The outline as a reader or a screen reader sees it.\",\"befund_h2_fehlt_langer_text\":\"{woerter} words without a single h2 || A long text without section headings gives readers nothing to scan and skip by.\",\"befund_kein_text\":\"No paragraph text found || No text inside p elements. Either the page is empty, or the content lives in elements this check does not count as prose.\",\"befund_umfang\":\"{woerter} words in {absaetze} paragraphs and {saetze} sentences, about {minuten} min of reading || Counted inside paragraphs of the main content, code removed.\",\"befund_text_kurz\":\"Only {woerter} words || Thin content for a page that is meant to be found and read.\",\"befund_satzlaenge\":\"Sentence length: average {schnitt} words, median {median}, {lang} sentences over 30 words ({prozent} %), longest {laengster} || Longest sentence: {text}\",\"befund_saetze_lang\":\"{prozent} % of the sentences have more than 30 words ({n}) || More than a quarter of the sentences are long. Long sentences are not wrong, but a text that consists of them tires readers.\",\"befund_satz_sehr_lang\":\"A sentence with {woerter} words || {text}\",\"befund_absaetze_lang\":\"{n} paragraph(s) with more than 150 words (longest {max}) || Long paragraphs form walls of text on a phone. A break at the change of thought helps.\",\"befund_absaetze_zerhackt\":\"{n} of {von} paragraphs are a single short sentence || Many one-line paragraphs read like a list without bullets. Some can be merged, some can become a real list.\",\"befund_kuerzel\":\"{n} abbreviation(s) in the introduction never explained: {liste} || An acronym used in the first 150 words without a bracketed explanation anywhere on the page. Readers outside the field stop here.\",\"befund_nominal\":\"{n} nominal construction(s): {liste} || Phrases such as \\u0022unter Verwendung von\\u0022 carry a verb in a noun. Only counted for German pages, and only concrete constructions, because a general -ung count hits ordinary things.\",\"befund_bilder_ohne_alt\":\"{n} of {von} images without alt attribute || Screen readers announce them as \\u0022image\\u0022 and nothing else. Decorative images get alt=\\u0022\\u0022, informative ones a description.\",\"befund_bilder_alt_ok\":\"All {n} images carry an alt attribute || Present on every image in the main content. Whether the text is useful is a question for a human.\",\"befund_links\":\"{intern} internal, {extern} external links, {nofollow} with nofollow || Links in the main content, anchors and mailto excluded.\",\"befund_keine_internen_links\":\"No internal links in the main content || A long page without links to related pages is a dead end for readers and for crawlers.\",\"befund_bausteine\":\"{listen} lists with {punkte} items, {tabellen} tables, {code} code blocks || Building blocks that break up the text.\",\"befund_text_anteil\":\"Text is {prozent} % of {kb} KB HTML || How much of what the browser downloads is readable text. Low shares are typical for pages with large scripts, menus or inline styles.\"};<\/p>\n<p>    var ENDPUNKT = '\/lw-structure.php';\n    var SITEKEY = '6LcrPkEtAAAAAPo1QCOf-IIM2fCL0UfdJz4y2iSY';\n    var STUFEN = ['hoch', 'mittel', 'niedrig', 'info', 'gut'];<\/p>\n<p>    function liste(w) { return Array.isArray(w) ? w : []; }\n    function zahl(w) { return (typeof w === 'number' && isFinite(w)) ? w : null; }\n    function text(schluessel, daten) {\n        var t = T[schluessel];\n        if (typeof t !== 'string') { return null; }\n        return t.replace(\/\\{([a-z_0-9]+)\\}\/g, function (m, k) {\n            return (daten && daten[k] !== undefined && daten[k] !== null) ? String(daten[k]) : m;\n        });\n    }<\/p>\n<p>    function bewerten(antwort) {\n        var a = antwort || {};\n        if (a.fehler) { return { fehler: String(a.fehler), grund: a.grund || null, limit: zahl(a.limit) }; }\n        var befunde = liste(a.befunde).map(function (f) {\n            return { key: String(f.key || ''), stufe: STUFEN.indexOf(f.stufe) === -1 ? 'info' : f.stufe, daten: (f.daten && typeof f.daten === 'object') ? f.daten : {} };\n        });\n        var gruppen = {};\n        STUFEN.forEach(function (s) { gruppen[s] = befunde.filter(function (f) { return f.stufe === s; }); });\n        var m = (a.masse && typeof a.masse === 'object') ? a.masse : {};\n        var masse = {};\n        ['woerter', 'absaetze', 'saetze', 'bilder', 'bilder_ohne_alt', 'links_intern', 'links_extern', 'listen', 'tabellen', 'code', 'html_kb', 'text_zeichen'].forEach(function (k) { masse[k] = zahl(m[k]) || 0; });\n        return {\n            fehler: null, url: a.url ? String(a.url) : '', endurl: a.endurl ? String(a.endurl) : '',\n            urteil: (a.urteil === 'gut' || a.urteil === 'warnung' || a.urteil === 'kritisch') ? a.urteil : 'kritisch',\n            title: a.title ? String(a.title) : null, description: a.description ? String(a.description) : null, lang: a.lang ? String(a.lang) : null, canonical: a.canonical ? String(a.canonical) : null, landmark: a.landmark ? String(a.landmark) : null,\n            ueberschriften: liste(a.ueberschriften).map(function (h) { h = h || {}; var e = zahl(h.ebene); return { ebene: e === null ? 1 : Math.min(6, Math.max(1, e)), text: h.text !== undefined && h.text !== null ? String(h.text) : '' }; }),\n            masse: masse, kuerzel: liste(a.kuerzel).map(String), einleitung: a.einleitung ? String(a.einleitung) : '',\n            befunde: befunde, gruppen: gruppen, dauer: zahl(a.dauer_ms), limitRest: zahl(a.limit_rest)\n        };\n    }<\/p>\n<p>    function skriptLaden() {\n        return new Promise(function (auf) {\n            if (window.grecaptcha) { auf(true); return; }\n            var s = document.createElement('script');\n            s.src = 'https:\/\/www.google.com\/recaptcha\/api.js?render=' + SITEKEY;\n            s.onload = function () { auf(true); }; s.onerror = function () { auf(false); };\n            document.head.appendChild(s);\n            setTimeout(function () { auf(!!window.grecaptcha); }, 8000);\n        });\n    }\n    function tokenHolen() {\n        return skriptLaden().then(function (da) {\n            if (!da || !window.grecaptcha || !window.grecaptcha.ready) { return null; }\n            return new Promise(function (auf) {\n                var fertig = false;\n                function einmal(w) { if (!fertig) { fertig = true; auf(w); } }\n                setTimeout(function () { einmal(null); }, 12000);\n                try {\n                    window.grecaptcha.ready(function () {\n                        if (fertig) { return; }\n                        if (!window.grecaptcha.execute) { einmal(null); return; }\n                        window.grecaptcha.execute(SITEKEY, { action: 'structure' }).then(function (t) { einmal(t || null); }, function () { einmal(null); });\n                    });\n                } catch (e) { einmal(null); }\n            });\n        }, function () { return null; });\n    }\n    function abfragen(url) {\n        return tokenHolen().then(function (token) {\n            return fetch(ENDPUNKT, { method: 'POST', headers: { 'Content-Type': 'application\/json' }, body: JSON.stringify({ url: url, token: token || '' }) })\n                .then(function (r) { return r.json().then(function (j) { return j; }, function () { return { fehler: 'antwort' }; }); }, function () { return { fehler: 'netz' }; });\n        });\n    }<\/p>\n<p>    window.LW_TEST = window.LW_TEST || {};\n    window.LW_TEST.ST = { bewerten: bewerten, darstellen: null, text: text, ENDPUNKT: ENDPUNKT, STUFEN: STUFEN, T: T };<\/p>\n<p>    var btn = document.getElementById('st-btn');\n    var out = document.getElementById('st-ausgabe');\n    if (!btn || !out) { return; }<\/p>\n<p>    function el(tag, stil, txt) { var e = document.createElement(tag); if (stil) { e.setAttribute('style', stil); } if (txt !== undefined && txt !== null) { e.textContent = txt; } return e; }\n    function wert(id) { var e = document.getElementById(id); return e ? e.value : ''; }\n    var UEBERSCHRIFT = 'font-family: \"Nunito Sans\", sans-serif; font-weight: 700; color: var(--text-primary, #e8e8ee); font-size: 0.95rem; margin: 22px 0 8px;';\n    var ZELLE = 'padding: 5px 12px 5px 0; color: var(--text-secondary, #a0a0b0); font-size: 0.87rem;';\n    var ZELLE_WERT = 'padding: 5px 12px 5px 0; color: var(--text-primary, #e8e8ee); font-size: 0.87rem; font-family: monospace; word-break: break-all;';\n    var KASTEN = 'background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); border-radius: 8px; padding: 14px 16px; margin: 0 0 10px;';\n    var GUT = ' color: #7ee787;', WARN = ' color: #ffa94d;', ROT = ' color: #ff7b72;', GRAU = ' color: #8a8a99;';\n    var FARBEN = { hoch: '#ff7b72', mittel: '#ffa94d', niedrig: '#e3b341', info: '#8a8a99', gut: '#7ee787' };\n    var URTEIL = { gut: GUT, warnung: WARN, kritisch: ROT };\n    function gitter(sp) { return el('div', 'display: grid; grid-template-columns: ' + sp + '; gap: 0 18px; align-items: baseline;'); }\n    function paar(g, n, w, stil) { g.appendChild(el('div', ZELLE, n)); g.appendChild(el('div', ZELLE_WERT + (stil || ''), w)); }<\/p>\n<p>    function darstellen(b, ziel) {\n        ziel.innerHTML = '';\n        if (b.fehler) {\n            var txt = T['fehler_' + b.fehler] || T.fehler_unbekannt;\n            if (b.grund && T['grund_' + b.grund]) { txt = txt + ' ' + T['grund_' + b.grund]; }\n            if (b.limit !== null) { txt = txt.replace('{limit}', String(b.limit)); }\n            ziel.appendChild(el('p', ZELLE + WARN + ' margin: 0;', txt));\n            return;\n        }\n        ziel.appendChild(el('div', 'font-size: 1.05rem; font-weight: 700; margin: 0 0 12px;' + URTEIL[b.urteil], T['urteil_' + b.urteil]));<\/p>\n<p>        ziel.appendChild(el('div', UEBERSCHRIFT, T.h_kopf));\n        var g = gitter('auto auto');\n        paar(g, T.zeile_url, b.endurl || b.url);\n        paar(g, T.zeile_title, b.title ? b.title + '  (' + text('zeichen', { n: b.title.length }) + ')' : T.wert_fehlt, b.title ? '' : ROT);\n        paar(g, T.zeile_description, b.description ? b.description + '  (' + text('zeichen', { n: b.description.length }) + ')' : T.wert_fehlt, b.description ? GRAU : WARN);\n        paar(g, T.zeile_lang, b.lang || T.wert_fehlt, b.lang ? GRAU : WARN);\n        paar(g, T.zeile_landmark, b.landmark ? T['landmark_' + b.landmark] || b.landmark : T.wert_fehlt, b.landmark ? GRAU : WARN);\n        if (b.canonical) { paar(g, T.zeile_canonical, b.canonical, GRAU); }\n        if (b.dauer !== null) { paar(g, T.zeile_dauer, b.dauer + ' ms', GRAU); }\n        if (b.limitRest !== null) { paar(g, T.zeile_limit, String(b.limitRest), GRAU); }\n        ziel.appendChild(g);<\/p>\n<p>        ziel.appendChild(el('div', UEBERSCHRIFT, T.h_masse));\n        var gm = gitter('auto auto auto auto');\n        var m = b.masse;\n        var kacheln = [[T.m_woerter, m.woerter], [T.m_absaetze, m.absaetze], [T.m_saetze, m.saetze], [T.m_lesezeit, text('minuten', { n: Math.max(1, Math.round(m.woerter \/ 200)) })], [T.m_bilder, m.bilder + (m.bilder_ohne_alt ? ' (' + text('ohne_alt', { n: m.bilder_ohne_alt }) + ')' : '')], [T.m_links, m.links_intern + ' \/ ' + m.links_extern], [T.m_listen, m.listen + ' \/ ' + m.tabellen + ' \/ ' + m.code], [T.m_html, m.html_kb + ' KB']];\n        kacheln.forEach(function (k) { var box = el('div', KASTEN + ' padding: 10px 12px;'); box.appendChild(el('div', ZELLE + ' padding: 0; font-size: 0.78rem;', k[0])); box.appendChild(el('div', 'color: var(--text-primary, #e8e8ee); font-size: 1.05rem; font-weight: 700; font-family: monospace;', String(k[1]))); gm.appendChild(box); });\n        ziel.appendChild(gm);<\/p>\n<p>        if (b.ueberschriften.length) {\n            ziel.appendChild(el('div', UEBERSCHRIFT, text('h_gliederung', { n: b.ueberschriften.length })));\n            var gl = el('div', KASTEN);\n            b.ueberschriften.forEach(function (h) {\n                var z = el('div', 'padding: 2px 0 2px ' + ((h.ebene - 1) * 18) + 'px; font-size: 0.85rem; color: ' + (h.text === '' ? '#ff7b72' : (h.ebene === 1 ? 'var(--text-primary, #e8e8ee)' : 'var(--text-secondary, #a0a0b0)')) + ';');\n                z.appendChild(el('span', 'font-family: monospace; color: #8a8a99; margin-right: 8px;', 'h' + h.ebene));\n                z.appendChild(document.createTextNode(h.text === '' ? T.leere_ueberschrift : h.text));\n                gl.appendChild(z);\n            });\n            ziel.appendChild(gl);\n        }<\/p>\n<p>        ziel.appendChild(el('div', UEBERSCHRIFT, T.h_befunde));\n        var irgendwas = false;\n        STUFEN.forEach(function (s) {\n            var gr = b.gruppen[s];\n            if (!gr.length) { return; }\n            irgendwas = true;\n            ziel.appendChild(el('div', 'font-weight: 700; font-size: 0.82rem; text-transform: uppercase; letter-spacing: 0.5px; margin: 14px 0 6px; color: ' + FARBEN[s] + ';', T['stufe_' + s] + ' (' + gr.length + ')'));\n            gr.forEach(function (f) {\n                var k = el('div', KASTEN + ' border-left: 3px solid ' + FARBEN[s] + ';');\n                var t = text('befund_' + f.key, f.daten) || f.key;\n                var teile = t.split(' || ');\n                k.appendChild(el('div', 'color: var(--text-primary, #e8e8ee); font-size: 0.9rem; font-weight: 700;', teile[0]));\n                if (teile[1]) { k.appendChild(el('div', ZELLE + ' padding: 6px 0 0; line-height: 1.55;', teile[1])); }\n                ziel.appendChild(k);\n            });\n        });\n        if (!irgendwas) { ziel.appendChild(el('p', ZELLE + ' margin: 0;', T.keine_befunde)); }\n    }\n    window.LW_TEST.ST.darstellen = darstellen;<\/p>\n<p>    var laeuft = false;\n    btn.addEventListener('click', function () {\n        if (laeuft) { return; }\n        laeuft = true; btn.disabled = true;\n        out.innerHTML = '';\n        out.appendChild(el('p', ZELLE + GRAU + ' margin: 0;', T.laeuft));\n        abfragen(wert('st-url')).then(function (a) { darstellen(bewerten(a), out); laeuft = false; btn.disabled = false; },\n            function () { darstellen(bewerten({ fehler: 'netz' }), out); laeuft = false; btn.disabled = false; });\n    });\n})();\n<\/script><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Fetches a page and measures its structure instead of its style: title, description and language, the heading tree with gaps and empty headings, the main content landmark, words, paragraphs and sentence lengths measured strictly inside paragraphs, unexplained abbreviations in the introduction, images without alt text, links and building blocks.<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":38,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"template-tool-base.php","meta":{"footnotes":""},"tags":[92735,91094,91315],"class_list":["post-15570","page","type-page","status-publish","hentry","tag-content","tag-seo","tag-web-performance"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Page Structure &amp; Readability Inspector: Headings, Sentences, Abbreviations - Lukas Wojcik - Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/page-structure-readability-inspector-headings-sentences\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Page Structure &amp; Readability Inspector: Headings, Sentences, Abbreviations - Lukas Wojcik - Blog\" \/>\n<meta property=\"og:description\" content=\"Fetches a page and measures its structure instead of its style: title, description and language, the heading tree with gaps and empty headings, the main content landmark, words, paragraphs and sentence lengths measured strictly inside paragraphs, unexplained abbreviations in the introduction, images without alt text, links and building blocks.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/page-structure-readability-inspector-headings-sentences\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukas Wojcik - Blog\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/08\/og-default.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"1 minute\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/page-structure-readability-inspector-headings-sentences\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/page-structure-readability-inspector-headings-sentences\\\/\",\"name\":\"Page Structure & Readability Inspector: Headings, Sentences, Abbreviations - Lukas Wojcik - Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"datePublished\":\"2026-09-05T12:51:39+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/page-structure-readability-inspector-headings-sentences\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/page-structure-readability-inspector-headings-sentences\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/page-structure-readability-inspector-headings-sentences\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Toolbox\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Page Structure &#038; Readability Inspector: Headings, Sentences, Abbreviations\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\",\"name\":\"Lukas Wojcik - Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\",\"name\":\"luky\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"width\":424,\"height\":636,\"caption\":\"luky\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\"},\"sameAs\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Page Structure & Readability Inspector: Headings, Sentences, Abbreviations - Lukas Wojcik - Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/page-structure-readability-inspector-headings-sentences\/","og_locale":"en_US","og_type":"article","og_title":"Page Structure & Readability Inspector: Headings, Sentences, Abbreviations - Lukas Wojcik - Blog","og_description":"Fetches a page and measures its structure instead of its style: title, description and language, the heading tree with gaps and empty headings, the main content landmark, words, paragraphs and sentence lengths measured strictly inside paragraphs, unexplained abbreviations in the introduction, images without alt text, links and building blocks.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/page-structure-readability-inspector-headings-sentences\/","og_site_name":"Lukas Wojcik - Blog","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/08\/og-default.jpg","type":"image\/jpeg"}],"twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"1 minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/page-structure-readability-inspector-headings-sentences\/","url":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/page-structure-readability-inspector-headings-sentences\/","name":"Page Structure & Readability Inspector: Headings, Sentences, Abbreviations - Lukas Wojcik - Blog","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"datePublished":"2026-09-05T12:51:39+00:00","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/page-structure-readability-inspector-headings-sentences\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/page-structure-readability-inspector-headings-sentences\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/page-structure-readability-inspector-headings-sentences\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.lukaswojcik.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Toolbox","item":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/"},{"@type":"ListItem","position":3,"name":"Page Structure &#038; Readability Inspector: Headings, Sentences, Abbreviations"}]},{"@type":"WebSite","@id":"https:\/\/www.lukaswojcik.com\/blog\/#website","url":"https:\/\/www.lukaswojcik.com\/blog\/","name":"Lukas Wojcik - Blog","description":"","publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.lukaswojcik.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9","name":"luky","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","width":424,"height":636,"caption":"luky"},"logo":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg"},"sameAs":["https:\/\/www.lukaswojcik.com\/blog"]}]}},"_links":{"self":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/15570","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/comments?post=15570"}],"version-history":[{"count":0,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/15570\/revisions"}],"up":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/38"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=15570"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=15570"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}