/* function $(id) { if (typeof(id) === "string") { return document.getElementById(id); } else { return id; } } */ window.onload = function() { $("fixindentation").onclick = indent; $("indentbyspaces").onchange = enableSpacesBox; $("indentbytabs").onchange = enableSpacesBox; $("sourcecode").onchange = $("sourcecode").onkeydown = $("sourcecode").onkeypress = $("sourcecode").onblur = $("sourcecode").onfocus = delayedSourceCodeChange; $("language").onchange = delayedSourceCodeChange; Cookies.makeRadioButtonStateful($("indentbyspaces")); Cookies.makeRadioButtonStateful($("indentbytabs")); Cookies.makeRadioButtonStateful($("languagejava")); Cookies.makeRadioButtonStateful($("languagephp")); Cookies.makeRadioButtonStateful($("languagehtml")); Cookies.makeRadioButtonStateful($("languageml")); Cookies.makeRadioButtonStateful($("languagescheme")); enableSpacesBox(); }; function enableSpacesBox(event) { $("spaces").disabled = $("indentbytabs").checked; } var indentString = ""; function updateIndentString() { indentString = "\t"; if ($("indentbyspaces").checked) { indentString = ""; var spaces = parseInt($("spaces").value); for (var i = 0; i < spaces; i++) { indentString += " "; } } } function indent(event) { updateIndentString(); if ($("languageml").checked || $("languagescheme").checked) { // don't have an algorithm to indent ML code right now. too bad alert("Sorry; we don't currently support fixing indentation of ML/Scheme code.\n" + "For ML/Scheme, this tool will only tell you about your substantive line count."); return; } if ($("languagehtml").checked) { indentHtml(event); } else { indentJavaPHP(event); } } function indentHtml(event) { updateIndentString(); if ($("indentbyspaces").checked) { $("tidyspaces").value = "" + indentString.length; } else { $("tidyspaces").value = "4"; } $("tidyform").submit(); } function indentJavaPHP(event) { var code = $("sourcecode").value; // code += "\n:-)"; var newCode = ""; var indentLevel = 0; var indentDuration = 0; // used for temporary indents like 1-line ifs var newLines = []; var inMultiLineComment = false; var lines = code.split(/[\r]?\n/gi); for (var i = 0; i < lines.length; i++) { var line = trim(lines[i]); var lineForMatching = line.replace(/\/\/.*/, ""); if (inMultiLineComment) { if (line.match(/\*\//)) { lineForMatching = line.replace(/.*\*\//, ""); inMultiLineComment = false; } else { // entire line is part of multi-line comment; // ignore it for indentation purposes lineForMatching = ""; } } if (lineForMatching.match(/\/\*/)) { if (lineForMatching.match(/\*\//)) { // a multi-line comment contained within one line; strip it lineForMatching = lineForMatching.replace(/\/\*.*\*\//, ""); } else { inMultiLineComment = true; lineForMatching = lineForMatching.replace(/\/\*.*/, ""); } } // ignore stuff in comments var lbrackets = lineForMatching.replace(/[^\{]+/gi, ""); var rbrackets = lineForMatching.replace(/[^\}]+/gi, ""); var lbracket1 = lineForMatching.indexOf("{"); var rbracket1 = lineForMatching.indexOf("}"); var lbracketN = lineForMatching.lastIndexOf("{"); var rbracketN = lineForMatching.lastIndexOf("}"); var increaseIndentBefore = false; var decreaseIndentBefore = false; var increaseIndentAfter = false; var decreaseIndentAfter = false; if (lbrackets.length > rbrackets.length || lbracketN >= 0 && lbracketN > rbracketN) { // opening brace(s) on this line; indent subsequent lines increaseIndentAfter = true; } if (rbrackets.length > lbrackets.length || rbracket1 >= 0 && rbracket1 < lbracket1) { // closing brace(s) on this line; decrease this line and subseqent lines decreaseIndentBefore = true; } // closing bracket; decrease indent // indentLevel = Math.max(0, indentLevel - 1); // check for a prior temporary indent (unbracketed if/else) // and get rid of it if so if (indentDuration > 0) { // if (lbrackets.length != rbrackets.length || // (!lineForMatching.match(/(if |for |while )[ \t]*([^)]*)/) && !lineForMatching.match(/else /))) { indentDuration--; if (trim(lineForMatching).indexOf("{") >= 0) { decreaseIndentBefore = true; } else if (indentDuration == 0) { // indentLevel = Math.max(0, indent - 1); decreaseIndentAfter = true; } // } } // check for a new temporary indent (unbracketed if/else) // on this line and increase subsequent indent temporarily if so // side note: f**k unbracketed if/elses for making me write this code if ( (( // (lbrackets.length < rbrackets.length || rbracketN > lbracketN) || // increaseIndentAfter || (lbrackets.length == 0 && rbrackets.length == 0) ) && ( (lineForMatching.match(/(if |while )[ \t]*([^)]*)/) && !lineForMatching.match(/;/)) || (lineForMatching.match(/(for )[ \t]*([^)]*)/)) || (lineForMatching.match(/else/) && ( !lineForMatching.match(/else[ ]+if/) && // !lineForMatching.match(/ /) (lbrackets.length == 0 || lbrackets.length > rbrackets.length) ) ) )) || trim(lineForMatching).match(/}[ \t]*else$/) ) { increaseIndentAfter = true; indentDuration = 1; } // pre-print indentation adjustments if (increaseIndentBefore) { indentLevel++; } else if (decreaseIndentBefore) { indentLevel = Math.max(0, indentLevel - 1); } // store this line, indented (hopefully) properly for (var tabs = 0; tabs < indentLevel; tabs++) { line = indentString + line; } newLines.push(line); // post-print indentation adjustments if (increaseIndentAfter) { indentLevel++; } else if (decreaseIndentAfter) { indentLevel = Math.max(0, indentLevel - 1); } } // put the newly indented lines into the text area on the page newCode = newLines.join("\n"); $("sourcecode").value = newCode; } function delayedSourceCodeChange(event) { event = event || window.event; sourceCodeChange(event); setTimeout(sourceCodeChange, 20); } // Called when the text in the text box changes; shows the count of lines. function sourceCodeChange(event) { var codeText = $("sourcecode").value; var lineCount = codeText ? trim(codeText).split(/[\r]?\n/).length : 0; if ($("languagehtml").checked) { // remove multi-line comments from HTML codeText = codeText.replace(/\