
// javascript format script |
// copyright Stephen Chapman 22 April 2007 |
var kw = ['abstract', 'as', 'boolean', 'break', 'byte', 'case', 'catch', 'char', 'class', 'const', 'continue', 'default', 'delete', 'do', 'double', 'else', 'enum', 'export', 'extends', 'false', 'final', 'finally', 'float', 'for', 'function', 'goto', 'if', 'implements', 'import', 'in', 'instanceof', 'int', 'interface', 'long', 'namespace', 'native', 'new', 'null', 'package', 'private', 'protected', 'public', 'return', 'short', 'static', 'super', 'switch', 'synchronized', 'this', 'throw', 'throws', 'transient', 'true', 'try', 'typeof', 'use', 'var', 'void', 'volatile', 'while', 'with']; |
var ob = ['Anchor', 'anchors', 'Applet', 'applets', 'Area', 'Array', 'Body', 'Button', 'Checkbox', 'Date', 'document', 'FileUpload', 'Form', 'forms', 'Frame', 'frames', 'Hidden', 'History', 'history', 'Image', 'images', 'Layer', 'layers', 'Link', 'links', 'location', 'Math', 'MimeType', 'mimeTypes', 'navigator', 'Number', 'Option', 'options', 'Password', 'Plugin', 'plugins', 'Radio', 'RegExp', 'Reset', 'screen', 'Script', 'Select', 'String', 'Style', 'StyleSheet', 'Submit', 'Text', 'Textarea', 'window']; |
var sym = '-+*<=>?:&|/!%'; |
function JSfmt(s) { |
this.i = this.r = this.lvl = this.pr = 0; |
this.row = ['']; |
this.lW = this.nC = this.pC = ''; |
this.decode = function() { |
s = s.replace(/(\r\n|\r|\n)/g, '\n'); |
while (this.i < s.length) { |
var c = s.charAt(this.i); |
if (s.length - 1 == this.i) this.nC = ''; |
else this.nC = s.charAt(this.i + 1); |
if (/\w/.test(c)) {if (this.lW) this.lW += c; |
else this.lW = c; |
this.row[this.r] += c; |
} |
else switch (c) { |
case '\n': break; |
case ' ': case '\t': this.hl(); |
this.row[this.r] += ' '; |
break; |
case '.': this.hl(); |
this.row[this.r] += '.'; |
break; |
case '{': this.hl(); |
var currentLine = this.row[this.r]; |
if (currentLine.length) { |
var lastChar = currentLine[currentLine.length - 1]; |
if (lastChar != ' ' && lastChar != '\t') this.row[this.r] += ' {'; |
else this.row[this.r] += '{'; |
} |
else this.row[this.r] += '{'; |
this.lvl++; |
this.wl(); |
break; |
case '}': this.hl(); |
this.lvl--; |
this.row[this.r] += '}'; |
if (';' != this.nC) this.wl(); |
break; |
case ';': this.hl(); |
this.row[this.r] += '; '; |
if (this.pr == 0) this.wl(); |
break; |
case '(': this.pr++; |
this.hl(); |
this.row[this.r] += '('; |
break; |
case ')': this.pr--; |
this.hl(); |
this.row[this.r] += ')'; |
break; |
case '"': case "'" : this.hl(); |
var escaped = false; |
this.row[this.r] += '<span class="literal">' + c; |
while (this.i < s.length - 1) { |
this.i++; |
var ch = s.charAt(this.i); |
if (ch == '\\') escaped = !escaped; |
if (ch == '&') ch = '&'; |
if (ch == '<') ch = '<'; |
if (ch == '>') ch = '>'; |
this.row[this.r] += ch; |
if (c == ch && !escaped) { |
this.row[this.r] += '<\/span>'; |
break; |
} |
if (ch != '\\') escaped = false; |
} |
break; |
case '/': if ('/' == this.nC) { |
this.row[this.r] += '<span class="comment">//'; |
this.i++; |
while (this.i < s.length - 1) { |
this.i++; |
var c = s.charAt(this.i); |
if (c == '&') c = '&'; |
if (c == '<') c = '<'; |
if (c == '>') c = '>'; |
if (c == '\n') { |
this.row[this.r] += '<\/span>'; |
this.wl(); |
break; |
} |
this.row[this.r] += c; |
} |
} |
else if (this.nC == '*') { |
this.row[this.r] += '<span class="comment">/*'; |
this.i++; |
var c = ''; |
var prevC = ''; |
while (this.i < s.length - 1) { |
this.i++; |
prevC = c; |
c = s.charAt(this.i); |
if (c == ' ' || c == '\t' || c == '\n') { |
if (c == ' ') { |
if (this.row[this.r]) this.row[this.r] += ' '; |
} |
else if (c == '\t') { |
if (this.row[this.r]) this.row[this.r] += ' '; |
} |
else if (c == '\n') this.wl(); |
} |
else this.row[this.r] += c; |
if (c == '/' && prevC == '*') { |
this.row[this.r] += '<\/span>'; |
break; |
} |
} |
this.wl(); |
} |
else if (this.lW) { |
this.hl(); |
if (this.nC == '=') this.row[this.r] += ' /'; |
else this.row[this.r] += ' / '; |
} |
else if (this.pC == '*') this.row[this.r] += '/ '; |
else if (this.pC == ')') this.row[this.r] += ' / '; |
else { |
if (this.pC == '=') this.row[this.r] += ' /'; |
else this.row[this.r] += '/'; |
while (this.i < s.length - 1) { |
this.i++; |
var c = s.charAt(this.i); |
if (c == '(') this.pr++; |
if (c == ')') this.pr--; |
if (c == '\\') escaped = !escaped; |
this.row[this.r] += c; |
if (c == ';' && this.pr == 0) { |
this.wl(); |
break; |
} |
if (c == '/' && this.pr == 0) if (!escaped) break; |
if (c != '\\') escaped = false; |
} |
} |
break; |
case ',': this.hl(); |
this.row[this.r] += ', '; |
break; |
case '-': case '+': case '*': case '%': case '<': case '=': case '>': case '?': case ':': case '&': case '|': case '!': this.hl(); |
if (c == '!' && this.nC != '=') { |
this.row[this.r] += c; |
break; |
} |
if (c == ':' && this.pC == "'") { |
this.row[this.r] += c; |
break; |
} |
if (c == '+' || c == '-') if (c == this.nC || c == this.pC) { |
this.row[this.r] += c; |
break; |
} |
if (sym.indexOf(this.pC) != - 1) { |
if (sym.indexOf(this.nC) != - 1) this.row[this.r] += c; |
else this.row[this.r] += c + ' '; |
} |
else { |
if (sym.indexOf(this.nC) != - 1) this.row[this.r] += ' ' + c; |
else this.row[this.r] += ' ' + c + ' '; |
} |
break; |
default : this.hl(); |
this.row[this.r] += c; |
break; |
} |
if (!/\w/.test(c)) if (c != ' ' && c != '\t') {this.hl(); |
this.lW = ''; |
} |
this.pC = c; |
this.i++; |
} |
return this.row.join('<br />'); |
} |
this.hl = function() { |
if (this.lW && kw.indexOf(this.lW) != - 1) { |
this.row[this.r] = this.row[this.r].substr(0, this.row[this.r].lastIndexOf(this.lW)) + '<span class="keyword">' + this.lW + '<\/span>'; |
this.lW = ''; |
} |
else if (this.lW && ob.indexOf(this.lW) != - 1) { |
this.row[this.r] = this.row[this.r].substr(0, this.row[this.r].lastIndexOf(this.lW)) + '<span class="object">' + this.lW + '<\/span>'; |
this.lW = ''; |
} |
} |
this.wl = function() { |
this.row.push(''); |
this.r++; |
var i = 0; |
while (i < this.lvl) { |
this.row[this.r] += ' '; |
i++; |
} |
} |
} |
if (typeof Array.prototype.indexOf == 'undefined') { |
Array.prototype.indexOf = function(item) { |
for (var i = 0; i < this.length; i++) { |
if ((typeof this[i] == typeof item) && (this[i] == item)) { |
return i; |
} |
} |
return - 1; |
} |
} |
function decode() { |
var jsformat = new JSfmt(document.getElementById('in').value); |
res(jsformat.decode()); |
} |
function res(t) { |
var mh = screen.height - 150; |
var mw = screen.width - 20; |
TheResWin = window.open('', 'format', 'height=' + mh + ',width=' + mw + ',toolbar=no,directories=no,status=no,' + 'menubar=no,scrollbars=yes,resizable=yes'); |
TheResWin.document.write('<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"\n"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http:\/\/www.w3.org\/1999\/xhtml">\n<head><title>Results<\/title><style type="text/css">#out {font: normal 10pt Courier,"Courier New",monospace; background: #f5f5f5;}\n.keyword {color:#0000ff;}\n.object {color:#ff00ff;}\n.literal {color:#cc9966;}\n.comment {color:#999999;}\n</style><\/head>\n<body ><p align="right"><a href="#" onclick="self.close();return false;">Close Window<\/a><\/p><div id="out">' + t + '</div><p align="right"><a href="#" onclick="self.close();return false;">Close Window<\/a><\/p><\/body><\/html>'); |
TheResWin.document.close(); |
TheResWin.moveTo(0, 0); |
TheResWin.focus(); |
} |



