js-beautify/index.html
2010-03-16 01:24:38 +02:00

324 lines
11 KiB
HTML

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<!--
(c) 2006-2010: Einar Lielmanis, einars@jsbeautifier.org
-->
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Online javascript beautifier</title>
<script type="text/javascript">
function add_onload_function(fn)
{
var oe=window.onload;
window.onload = function() { if (oe) oe(); fn(); }
}
add_onload_function(function() {
var tabsize = get_var('tabsize');
var c;
if (tabsize) {
document.getElementById('tabsize').value = tabsize;
}
if (get_var('test')) {
run_tests();
} else {
c = document.forms[0].content;
c && c.setSelectionRange && c.setSelectionRange(0, 0);
c && c.focus && c.focus();
}
});
function trim_leading_comments(str)
{
// very basic. doesn't support /* ... */
str = str.replace(/^(\s*\/\/[^\n]*\n)+/, '');
str = str.replace(/^\s+/, '');
return str;
}
function unpacker_filter(source)
{
if (document.getElementById('detect-packers').checked) {
var stripped_source = trim_leading_comments(source);
var unpacked = '';
if (P_A_C_K_E_R.detect(stripped_source)) {
unpacked = P_A_C_K_E_R.unpack(stripped_source);
if (unpacked !== stripped_source) {
return unpacker_filter(unpacked);
}
}
if (EscapedBookmarklet.detect(source)) {
unpacked = EscapedBookmarklet.unpack(source);
if (unpacked !== stripped_source) {
return unpacker_filter(unpacked);
}
}
if (JavascriptObfuscator.detect(stripped_source)) {
unpacked = JavascriptObfuscator.unpack(stripped_source);
if (unpacked !== stripped_source) {
return unpacker_filter(unpacked);
}
}
}
return source;
}
function do_js_beautify()
{
document.getElementById('beautify').disabled = true;
var js_source = document.getElementById('content').value.replace(/^\s+/, '');
var indent_size = document.getElementById('tabsize').value;
var indent_char = ' ';
var preserve_newlines = document.getElementById('preserve-newlines').checked;
var keep_array_indentation = document.getElementById('keep-array-indentation').checked;
if (indent_size == 1) {
indent_char = '\t';
}
if (js_source && js_source[0] === '<' && js_source.substring(0, 4) !== '<!--') {
document.getElementById('content').value = style_html(js_source, indent_size, indent_char, 80);
} else {
document.getElementById('content').value =
js_beautify(unpacker_filter(js_source), {
indent_size: indent_size,
indent_char: indent_char,
preserve_newlines:preserve_newlines,
keep_array_indentation:keep_array_indentation,
space_after_anon_function:true});
}
document.getElementById('beautify').disabled = false;
return false;
}
function get_var( name )
{
var res = new RegExp( "[\\?&]" + name + "=([^&#]*)" ).exec( window.location.href );
return res ? res[1] : "";
}
function run_tests()
{
var st = new SanityTest();
run_beautifier_tests(st);
JavascriptObfuscator.run_tests(st);
P_A_C_K_E_R.run_tests(st);
EscapedBookmarklet.run_tests(st);
document.getElementById('testresults').style.display='block';
document.getElementById('testresults').innerHTML=st.results();
}
</script>
<script type="text/javascript" src="beautify.js" ></script>
<script type="text/javascript" src="beautify-html.js" ></script>
<script type="text/javascript" src="tests/sanitytest.js" ></script>
<script type="text/javascript" src="tests/beautify-tests.js" ></script>
<script type="text/javascript" src="unpackers/javascriptobfuscator_unpacker.js" ></script>
<script type="text/javascript" src="unpackers/bookmarklet_unpacker.js" ></script>
<script type="text/javascript" src="unpackers/p_a_c_k_e_r_unpacker.js" ></script>
<style type="text/css">
/* I guess I need a CSS beautifer as well */
* {
margin: 0;
padding: 0;
}
div#wrap {
padding: 0 15px;
}
form {
margin: 0 0 20px 0;
}
textarea {
width: 100%;
height: 420px;
border: 0;
}
h1 {
font-family: "trebuchet ms", arial, sans-serif;
font-weight: normal;
font-size: 28px;
color: #666;
margin: 10px 10px 15px 10px;
border-bottom: 1px solid #666;
}
a {
color: #36d;
}
select {
width: 190px;
}
button {
width: 100%;
padding: 3px 5px;
cursor: pointer;
bordeR: 1px solid #ccc;
border-bottom: 1px solid #999;
border-right: 1px solid #999;
margin-top: 2px;
background-color: #eee;
}
body {
font: 14px "myriad web", verdana, arial, helvetica, sans-serif;
}
body, label, button, select {
font-family: "myriad web", verdana, arial, helvetica, sans-serif;
}
textarea, pre, span.code {
font-family: consolas, Terminus, "lucida console", "courier new", courier, monospace;
}
div#bottom {
color: #333;
}
a#signature {
background: url(http://spicausis.lv/spic-sign-blog.png) no-repeat bottom right;
display:block;
width: 15px;
height: 21px;
position: fixed;
bottom: 0px;
right: 0px;
}
h2 {
color: #555;
margin: 18px 0 4px 0;
font-size: 14px;
}
p {
line-height: 150%;
}
div#footer {
margin: 20px 0 0 0;
font-size: 12px;
border-top: 1px solid #ddd;
padding-top: 16px;
}
label {
cursor: pointer;
}
fieldset {
border: 0;
padding: 0;
}
fieldset#textarea div {
border: 1px solid #ccc;
padding: 3px;
}
fieldset#options {
width: 200px;
margin-left: 10px;
float: right;
}
fieldset#options h2 {
margin-top: 0;
}
fieldset ul {
list-style: none;
}
fieldset li {
margin-bottom: 6px;
}
fieldset#textarea {
text-align: right;
}
pre {
margin: 10px 0;
}
</style>
</head>
<body>
<div id="wrap">
<h1>Javascript unpacker and beautifier</h1>
<form method="post" action="?">
<fieldset id="options">
<h2>Options</h2>
<ul>
<li><select name="tabsize" id="tabsize">
<option value="1">indent with a tab character</option>
<option value="2">indent with 2 spaces</option>
<option value="3">indent with 3 spaces</option>
<option value="4" selected="selected">indent with 4 spaces</option>
<option value="8">indent with 8 spaces</option>
</select></li>
<li><input type="checkbox" id="preserve-newlines" checked="checked" /><label for="preserve-newlines"> Preserve empty lines?</label><br /></li>
<li><input type="checkbox" id="detect-packers" checked="checked" /><label for="detect-packers"> Detect packers?</label><br /></li>
<li><input type="checkbox" id="keep-array-indentation" /><label for="keep-array-indentation"> Keep array indentation?</label></li>
</ul>
</fieldset>
<fieldset id="textarea">
<div><textarea rows="30" cols="30" name="content" id="content">
/* paste in your code and press Beautify button */
if('this_is'==/an_example/){do_something();}else{var a=b?(c%d):e[f];}
</textarea></div>
<button onclick="return do_js_beautify()" id="beautify">Beautify</button>
</fieldset>
</form>
<div id="bottom">
<p>This little beautifier will reformat and reindent bookmarklets, ugly javascript, unpack scripts packed by
the popular <a href="http://dean.edwards.name/packer/">Dean Edward's packer,</a> as well as deobfuscate scripts
processed by javascriptobfuscator.com.</p>
<p>The source code for the latest version is always available on <a
href="http://github.com/einars/js-beautify">github</a>, and you can download the beautifier for
local use (<a href="http://github.com/einars/js-beautify/zipball/master">zip</a>, <a href="http://github.com/einars/js-beautify/tarball/master">tar.gz</a>) as well.</p>
<h2>Formatting from command-line</h2>
<p>To beautify from the command-line you can use provided beautify-cl.js script, using <a href="http://www.mozilla.org/rhino/">Rhino javascript engine</a>. See the file contents for the details.</p>
<h2><a href="http://fiddler2.com/">Fiddler</a></h2>
<p>This popular web debugging proxy for Windows has a <a href="http://fiddler2.com/Fiddler2/extensions.asp">Javascript Formatter addon</a> (based on this beautifier) which can reformat javascript on the fly.</p>
<h2>Vim</h2>
<p>Aj3423 converted the script to vimscript — and so now there is a <a href="http://www.vim.org/scripts/script.php?script_id=2727">vim plugin</a> for the quality javascript beautifying.</p>
<h2>gEdit</h2>
<p>Fabio Nagao has written some <a href="http://github.com/nagaozen/gedit-tunnings/">tips for the gEdit users,</a> among them he tells how to integrate the beautifier into the editor.</p>
<h2>Other nice things</h2>
<p>If you're writing javascript code, <a href="http://jslint.com/">JSLint</a> is a really fine piece of software, too. You don't have to follow its recommendations blindly, but understanding what it says about your code can greatly improve your skills.</p>
<h2>Support</h2>
<p>Some of you have expressed an esoteric wish to thank me for the beautifier financially, and I gladly agree to that.</p>
<p>As the beautifier is — and always will be — completely free and open, donating is a wonderful thing to do and it will probably make you feel good and warm inside.
<form style="margin-top: 5px" action="https://www.paypal.com/cgi-bin/webscr" method="post">
<input type="hidden" name="cmd" value="_s-xclick">
<input type="hidden" name="hosted_button_id" value="TL28UJK2ARCUJ">
<input type="image" src="http://spicausis.lv/misc/paypal-donate.gif" border="0" name="submit" alt="PayPal - The safer, easier way to pay online!">
<img alt="" border="0" src="https://www.paypal.com/en_US/i/scr/pixel.gif" width="1" height="1">
</form>
<h2>Contacts</h2>
<p>If you find some problems with the generated javascript, adapt the script for your favorite editor, or something, my email is einar@jsbeautifier.org.</p>
<div id="footer">
<a href="#" style="border-bottom: 1px dashed #36d; text-decoration: none;" onclick="run_tests(); return false;">Run the tests</a>
<br />
<pre id="testresults"></pre>
Written by <a href="mailto:einar@jsbeautifier.org">Einar Lielmanis</a>, with the help of <a href="http://jason.diamond.name/weblog/">Jason Diamond</a>, Patrick Hof, Nochum, Andreas Schneider, Dave Vasilevsky, <a href="http://my.opera.com/Vital/blog/">Vital,</a> Ron Baldwin, Gabriel Harrison and others.
</div>
</div>
</div>
<a id="signature" href="http://spicausis.lv/"></a>
<script src="http://www.google-analytics.com/ga.js" type="text/javascript"></script>
<script type="text/javascript">
if (window._gat) {
var tracker = _gat._getTracker("UA-7409939-1");
if (tracker && tracker._trackPageview) {
tracker._trackPageview();
}
}
</script>
</body>
</html>