{"id":10075,"date":"2026-08-13T14:51:41","date_gmt":"2026-08-13T12:51:41","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/blog\/toolbox\/code-beautifier\/"},"modified":"2026-08-13T14:54:43","modified_gmt":"2026-08-13T12:54:43","slug":"code-beautifier","status":"publish","type":"page","link":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/code-beautifier\/","title":{"rendered":"Code Beautifier \u2013 JavaScript, PHP, Python, SQL &#038; More"},"content":{"rendered":"<p>Paste minified or messy JavaScript, PHP, Node.js, Python, SQL, Java, C\/C++, C#, Go, Rust, TypeScript, HTML, CSS, JSON or Bash below. The language is detected automatically, and the code is reformatted with clean, consistent indentation.<\/p>\n<div class=\"code-tool-container\">\n<div class=\"code-tool-toolbar\">\n        <label for=\"code-beau-lang-select\">Language:<\/label><br \/>\n        <select id=\"code-beau-lang-select\" onchange=\"lwCodeBeauUpdateDetected()\"><option value=\"auto\">Auto-detect<\/option><option value=\"javascript\">JavaScript \/ Node.js<\/option><option value=\"typescript\">TypeScript<\/option><option value=\"php\">PHP<\/option><option value=\"python\">Python<\/option><option value=\"sql\">SQL<\/option><option value=\"java\">Java<\/option><option value=\"c\">C<\/option><option value=\"cpp\">C++<\/option><option value=\"csharp\">C#<\/option><option value=\"go\">Go<\/option><option value=\"rust\">Rust<\/option><option value=\"kotlin\">Kotlin<\/option><option value=\"swift\">Swift<\/option><option value=\"json\">JSON<\/option><option value=\"html\">HTML<\/option><option value=\"css\">CSS<\/option><option value=\"bash\">Bash \/ Shell<\/option><\/select><br \/>\n        <span class=\"code-tool-detected\" id=\"code-beau-detected\"><\/span>\n    <\/div>\n<p>    <textarea id=\"code-beau-input\" placeholder=\"Paste your code here\u2026\" oninput=\"lwCodeBeauUpdateDetected()\"><\/textarea><\/p>\n<div class=\"code-tool-actions\">\n        <button onclick=\"lwCodeBeauRun()\">Beautify<\/button><br \/>\n        <button onclick=\"lwCodeBeauCopy(this)\" style=\"background-color: var(--text-secondary);\">Copy Output<\/button>\n    <\/div>\n<div id=\"code-beau-error\" class=\"code-tool-error\" style=\"display:none;\"><\/div>\n<div id=\"code-beau-stats\" class=\"code-tool-stats\" style=\"display:none;\"><\/div>\n<pre id=\"code-beau-output\" class=\"code-tool-output\"><\/pre>\n<\/div>\n<style>\n    .code-tool-toolbar { display: flex; flex-wrap: wrap; align-items: center; gap: 10px; margin-bottom: 12px; font-size: 0.9rem; color: var(--text-secondary); }\n    .code-tool-toolbar select { background: var(--bg-panel); color: var(--text-primary); border: 1px solid var(--border); border-radius: 6px; padding: 6px 10px; font-family: inherit; font-size: 0.9rem; }\n    .code-tool-detected { color: var(--accent); font-weight: 700; }\n    .code-tool-actions { margin: 15px 0; display: flex; gap: 10px; flex-wrap: wrap; }\n    .code-tool-error { color: #ff5555; margin: 10px 0; font-weight: bold; }\n    .code-tool-stats { color: var(--text-secondary); font-size: 0.85rem; margin: 10px 0; }\n    .code-tool-output { margin-top: 10px; background: var(--bg-panel); padding: 15px; border-radius: 8px; border: 1px solid var(--border); overflow-x: auto; white-space: pre-wrap; word-break: break-word; font-family: 'Consolas', 'Courier New', monospace; font-size: 0.85rem; min-height: 60px; }\n<\/style>\n<p><script>\n\/* LW Code Engine \u2014 Sprach-Erkennung + Minify\/Beautify. Reine Vanilla-JS, keine Abhaengigkeiten. *\/<\/p>\n<p>\/* ---------- Tokenizer: schuetzt Strings\/Kommentare vor Reflow\/Minify ---------- *\/\nfunction lwTokenize(src, opts) {\n    opts = opts || {};\n    var tokens = [];\n    var i = 0, n = src.length, buf = '';\n    function flush() { if (buf) { tokens.push({ type: 'code', value: buf }); buf = ''; } }<\/p>\n<p>    \/\/ Shebang-Zeile nie anfassen (muss Zeile 1 bleiben, damit das Skript ausfuehrbar ist)\n    if (opts.shebang && src.slice(0, 2) === '#!') {\n        var nl = src.indexOf('\\n');\n        var end = nl === -1 ? n : nl + 1;\n        tokens.push({ type: 'code', value: src.slice(0, end) });\n        i = end;\n    }<\/p>\n<p>    while (i < n) {\n        var c = src[i], c2 = src[i + 1];\n\n        \/\/ Praeprozessor-Zeile (#include, #define, ...): muss auf ihrer eigenen\n        \/\/ Zeile bleiben, sonst wird aus gueltigem C\/C++ ungueltiges C\/C++.\n        if (opts.preprocessorLine &#038;&#038; c === '#' &#038;&#038; \/(^|\\n)[ \\t]*$\/.test(buf)) {\n            flush();\n            var j = src.indexOf('\\n', i);\n            if (j === -1) j = n;\n            tokens.push({ type: 'preproc', value: src.slice(i, j) });\n            i = j;\n            continue;\n        }\n\n        if (opts.lineSlash &#038;&#038; c === '\/' &#038;&#038; c2 === '\/') {\n            flush();\n            var j = src.indexOf('\\n', i);\n            if (j === -1) j = n;\n            tokens.push({ type: 'comment', value: src.slice(i, j) });\n            i = j;\n            continue;\n        }\n        if (opts.blockSlashStar &#038;&#038; c === '\/' &#038;&#038; c2 === '*') {\n            flush();\n            var j = src.indexOf('*\/', i + 2);\n            j = j === -1 ? n : j + 2;\n            tokens.push({ type: 'comment', value: src.slice(i, j) });\n            i = j;\n            continue;\n        }\n        if (opts.lineDoubleDash &#038;&#038; c === '-' &#038;&#038; c2 === '-') {\n            flush();\n            var j = src.indexOf('\\n', i);\n            if (j === -1) j = n;\n            tokens.push({ type: 'comment', value: src.slice(i, j) });\n            i = j;\n            continue;\n        }\n        if (opts.lineHash &#038;&#038; c === '#') {\n            \/\/ PHP-Attribute #[...] sind kein Kommentar\n            if (c2 === '[') { buf += c; i++; continue; }\n            flush();\n            var j = src.indexOf('\\n', i);\n            if (j === -1) j = n;\n            tokens.push({ type: 'comment', value: src.slice(i, j) });\n            i = j;\n            continue;\n        }\n        \/\/ Python-Triple-Quotes zuerst pruefen (vor normalen Anfuehrungszeichen)\n        if (opts.tripleQuote &#038;&#038; (src.slice(i, i + 3) === '\"\"\"' || src.slice(i, i + 3) === \"'''\")) {\n            flush();\n            var q3 = src.slice(i, i + 3);\n            var j = src.indexOf(q3, i + 3);\n            j = j === -1 ? n : j + 3;\n            tokens.push({ type: 'string', value: src.slice(i, j) });\n            i = j;\n            continue;\n        }\n        \/\/ PHP Heredoc\/Nowdoc: <<<EOT ... EOT;  oder <<<'EOT' ... EOT;\n        if (opts.phpHeredoc &#038;&#038; c === '<' &#038;&#038; src.slice(i, i + 3) === '<<<') {\n            var m = \/^<<<[ \\t]*(['\"]?)([A-Za-z_][A-Za-z0-9_]*)\\1\\r?\\n\/.exec(src.slice(i));\n            if (m) {\n                flush();\n                var ident = m[2];\n                var startBody = i + m[0].length;\n                var endRe = new RegExp('\\\\n[ \\\\t]*' + ident + '\\\\b');\n                endRe.lastIndex = 0;\n                var rest = src.slice(startBody - 1); \/\/ include leading \\n for the regex match\n                var em = endRe.exec(rest);\n                var j = em ? startBody - 1 + em.index + em[0].length : n;\n                tokens.push({ type: 'string', value: src.slice(i, j) });\n                i = j;\n                continue;\n            }\n        }\n        if (c === '\"' || c === \"'\" || (opts.templateBacktick &#038;&#038; c === '`')) {\n            flush();\n            var quote = c, j = i + 1;\n            while (j < n) {\n                if (src[j] === '\\\\') { j += 2; continue; }\n                if (src[j] === quote) { j++; break; }\n                if (src[j] === '\\n' &#038;&#038; quote !== '`') { j++; break; } \/\/ unterminierte Zeile abbrechen\n                j++;\n            }\n            tokens.push({ type: 'string', value: src.slice(i, j) });\n            i = j;\n            continue;\n        }\n\n        buf += c;\n        i++;\n    }\n    flush();\n    return tokens;\n}\n\nvar LW_LANG_OPTS = {\n    javascript: { lineSlash: true, blockSlashStar: true, templateBacktick: true },\n    typescript: { lineSlash: true, blockSlashStar: true, templateBacktick: true },\n    php: { lineSlash: true, lineHash: true, blockSlashStar: true, phpHeredoc: true },\n    java: { lineSlash: true, blockSlashStar: true },\n    csharp: { lineSlash: true, blockSlashStar: true },\n    c: { lineSlash: true, blockSlashStar: true, preprocessorLine: true },\n    cpp: { lineSlash: true, blockSlashStar: true, preprocessorLine: true },\n    go: { lineSlash: true, blockSlashStar: true, templateBacktick: true },\n    rust: { lineSlash: true, blockSlashStar: true },\n    kotlin: { lineSlash: true, blockSlashStar: true },\n    swift: { lineSlash: true, blockSlashStar: true },\n    css: { blockSlashStar: true },\n    json: {},\n    sql: { lineDoubleDash: true, blockSlashStar: true, lineHash: true, templateBacktick: true },\n    python: { lineHash: true, tripleQuote: true, shebang: true },\n    bash: { lineHash: true, shebang: true }\n};\n\n\/* ---------- Sprach-Erkennung ---------- *\/\nfunction lwDetectLanguage(code) {\n    var s = code || '';\n    var t = s.trim();\n    if (!t) return { key: 'unknown', label: 'Keine Eingabe' };\n\n    if (\/<\\?php|<\\?=\/.test(t)) return { key: 'php', label: 'PHP' };\n\n    if ((t[0] === '{' || t[0] === '[')) {\n        try { JSON.parse(t); return { key: 'json', label: 'JSON' }; } catch (e) { \/* weiter *\/ }\n    }\n\n    if (\/^#!.*\\b(bash|sh|zsh|ksh)\\b\/.test(t)) return { key: 'bash', label: 'Bash \/ Shell' };\n    if (\/^#!.*\\bpython\/.test(t)) return { key: 'python', label: 'Python' };\n    if (\/^#!.*\\bnode\\b\/.test(t)) return { key: 'javascript', label: 'Node.js (JavaScript)' };\n\n    if (\/^\\s*<!DOCTYPE\\s+html\/i.test(t) || \/^\\s*<html[\\s>]\/i.test(t) ||\n        (\/^\\s*<\/.test(t) &#038;&#038; \/<\\\/[a-zA-Z][\\w-]*>\/.test(t) && !\/=>|function\\s*\\(|;\\s*$\/m.test(t))) {\n        return { key: 'html', label: 'HTML' };\n    }<\/p>\n<p>    var sqlKeyword = \/^\\s*(?:--.*\\n|\\\/\\*[\\s\\S]*?\\*\\\/\\s*)*\\s*(SELECT|INSERT\\s+INTO|UPDATE|DELETE\\s+FROM|CREATE\\s+(?:TABLE|VIEW|INDEX|DATABASE)|ALTER\\s+TABLE|DROP\\s+(?:TABLE|VIEW|INDEX)|WITH)\\b\/i;\n    if (sqlKeyword.test(t)) return { key: 'sql', label: 'SQL' };<\/p>\n<p>    if (\/\\bfn\\s+main\\s*\\(\/.test(t) && (\/let\\s+mut\\s\/.test(t) || \/println!\/.test(t))) {\n        return { key: 'rust', label: 'Rust' };\n    }\n    if (\/\\bpackage\\s+main\\b\/.test(t) && \/\\bfunc\\s+main\\s*\\(\/.test(t)) {\n        return { key: 'go', label: 'Go' };\n    }\n    if (\/\\bpublic\\s+class\\s+\\w+\/.test(t) || \/\\bpublic\\s+static\\s+void\\s+main\\s*\\(\/.test(t) || \/\\bSystem\\.out\\.println\/.test(t)) {\n        return { key: 'java', label: 'Java' };\n    }\n    if (\/\\busing\\s+System\\s*;\/.test(t) || \/\\bnamespace\\s+\\w+\/.test(t) || \/\\bConsole\\.WriteLine\/.test(t)) {\n        return { key: 'csharp', label: 'C#' };\n    }\n    if (\/#include\\s*<\\w+(\\.h)?>\/.test(t)) {\n        if (\/\\bstd::|::cout|::cin|<iostream>|<vector>|\\btemplate\\s*<\/.test(t)) return { key: 'cpp', label: 'C++' };\n        return { key: 'c', label: 'C' };\n    }\n    if (\/\\bfun\\s+main\\s*\\(\/.test(t) &#038;&#038; \/\\bval\\s|\\bvar\\s\/.test(t)) return { key: 'kotlin', label: 'Kotlin' };\n    if (\/\\bfunc\\s+\\w+\\s*\\([^)]*\\)\\s*(->|\\{)\/.test(t) && \/\\blet\\s|\\bvar\\s\/.test(t) && \/\\bimport\\s+(Foundation|SwiftUI|UIKit)\/.test(t)) {\n        return { key: 'swift', label: 'Swift' };\n    }<\/p>\n<p>    \/\/ CSS: Regel-Bloecke \"selektor { eigenschaft: wert; }\", keine JS\/PHP-Merkmale\n    if (\/[.#]?[\\w-]+\\s*\\{[^{}]*:[^{}]*;[^{}]*\\}\/.test(t) &&\n        !\/\\bfunction\\b|=>|\\bconst\\b|\\blet\\b|\\bvar\\b|<\\?php|\\bdef\\b\/.test(t)) {\n        return { key: 'css', label: 'CSS' };\n    }\n\n    \/\/ Shell: typische Konstrukte ohne Shebang\n    if (\/\\b(fi|done|esac)\\b\/.test(t) &#038;&#038; \/\\b(then|do)\\b\/.test(t) &#038;&#038; !\/\\bdef\\b|\\bclass\\b|<\\?php\/.test(t)) {\n        return { key: 'bash', label: 'Bash \/ Shell' };\n    }\n\n    \/\/ Python: Score-basierte Heuristik\n    var pyScore = 0;\n    if (\/^\\s*def\\s+\\w+\\s*\\(.*\\)\\s*:\\s*$\/m.test(t)) pyScore += 3;\n    if (\/^\\s*class\\s+\\w+.*:\\s*$\/m.test(t)) pyScore += 2;\n    if (\/^\\s*(import\\s+\\w+|from\\s+\\w+\\s+import\\s)\/m.test(t)) pyScore += 2;\n    if (\/^\\s*(elif|else)\\s*.*:\\s*$\/m.test(t)) pyScore += 2;\n    if (\/:\\s*$\/m.test(t)) pyScore += 1;\n    if (\/\\bprint\\s*\\(\/.test(t)) pyScore += 1;\n    if (\/\\bself\\b\/.test(t)) pyScore += 1;\n    if (\/[{};]\/.test(t) === false) pyScore += 1;\n    if (\/\\bfunction\\b|=>|<\\?php|\\bpublic\\s+class\\b\/.test(t)) pyScore -= 5;\n    if (pyScore >= 3) return { key: 'python', label: 'Python' };<\/p>\n<p>    \/\/ JS\/TS\/Node Merkmale\n    var jsish = \/\\bfunction\\b|=>|\\bconst\\s|\\blet\\s|\\bvar\\s|\\bconsole\\.log\\b|\\bimport\\s.+\\sfrom\\s|\\bexport\\s(default\\s)?\/.test(t);\n    if (jsish) {\n        if (\/\\brequire\\s*\\(|module\\.exports|process\\.env|__dirname|\\bexports\\.\/.test(t)) {\n            return { key: 'javascript', label: 'Node.js (JavaScript)' };\n        }\n        if (\/:\\s*(string|number|boolean|any|void|unknown)\\b|\\binterface\\s+\\w+|\\bimplements\\s+\\w+|<\\w+>\\s*\\(\/.test(t)) {\n            return { key: 'typescript', label: 'TypeScript' };\n        }\n        return { key: 'javascript', label: 'JavaScript' };\n    }<\/p>\n<p>    return { key: 'javascript', label: 'JavaScript (Standard-Vermutung)' };\n}<\/p>\n<p>\/* ---------- Minify: brace-basierte Sprachen ---------- *\/\nfunction lwSqueezeCode(s) {\n    s = s.replace(\/[ \\t\\r\\n]+\/g, ' ');\n    s = s.replace(\/\\s*([{}()\\[\\];,:])\\s*\/g, '$1');\n    return s;\n}<\/p>\n<p>function lwMinifyBrace(code, langOpts) {\n    var tokens = lwTokenize(code, langOpts);\n    var out = '';\n    \/\/ Zeilenumbruch zaehlt wie ein Leerzeichen als Trenner (Praeprozessor-Zeilen).\n    function endsWithSpace() { return out === '' || \/[ \\n]$\/.test(out); }\n    for (var k = 0; k < tokens.length; k++) {\n        var t = tokens[k];\n        if (t.type === 'comment') {\n            if (!endsWithSpace()) out += ' ';\n            continue;\n        }\n        if (t.type === 'preproc') {\n            if (out !== '' &#038;&#038; !\/\\n$\/.test(out)) out += '\\n';\n            out += t.value.trim() + '\\n';\n            continue;\n        }\n        if (t.type === 'string') { out += t.value; continue; }\n        var seg = lwSqueezeCode(t.value);\n        if (endsWithSpace()) seg = seg.replace(\/^ \/, '');\n        out += seg;\n    }\n    return out.replace(\/^\\s+|\\s+$\/g, '');\n}\n\n\/* ---------- Beautify: brace-basierte Sprachen ---------- *\/\nvar LW_SAME_LINE_AFTER_BRACE = { else: 1, catch: 1, finally: 1, while: 1 };\n\nfunction lwBeautifyBrace(code, langOpts, breakOnComma) {\n    var tokens = lwTokenize(code, langOpts);\n    var unit = '    ';\n    var depth = 0;\n    var out = '';\n    var atLineStart = true;\n    var pendingSpace = false;\n    var pendingBraceClose = false;\n    var braceCloseHadSpace = false;\n    var word = '';\n\n    function newline() {\n        \/\/ Direkt nach einer bereits leeren Zeile keine zweite Leerzeile anhaengen\n        \/\/ (sonst entsteht vor jeder schliessenden Klammer eine Luecke).\n        if (atLineStart) {\n            out = out.replace(\/[ \\t]*$\/, '') + unit.repeat(Math.max(depth, 0));\n            return;\n        }\n        out = out.replace(\/[ \\t]+$\/, '');\n        out += '\\n' + unit.repeat(Math.max(depth, 0));\n        atLineStart = true;\n        pendingSpace = false;\n    }\n    function resolveBraceClose(text, isWord) {\n        \/\/ Nach \"}\" beginnt normalerweise eine neue Zeile - ausser bei\n        \/\/ else\/catch\/finally\/while (bleiben an der Klammer) oder wenn im\n        \/\/ Original kein Leerraum folgte (z.B. \"})\" oder \"};\" am Zeilenende -\n        \/\/ dann direkt anhaengen statt eine Zeile zu verschwenden).\n        if (isWord &#038;&#038; LW_SAME_LINE_AFTER_BRACE[text.toLowerCase()]) {\n            out += ' ' + text;\n        } else if (!braceCloseHadSpace) {\n            out += text;\n        } else {\n            newline();\n            out += text;\n        }\n        pendingBraceClose = false;\n        braceCloseHadSpace = false;\n        atLineStart = false;\n        pendingSpace = false;\n    }\n    function flushWord() {\n        if (!word) return;\n        if (pendingBraceClose) { resolveBraceClose(word, true); word = ''; return; }\n        if (!atLineStart &#038;&#038; pendingSpace) out += ' ';\n        out += word;\n        atLineStart = false;\n        pendingSpace = false;\n        word = '';\n    }\n    function appendAtom(str) {\n        flushWord();\n        if (pendingBraceClose) { resolveBraceClose(str, false); return; }\n        if (!atLineStart &#038;&#038; pendingSpace) out += ' ';\n        out += str;\n        atLineStart = false;\n        pendingSpace = false;\n    }\n\n    for (var k = 0; k < tokens.length; k++) {\n        var t = tokens[k];\n        if (t.type === 'string') { appendAtom(t.value); continue; }\n        if (t.type === 'preproc') {\n            flushWord();\n            if (!atLineStart) newline();\n            out += t.value.trim();\n            atLineStart = false;\n            pendingBraceClose = false;\n            newline();\n            continue;\n        }\n        if (t.type === 'comment') {\n            appendAtom(t.value);\n            if (t.value.slice(0, 2) === '\/\/' || t.value[0] === '#' || t.value.slice(0, 2) === '--') {\n                newline();\n            } else {\n                pendingSpace = true;\n            }\n            continue;\n        }\n        var val = t.value;\n        for (var ci = 0; ci < val.length; ci++) {\n            var ch = val[ci];\n            if (ch === ' ' || ch === '\\t' || ch === '\\n' || ch === '\\r') {\n                flushWord();\n                pendingSpace = true;\n                if (pendingBraceClose) braceCloseHadSpace = true;\n                continue;\n            }\n            if (ch === '{') {\n                flushWord();\n                if (pendingBraceClose) { resolveBraceClose('{', false); }\n                else {\n                    if (!atLineStart) out += ' ';\n                    out += '{';\n                    atLineStart = false;\n                    pendingSpace = false;\n                }\n                depth++;\n                newline();\n            } else if (ch === '}') {\n                flushWord();\n                depth = Math.max(0, depth - 1);\n                newline();\n                out += '}';\n                atLineStart = false;\n                pendingSpace = false;\n                pendingBraceClose = true;\n            } else if (ch === ';') {\n                flushWord();\n                pendingBraceClose = false;\n                out += ';';\n                atLineStart = false;\n                newline();\n            } else if (breakOnComma &#038;&#038; ch === ',') {\n                flushWord();\n                pendingBraceClose = false;\n                out += ',';\n                atLineStart = false;\n                newline();\n            } else {\n                word += ch;\n            }\n        }\n    }\n    flushWord();\n    return out.replace(\/^\\s+|\\s+$\/g, '').replace(\/\\n{3,}\/g, '\\n\\n');\n}\n\n\/* ---------- SQL: Keyword-basiertes Umbrechen ---------- *\/\nvar LW_SQL_CLAUSES = [\n    'SELECT', 'FROM', 'WHERE', 'LEFT JOIN', 'RIGHT JOIN', 'INNER JOIN', 'FULL JOIN',\n    'JOIN', 'ON', 'ORDER BY', 'GROUP BY', 'HAVING', 'LIMIT', 'OFFSET', 'INSERT INTO',\n    'VALUES', 'UPDATE', 'SET', 'DELETE FROM', 'UNION ALL', 'UNION', 'AND', 'OR'\n];\nvar LW_SQL_INDENTED = { 'AND': true, 'OR': true, 'ON': true };\n\nfunction lwStripSqlComments(sql) {\n    var tokens = lwTokenize(sql, LW_LANG_OPTS.sql);\n    var out = '';\n    for (var i = 0; i < tokens.length; i++) {\n        var t = tokens[i];\n        if (t.type === 'comment') { out += ' '; continue; }\n        out += t.value;\n    }\n    return out;\n}\n\nfunction lwMinifySql(sql) {\n    var s = lwStripSqlComments(sql);\n    s = s.replace(\/[ \\t\\r\\n]+\/g, ' ').trim();\n    s = s.replace(\/\\s*([(),;])\\s*\/g, '$1');\n    LW_SQL_CLAUSES.forEach(function (clause) {\n        var re = new RegExp('\\\\b' + clause.replace(' ', '\\\\s+') + '\\\\b', 'gi');\n        s = s.replace(re, clause);\n    });\n    return s;\n}\n\nfunction lwBeautifySql(sql) {\n    var s = lwStripSqlComments(sql);\n    s = s.replace(\/[ \\t\\r\\n]+\/g, ' ').trim();\n    s = s.replace(\/\\s*,\\s*\/g, ', ');\n\n    LW_SQL_CLAUSES.forEach(function (clause) {\n        var re = new RegExp('\\\\b' + clause.replace(' ', '\\\\s+') + '\\\\b', 'gi');\n        var marker = (LW_SQL_INDENTED[clause] ? '\\n  ' : '\\n') + clause;\n        s = s.replace(re, marker);\n    });\n\n    return s.replace(\/^\\n+\/, '').split('\\n').map(function (l) { return l.replace(\/\\s+$\/, ''); }).join('\\n').trim();\n}\n\n\/* ---------- Indent-Engine: Python, Bash (Einrueckung relativ zur Struktur) ---------- *\/\nfunction lwReindentByStructure(code, langKey, unit, opts) {\n    opts = opts || {};\n    var tokens = lwTokenize(code, LW_LANG_OPTS[langKey]);\n    var cleaned = '';\n    for (var i = 0; i < tokens.length; i++) {\n        var t = tokens[i];\n        cleaned += (t.type === 'comment' &#038;&#038; opts.stripComments) ? '' : t.value;\n    }\n    cleaned = cleaned.replace(\/\\r\\n\/g, '\\n').replace(\/\\t\/g, '    ');\n\n    var lines = cleaned.split('\\n');\n    var stack = [0];\n    var out = [];\n    var blankRun = 0;\n\n    for (var li = 0; li < lines.length; li++) {\n        var raw = lines[li];\n        var trimmed = raw.replace(\/\\s+$\/, '');\n        if (trimmed.trim() === '') {\n            blankRun++;\n            if (!opts.stripBlank &#038;&#038; blankRun <= 1) out.push('');\n            continue;\n        }\n        blankRun = 0;\n\n        \/\/ Shebang-Zeile (bereits als eigener code-Token am Anfang) unveraendert lassen\n        if (out.length === 0 &#038;&#038; trimmed.slice(0, 2) === '#!') {\n            out.push(trimmed);\n            continue;\n        }\n\n        var indentLen = trimmed.match(\/^ *\/)[0].length;\n        var content = trimmed.replace(\/^ +\/, '');\n\n        while (stack.length > 1 && indentLen < stack[stack.length - 1]) stack.pop();\n        if (indentLen > stack[stack.length - 1]) stack.push(indentLen);<\/p>\n<p>        var depth = stack.length - 1;\n        out.push(unit.repeat(depth) + content);\n    }<\/p>\n<p>    return out.join('\\n').replace(\/\\n{3,}\/g, '\\n\\n').replace(\/^\\s+|\\s+$\/g, '');\n}<\/p>\n<p>\/* ---------- HTML: Tag-Engine ---------- *\/\nvar LW_VOID_TAGS = { area: 1, base: 1, br: 1, col: 1, embed: 1, hr: 1, img: 1, input: 1, link: 1, meta: 1, param: 1, source: 1, track: 1, wbr: 1 };\nvar LW_RAW_TAGS = { script: 1, style: 1, pre: 1, textarea: 1 };<\/p>\n<p>function lwTokenizeHtml(src) {\n    var tokens = [];\n    var i = 0, n = src.length;\n    while (i < n) {\n        if (src.slice(i, i + 4) === '<!--') {\n            var j = src.indexOf('-->', i);\n            j = j === -1 ? n : j + 3;\n            tokens.push({ type: 'comment', value: src.slice(i, j) });\n            i = j;\n            continue;\n        }\n        if (src[i] === '<') {\n            var m = \/^<\\\/?[a-zA-Z][a-zA-Z0-9:-]*(\\s+[^<>]*?)?\\\/?>\/.exec(src.slice(i));\n            if (m) {\n                var tagStr = m[0];\n                var isClose = tagStr[1] === '\/';\n                var nameMatch = \/^<\\\/?([a-zA-Z][a-zA-Z0-9:-]*)\/.exec(tagStr);\n                var name = nameMatch[1].toLowerCase();\n                var selfClose = \/\\\/>\\s*$\/.test(tagStr) || LW_VOID_TAGS[name];\n                tokens.push({ type: isClose ? 'close' : (selfClose ? 'void' : 'open'), name: name, value: tagStr });\n                i += tagStr.length;<\/p>\n<p>                if (!isClose && !selfClose && LW_RAW_TAGS[name]) {\n                    var endTag = '<\/' + name;\n                    var endIdx = src.toLowerCase().indexOf(endTag, i);\n                    endIdx = endIdx === -1 ? n : endIdx;\n                    if (endIdx > i) tokens.push({ type: 'raw', value: src.slice(i, endIdx) });\n                    i = endIdx;\n                }\n                continue;\n            }\n        }\n        var next = src.indexOf('<', i + 1);\n        next = next === -1 ? n : next;\n        var text = src.slice(i, next);\n        \/\/ Nur inneren Leerraum zusammenfassen, Raender nicht abschneiden -\n        \/\/ sonst verschwindet z.B. das Leerzeichen zwischen \"Hello\" und \"<b>\".\n        var collapsed = text.replace(\/\\s+\/g, ' ');\n        if (collapsed !== '') tokens.push({ type: 'text', value: collapsed });\n        i = next;\n    }\n    return tokens;\n}<\/p>\n<p>function lwBeautifyHtml(src) {\n    var tokens = lwTokenizeHtml(src);\n    var unit = '    ';\n    var depth = 0;\n    var out = [];\n    for (var i = 0; i < tokens.length; i++) {\n        var t = tokens[i];\n        if (t.type === 'close') {\n            depth = Math.max(0, depth - 1);\n            out.push(unit.repeat(depth) + t.value);\n        } else if (t.type === 'open') {\n            out.push(unit.repeat(depth) + t.value);\n            depth++;\n        } else if (t.type === 'void') {\n            out.push(unit.repeat(depth) + t.value);\n        } else if (t.type === 'raw') {\n            var innerLines = t.value.split('\\n');\n            for (var l = 0; l < innerLines.length; l++) {\n                var ln = innerLines[l].trim();\n                if (ln) out.push(unit.repeat(depth) + ln);\n            }\n        } else if (t.type === 'text') {\n            var txt = t.value.trim();\n            if (txt) out.push(unit.repeat(depth) + txt);\n        } else {\n            out.push(unit.repeat(depth) + t.value);\n        }\n    }\n    return out.join('\\n');\n}\n\nfunction lwMinifyHtml(src) {\n    var tokens = lwTokenizeHtml(src);\n    var out = '';\n    for (var i = 0; i < tokens.length; i++) {\n        var t = tokens[i];\n        if (t.type === 'comment') continue;\n        if (t.type === 'raw') { out += t.value.trim(); continue; }\n        out += t.value;\n    }\n    return out.trim();\n}\n\n\/* ---------- Oeffentliche API ---------- *\/\nfunction lwEngineFor(langKey) {\n    if (langKey === 'sql') return 'sql';\n    if (langKey === 'python' || langKey === 'bash') return 'indent';\n    if (langKey === 'html') return 'html';\n    return 'brace';\n}\n\nfunction lwMinifyCode(code, langKey) {\n    if (langKey === 'json') {\n        try { return JSON.stringify(JSON.parse(code)); } catch (e) { \/* auf Brace-Engine ausweichen *\/ }\n    }\n    var engine = lwEngineFor(langKey);\n    if (engine === 'sql') return lwMinifySql(code);\n    if (engine === 'html') return lwMinifyHtml(code);\n    if (engine === 'indent') return lwReindentByStructure(code, langKey, ' ', { stripComments: true, stripBlank: true });\n    return lwMinifyBrace(code, LW_LANG_OPTS[langKey] || LW_LANG_OPTS.javascript);\n}\n\nfunction lwBeautifyCode(code, langKey) {\n    if (langKey === 'json') {\n        try { return JSON.stringify(JSON.parse(code), null, 4); } catch (e) { \/* auf Brace-Engine ausweichen *\/ }\n    }\n    var engine = lwEngineFor(langKey);\n    if (engine === 'sql') return lwBeautifySql(code);\n    if (engine === 'html') return lwBeautifyHtml(code);\n    if (engine === 'indent') return lwReindentByStructure(code, langKey, '    ', { stripComments: false, stripBlank: false });\n    return lwBeautifyBrace(code, LW_LANG_OPTS[langKey] || LW_LANG_OPTS.javascript, langKey === 'json');\n}\n\n\n(function () {\n    var LABEL_INPUT = \"Input\";\n    var LABEL_OUTPUT = \"Output\";\n    var LABEL_CHARS = \"characters\";\n    var ERR_EMPTY = \"Please paste some code first.\";\n    var ERR_GENERIC = \"Could not process this input. Please check that it is complete, valid code.\";\n    var DETECTED_PREFIX = \"Detected: \";\n    var BTN_COPY_TEXT = \"Copy Output\";\n    var BTN_COPIED_TEXT = \"Copied!\";\n\n    window.lwCodeBeauUpdateDetected = function () {\n        var select = document.getElementById('code-beau-lang-select');\n        var input = document.getElementById('code-beau-input').value;\n        var badge = document.getElementById('code-beau-detected');\n        if (select.value !== 'auto' || !input.trim()) { badge.textContent = ''; return; }\n        var det = lwDetectLanguage(input);\n        badge.textContent = DETECTED_PREFIX + det.label;\n    };\n\n    window.lwCodeBeauRun = function () {\n        var select = document.getElementById('code-beau-lang-select');\n        var input = document.getElementById('code-beau-input').value;\n        var errorBox = document.getElementById('code-beau-error');\n        var statsBox = document.getElementById('code-beau-stats');\n        var output = document.getElementById('code-beau-output');\n\n        errorBox.style.display = 'none';\n        statsBox.style.display = 'none';\n        output.textContent = '';\n\n        if (!input.trim()) {\n            errorBox.textContent = ERR_EMPTY;\n            errorBox.style.display = 'block';\n            return;\n        }\n\n        var langKey = select.value === 'auto' ? lwDetectLanguage(input).key : select.value;\n\n        try {\n            var result = lwBeautifyCode(input, langKey);\n            output.textContent = result;\n\n            var inLen = input.length, outLen = result.length;\n            statsBox.textContent = LABEL_INPUT + ': ' + inLen + ' ' + LABEL_CHARS + ' \u2192 ' + LABEL_OUTPUT + ': ' + outLen + ' ' + LABEL_CHARS;\n            statsBox.style.display = 'block';\n        } catch (e) {\n            errorBox.textContent = ERR_GENERIC;\n            errorBox.style.display = 'block';\n        }\n    };\n\n    window.lwCodeBeauCopy = function (btn) {\n        var text = document.getElementById('code-beau-output').textContent;\n        if (!text) return;\n        navigator.clipboard.writeText(text).then(function () {\n            var original = btn.textContent;\n            btn.textContent = BTN_COPIED_TEXT;\n            setTimeout(function () { btn.textContent = original; }, 1500);\n        });\n    };\n})();\n<\/script><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Paste minified or messy JavaScript, PHP, Node.js, Python, SQL, Java, C\/C++, C#, Go, Rust, TypeScript, HTML, CSS, JSON or Bash below. The language is detected automatically, and the code is reformatted with clean, consistent indentation. Language: Auto-detectJavaScript \/ Node.jsTypeScriptPHPPythonSQLJavaCC++C#GoRustKotlinSwiftJSONHTMLCSSBash \/ Shell Beautify Copy Output<\/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":[91144],"class_list":["post-10075","page","type-page","status-publish","hentry","tag-devops"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Code Beautifier \u2013 JavaScript, PHP, Python, SQL &amp; More - 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\/code-beautifier\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Code Beautifier \u2013 JavaScript, PHP, Python, SQL &amp; More - Lukas Wojcik - Blog\" \/>\n<meta property=\"og:description\" content=\"Paste minified or messy JavaScript, PHP, Node.js, Python, SQL, Java, C\/C++, C#, Go, Rust, TypeScript, HTML, CSS, JSON or Bash below. The language is detected automatically, and the code is reformatted with clean, consistent indentation. Language: Auto-detectJavaScript \/ Node.jsTypeScriptPHPPythonSQLJavaCC++C#GoRustKotlinSwiftJSONHTMLCSSBash \/ Shell Beautify Copy Output\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/code-beautifier\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukas Wojcik - Blog\" \/>\n<meta property=\"article:modified_time\" content=\"2026-08-13T12:54:43+00:00\" \/>\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<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/code-beautifier\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/code-beautifier\\\/\",\"name\":\"Code Beautifier \u2013 JavaScript, PHP, Python, SQL & More - Lukas Wojcik - Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"datePublished\":\"2026-08-13T12:51:41+00:00\",\"dateModified\":\"2026-08-13T12:54:43+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/code-beautifier\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/code-beautifier\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/code-beautifier\\\/#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\":\"Code Beautifier \u2013 JavaScript, PHP, Python, SQL &#038; More\"}]},{\"@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":"Code Beautifier \u2013 JavaScript, PHP, Python, SQL & More - 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\/code-beautifier\/","og_locale":"en_US","og_type":"article","og_title":"Code Beautifier \u2013 JavaScript, PHP, Python, SQL & More - Lukas Wojcik - Blog","og_description":"Paste minified or messy JavaScript, PHP, Node.js, Python, SQL, Java, C\/C++, C#, Go, Rust, TypeScript, HTML, CSS, JSON or Bash below. The language is detected automatically, and the code is reformatted with clean, consistent indentation. Language: Auto-detectJavaScript \/ Node.jsTypeScriptPHPPythonSQLJavaCC++C#GoRustKotlinSwiftJSONHTMLCSSBash \/ Shell Beautify Copy Output","og_url":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/code-beautifier\/","og_site_name":"Lukas Wojcik - Blog","article_modified_time":"2026-08-13T12:54:43+00:00","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","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/code-beautifier\/","url":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/code-beautifier\/","name":"Code Beautifier \u2013 JavaScript, PHP, Python, SQL & More - Lukas Wojcik - Blog","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"datePublished":"2026-08-13T12:51:41+00:00","dateModified":"2026-08-13T12:54:43+00:00","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/code-beautifier\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/code-beautifier\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/code-beautifier\/#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":"Code Beautifier \u2013 JavaScript, PHP, Python, SQL &#038; More"}]},{"@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\/10075","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=10075"}],"version-history":[{"count":1,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/10075\/revisions"}],"predecessor-version":[{"id":10083,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/10075\/revisions\/10083"}],"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=10075"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=10075"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}