Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

New example: code minify.

  • Loading branch information...
commit 9f28a445070d0acd33df978e6fcdbece455feb31 1 parent 550b084
@ariya authored
Showing with 195 additions and 0 deletions.
  1. +72 −0 demo/minify.html
  2. +122 −0 demo/minify.js
  3. +1 −0  index.html
View
72 demo/minify.html
@@ -0,0 +1,72 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+<meta charset="utf-8">
+<title>Esprima: Code Minify Demo</title>
+<script src="../test/3rdparty/platform.js"></script>
+<script src="../test/3rdparty/escodegen.js"></script>
+<script src="checkenv.js"></script>
+<script src="minify.js"></script>
+<script src="../esprima.js"></script>
+<script src="../assets/codemirror/codemirror.js"></script>
+<script src="../assets/codemirror/javascript.js"></script>
+<link rel="stylesheet" type="text/css" href="../assets/codemirror/codemirror.css"/>
+<link rel="stylesheet" type="text/css" href="../assets/style.css"/>
+<style>
+.CodeMirror-scroll {
+ height: 300px;
+}
+</style>
+</head>
+<body>
+<div class="container">
+
+<div class="topbar">
+<ul class="nav">
+<li><a href="../index.html">&larr; Home</a></li>
+<li><a href="http://github.com/ariya/esprima">Code</a></li>
+<li><a href="../doc/index.html">Documentation</a></li>
+<li><a href="http://issues.esprima.org">Issues</a></li>
+</ul>
+</div>
+
+<h1>Minify <small>compacts everything</small></h1>
+
+<p>Type ECMAScript code in the editor. Press <b>Minify</b> button to shorten the code
+using <a href="https://github.com/Constellation/escodegen">Escodegen project</a>.</p>
+
+<p><textarea id="code" autofocus="autofocus" cols="70" rows="25" spellcheck="false">
+function bubbleSort (list) {
+var items = list.slice(0), swapped =false,
+ p, q;
+ for ( p= 1;p &lt; items.length; ++p) {
+ for (q=0; q &lt; items.length - p; ++q) {
+ if (items[q + 1 ] &lt; items[q]) {
+ swapped =true;
+ let temp = items[q];
+ items[q] = items[ q+1]; items[q+1] = temp;
+ }
+ }
+ if (!swapped)
+ break;
+ }
+ return items;
+}
+</textarea></p>
+
+<p><input type="button" value="Minify" id="minify"></p>
+
+<p id="codemirror" align="right"><small>The above code editor is based on <a href="http://codemirror.net" target="_blank">CodeMirror</a>.</small></p>
+
+<p id="error"></p>
+
+<p style="margin-top: 50px;" id="version"></p>
+
+<div class="footer"><strong>Esprima</strong> is created by
+<a href="http://ariya.ofilabs.com/about" target="_blank">Ariya Hidayat</a>. Follow <a href="http://twitter.com/ariyahidayat">@ariyahidayat</a> on Twitter.
+</div>
+
+<p id="testbox" style="visibility: hidden;"><textarea id="test"></textarea></p>
+</div>
+</body>
+</html>
View
122 demo/minify.js
@@ -0,0 +1,122 @@
+/*
+ Copyright (C) 2012 Ariya Hidayat <ariya.hidayat@gmail.com>
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/*jslint browser:true */
+/*global esprima:true, escodegen:true */
+
+function id(i) {
+ 'use strict';
+ return document.getElementById(i);
+}
+
+function setText(id, str) {
+ 'use strict';
+ var el = document.getElementById(id);
+ if (typeof el.innerText === 'string') {
+ el.innerText = str;
+ } else {
+ el.textContent = str;
+ }
+}
+
+function minify() {
+ 'use strict';
+
+ var code, syntax, option, before, after;
+
+ setText('error', '');
+ if (typeof window.editor !== 'undefined') {
+ // Using CodeMirror.
+ code = window.editor.getValue();
+ } else {
+ // Plain textarea, likely in a situation where CodeMirror does not work.
+ code = id('code').value;
+ }
+
+ option = {
+ format: {
+ indent: {
+ style: ''
+ },
+ quotes: 'auto',
+ compact: true
+ }
+ };
+
+ try {
+ before = code.length;
+ syntax = window.esprima.parse(code, { raw: true, range: true });
+ code = window.escodegen.generate(syntax, option);
+ if (typeof window.editor !== 'undefined') {
+ window.editor.setValue(code);
+ } else {
+ id('code').value = code;
+ }
+ after = code.length;
+ if (before > after) {
+ setText('error', 'No error. Minifying ' + before + ' bytes to ' + after + ' bytes.');
+ } else {
+ setText('error', 'Can not minify further, code is already optimized.');
+ }
+ } catch (e) {
+ setText('error', e.toString());
+ } finally {
+ }
+}
+
+/*jslint sloppy:true browser:true */
+/*global minify:true, CodeMirror:true */
+window.onload = function () {
+ var version, el;
+
+ version = 'Using Esprima version ' + esprima.version;
+ version += ' and Escodegen version ' + escodegen.version + '.';
+
+ el = id('version');
+ if (typeof el.innerText === 'string') {
+ el.innerText = version;
+ } else {
+ el.textContent = version;
+ }
+
+ id('minify').onclick = minify;
+
+ try {
+ window.checkEnv();
+
+ // This is just testing, to detect whether CodeMirror would fail or not
+ window.editor = CodeMirror.fromTextArea(id("test"));
+
+ window.editor = CodeMirror.fromTextArea(id("code"), {
+ lineNumbers: true,
+ matchBrackets: true,
+ lineWrapping: true
+ });
+ } catch (e) {
+ // CodeMirror failed to initialize, possible in e.g. old IE.
+ id('codemirror').innerHTML = '';
+ } finally {
+ id('testbox').parentNode.removeChild(id('testbox'));
+ }
+};
View
1  index.html
@@ -84,6 +84,7 @@
<h3>Source transformation</h3>
<ul>
<li><a href="demo/rewrite.html">Source rewrite</a></li>
+ <li><a href="demo/minify.html">Minify</a></li>
</ul>
<h3>Harness tests</h3>
<ul>
Please sign in to comment.
Something went wrong with that request. Please try again.