1 UglifyJS — a JavaScript parser/compressor/beautifier
-
-
-
-
-This package implements a general-purpose JavaScript
-parser/compressor/beautifier toolkit. It is developed on NodeJS, but it
-should work on any JavaScript platform supporting the CommonJS module system
-(and if your platform of choice doesn't support CommonJS, you can easily
-implement it, or discard the exports.* lines from UglifyJS sources).
-
-
-The tokenizer/parser generates an abstract syntax tree from JS code. You
-can then traverse the AST to learn more about the code, or do various
-manipulations on it. This part is implemented in parse-js.js and it's a
-port to JavaScript of the excellent parse-js Common Lisp library from Marijn Haverbeke.
-
-
-( See cl-uglify-js if you're looking for the Common Lisp version of
-UglifyJS. )
-
-
-The second part of this package, implemented in process.js, inspects and
-manipulates the AST generated by the parser to provide the following:
-
-
-
-ability to re-generate JavaScript code from the AST. Optionally
-indented—you can use this if you want to âbeautifyâ a program that has
-been compressed, so that you can inspect the source. But you can also run
-our code generator to print out an AST without any whitespace, so you
-achieve compression as well.
-
-
-
-shorten variable names (usually to single characters). Our mangler will
-analyze the code and generate proper variable names, depending on scope
-and usage, and is smart enough to deal with globals defined elsewhere, or
-with eval() calls or with{} statements. In short, if eval() or
-with{} are used in some scope, then all variables in that scope and any
-variables in the parent scopes will remain unmangled, and any references
-to such variables remain unmangled as well.
-
-
-
-various small optimizations that may lead to faster code but certainly
-lead to smaller code. Where possible, we do the following:
-
-
-
-foo["bar"] ==> foo.bar
-
-
-
-remove block brackets {}
-
-
-
-join consecutive var declarations:
-var a = 10; var b = 20; ==> var a=10,b=20;
-
-
-
-resolve simple constant expressions: 1 +2 * 3 ==> 7. We only do the
-replacement if the result occupies less bytes; for example 1/3 would
-translate to 0.333333333333, so in this case we don't replace it.
-
-
-
-consecutive statements in blocks are merged into a sequence; in many
-cases, this leaves blocks with a single statement, so then we can remove
-the block brackets.
-
-
-remove some unreachable code and warn about it (code that follows a
-return, throw, break or continue statement, except
-function/variable declarations).
-
-
-
-
-
-
-
-
-
-
-
1.1Unsafe transformations
-
-
-
-
-UglifyJS tries its best to achieve great compression while leaving the
-semantics of the code intact. In general, if your code logic is broken by
-UglifyJS then it's a bug in UglifyJS and you should report it and I should
-fix it. :-)
-
-
-However, I opted to include the following potentially unsafe transformations
-as default behavior. Discussion is welcome, if you have ideas of how to
-handle this better, or any objections to these optimizations, please let me
-know.
-
-
-
-
-
-
1.1.1 Calls involving the global Array constructor
-These are all safe if the Array name isn't redefined. JavaScript does allow
-one to globally redefine Array (and pretty much everything, in fact) but I
-personally don't see why would anyone do that.
-
-
-UglifyJS does handle the case where Array is redefined locally, or even
-globally but with a function or var declaration. Therefore, in the
-following cases UglifyJS doesn't touch calls or instantiations of Array:
-
-
-
-
-
// case 1. globally declared variable
-varArray;
- newArray(1, 2, 3);
- Array(a, b);
-
- // or (can be declared later)
-newArray(1, 2, 3);
- varArray;
-
- // or (can be a function)
-newArray(1, 2, 3);
- functionArray() { ... }
-
-// case 2. declared in a function
- (function(){
- a = newArray(1, 2, 3);
- b = Array(5, 6);
- varArray;
- })();
-
- // or
- (function(Array){
- return Array(5, 6, 7);
- })();
-
- // or
- (function(){
- returnnewArray(1, 2, 3, 4);
- functionArray() { ... }
- })();
-
- // etc.
-
-
-
-
-
-
-
-
-
-
-
1.2 Install (NPM)
-
-
-
-
-UglifyJS is now available through NPM — npm install uglify-js should do
-the job.
-
-
-
-
-
-
-
1.3 Install latest code from GitHub
-
-
-
-
-
-
-
## clone the repository
-mkdir -p /where/you/wanna/put/it
-cd /where/you/wanna/put/it
-git clone git://github.com/mishoo/UglifyJS.git
-
-## make the module available to Node
-mkdir -p ~/.node_libraries/
-cd ~/.node_libraries/
-ln -s /where/you/wanna/put/it/UglifyJS/uglify-js.js
-
-## and if you want the CLI script too:
-mkdir -p ~/bin
-cd ~/bin
-ln -s /where/you/wanna/put/it/UglifyJS/bin/uglifyjs
- # (then add ~/bin to your $PATH if it's not there already)
-
-
-
-
-
-
-
-
-
-
1.4 Usage
-
-
-
-
-There is a command-line tool that exposes the functionality of this library
-for your shell-scripting needs:
-
-
-
-
-
uglifyjs [ options... ] [ filename ]
-
-
-
-
-
-filename should be the last argument and should name the file from which
-to read the JavaScript code. If you don't specify it, it will read code
-from STDIN.
-
-
-Supported options:
-
-
-
--b or --beautify — output indented code; when passed, additional
-options control the beautifier:
-
-
-
--i N or --indent N — indentation level (number of spaces)
-
-
-
--q or --quote-keys — quote keys in literal objects (by default,
-only keys that cannot be identifier names will be quotes).
-
-
-
-
-
---ascii — pass this argument to encode non-ASCII characters as
-\uXXXX sequences. By default UglifyJS won't bother to do it and will
-output Unicode characters instead. (the output is always encoded in UTF8,
-but if you pass this option you'll only get ASCII).
-
-
-
--nm or --no-mangle — don't mangle variable names
-
-
-
--ns or --no-squeeze — don't call ast_squeeze() (which does various
-optimizations that result in smaller, less readable code).
-
-
-
--mt or --mangle-toplevel — mangle names in the toplevel scope too
-(by default we don't do this).
-
-
-
---no-seqs — when ast_squeeze() is called (thus, unless you pass
---no-squeeze) it will reduce consecutive statements in blocks into a
-sequence. For example, "a = 10; b = 20; foo();" will be written as
-"a=10,b=20,foo();". In various occasions, this allows us to discard the
-block brackets (since the block becomes a single statement). This is ON
-by default because it seems safe and saves a few hundred bytes on some
-libs that I tested it on, but pass --no-seqs to disable it.
-
-
-
---no-dead-code — by default, UglifyJS will remove code that is
-obviously unreachable (code that follows a return, throw, break or
-continue statement and is not a function/variable declaration). Pass
-this option to disable this optimization.
-
-
-
--nc or --no-copyright — by default, uglifyjs will keep the initial
-comment tokens in the generated code (assumed to be copyright information
-etc.). If you pass this it will discard it.
-
-
-
--o filename or --output filename — put the result in filename. If
-this isn't given, the result goes to standard output (or see next one).
-
-
-
---overwrite — if the code is read from a file (not from STDIN) and you
-pass --overwrite then the output will be written in the same file.
-
-
-
---ast — pass this if you want to get the Abstract Syntax Tree instead
-of JavaScript as output. Useful for debugging or learning more about the
-internals.
-
-
-
--v or --verbose — output some notes on STDERR (for now just how long
-each operation takes).
-
-
-
---extra — enable additional optimizations that have not yet been
-extensively tested. These might, or might not, break your code. If you
-find a bug using this option, please report a test case.
-
-
-
---unsafe — enable other additional optimizations that are known to be
-unsafe in some contrived situations, but could still be generally useful.
-For now only this:
-
-
-
-foo.toString() ==> foo+""
-
-
-
-
-
---max-line-len (default 32K characters) — add a newline after around
-32K characters. I've seen both FF and Chrome croak when all the code was
-on a single line of around 670K. Pass –max-line-len 0 to disable this
-safety feature.
-
-
-
---reserved-names — some libraries rely on certain names to be used, as
-pointed out in issue #92 and #81, so this option allow you to exclude such
-names from the mangler. For example, to keep names require and $super
-intact you'd specify –reserved-names "require,$super".
-
-
-
---inline-script – when you want to include the output literally in an
-HTML <script> tag you can use this option to prevent </script from
-showing up in the output.
-
-
-
-
-
-
-
-
-
1.4.1 API
-
-
-
-
-To use the library from JavaScript, you'd do the following (example for
-NodeJS):
-
-
-
-
-
varjsp = require("uglify-js").parser;
-varpro = require("uglify-js").uglify;
-
-varorig_code = "... JS code here";
-varast = jsp.parse(orig_code); // parse code and get the initial AST
-ast = pro.ast_mangle(ast); // get a new AST with mangled names
-ast = pro.ast_squeeze(ast); // get an AST with compression optimizations
-varfinal_code = pro.gen_code(ast); // compressed code here
-
-
-
-
-
-The above performs the full compression that is possible right now. As you
-can see, there are a sequence of steps which you can apply. For example if
-you want compressed output but for some reason you don't want to mangle
-variable names, you would simply skip the line that calls
-pro.ast_mangle(ast).
-
-
-Some of these functions take optional arguments. Here's a description:
-
-
-
-jsp.parse(code, strict_semicolons) – parses JS code and returns an AST.
-strict_semicolons is optional and defaults to false. If you pass
-true then the parser will throw an error when it expects a semicolon and
-it doesn't find it. For most JS code you don't want that, but it's useful
-if you want to strictly sanitize your code.
-
-
-
-pro.ast_mangle(ast, options) – generates a new AST containing mangled
-(compressed) variable and function names. It supports the following
-options:
-
-
-except – an array of names to exclude from compression.
-
-
-
-
-
-pro.ast_squeeze(ast, options) – employs further optimizations designed
-to reduce the size of the code that gen_code would generate from the
-AST. Returns a new AST. options can be a hash; the supported options
-are:
-
-
-
-make_seqs (default true) which will cause consecutive statements in a
-block to be merged using the "sequence" (comma) operator
-
-
-
-dead_code (default true) which will remove unreachable code.
-
-
-
-
-
-pro.gen_code(ast, options) – generates JS code from the AST. By
-default it's minified, but using the options argument you can get nicely
-formatted output. options is, well, optional :-) and if you pass it it
-must be an object and supports the following properties (below you can see
-the default values):
-
-
-
-beautify: false – pass true if you want indented output
-
-
-indent_start: 0 (only applies when beautify is true) – initial
-indentation in spaces
-
-
-indent_level: 4 (only applies when beautify is true) --
-indentation level, in spaces (pass an even number)
-
-
-quote_keys: false – if you pass true it will quote all keys in
-literal objects
-
-
-space_colon: false (only applies when beautify is true) – wether
-to put a space before the colon in object literals
-
-
-ascii_only: false – pass true if you want to encode non-ASCII
-characters as \uXXXX.
-
-
-inline_script: false – pass true to escape occurrences of
-</script in strings
-
-
-
-
-
-
-
-
-
-
-
-
1.4.2 Beautifier shortcoming – no more comments
-
-
-
-
-The beautifier can be used as a general purpose indentation tool. It's
-useful when you want to make a minified file readable. One limitation,
-though, is that it discards all comments, so you don't really want to use it
-to reformat your code, unless you don't have, or don't care about, comments.
-
-
-In fact it's not the beautifier who discards comments — they are dumped at
-the parsing stage, when we build the initial AST. Comments don't really
-make sense in the AST, and while we could add nodes for them, it would be
-inconvenient because we'd have to add special rules to ignore them at all
-the processing stages.
-
-
-
-
-
-
-
-
1.5 Compression – how good is it?
-
-
-
-
-(XXX: this is somewhat outdated. On the jQuery source code we beat Closure
-by 168 bytes (560 after gzip) and by many seconds.)
-
-
-There are a few popular JS minifiers nowadays – the two most well known
-being the GoogleClosure (GCL) compiler and the YUI compressor. For some
-reason they are both written in Java. I didn't really hope to beat any of
-them, but finally I did – UglifyJS compresses better than the YUI
-compressor, and safer than GoogleClosure.
-
-
-I tested it on two big libraries. DynarchLIB is my own, and it's big enough
-to contain probably all the JavaScript tricks known to mankind. jQuery is
-definitely the most popular JavaScript library (to some people, it's a
-synonym to JavaScript itself).
-
-
-I cannot swear that there are no bugs in the generated codes, but they
-appear to work fine.
-
-
-Compression results:
-
-
-
-
-
-
-
Library
Orig. size
UglifyJS
YUI
GCL
-
-
-
DynarchLIB
636896
241441
246452 (+5011)
240439 (-1002) (buggy)
-
jQuery
163855
72006
79702 (+7696)
71858 (-148)
-
-
-
-
-
-UglifyJS is the fastest to run. On my laptop UglifyJS takes 1.35s for
-DynarchLIB, while YUI takes 2.7s and GCL takes 6.5s.
-
-
-GoogleClosure does a lot of smart ass optimizations. I had to strive really
-hard to get close to it. It should be possible to even beat it, but then
-again, GCL has a gazillion lines of code and runs terribly slow, so I'm not
-sure it worths spending the effort to save a few bytes. Also, GCL doesn't
-cope with eval() or with{} – it just dumps a warning and proceeds to
-mangle names anyway; my DynarchLIB compiled with it is buggy because of
-this.
-
-
-UglifyJS consists of ~1100 lines of code for the tokenizer/parser, and ~1100
-lines for the compressor and code generator. That should make it very
-maintainable and easily extensible, so I would say it has a good place in
-this field and it's bound to become the de-facto standard JS minifier. And
-I shall rule the world. :-) Use it, and spread the word!
-
-
-
-
-
-
-
1.6 Bugs?
-
-
-
-
-Unfortunately, for the time being there is no automated test suite. But I
-ran the compressor manually on non-trivial code, and then I tested that the
-generated code works as expected. A few hundred times.
-
-
-DynarchLIB was started in times when there was no good JS minifier.
-Therefore I was quite religious about trying to write short code manually,
-and as such DL contains a lot of syntactic hacks1 such as âfoo == bar ? a
-= 10 : b = 20â, though the more readable version would clearly be to use
-âif/elseâ.
-
-
-Since the parser/compressor runs fine on DL and jQuery, I'm quite confident
-that it's solid enough for production use. If you can identify any bugs,
-I'd love to hear about them (use the Google Group or email me directly).
-
Copyright 2010 (c) Mihai Bazon <mihai.bazon@gmail.com>
-Based on parse-js (http://marijn.haverbeke.nl/parse-js/).
-
-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 HOLDER â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 THE 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.
-
-
-
-
-
-
-
-
-
-
Footnotes:
-
-
1 I even reported a few bugs and suggested some fixes in the original
-parse-js library, and Marijn pushed fixes literally in minutes.
-
-
-
-
-
Author: Mihai Bazon
-
-
Date: 2011-07-14 12:50:31 EEST
-
HTML generated by org-mode 7.01trans in emacs 23
-
-
-
-
diff --git a/node/node_modules/___uglify-js.npm/package/README.org b/node/node_modules/___uglify-js.npm/package/README.org
deleted file mode 100644
index f0ae354..0000000
--- a/node/node_modules/___uglify-js.npm/package/README.org
+++ /dev/null
@@ -1,437 +0,0 @@
-#+TITLE: UglifyJS -- a JavaScript parser/compressor/beautifier
-#+KEYWORDS: javascript, js, parser, compiler, compressor, mangle, minify, minifier
-#+DESCRIPTION: a JavaScript parser/compressor/beautifier in JavaScript
-#+STYLE:
-#+AUTHOR: Mihai Bazon
-#+EMAIL: mihai.bazon@gmail.com
-
-* UglifyJS --- a JavaScript parser/compressor/beautifier
-
-This package implements a general-purpose JavaScript
-parser/compressor/beautifier toolkit. It is developed on [[http://nodejs.org/][NodeJS]], but it
-should work on any JavaScript platform supporting the CommonJS module system
-(and if your platform of choice doesn't support CommonJS, you can easily
-implement it, or discard the =exports.*= lines from UglifyJS sources).
-
-The tokenizer/parser generates an abstract syntax tree from JS code. You
-can then traverse the AST to learn more about the code, or do various
-manipulations on it. This part is implemented in [[../lib/parse-js.js][parse-js.js]] and it's a
-port to JavaScript of the excellent [[http://marijn.haverbeke.nl/parse-js/][parse-js]] Common Lisp library from [[http://marijn.haverbeke.nl/][Marijn
-Haverbeke]].
-
-( See [[http://github.com/mishoo/cl-uglify-js][cl-uglify-js]] if you're looking for the Common Lisp version of
-UglifyJS. )
-
-The second part of this package, implemented in [[../lib/process.js][process.js]], inspects and
-manipulates the AST generated by the parser to provide the following:
-
-- ability to re-generate JavaScript code from the AST. Optionally
- indented---you can use this if you want to âbeautifyâ a program that has
- been compressed, so that you can inspect the source. But you can also run
- our code generator to print out an AST without any whitespace, so you
- achieve compression as well.
-
-- shorten variable names (usually to single characters). Our mangler will
- analyze the code and generate proper variable names, depending on scope
- and usage, and is smart enough to deal with globals defined elsewhere, or
- with =eval()= calls or =with{}= statements. In short, if =eval()= or
- =with{}= are used in some scope, then all variables in that scope and any
- variables in the parent scopes will remain unmangled, and any references
- to such variables remain unmangled as well.
-
-- various small optimizations that may lead to faster code but certainly
- lead to smaller code. Where possible, we do the following:
-
- - foo["bar"] ==> foo.bar
-
- - remove block brackets ={}=
-
- - join consecutive var declarations:
- var a = 10; var b = 20; ==> var a=10,b=20;
-
- - resolve simple constant expressions: 1 +2 * 3 ==> 7. We only do the
- replacement if the result occupies less bytes; for example 1/3 would
- translate to 0.333333333333, so in this case we don't replace it.
-
- - consecutive statements in blocks are merged into a sequence; in many
- cases, this leaves blocks with a single statement, so then we can remove
- the block brackets.
-
- - various optimizations for IF statements:
-
- - if (foo) bar(); else baz(); ==> foo?bar():baz();
- - if (!foo) bar(); else baz(); ==> foo?baz():bar();
- - if (foo) bar(); ==> foo&&bar();
- - if (!foo) bar(); ==> foo||bar();
- - if (foo) return bar(); else return baz(); ==> return foo?bar():baz();
- - if (foo) return bar(); else something(); ==> {if(foo)return bar();something()}
-
- - remove some unreachable code and warn about it (code that follows a
- =return=, =throw=, =break= or =continue= statement, except
- function/variable declarations).
-
-** <>
-
-UglifyJS tries its best to achieve great compression while leaving the
-semantics of the code intact. In general, if your code logic is broken by
-UglifyJS then it's a bug in UglifyJS and you should report it and I should
-fix it. :-)
-
-However, I opted to include the following potentially unsafe transformations
-as default behavior. Discussion is welcome, if you have ideas of how to
-handle this better, or any objections to these optimizations, please let me
-know.
-
-*** Calls involving the global Array constructor
-
-The following transformations occur:
-
-#+BEGIN_SRC js
-new Array(1, 2, 3, 4) => [1,2,3,4]
-Array(a, b, c) => [a,b,c]
-new Array(5) => Array(5)
-new Array(a) => Array(a)
-#+END_SRC
-
-These are all safe if the Array name isn't redefined. JavaScript does allow
-one to globally redefine Array (and pretty much everything, in fact) but I
-personally don't see why would anyone do that.
-
-UglifyJS does handle the case where Array is redefined locally, or even
-globally but with a =function= or =var= declaration. Therefore, in the
-following cases UglifyJS *doesn't touch* calls or instantiations of Array:
-
-#+BEGIN_SRC js
-// case 1. globally declared variable
- var Array;
- new Array(1, 2, 3);
- Array(a, b);
-
- // or (can be declared later)
- new Array(1, 2, 3);
- var Array;
-
- // or (can be a function)
- new Array(1, 2, 3);
- function Array() { ... }
-
-// case 2. declared in a function
- (function(){
- a = new Array(1, 2, 3);
- b = Array(5, 6);
- var Array;
- })();
-
- // or
- (function(Array){
- return Array(5, 6, 7);
- })();
-
- // or
- (function(){
- return new Array(1, 2, 3, 4);
- function Array() { ... }
- })();
-
- // etc.
-#+END_SRC
-
-** Install (NPM)
-
-UglifyJS is now available through NPM --- =npm install uglify-js= should do
-the job.
-
-** Install latest code from GitHub
-
-#+BEGIN_SRC sh
-## clone the repository
-mkdir -p /where/you/wanna/put/it
-cd /where/you/wanna/put/it
-git clone git://github.com/mishoo/UglifyJS.git
-
-## make the module available to Node
-mkdir -p ~/.node_libraries/
-cd ~/.node_libraries/
-ln -s /where/you/wanna/put/it/UglifyJS/uglify-js.js
-
-## and if you want the CLI script too:
-mkdir -p ~/bin
-cd ~/bin
-ln -s /where/you/wanna/put/it/UglifyJS/bin/uglifyjs
- # (then add ~/bin to your $PATH if it's not there already)
-#+END_SRC
-
-** Usage
-
-There is a command-line tool that exposes the functionality of this library
-for your shell-scripting needs:
-
-#+BEGIN_SRC sh
-uglifyjs [ options... ] [ filename ]
-#+END_SRC
-
-=filename= should be the last argument and should name the file from which
-to read the JavaScript code. If you don't specify it, it will read code
-from STDIN.
-
-Supported options:
-
-- =-b= or =--beautify= --- output indented code; when passed, additional
- options control the beautifier:
-
- - =-i N= or =--indent N= --- indentation level (number of spaces)
-
- - =-q= or =--quote-keys= --- quote keys in literal objects (by default,
- only keys that cannot be identifier names will be quotes).
-
-- =--ascii= --- pass this argument to encode non-ASCII characters as
- =\uXXXX= sequences. By default UglifyJS won't bother to do it and will
- output Unicode characters instead. (the output is always encoded in UTF8,
- but if you pass this option you'll only get ASCII).
-
-- =-nm= or =--no-mangle= --- don't mangle variable names
-
-- =-ns= or =--no-squeeze= --- don't call =ast_squeeze()= (which does various
- optimizations that result in smaller, less readable code).
-
-- =-mt= or =--mangle-toplevel= --- mangle names in the toplevel scope too
- (by default we don't do this).
-
-- =--no-seqs= --- when =ast_squeeze()= is called (thus, unless you pass
- =--no-squeeze=) it will reduce consecutive statements in blocks into a
- sequence. For example, "a = 10; b = 20; foo();" will be written as
- "a=10,b=20,foo();". In various occasions, this allows us to discard the
- block brackets (since the block becomes a single statement). This is ON
- by default because it seems safe and saves a few hundred bytes on some
- libs that I tested it on, but pass =--no-seqs= to disable it.
-
-- =--no-dead-code= --- by default, UglifyJS will remove code that is
- obviously unreachable (code that follows a =return=, =throw=, =break= or
- =continue= statement and is not a function/variable declaration). Pass
- this option to disable this optimization.
-
-- =-nc= or =--no-copyright= --- by default, =uglifyjs= will keep the initial
- comment tokens in the generated code (assumed to be copyright information
- etc.). If you pass this it will discard it.
-
-- =-o filename= or =--output filename= --- put the result in =filename=. If
- this isn't given, the result goes to standard output (or see next one).
-
-- =--overwrite= --- if the code is read from a file (not from STDIN) and you
- pass =--overwrite= then the output will be written in the same file.
-
-- =--ast= --- pass this if you want to get the Abstract Syntax Tree instead
- of JavaScript as output. Useful for debugging or learning more about the
- internals.
-
-- =-v= or =--verbose= --- output some notes on STDERR (for now just how long
- each operation takes).
-
-- =--extra= --- enable additional optimizations that have not yet been
- extensively tested. These might, or might not, break your code. If you
- find a bug using this option, please report a test case.
-
-- =--unsafe= --- enable other additional optimizations that are known to be
- unsafe in some contrived situations, but could still be generally useful.
- For now only this:
-
- - foo.toString() ==> foo+""
-
-- =--max-line-len= (default 32K characters) --- add a newline after around
- 32K characters. I've seen both FF and Chrome croak when all the code was
- on a single line of around 670K. Pass --max-line-len 0 to disable this
- safety feature.
-
-- =--reserved-names= --- some libraries rely on certain names to be used, as
- pointed out in issue #92 and #81, so this option allow you to exclude such
- names from the mangler. For example, to keep names =require= and =$super=
- intact you'd specify --reserved-names "require,$super".
-
-- =--inline-script= -- when you want to include the output literally in an
- HTML =
-Based on parse-js (http://marijn.haverbeke.nl/parse-js/).
-
-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 HOLDER â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 THE 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.
-#+END_EXAMPLE
diff --git a/node/node_modules/___uglify-js.npm/package/bin/uglifyjs b/node/node_modules/___uglify-js.npm/package/bin/uglifyjs
deleted file mode 100644
index 3a23be8..0000000
--- a/node/node_modules/___uglify-js.npm/package/bin/uglifyjs
+++ /dev/null
@@ -1,309 +0,0 @@
-#! /usr/bin/env node
-// -*- js -*-
-
-global.sys = require(/^v0\.[012]/.test(process.version) ? "sys" : "util");
-var fs = require("fs");
-var uglify = require("uglify-js"), // symlink ~/.node_libraries/uglify-js.js to ../uglify-js.js
- jsp = uglify.parser,
- pro = uglify.uglify;
-
-var options = {
- ast: false,
- mangle: true,
- mangle_toplevel: false,
- squeeze: true,
- make_seqs: true,
- dead_code: true,
- verbose: false,
- show_copyright: true,
- out_same_file: false,
- max_line_length: 32 * 1024,
- unsafe: false,
- reserved_names: null,
- defines: { },
- codegen_options: {
- ascii_only: false,
- beautify: false,
- indent_level: 4,
- indent_start: 0,
- quote_keys: false,
- space_colon: false,
- inline_script: false
- },
- make: false,
- output: true // stdout
-};
-
-var args = jsp.slice(process.argv, 2);
-var filename;
-
-out: while (args.length > 0) {
- var v = args.shift();
- switch (v) {
- case "-b":
- case "--beautify":
- options.codegen_options.beautify = true;
- break;
- case "-i":
- case "--indent":
- options.codegen_options.indent_level = args.shift();
- break;
- case "-q":
- case "--quote-keys":
- options.codegen_options.quote_keys = true;
- break;
- case "-mt":
- case "--mangle-toplevel":
- options.mangle_toplevel = true;
- break;
- case "--no-mangle":
- case "-nm":
- options.mangle = false;
- break;
- case "--no-squeeze":
- case "-ns":
- options.squeeze = false;
- break;
- case "--no-seqs":
- options.make_seqs = false;
- break;
- case "--no-dead-code":
- options.dead_code = false;
- break;
- case "--no-copyright":
- case "-nc":
- options.show_copyright = false;
- break;
- case "-o":
- case "--output":
- options.output = args.shift();
- break;
- case "--overwrite":
- options.out_same_file = true;
- break;
- case "-v":
- case "--verbose":
- options.verbose = true;
- break;
- case "--ast":
- options.ast = true;
- break;
- case "--unsafe":
- options.unsafe = true;
- break;
- case "--max-line-len":
- options.max_line_length = parseInt(args.shift(), 10);
- break;
- case "--reserved-names":
- options.reserved_names = args.shift().split(",");
- break;
- case "-d":
- case "--define":
- var defarg = args.shift();
- try {
- var defsym = function(sym) {
- // KEYWORDS_ATOM doesn't include NaN or Infinity - should we check
- // for them too ?? We don't check reserved words and the like as the
- // define values are only substituted AFTER parsing
- if (jsp.KEYWORDS_ATOM.hasOwnProperty(sym)) {
- throw "Don't define values for inbuilt constant '"+sym+"'";
- }
- return sym;
- },
- defval = function(v) {
- if (v.match(/^"(.*)"$/) || v.match(/^'(.*)'$/)) {
- return [ "string", RegExp.$1 ];
- }
- else if (!isNaN(parseFloat(v))) {
- return [ "num", parseFloat(v) ];
- }
- else if (v.match(/^[a-z\$_][a-z\$_0-9]*$/i)) {
- return [ "name", v ];
- }
- else if (!v.match(/"/)) {
- return [ "string", v ];
- }
- else if (!v.match(/'/)) {
- return [ "string", v ];
- }
- throw "Can't understand the specified value: "+v;
- };
- if (defarg.match(/^([a-z_\$][a-z_\$0-9]*)(=(.*))?$/i)) {
- var sym = defsym(RegExp.$1),
- val = RegExp.$2 ? defval(RegExp.$2.substr(1)) : [ 'name', 'true' ];
- options.defines[sym] = val;
- }
- else {
- throw "The --define option expects SYMBOL[=value]";
- }
- } catch(ex) {
- sys.print("ERROR: In option --define "+defarg+"\n"+ex+"\n");
- process.exit(1);
- }
- break;
- case "--define-from-module":
- var defmodarg = args.shift(),
- defmodule = require(defmodarg),
- sym,
- val;
- for (sym in defmodule) {
- if (defmodule.hasOwnProperty(sym)) {
- options.defines[sym] = function(val) {
- if (typeof val == "string")
- return [ "string", val ];
- if (typeof val == "number")
- return [ "num", val ];
- if (val === true)
- return [ 'name', 'true' ];
- if (val === false)
- return [ 'name', 'false' ];
- if (val === null)
- return [ 'name', 'null' ];
- if (val === undefined)
- return [ 'name', 'undefined' ];
- sys.print("ERROR: In option --define-from-module "+defmodarg+"\n");
- sys.print("ERROR: Unknown object type for: "+sym+"="+val+"\n");
- process.exit(1);
- return null;
- }(defmodule[sym]);
- }
- }
- break;
- case "--ascii":
- options.codegen_options.ascii_only = true;
- break;
- case "--make":
- options.make = true;
- break;
- case "--inline-script":
- options.codegen_options.inline_script = true;
- break;
- default:
- filename = v;
- break out;
- }
-}
-
-if (options.verbose) {
- pro.set_logger(function(msg){
- sys.debug(msg);
- });
-}
-
-jsp.set_logger(function(msg){
- sys.debug(msg);
-});
-
-if (options.make) {
- options.out_same_file = false; // doesn't make sense in this case
- var makefile = JSON.parse(fs.readFileSync(filename || "Makefile.uglify.js").toString());
- output(makefile.files.map(function(file){
- var code = fs.readFileSync(file.name);
- if (file.module) {
- code = "!function(exports, global){global = this;\n" + code + "\n;this." + file.module + " = exports;}({})";
- }
- else if (file.hide) {
- code = "(function(){" + code + "}());";
- }
- return squeeze_it(code);
- }).join("\n"));
-}
-else if (filename) {
- fs.readFile(filename, "utf8", function(err, text){
- if (err) throw err;
- output(squeeze_it(text));
- });
-}
-else {
- var stdin = process.openStdin();
- stdin.setEncoding("utf8");
- var text = "";
- stdin.on("data", function(chunk){
- text += chunk;
- });
- stdin.on("end", function() {
- output(squeeze_it(text));
- });
-}
-
-function output(text) {
- var out;
- if (options.out_same_file && filename)
- options.output = filename;
- if (options.output === true) {
- out = process.stdout;
- } else {
- out = fs.createWriteStream(options.output, {
- flags: "w",
- encoding: "utf8",
- mode: 0644
- });
- }
- out.write(text);
- if (options.output !== true) {
- out.end();
- }
-};
-
-// --------- main ends here.
-
-function show_copyright(comments) {
- var ret = "";
- for (var i = 0; i < comments.length; ++i) {
- var c = comments[i];
- if (c.type == "comment1") {
- ret += "//" + c.value + "\n";
- } else {
- ret += "/*" + c.value + "*/";
- }
- }
- return ret;
-};
-
-function squeeze_it(code) {
- var result = "";
- if (options.show_copyright) {
- var tok = jsp.tokenizer(code), c;
- c = tok();
- result += show_copyright(c.comments_before);
- }
- try {
- var ast = time_it("parse", function(){ return jsp.parse(code); });
- if (options.mangle) ast = time_it("mangle", function(){
- return pro.ast_mangle(ast, {
- toplevel: options.mangle_toplevel,
- defines: options.defines,
- except: options.reserved_names
- });
- });
- if (options.squeeze) ast = time_it("squeeze", function(){
- ast = pro.ast_squeeze(ast, {
- make_seqs : options.make_seqs,
- dead_code : options.dead_code,
- keep_comps : !options.unsafe
- });
- if (options.unsafe)
- ast = pro.ast_squeeze_more(ast);
- return ast;
- });
- if (options.ast)
- return sys.inspect(ast, null, null);
- result += time_it("generate", function(){ return pro.gen_code(ast, options.codegen_options) });
- if (!options.codegen_options.beautify && options.max_line_length) {
- result = time_it("split", function(){ return pro.split_lines(result, options.max_line_length) });
- }
- return result;
- } catch(ex) {
- sys.debug(ex.stack);
- sys.debug(sys.inspect(ex));
- sys.debug(JSON.stringify(ex));
- }
-};
-
-function time_it(name, cont) {
- if (!options.verbose)
- return cont();
- var t1 = new Date().getTime();
- try { return cont(); }
- finally { sys.debug("// " + name + ": " + ((new Date().getTime() - t1) / 1000).toFixed(3) + " sec."); }
-};
diff --git a/node/node_modules/___uglify-js.npm/package/docstyle.css b/node/node_modules/___uglify-js.npm/package/docstyle.css
deleted file mode 100644
index 412481f..0000000
--- a/node/node_modules/___uglify-js.npm/package/docstyle.css
+++ /dev/null
@@ -1,75 +0,0 @@
-html { font-family: "Lucida Grande","Trebuchet MS",sans-serif; font-size: 12pt; }
-body { max-width: 60em; }
-.title { text-align: center; }
-.todo { color: red; }
-.done { color: green; }
-.tag { background-color:lightblue; font-weight:normal }
-.target { }
-.timestamp { color: grey }
-.timestamp-kwd { color: CadetBlue }
-p.verse { margin-left: 3% }
-pre {
- border: 1pt solid #AEBDCC;
- background-color: #F3F5F7;
- padding: 5pt;
- font-family: monospace;
- font-size: 90%;
- overflow:auto;
-}
-pre.src {
- background-color: #eee; color: #112; border: 1px solid #000;
-}
-table { border-collapse: collapse; }
-td, th { vertical-align: top; }
-dt { font-weight: bold; }
-div.figure { padding: 0.5em; }
-div.figure p { text-align: center; }
-.linenr { font-size:smaller }
-.code-highlighted {background-color:#ffff00;}
-.org-info-js_info-navigation { border-style:none; }
-#org-info-js_console-label { font-size:10px; font-weight:bold;
- white-space:nowrap; }
-.org-info-js_search-highlight {background-color:#ffff00; color:#000000;
- font-weight:bold; }
-
-sup {
- vertical-align: baseline;
- position: relative;
- top: -0.5em;
- font-size: 80%;
-}
-
-sup a:link, sup a:visited {
- text-decoration: none;
- color: #c00;
-}
-
-sup a:before { content: "["; color: #999; }
-sup a:after { content: "]"; color: #999; }
-
-h1.title { border-bottom: 4px solid #000; padding-bottom: 5px; margin-bottom: 2em; }
-
-#postamble {
- color: #777;
- font-size: 90%;
- padding-top: 1em; padding-bottom: 1em; border-top: 1px solid #999;
- margin-top: 2em;
- padding-left: 2em;
- padding-right: 2em;
- text-align: right;
-}
-
-#postamble p { margin: 0; }
-
-#footnotes { border-top: 1px solid #000; }
-
-h1 { font-size: 200% }
-h2 { font-size: 175% }
-h3 { font-size: 150% }
-h4 { font-size: 125% }
-
-h1, h2, h3, h4 { font-family: "Bookman",Georgia,"Times New Roman",serif; font-weight: normal; }
-
-@media print {
- html { font-size: 11pt; }
-}
diff --git a/node/node_modules/___uglify-js.npm/package/lib/parse-js.js b/node/node_modules/___uglify-js.npm/package/lib/parse-js.js
deleted file mode 100644
index 70bf999..0000000
--- a/node/node_modules/___uglify-js.npm/package/lib/parse-js.js
+++ /dev/null
@@ -1,1340 +0,0 @@
-/***********************************************************************
-
- A JavaScript tokenizer / parser / beautifier / compressor.
-
- This version is suitable for Node.js. With minimal changes (the
- exports stuff) it should work on any JS platform.
-
- This file contains the tokenizer/parser. It is a port to JavaScript
- of parse-js [1], a JavaScript parser library written in Common Lisp
- by Marijn Haverbeke. Thank you Marijn!
-
- [1] http://marijn.haverbeke.nl/parse-js/
-
- Exported functions:
-
- - tokenizer(code) -- returns a function. Call the returned
- function to fetch the next token.
-
- - parse(code) -- returns an AST of the given JavaScript code.
-
- -------------------------------- (C) ---------------------------------
-
- Author: Mihai Bazon
-
- http://mihai.bazon.net/blog
-
- Distributed under the BSD license:
-
- Copyright 2010 (c) Mihai Bazon
- Based on parse-js (http://marijn.haverbeke.nl/parse-js/).
-
- 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 HOLDER â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 THE 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.
-
- ***********************************************************************/
-
-/* -----[ Tokenizer (constants) ]----- */
-
-var KEYWORDS = array_to_hash([
- "break",
- "case",
- "catch",
- "const",
- "continue",
- "default",
- "delete",
- "do",
- "else",
- "finally",
- "for",
- "function",
- "if",
- "in",
- "instanceof",
- "new",
- "return",
- "switch",
- "throw",
- "try",
- "typeof",
- "var",
- "void",
- "while",
- "with"
-]);
-
-var RESERVED_WORDS = array_to_hash([
- "abstract",
- "boolean",
- "byte",
- "char",
- "class",
- "debugger",
- "double",
- "enum",
- "export",
- "extends",
- "final",
- "float",
- "goto",
- "implements",
- "import",
- "int",
- "interface",
- "long",
- "native",
- "package",
- "private",
- "protected",
- "public",
- "short",
- "static",
- "super",
- "synchronized",
- "throws",
- "transient",
- "volatile"
-]);
-
-var KEYWORDS_BEFORE_EXPRESSION = array_to_hash([
- "return",
- "new",
- "delete",
- "throw",
- "else",
- "case"
-]);
-
-var KEYWORDS_ATOM = array_to_hash([
- "false",
- "null",
- "true",
- "undefined"
-]);
-
-var OPERATOR_CHARS = array_to_hash(characters("+-*&%=<>!?|~^"));
-
-var RE_HEX_NUMBER = /^0x[0-9a-f]+$/i;
-var RE_OCT_NUMBER = /^0[0-7]+$/;
-var RE_DEC_NUMBER = /^\d*\.?\d*(?:e[+-]?\d*(?:\d\.?|\.?\d)\d*)?$/i;
-
-var OPERATORS = array_to_hash([
- "in",
- "instanceof",
- "typeof",
- "new",
- "void",
- "delete",
- "++",
- "--",
- "+",
- "-",
- "!",
- "~",
- "&",
- "|",
- "^",
- "*",
- "/",
- "%",
- ">>",
- "<<",
- ">>>",
- "<",
- ">",
- "<=",
- ">=",
- "==",
- "===",
- "!=",
- "!==",
- "?",
- "=",
- "+=",
- "-=",
- "/=",
- "*=",
- "%=",
- ">>=",
- "<<=",
- ">>>=",
- "|=",
- "^=",
- "&=",
- "&&",
- "||"
-]);
-
-var WHITESPACE_CHARS = array_to_hash(characters(" \u00a0\n\r\t\f\v\u200b"));
-
-var PUNC_BEFORE_EXPRESSION = array_to_hash(characters("[{}(,.;:"));
-
-var PUNC_CHARS = array_to_hash(characters("[]{}(),;:"));
-
-var REGEXP_MODIFIERS = array_to_hash(characters("gmsiy"));
-
-/* -----[ Tokenizer ]----- */
-
-// regexps adapted from http://xregexp.com/plugins/#unicode
-var UNICODE = {
- letter: new RegExp("[\\u0041-\\u005A\\u0061-\\u007A\\u00AA\\u00B5\\u00BA\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u0523\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0621-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971\\u0972\\u097B-\\u097F\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C33\\u0C35-\\u0C39\\u0C3D\\u0C58\\u0C59\\u0C60\\u0C61\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D28\\u0D2A-\\u0D39\\u0D3D\\u0D60\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E46\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EDC\\u0EDD\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8B\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10A0-\\u10C5\\u10D0-\\u10FA\\u10FC\\u1100-\\u1159\\u115F-\\u11A2\\u11A8-\\u11F9\\u1200-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F4\\u1401-\\u166C\\u166F-\\u1676\\u1681-\\u169A\\u16A0-\\u16EA\\u1700-\\u170C\\u170E-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u1820-\\u1877\\u1880-\\u18A8\\u18AA\\u1900-\\u191C\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19A9\\u19C1-\\u19C7\\u1A00-\\u1A16\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F\\u2090-\\u2094\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2183\\u2184\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2C6F\\u2C71-\\u2C7D\\u2C80-\\u2CE4\\u2D00-\\u2D25\\u2D30-\\u2D65\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2E2F\\u3005\\u3006\\u3031-\\u3035\\u303B\\u303C\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31B7\\u31F0-\\u31FF\\u3400\\u4DB5\\u4E00\\u9FC3\\uA000-\\uA48C\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA65F\\uA662-\\uA66E\\uA67F-\\uA697\\uA717-\\uA71F\\uA722-\\uA788\\uA78B\\uA78C\\uA7FB-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA90A-\\uA925\\uA930-\\uA946\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAC00\\uD7A3\\uF900-\\uFA2D\\uFA30-\\uFA6A\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC]"),
- non_spacing_mark: new RegExp("[\\u0300-\\u036F\\u0483-\\u0487\\u0591-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u0610-\\u061A\\u064B-\\u065E\\u0670\\u06D6-\\u06DC\\u06DF-\\u06E4\\u06E7\\u06E8\\u06EA-\\u06ED\\u0711\\u0730-\\u074A\\u07A6-\\u07B0\\u07EB-\\u07F3\\u0816-\\u0819\\u081B-\\u0823\\u0825-\\u0827\\u0829-\\u082D\\u0900-\\u0902\\u093C\\u0941-\\u0948\\u094D\\u0951-\\u0955\\u0962\\u0963\\u0981\\u09BC\\u09C1-\\u09C4\\u09CD\\u09E2\\u09E3\\u0A01\\u0A02\\u0A3C\\u0A41\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A70\\u0A71\\u0A75\\u0A81\\u0A82\\u0ABC\\u0AC1-\\u0AC5\\u0AC7\\u0AC8\\u0ACD\\u0AE2\\u0AE3\\u0B01\\u0B3C\\u0B3F\\u0B41-\\u0B44\\u0B4D\\u0B56\\u0B62\\u0B63\\u0B82\\u0BC0\\u0BCD\\u0C3E-\\u0C40\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C62\\u0C63\\u0CBC\\u0CBF\\u0CC6\\u0CCC\\u0CCD\\u0CE2\\u0CE3\\u0D41-\\u0D44\\u0D4D\\u0D62\\u0D63\\u0DCA\\u0DD2-\\u0DD4\\u0DD6\\u0E31\\u0E34-\\u0E3A\\u0E47-\\u0E4E\\u0EB1\\u0EB4-\\u0EB9\\u0EBB\\u0EBC\\u0EC8-\\u0ECD\\u0F18\\u0F19\\u0F35\\u0F37\\u0F39\\u0F71-\\u0F7E\\u0F80-\\u0F84\\u0F86\\u0F87\\u0F90-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u102D-\\u1030\\u1032-\\u1037\\u1039\\u103A\\u103D\\u103E\\u1058\\u1059\\u105E-\\u1060\\u1071-\\u1074\\u1082\\u1085\\u1086\\u108D\\u109D\\u135F\\u1712-\\u1714\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17B7-\\u17BD\\u17C6\\u17C9-\\u17D3\\u17DD\\u180B-\\u180D\\u18A9\\u1920-\\u1922\\u1927\\u1928\\u1932\\u1939-\\u193B\\u1A17\\u1A18\\u1A56\\u1A58-\\u1A5E\\u1A60\\u1A62\\u1A65-\\u1A6C\\u1A73-\\u1A7C\\u1A7F\\u1B00-\\u1B03\\u1B34\\u1B36-\\u1B3A\\u1B3C\\u1B42\\u1B6B-\\u1B73\\u1B80\\u1B81\\u1BA2-\\u1BA5\\u1BA8\\u1BA9\\u1C2C-\\u1C33\\u1C36\\u1C37\\u1CD0-\\u1CD2\\u1CD4-\\u1CE0\\u1CE2-\\u1CE8\\u1CED\\u1DC0-\\u1DE6\\u1DFD-\\u1DFF\\u20D0-\\u20DC\\u20E1\\u20E5-\\u20F0\\u2CEF-\\u2CF1\\u2DE0-\\u2DFF\\u302A-\\u302F\\u3099\\u309A\\uA66F\\uA67C\\uA67D\\uA6F0\\uA6F1\\uA802\\uA806\\uA80B\\uA825\\uA826\\uA8C4\\uA8E0-\\uA8F1\\uA926-\\uA92D\\uA947-\\uA951\\uA980-\\uA982\\uA9B3\\uA9B6-\\uA9B9\\uA9BC\\uAA29-\\uAA2E\\uAA31\\uAA32\\uAA35\\uAA36\\uAA43\\uAA4C\\uAAB0\\uAAB2-\\uAAB4\\uAAB7\\uAAB8\\uAABE\\uAABF\\uAAC1\\uABE5\\uABE8\\uABED\\uFB1E\\uFE00-\\uFE0F\\uFE20-\\uFE26]"),
- space_combining_mark: new RegExp("[\\u0903\\u093E-\\u0940\\u0949-\\u094C\\u094E\\u0982\\u0983\\u09BE-\\u09C0\\u09C7\\u09C8\\u09CB\\u09CC\\u09D7\\u0A03\\u0A3E-\\u0A40\\u0A83\\u0ABE-\\u0AC0\\u0AC9\\u0ACB\\u0ACC\\u0B02\\u0B03\\u0B3E\\u0B40\\u0B47\\u0B48\\u0B4B\\u0B4C\\u0B57\\u0BBE\\u0BBF\\u0BC1\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCC\\u0BD7\\u0C01-\\u0C03\\u0C41-\\u0C44\\u0C82\\u0C83\\u0CBE\\u0CC0-\\u0CC4\\u0CC7\\u0CC8\\u0CCA\\u0CCB\\u0CD5\\u0CD6\\u0D02\\u0D03\\u0D3E-\\u0D40\\u0D46-\\u0D48\\u0D4A-\\u0D4C\\u0D57\\u0D82\\u0D83\\u0DCF-\\u0DD1\\u0DD8-\\u0DDF\\u0DF2\\u0DF3\\u0F3E\\u0F3F\\u0F7F\\u102B\\u102C\\u1031\\u1038\\u103B\\u103C\\u1056\\u1057\\u1062-\\u1064\\u1067-\\u106D\\u1083\\u1084\\u1087-\\u108C\\u108F\\u109A-\\u109C\\u17B6\\u17BE-\\u17C5\\u17C7\\u17C8\\u1923-\\u1926\\u1929-\\u192B\\u1930\\u1931\\u1933-\\u1938\\u19B0-\\u19C0\\u19C8\\u19C9\\u1A19-\\u1A1B\\u1A55\\u1A57\\u1A61\\u1A63\\u1A64\\u1A6D-\\u1A72\\u1B04\\u1B35\\u1B3B\\u1B3D-\\u1B41\\u1B43\\u1B44\\u1B82\\u1BA1\\u1BA6\\u1BA7\\u1BAA\\u1C24-\\u1C2B\\u1C34\\u1C35\\u1CE1\\u1CF2\\uA823\\uA824\\uA827\\uA880\\uA881\\uA8B4-\\uA8C3\\uA952\\uA953\\uA983\\uA9B4\\uA9B5\\uA9BA\\uA9BB\\uA9BD-\\uA9C0\\uAA2F\\uAA30\\uAA33\\uAA34\\uAA4D\\uAA7B\\uABE3\\uABE4\\uABE6\\uABE7\\uABE9\\uABEA\\uABEC]"),
- connector_punctuation: new RegExp("[\\u005F\\u203F\\u2040\\u2054\\uFE33\\uFE34\\uFE4D-\\uFE4F\\uFF3F]")
-};
-
-function is_letter(ch) {
- return UNICODE.letter.test(ch);
-};
-
-function is_digit(ch) {
- ch = ch.charCodeAt(0);
- return ch >= 48 && ch <= 57; //XXX: find out if "UnicodeDigit" means something else than 0..9
-};
-
-function is_alphanumeric_char(ch) {
- return is_digit(ch) || is_letter(ch);
-};
-
-function is_unicode_combining_mark(ch) {
- return UNICODE.non_spacing_mark.test(ch) || UNICODE.space_combining_mark.test(ch);
-};
-
-function is_unicode_connector_punctuation(ch) {
- return UNICODE.connector_punctuation.test(ch);
-};
-
-function is_identifier_start(ch) {
- return ch == "$" || ch == "_" || is_letter(ch);
-};
-
-function is_identifier_char(ch) {
- return is_identifier_start(ch)
- || is_unicode_combining_mark(ch)
- || is_digit(ch)
- || is_unicode_connector_punctuation(ch)
- || ch == "\u200c" // zero-width non-joiner
- || ch == "\u200d" // zero-width joiner (in my ECMA-262 PDF, this is also 200c)
- ;
-};
-
-function parse_js_number(num) {
- if (RE_HEX_NUMBER.test(num)) {
- return parseInt(num.substr(2), 16);
- } else if (RE_OCT_NUMBER.test(num)) {
- return parseInt(num.substr(1), 8);
- } else if (RE_DEC_NUMBER.test(num)) {
- return parseFloat(num);
- }
-};
-
-function JS_Parse_Error(message, line, col, pos) {
- this.message = message;
- this.line = line;
- this.col = col;
- this.pos = pos;
- try {
- ({})();
- } catch(ex) {
- this.stack = ex.stack;
- };
-};
-
-JS_Parse_Error.prototype.toString = function() {
- return this.message + " (line: " + this.line + ", col: " + this.col + ", pos: " + this.pos + ")" + "\n\n" + this.stack;
-};
-
-function js_error(message, line, col, pos) {
- throw new JS_Parse_Error(message, line, col, pos);
-};
-
-function is_token(token, type, val) {
- return token.type == type && (val == null || token.value == val);
-};
-
-var EX_EOF = {};
-
-function tokenizer($TEXT) {
-
- var S = {
- text : $TEXT.replace(/\r\n?|[\n\u2028\u2029]/g, "\n").replace(/^\uFEFF/, ''),
- pos : 0,
- tokpos : 0,
- line : 0,
- tokline : 0,
- col : 0,
- tokcol : 0,
- newline_before : false,
- regex_allowed : false,
- comments_before : []
- };
-
- function peek() { return S.text.charAt(S.pos); };
-
- function next(signal_eof) {
- var ch = S.text.charAt(S.pos++);
- if (signal_eof && !ch)
- throw EX_EOF;
- if (ch == "\n") {
- S.newline_before = true;
- ++S.line;
- S.col = 0;
- } else {
- ++S.col;
- }
- return ch;
- };
-
- function eof() {
- return !S.peek();
- };
-
- function find(what, signal_eof) {
- var pos = S.text.indexOf(what, S.pos);
- if (signal_eof && pos == -1) throw EX_EOF;
- return pos;
- };
-
- function start_token() {
- S.tokline = S.line;
- S.tokcol = S.col;
- S.tokpos = S.pos;
- };
-
- function token(type, value, is_comment) {
- S.regex_allowed = ((type == "operator" && !HOP(UNARY_POSTFIX, value)) ||
- (type == "keyword" && HOP(KEYWORDS_BEFORE_EXPRESSION, value)) ||
- (type == "punc" && HOP(PUNC_BEFORE_EXPRESSION, value)));
- var ret = {
- type : type,
- value : value,
- line : S.tokline,
- col : S.tokcol,
- pos : S.tokpos,
- nlb : S.newline_before
- };
- if (!is_comment) {
- ret.comments_before = S.comments_before;
- S.comments_before = [];
- }
- S.newline_before = false;
- return ret;
- };
-
- function skip_whitespace() {
- while (HOP(WHITESPACE_CHARS, peek()))
- next();
- };
-
- function read_while(pred) {
- var ret = "", ch = peek(), i = 0;
- while (ch && pred(ch, i++)) {
- ret += next();
- ch = peek();
- }
- return ret;
- };
-
- function parse_error(err) {
- js_error(err, S.tokline, S.tokcol, S.tokpos);
- };
-
- function read_num(prefix) {
- var has_e = false, after_e = false, has_x = false, has_dot = prefix == ".";
- var num = read_while(function(ch, i){
- if (ch == "x" || ch == "X") {
- if (has_x) return false;
- return has_x = true;
- }
- if (!has_x && (ch == "E" || ch == "e")) {
- if (has_e) return false;
- return has_e = after_e = true;
- }
- if (ch == "-") {
- if (after_e || (i == 0 && !prefix)) return true;
- return false;
- }
- if (ch == "+") return after_e;
- after_e = false;
- if (ch == ".") {
- if (!has_dot && !has_x)
- return has_dot = true;
- return false;
- }
- return is_alphanumeric_char(ch);
- });
- if (prefix)
- num = prefix + num;
- var valid = parse_js_number(num);
- if (!isNaN(valid)) {
- return token("num", valid);
- } else {
- parse_error("Invalid syntax: " + num);
- }
- };
-
- function read_escaped_char() {
- var ch = next(true);
- switch (ch) {
- case "n" : return "\n";
- case "r" : return "\r";
- case "t" : return "\t";
- case "b" : return "\b";
- case "v" : return "\v";
- case "f" : return "\f";
- case "0" : return "\0";
- case "x" : return String.fromCharCode(hex_bytes(2));
- case "u" : return String.fromCharCode(hex_bytes(4));
- default : return ch;
- }
- };
-
- function hex_bytes(n) {
- var num = 0;
- for (; n > 0; --n) {
- var digit = parseInt(next(true), 16);
- if (isNaN(digit))
- parse_error("Invalid hex-character pattern in string");
- num = (num << 4) | digit;
- }
- return num;
- };
-
- function read_string() {
- return with_eof_error("Unterminated string constant", function(){
- var quote = next(), ret = "";
- for (;;) {
- var ch = next(true);
- if (ch == "\\") {
- // read OctalEscapeSequence (XXX: deprecated if "strict mode")
- // https://github.com/mishoo/UglifyJS/issues/178
- var octal_len = 0, first = null;
- ch = read_while(function(ch){
- if (ch >= "0" && ch <= "7") {
- if (!first) {
- first = ch;
- return ++octal_len;
- }
- else if (first <= "3" && octal_len <= 2) return ++octal_len;
- else if (first >= "4" && octal_len <= 1) return ++octal_len;
- }
- return false;
- });
- if (octal_len > 0) ch = String.fromCharCode(parseInt(ch, 8));
- else ch = read_escaped_char();
- }
- else if (ch == quote) break;
- ret += ch;
- }
- return token("string", ret);
- });
- };
-
- function read_line_comment() {
- next();
- var i = find("\n"), ret;
- if (i == -1) {
- ret = S.text.substr(S.pos);
- S.pos = S.text.length;
- } else {
- ret = S.text.substring(S.pos, i);
- S.pos = i;
- }
- return token("comment1", ret, true);
- };
-
- function read_multiline_comment() {
- next();
- return with_eof_error("Unterminated multiline comment", function(){
- var i = find("*/", true),
- text = S.text.substring(S.pos, i),
- tok = token("comment2", text, true);
- S.pos = i + 2;
- S.line += text.split("\n").length - 1;
- S.newline_before = text.indexOf("\n") >= 0;
-
- // https://github.com/mishoo/UglifyJS/issues/#issue/100
- if (/^@cc_on/i.test(text)) {
- warn("WARNING: at line " + S.line);
- warn("*** Found \"conditional comment\": " + text);
- warn("*** UglifyJS DISCARDS ALL COMMENTS. This means your code might no longer work properly in Internet Explorer.");
- }
-
- return tok;
- });
- };
-
- function read_name() {
- var backslash = false, name = "", ch;
- while ((ch = peek()) != null) {
- if (!backslash) {
- if (ch == "\\") backslash = true, next();
- else if (is_identifier_char(ch)) name += next();
- else break;
- }
- else {
- if (ch != "u") parse_error("Expecting UnicodeEscapeSequence -- uXXXX");
- ch = read_escaped_char();
- if (!is_identifier_char(ch)) parse_error("Unicode char: " + ch.charCodeAt(0) + " is not valid in identifier");
- name += ch;
- backslash = false;
- }
- }
- return name;
- };
-
- function read_regexp() {
- return with_eof_error("Unterminated regular expression", function(){
- var prev_backslash = false, regexp = "", ch, in_class = false;
- while ((ch = next(true))) if (prev_backslash) {
- regexp += "\\" + ch;
- prev_backslash = false;
- } else if (ch == "[") {
- in_class = true;
- regexp += ch;
- } else if (ch == "]" && in_class) {
- in_class = false;
- regexp += ch;
- } else if (ch == "/" && !in_class) {
- break;
- } else if (ch == "\\") {
- prev_backslash = true;
- } else {
- regexp += ch;
- }
- var mods = read_name();
- return token("regexp", [ regexp, mods ]);
- });
- };
-
- function read_operator(prefix) {
- function grow(op) {
- if (!peek()) return op;
- var bigger = op + peek();
- if (HOP(OPERATORS, bigger)) {
- next();
- return grow(bigger);
- } else {
- return op;
- }
- };
- return token("operator", grow(prefix || next()));
- };
-
- function handle_slash() {
- next();
- var regex_allowed = S.regex_allowed;
- switch (peek()) {
- case "/":
- S.comments_before.push(read_line_comment());
- S.regex_allowed = regex_allowed;
- return next_token();
- case "*":
- S.comments_before.push(read_multiline_comment());
- S.regex_allowed = regex_allowed;
- return next_token();
- }
- return S.regex_allowed ? read_regexp() : read_operator("/");
- };
-
- function handle_dot() {
- next();
- return is_digit(peek())
- ? read_num(".")
- : token("punc", ".");
- };
-
- function read_word() {
- var word = read_name();
- return !HOP(KEYWORDS, word)
- ? token("name", word)
- : HOP(OPERATORS, word)
- ? token("operator", word)
- : HOP(KEYWORDS_ATOM, word)
- ? token("atom", word)
- : token("keyword", word);
- };
-
- function with_eof_error(eof_error, cont) {
- try {
- return cont();
- } catch(ex) {
- if (ex === EX_EOF) parse_error(eof_error);
- else throw ex;
- }
- };
-
- function next_token(force_regexp) {
- if (force_regexp)
- return read_regexp();
- skip_whitespace();
- start_token();
- var ch = peek();
- if (!ch) return token("eof");
- if (is_digit(ch)) return read_num();
- if (ch == '"' || ch == "'") return read_string();
- if (HOP(PUNC_CHARS, ch)) return token("punc", next());
- if (ch == ".") return handle_dot();
- if (ch == "/") return handle_slash();
- if (HOP(OPERATOR_CHARS, ch)) return read_operator();
- if (ch == "\\" || is_identifier_start(ch)) return read_word();
- parse_error("Unexpected character '" + ch + "'");
- };
-
- next_token.context = function(nc) {
- if (nc) S = nc;
- return S;
- };
-
- return next_token;
-
-};
-
-/* -----[ Parser (constants) ]----- */
-
-var UNARY_PREFIX = array_to_hash([
- "typeof",
- "void",
- "delete",
- "--",
- "++",
- "!",
- "~",
- "-",
- "+"
-]);
-
-var UNARY_POSTFIX = array_to_hash([ "--", "++" ]);
-
-var ASSIGNMENT = (function(a, ret, i){
- while (i < a.length) {
- ret[a[i]] = a[i].substr(0, a[i].length - 1);
- i++;
- }
- return ret;
-})(
- ["+=", "-=", "/=", "*=", "%=", ">>=", "<<=", ">>>=", "|=", "^=", "&="],
- { "=": true },
- 0
-);
-
-var PRECEDENCE = (function(a, ret){
- for (var i = 0, n = 1; i < a.length; ++i, ++n) {
- var b = a[i];
- for (var j = 0; j < b.length; ++j) {
- ret[b[j]] = n;
- }
- }
- return ret;
-})(
- [
- ["||"],
- ["&&"],
- ["|"],
- ["^"],
- ["&"],
- ["==", "===", "!=", "!=="],
- ["<", ">", "<=", ">=", "in", "instanceof"],
- [">>", "<<", ">>>"],
- ["+", "-"],
- ["*", "/", "%"]
- ],
- {}
-);
-
-var STATEMENTS_WITH_LABELS = array_to_hash([ "for", "do", "while", "switch" ]);
-
-var ATOMIC_START_TOKEN = array_to_hash([ "atom", "num", "string", "regexp", "name" ]);
-
-/* -----[ Parser ]----- */
-
-function NodeWithToken(str, start, end) {
- this.name = str;
- this.start = start;
- this.end = end;
-};
-
-NodeWithToken.prototype.toString = function() { return this.name; };
-
-function parse($TEXT, exigent_mode, embed_tokens) {
-
- var S = {
- input : typeof $TEXT == "string" ? tokenizer($TEXT, true) : $TEXT,
- token : null,
- prev : null,
- peeked : null,
- in_function : 0,
- in_loop : 0,
- labels : []
- };
-
- S.token = next();
-
- function is(type, value) {
- return is_token(S.token, type, value);
- };
-
- function peek() { return S.peeked || (S.peeked = S.input()); };
-
- function next() {
- S.prev = S.token;
- if (S.peeked) {
- S.token = S.peeked;
- S.peeked = null;
- } else {
- S.token = S.input();
- }
- return S.token;
- };
-
- function prev() {
- return S.prev;
- };
-
- function croak(msg, line, col, pos) {
- var ctx = S.input.context();
- js_error(msg,
- line != null ? line : ctx.tokline,
- col != null ? col : ctx.tokcol,
- pos != null ? pos : ctx.tokpos);
- };
-
- function token_error(token, msg) {
- croak(msg, token.line, token.col);
- };
-
- function unexpected(token) {
- if (token == null)
- token = S.token;
- token_error(token, "Unexpected token: " + token.type + " (" + token.value + ")");
- };
-
- function expect_token(type, val) {
- if (is(type, val)) {
- return next();
- }
- token_error(S.token, "Unexpected token " + S.token.type + ", expected " + type);
- };
-
- function expect(punc) { return expect_token("punc", punc); };
-
- function can_insert_semicolon() {
- return !exigent_mode && (
- S.token.nlb || is("eof") || is("punc", "}")
- );
- };
-
- function semicolon() {
- if (is("punc", ";")) next();
- else if (!can_insert_semicolon()) unexpected();
- };
-
- function as() {
- return slice(arguments);
- };
-
- function parenthesised() {
- expect("(");
- var ex = expression();
- expect(")");
- return ex;
- };
-
- function add_tokens(str, start, end) {
- return str instanceof NodeWithToken ? str : new NodeWithToken(str, start, end);
- };
-
- function maybe_embed_tokens(parser) {
- if (embed_tokens) return function() {
- var start = S.token;
- var ast = parser.apply(this, arguments);
- ast[0] = add_tokens(ast[0], start, prev());
- return ast;
- };
- else return parser;
- };
-
- var statement = maybe_embed_tokens(function() {
- if (is("operator", "/")) {
- S.peeked = null;
- S.token = S.input(true); // force regexp
- }
- switch (S.token.type) {
- case "num":
- case "string":
- case "regexp":
- case "operator":
- case "atom":
- return simple_statement();
-
- case "name":
- return is_token(peek(), "punc", ":")
- ? labeled_statement(prog1(S.token.value, next, next))
- : simple_statement();
-
- case "punc":
- switch (S.token.value) {
- case "{":
- return as("block", block_());
- case "[":
- case "(":
- return simple_statement();
- case ";":
- next();
- return as("block");
- default:
- unexpected();
- }
-
- case "keyword":
- switch (prog1(S.token.value, next)) {
- case "break":
- return break_cont("break");
-
- case "continue":
- return break_cont("continue");
-
- case "debugger":
- semicolon();
- return as("debugger");
-
- case "do":
- return (function(body){
- expect_token("keyword", "while");
- return as("do", prog1(parenthesised, semicolon), body);
- })(in_loop(statement));
-
- case "for":
- return for_();
-
- case "function":
- return function_(true);
-
- case "if":
- return if_();
-
- case "return":
- if (S.in_function == 0)
- croak("'return' outside of function");
- return as("return",
- is("punc", ";")
- ? (next(), null)
- : can_insert_semicolon()
- ? null
- : prog1(expression, semicolon));
-
- case "switch":
- return as("switch", parenthesised(), switch_block_());
-
- case "throw":
- return as("throw", prog1(expression, semicolon));
-
- case "try":
- return try_();
-
- case "var":
- return prog1(var_, semicolon);
-
- case "const":
- return prog1(const_, semicolon);
-
- case "while":
- return as("while", parenthesised(), in_loop(statement));
-
- case "with":
- return as("with", parenthesised(), statement());
-
- default:
- unexpected();
- }
- }
- });
-
- function labeled_statement(label) {
- S.labels.push(label);
- var start = S.token, stat = statement();
- if (exigent_mode && !HOP(STATEMENTS_WITH_LABELS, stat[0]))
- unexpected(start);
- S.labels.pop();
- return as("label", label, stat);
- };
-
- function simple_statement() {
- return as("stat", prog1(expression, semicolon));
- };
-
- function break_cont(type) {
- var name;
- if (!can_insert_semicolon()) {
- name = is("name") ? S.token.value : null;
- }
- if (name != null) {
- next();
- if (!member(name, S.labels))
- croak("Label " + name + " without matching loop or statement");
- }
- else if (S.in_loop == 0)
- croak(type + " not inside a loop or switch");
- semicolon();
- return as(type, name);
- };
-
- function for_() {
- expect("(");
- var init = null;
- if (!is("punc", ";")) {
- init = is("keyword", "var")
- ? (next(), var_(true))
- : expression(true, true);
- if (is("operator", "in"))
- return for_in(init);
- }
- return regular_for(init);
- };
-
- function regular_for(init) {
- expect(";");
- var test = is("punc", ";") ? null : expression();
- expect(";");
- var step = is("punc", ")") ? null : expression();
- expect(")");
- return as("for", init, test, step, in_loop(statement));
- };
-
- function for_in(init) {
- var lhs = init[0] == "var" ? as("name", init[1][0]) : init;
- next();
- var obj = expression();
- expect(")");
- return as("for-in", init, lhs, obj, in_loop(statement));
- };
-
- var function_ = maybe_embed_tokens(function(in_statement) {
- var name = is("name") ? prog1(S.token.value, next) : null;
- if (in_statement && !name)
- unexpected();
- expect("(");
- return as(in_statement ? "defun" : "function",
- name,
- // arguments
- (function(first, a){
- while (!is("punc", ")")) {
- if (first) first = false; else expect(",");
- if (!is("name")) unexpected();
- a.push(S.token.value);
- next();
- }
- next();
- return a;
- })(true, []),
- // body
- (function(){
- ++S.in_function;
- var loop = S.in_loop;
- S.in_loop = 0;
- var a = block_();
- --S.in_function;
- S.in_loop = loop;
- return a;
- })());
- });
-
- function if_() {
- var cond = parenthesised(), body = statement(), belse;
- if (is("keyword", "else")) {
- next();
- belse = statement();
- }
- return as("if", cond, body, belse);
- };
-
- function block_() {
- expect("{");
- var a = [];
- while (!is("punc", "}")) {
- if (is("eof")) unexpected();
- a.push(statement());
- }
- next();
- return a;
- };
-
- var switch_block_ = curry(in_loop, function(){
- expect("{");
- var a = [], cur = null;
- while (!is("punc", "}")) {
- if (is("eof")) unexpected();
- if (is("keyword", "case")) {
- next();
- cur = [];
- a.push([ expression(), cur ]);
- expect(":");
- }
- else if (is("keyword", "default")) {
- next();
- expect(":");
- cur = [];
- a.push([ null, cur ]);
- }
- else {
- if (!cur) unexpected();
- cur.push(statement());
- }
- }
- next();
- return a;
- });
-
- function try_() {
- var body = block_(), bcatch, bfinally;
- if (is("keyword", "catch")) {
- next();
- expect("(");
- if (!is("name"))
- croak("Name expected");
- var name = S.token.value;
- next();
- expect(")");
- bcatch = [ name, block_() ];
- }
- if (is("keyword", "finally")) {
- next();
- bfinally = block_();
- }
- if (!bcatch && !bfinally)
- croak("Missing catch/finally blocks");
- return as("try", body, bcatch, bfinally);
- };
-
- function vardefs(no_in) {
- var a = [];
- for (;;) {
- if (!is("name"))
- unexpected();
- var name = S.token.value;
- next();
- if (is("operator", "=")) {
- next();
- a.push([ name, expression(false, no_in) ]);
- } else {
- a.push([ name ]);
- }
- if (!is("punc", ","))
- break;
- next();
- }
- return a;
- };
-
- function var_(no_in) {
- return as("var", vardefs(no_in));
- };
-
- function const_() {
- return as("const", vardefs());
- };
-
- function new_() {
- var newexp = expr_atom(false), args;
- if (is("punc", "(")) {
- next();
- args = expr_list(")");
- } else {
- args = [];
- }
- return subscripts(as("new", newexp, args), true);
- };
-
- var expr_atom = maybe_embed_tokens(function(allow_calls) {
- if (is("operator", "new")) {
- next();
- return new_();
- }
- if (is("punc")) {
- switch (S.token.value) {
- case "(":
- next();
- return subscripts(prog1(expression, curry(expect, ")")), allow_calls);
- case "[":
- next();
- return subscripts(array_(), allow_calls);
- case "{":
- next();
- return subscripts(object_(), allow_calls);
- }
- unexpected();
- }
- if (is("keyword", "function")) {
- next();
- return subscripts(function_(false), allow_calls);
- }
- if (HOP(ATOMIC_START_TOKEN, S.token.type)) {
- var atom = S.token.type == "regexp"
- ? as("regexp", S.token.value[0], S.token.value[1])
- : as(S.token.type, S.token.value);
- return subscripts(prog1(atom, next), allow_calls);
- }
- unexpected();
- });
-
- function expr_list(closing, allow_trailing_comma, allow_empty) {
- var first = true, a = [];
- while (!is("punc", closing)) {
- if (first) first = false; else expect(",");
- if (allow_trailing_comma && is("punc", closing)) break;
- if (is("punc", ",") && allow_empty) {
- a.push([ "atom", "undefined" ]);
- } else {
- a.push(expression(false));
- }
- }
- next();
- return a;
- };
-
- function array_() {
- return as("array", expr_list("]", !exigent_mode, true));
- };
-
- function object_() {
- var first = true, a = [];
- while (!is("punc", "}")) {
- if (first) first = false; else expect(",");
- if (!exigent_mode && is("punc", "}"))
- // allow trailing comma
- break;
- var type = S.token.type;
- var name = as_property_name();
- if (type == "name" && (name == "get" || name == "set") && !is("punc", ":")) {
- a.push([ as_name(), function_(false), name ]);
- } else {
- expect(":");
- a.push([ name, expression(false) ]);
- }
- }
- next();
- return as("object", a);
- };
-
- function as_property_name() {
- switch (S.token.type) {
- case "num":
- case "string":
- return prog1(S.token.value, next);
- }
- return as_name();
- };
-
- function as_name() {
- switch (S.token.type) {
- case "name":
- case "operator":
- case "keyword":
- case "atom":
- return prog1(S.token.value, next);
- default:
- unexpected();
- }
- };
-
- function subscripts(expr, allow_calls) {
- if (is("punc", ".")) {
- next();
- return subscripts(as("dot", expr, as_name()), allow_calls);
- }
- if (is("punc", "[")) {
- next();
- return subscripts(as("sub", expr, prog1(expression, curry(expect, "]"))), allow_calls);
- }
- if (allow_calls && is("punc", "(")) {
- next();
- return subscripts(as("call", expr, expr_list(")")), true);
- }
- return expr;
- };
-
- function maybe_unary(allow_calls) {
- if (is("operator") && HOP(UNARY_PREFIX, S.token.value)) {
- return make_unary("unary-prefix",
- prog1(S.token.value, next),
- maybe_unary(allow_calls));
- }
- var val = expr_atom(allow_calls);
- while (is("operator") && HOP(UNARY_POSTFIX, S.token.value) && !S.token.nlb) {
- val = make_unary("unary-postfix", S.token.value, val);
- next();
- }
- return val;
- };
-
- function make_unary(tag, op, expr) {
- if ((op == "++" || op == "--") && !is_assignable(expr))
- croak("Invalid use of " + op + " operator");
- return as(tag, op, expr);
- };
-
- function expr_op(left, min_prec, no_in) {
- var op = is("operator") ? S.token.value : null;
- if (op && op == "in" && no_in) op = null;
- var prec = op != null ? PRECEDENCE[op] : null;
- if (prec != null && prec > min_prec) {
- next();
- var right = expr_op(maybe_unary(true), prec, no_in);
- return expr_op(as("binary", op, left, right), min_prec, no_in);
- }
- return left;
- };
-
- function expr_ops(no_in) {
- return expr_op(maybe_unary(true), 0, no_in);
- };
-
- function maybe_conditional(no_in) {
- var expr = expr_ops(no_in);
- if (is("operator", "?")) {
- next();
- var yes = expression(false);
- expect(":");
- return as("conditional", expr, yes, expression(false, no_in));
- }
- return expr;
- };
-
- function is_assignable(expr) {
- if (!exigent_mode) return true;
- switch (expr[0]) {
- case "dot":
- case "sub":
- case "new":
- case "call":
- return true;
- case "name":
- return expr[1] != "this";
- }
- };
-
- function maybe_assign(no_in) {
- var left = maybe_conditional(no_in), val = S.token.value;
- if (is("operator") && HOP(ASSIGNMENT, val)) {
- if (is_assignable(left)) {
- next();
- return as("assign", ASSIGNMENT[val], left, maybe_assign(no_in));
- }
- croak("Invalid assignment");
- }
- return left;
- };
-
- var expression = maybe_embed_tokens(function(commas, no_in) {
- if (arguments.length == 0)
- commas = true;
- var expr = maybe_assign(no_in);
- if (commas && is("punc", ",")) {
- next();
- return as("seq", expr, expression(true, no_in));
- }
- return expr;
- });
-
- function in_loop(cont) {
- try {
- ++S.in_loop;
- return cont();
- } finally {
- --S.in_loop;
- }
- };
-
- return as("toplevel", (function(a){
- while (!is("eof"))
- a.push(statement());
- return a;
- })([]));
-
-};
-
-/* -----[ Utilities ]----- */
-
-function curry(f) {
- var args = slice(arguments, 1);
- return function() { return f.apply(this, args.concat(slice(arguments))); };
-};
-
-function prog1(ret) {
- if (ret instanceof Function)
- ret = ret();
- for (var i = 1, n = arguments.length; --n > 0; ++i)
- arguments[i]();
- return ret;
-};
-
-function array_to_hash(a) {
- var ret = {};
- for (var i = 0; i < a.length; ++i)
- ret[a[i]] = true;
- return ret;
-};
-
-function slice(a, start) {
- return Array.prototype.slice.call(a, start == null ? 0 : start);
-};
-
-function characters(str) {
- return str.split("");
-};
-
-function member(name, array) {
- for (var i = array.length; --i >= 0;)
- if (array[i] === name)
- return true;
- return false;
-};
-
-function HOP(obj, prop) {
- return Object.prototype.hasOwnProperty.call(obj, prop);
-};
-
-var warn = function() {};
-
-/* -----[ Exports ]----- */
-
-exports.tokenizer = tokenizer;
-exports.parse = parse;
-exports.slice = slice;
-exports.curry = curry;
-exports.member = member;
-exports.array_to_hash = array_to_hash;
-exports.PRECEDENCE = PRECEDENCE;
-exports.KEYWORDS_ATOM = KEYWORDS_ATOM;
-exports.RESERVED_WORDS = RESERVED_WORDS;
-exports.KEYWORDS = KEYWORDS;
-exports.ATOMIC_START_TOKEN = ATOMIC_START_TOKEN;
-exports.OPERATORS = OPERATORS;
-exports.is_alphanumeric_char = is_alphanumeric_char;
-exports.set_logger = function(logger) {
- warn = logger;
-};
diff --git a/node/node_modules/___uglify-js.npm/package/lib/process.js b/node/node_modules/___uglify-js.npm/package/lib/process.js
deleted file mode 100644
index 775e305..0000000
--- a/node/node_modules/___uglify-js.npm/package/lib/process.js
+++ /dev/null
@@ -1,1774 +0,0 @@
-/***********************************************************************
-
- A JavaScript tokenizer / parser / beautifier / compressor.
-
- This version is suitable for Node.js. With minimal changes (the
- exports stuff) it should work on any JS platform.
-
- This file implements some AST processors. They work on data built
- by parse-js.
-
- Exported functions:
-
- - ast_mangle(ast, options) -- mangles the variable/function names
- in the AST. Returns an AST.
-
- - ast_squeeze(ast) -- employs various optimizations to make the
- final generated code even smaller. Returns an AST.
-
- - gen_code(ast, options) -- generates JS code from the AST. Pass
- true (or an object, see the code for some options) as second
- argument to get "pretty" (indented) code.
-
- -------------------------------- (C) ---------------------------------
-
- Author: Mihai Bazon
-
- http://mihai.bazon.net/blog
-
- Distributed under the BSD license:
-
- Copyright 2010 (c) Mihai Bazon
-
- 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 HOLDER â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 THE 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.
-
- ***********************************************************************/
-
-var jsp = require("./parse-js"),
- slice = jsp.slice,
- member = jsp.member,
- PRECEDENCE = jsp.PRECEDENCE,
- OPERATORS = jsp.OPERATORS;
-
-/* -----[ helper for AST traversal ]----- */
-
-function ast_walker(ast) {
- function _vardefs(defs) {
- return [ this[0], MAP(defs, function(def){
- var a = [ def[0] ];
- if (def.length > 1)
- a[1] = walk(def[1]);
- return a;
- }) ];
- };
- function _block(statements) {
- var out = [ this[0] ];
- if (statements != null)
- out.push(MAP(statements, walk));
- return out;
- };
- var walkers = {
- "string": function(str) {
- return [ this[0], str ];
- },
- "num": function(num) {
- return [ this[0], num ];
- },
- "name": function(name) {
- return [ this[0], name ];
- },
- "toplevel": function(statements) {
- return [ this[0], MAP(statements, walk) ];
- },
- "block": _block,
- "splice": _block,
- "var": _vardefs,
- "const": _vardefs,
- "try": function(t, c, f) {
- return [
- this[0],
- MAP(t, walk),
- c != null ? [ c[0], MAP(c[1], walk) ] : null,
- f != null ? MAP(f, walk) : null
- ];
- },
- "throw": function(expr) {
- return [ this[0], walk(expr) ];
- },
- "new": function(ctor, args) {
- return [ this[0], walk(ctor), MAP(args, walk) ];
- },
- "switch": function(expr, body) {
- return [ this[0], walk(expr), MAP(body, function(branch){
- return [ branch[0] ? walk(branch[0]) : null,
- MAP(branch[1], walk) ];
- }) ];
- },
- "break": function(label) {
- return [ this[0], label ];
- },
- "continue": function(label) {
- return [ this[0], label ];
- },
- "conditional": function(cond, t, e) {
- return [ this[0], walk(cond), walk(t), walk(e) ];
- },
- "assign": function(op, lvalue, rvalue) {
- return [ this[0], op, walk(lvalue), walk(rvalue) ];
- },
- "dot": function(expr) {
- return [ this[0], walk(expr) ].concat(slice(arguments, 1));
- },
- "call": function(expr, args) {
- return [ this[0], walk(expr), MAP(args, walk) ];
- },
- "function": function(name, args, body) {
- return [ this[0], name, args.slice(), MAP(body, walk) ];
- },
- "defun": function(name, args, body) {
- return [ this[0], name, args.slice(), MAP(body, walk) ];
- },
- "if": function(conditional, t, e) {
- return [ this[0], walk(conditional), walk(t), walk(e) ];
- },
- "for": function(init, cond, step, block) {
- return [ this[0], walk(init), walk(cond), walk(step), walk(block) ];
- },
- "for-in": function(vvar, key, hash, block) {
- return [ this[0], walk(vvar), walk(key), walk(hash), walk(block) ];
- },
- "while": function(cond, block) {
- return [ this[0], walk(cond), walk(block) ];
- },
- "do": function(cond, block) {
- return [ this[0], walk(cond), walk(block) ];
- },
- "return": function(expr) {
- return [ this[0], walk(expr) ];
- },
- "binary": function(op, left, right) {
- return [ this[0], op, walk(left), walk(right) ];
- },
- "unary-prefix": function(op, expr) {
- return [ this[0], op, walk(expr) ];
- },
- "unary-postfix": function(op, expr) {
- return [ this[0], op, walk(expr) ];
- },
- "sub": function(expr, subscript) {
- return [ this[0], walk(expr), walk(subscript) ];
- },
- "object": function(props) {
- return [ this[0], MAP(props, function(p){
- return p.length == 2
- ? [ p[0], walk(p[1]) ]
- : [ p[0], walk(p[1]), p[2] ]; // get/set-ter
- }) ];
- },
- "regexp": function(rx, mods) {
- return [ this[0], rx, mods ];
- },
- "array": function(elements) {
- return [ this[0], MAP(elements, walk) ];
- },
- "stat": function(stat) {
- return [ this[0], walk(stat) ];
- },
- "seq": function() {
- return [ this[0] ].concat(MAP(slice(arguments), walk));
- },
- "label": function(name, block) {
- return [ this[0], name, walk(block) ];
- },
- "with": function(expr, block) {
- return [ this[0], walk(expr), walk(block) ];
- },
- "atom": function(name) {
- return [ this[0], name ];
- }
- };
-
- var user = {};
- var stack = [];
- function walk(ast) {
- if (ast == null)
- return null;
- try {
- stack.push(ast);
- var type = ast[0];
- var gen = user[type];
- if (gen) {
- var ret = gen.apply(ast, ast.slice(1));
- if (ret != null)
- return ret;
- }
- gen = walkers[type];
- return gen.apply(ast, ast.slice(1));
- } finally {
- stack.pop();
- }
- };
-
- function with_walkers(walkers, cont){
- var save = {}, i;
- for (i in walkers) if (HOP(walkers, i)) {
- save[i] = user[i];
- user[i] = walkers[i];
- }
- var ret = cont();
- for (i in save) if (HOP(save, i)) {
- if (!save[i]) delete user[i];
- else user[i] = save[i];
- }
- return ret;
- };
-
- return {
- walk: walk,
- with_walkers: with_walkers,
- parent: function() {
- return stack[stack.length - 2]; // last one is current node
- },
- stack: function() {
- return stack;
- }
- };
-};
-
-/* -----[ Scope and mangling ]----- */
-
-function Scope(parent) {
- this.names = {}; // names defined in this scope
- this.mangled = {}; // mangled names (orig.name => mangled)
- this.rev_mangled = {}; // reverse lookup (mangled => orig.name)
- this.cname = -1; // current mangled name
- this.refs = {}; // names referenced from this scope
- this.uses_with = false; // will become TRUE if with() is detected in this or any subscopes
- this.uses_eval = false; // will become TRUE if eval() is detected in this or any subscopes
- this.parent = parent; // parent scope
- this.children = []; // sub-scopes
- if (parent) {
- this.level = parent.level + 1;
- parent.children.push(this);
- } else {
- this.level = 0;
- }
-};
-
-var base54 = (function(){
- var DIGITS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$_";
- return function(num) {
- var ret = "";
- do {
- ret = DIGITS.charAt(num % 54) + ret;
- num = Math.floor(num / 54);
- } while (num > 0);
- return ret;
- };
-})();
-
-Scope.prototype = {
- has: function(name) {
- for (var s = this; s; s = s.parent)
- if (HOP(s.names, name))
- return s;
- },
- has_mangled: function(mname) {
- for (var s = this; s; s = s.parent)
- if (HOP(s.rev_mangled, mname))
- return s;
- },
- toJSON: function() {
- return {
- names: this.names,
- uses_eval: this.uses_eval,
- uses_with: this.uses_with
- };
- },
-
- next_mangled: function() {
- // we must be careful that the new mangled name:
- //
- // 1. doesn't shadow a mangled name from a parent
- // scope, unless we don't reference the original
- // name from this scope OR from any sub-scopes!
- // This will get slow.
- //
- // 2. doesn't shadow an original name from a parent
- // scope, in the event that the name is not mangled
- // in the parent scope and we reference that name
- // here OR IN ANY SUBSCOPES!
- //
- // 3. doesn't shadow a name that is referenced but not
- // defined (possibly global defined elsewhere).
- for (;;) {
- var m = base54(++this.cname), prior;
-
- // case 1.
- prior = this.has_mangled(m);
- if (prior && this.refs[prior.rev_mangled[m]] === prior)
- continue;
-
- // case 2.
- prior = this.has(m);
- if (prior && prior !== this && this.refs[m] === prior && !prior.has_mangled(m))
- continue;
-
- // case 3.
- if (HOP(this.refs, m) && this.refs[m] == null)
- continue;
-
- // I got "do" once. :-/
- if (!is_identifier(m))
- continue;
-
- return m;
- }
- },
- set_mangle: function(name, m) {
- this.rev_mangled[m] = name;
- return this.mangled[name] = m;
- },
- get_mangled: function(name, newMangle) {
- if (this.uses_eval || this.uses_with) return name; // no mangle if eval or with is in use
- var s = this.has(name);
- if (!s) return name; // not in visible scope, no mangle
- if (HOP(s.mangled, name)) return s.mangled[name]; // already mangled in this scope
- if (!newMangle) return name; // not found and no mangling requested
- return s.set_mangle(name, s.next_mangled());
- },
- define: function(name) {
- if (name != null)
- return this.names[name] = name;
- }
-};
-
-function ast_add_scope(ast) {
-
- var current_scope = null;
- var w = ast_walker(), walk = w.walk;
- var having_eval = [];
-
- function with_new_scope(cont) {
- current_scope = new Scope(current_scope);
- var ret = current_scope.body = cont();
- ret.scope = current_scope;
- current_scope = current_scope.parent;
- return ret;
- };
-
- function define(name) {
- return current_scope.define(name);
- };
-
- function reference(name) {
- current_scope.refs[name] = true;
- };
-
- function _lambda(name, args, body) {
- var is_defun = this[0] == "defun";
- return [ this[0], is_defun ? define(name) : name, args, with_new_scope(function(){
- if (!is_defun) define(name);
- MAP(args, define);
- return MAP(body, walk);
- })];
- };
-
- return with_new_scope(function(){
- // process AST
- var ret = w.with_walkers({
- "function": _lambda,
- "defun": _lambda,
- "with": function(expr, block) {
- for (var s = current_scope; s; s = s.parent)
- s.uses_with = true;
- },
- "var": function(defs) {
- MAP(defs, function(d){ define(d[0]) });
- },
- "const": function(defs) {
- MAP(defs, function(d){ define(d[0]) });
- },
- "try": function(t, c, f) {
- if (c != null) return [
- this[0],
- MAP(t, walk),
- [ define(c[0]), MAP(c[1], walk) ],
- f != null ? MAP(f, walk) : null
- ];
- },
- "name": function(name) {
- if (name == "eval")
- having_eval.push(current_scope);
- reference(name);
- }
- }, function(){
- return walk(ast);
- });
-
- // the reason why we need an additional pass here is
- // that names can be used prior to their definition.
-
- // scopes where eval was detected and their parents
- // are marked with uses_eval, unless they define the
- // "eval" name.
- MAP(having_eval, function(scope){
- if (!scope.has("eval")) while (scope) {
- scope.uses_eval = true;
- scope = scope.parent;
- }
- });
-
- // for referenced names it might be useful to know
- // their origin scope. current_scope here is the
- // toplevel one.
- function fixrefs(scope, i) {
- // do children first; order shouldn't matter
- for (i = scope.children.length; --i >= 0;)
- fixrefs(scope.children[i]);
- for (i in scope.refs) if (HOP(scope.refs, i)) {
- // find origin scope and propagate the reference to origin
- for (var origin = scope.has(i), s = scope; s; s = s.parent) {
- s.refs[i] = origin;
- if (s === origin) break;
- }
- }
- };
- fixrefs(current_scope);
-
- return ret;
- });
-
-};
-
-/* -----[ mangle names ]----- */
-
-function ast_mangle(ast, options) {
- var w = ast_walker(), walk = w.walk, scope;
- options = options || {};
-
- function get_mangled(name, newMangle) {
- if (!options.toplevel && !scope.parent) return name; // don't mangle toplevel
- if (options.except && member(name, options.except))
- return name;
- return scope.get_mangled(name, newMangle);
- };
-
- function get_define(name) {
- if (options.defines) {
- // we always lookup a defined symbol for the current scope FIRST, so declared
- // vars trump a DEFINE symbol, but if no such var is found, then match a DEFINE value
- if (!scope.has(name)) {
- if (HOP(options.defines, name)) {
- return options.defines[name];
- }
- }
- return null;
- }
- };
-
- function _lambda(name, args, body) {
- var is_defun = this[0] == "defun", extra;
- if (name) {
- if (is_defun) name = get_mangled(name);
- else {
- extra = {};
- if (!(scope.uses_eval || scope.uses_with))
- name = extra[name] = scope.next_mangled();
- else
- extra[name] = name;
- }
- }
- body = with_scope(body.scope, function(){
- args = MAP(args, function(name){ return get_mangled(name) });
- return MAP(body, walk);
- }, extra);
- return [ this[0], name, args, body ];
- };
-
- function with_scope(s, cont, extra) {
- var _scope = scope;
- scope = s;
- if (extra) for (var i in extra) if (HOP(extra, i)) {
- s.set_mangle(i, extra[i]);
- }
- for (var i in s.names) if (HOP(s.names, i)) {
- get_mangled(i, true);
- }
- var ret = cont();
- ret.scope = s;
- scope = _scope;
- return ret;
- };
-
- function _vardefs(defs) {
- return [ this[0], MAP(defs, function(d){
- return [ get_mangled(d[0]), walk(d[1]) ];
- }) ];
- };
-
- return w.with_walkers({
- "function": _lambda,
- "defun": function() {
- // move function declarations to the top when
- // they are not in some block.
- var ast = _lambda.apply(this, arguments);
- switch (w.parent()[0]) {
- case "toplevel":
- case "function":
- case "defun":
- return MAP.at_top(ast);
- }
- return ast;
- },
- "var": _vardefs,
- "const": _vardefs,
- "name": function(name) {
- return get_define(name) || [ this[0], get_mangled(name) ];
- },
- "try": function(t, c, f) {
- return [ this[0],
- MAP(t, walk),
- c != null ? [ get_mangled(c[0]), MAP(c[1], walk) ] : null,
- f != null ? MAP(f, walk) : null ];
- },
- "toplevel": function(body) {
- var self = this;
- return with_scope(self.scope, function(){
- return [ self[0], MAP(body, walk) ];
- });
- }
- }, function() {
- return walk(ast_add_scope(ast));
- });
-};
-
-/* -----[
- - compress foo["bar"] into foo.bar,
- - remove block brackets {} where possible
- - join consecutive var declarations
- - various optimizations for IFs:
- - if (cond) foo(); else bar(); ==> cond?foo():bar();
- - if (cond) foo(); ==> cond&&foo();
- - if (foo) return bar(); else return baz(); ==> return foo?bar():baz(); // also for throw
- - if (foo) return bar(); else something(); ==> {if(foo)return bar();something()}
- ]----- */
-
-var warn = function(){};
-
-function best_of(ast1, ast2) {
- return gen_code(ast1).length > gen_code(ast2[0] == "stat" ? ast2[1] : ast2).length ? ast2 : ast1;
-};
-
-function last_stat(b) {
- if (b[0] == "block" && b[1] && b[1].length > 0)
- return b[1][b[1].length - 1];
- return b;
-}
-
-function aborts(t) {
- if (t) {
- t = last_stat(t);
- if (t[0] == "return" || t[0] == "break" || t[0] == "continue" || t[0] == "throw")
- return true;
- }
-};
-
-function boolean_expr(expr) {
- return ( (expr[0] == "unary-prefix"
- && member(expr[1], [ "!", "delete" ])) ||
-
- (expr[0] == "binary"
- && member(expr[1], [ "in", "instanceof", "==", "!=", "===", "!==", "<", "<=", ">=", ">" ])) ||
-
- (expr[0] == "binary"
- && member(expr[1], [ "&&", "||" ])
- && boolean_expr(expr[2])
- && boolean_expr(expr[3])) ||
-
- (expr[0] == "conditional"
- && boolean_expr(expr[2])
- && boolean_expr(expr[3])) ||
-
- (expr[0] == "assign"
- && expr[1] === true
- && boolean_expr(expr[3])) ||
-
- (expr[0] == "seq"
- && boolean_expr(expr[expr.length - 1]))
- );
-};
-
-function make_conditional(c, t, e) {
- var make_real_conditional = function() {
- if (c[0] == "unary-prefix" && c[1] == "!") {
- return e ? [ "conditional", c[2], e, t ] : [ "binary", "||", c[2], t ];
- } else {
- return e ? [ "conditional", c, t, e ] : [ "binary", "&&", c, t ];
- }
- };
- // shortcut the conditional if the expression has a constant value
- return when_constant(c, function(ast, val){
- warn_unreachable(val ? e : t);
- return (val ? t : e);
- }, make_real_conditional);
-};
-
-function empty(b) {
- return !b || (b[0] == "block" && (!b[1] || b[1].length == 0));
-};
-
-function is_string(node) {
- return (node[0] == "string" ||
- node[0] == "unary-prefix" && node[1] == "typeof" ||
- node[0] == "binary" && node[1] == "+" &&
- (is_string(node[2]) || is_string(node[3])));
-};
-
-var when_constant = (function(){
-
- var $NOT_CONSTANT = {};
-
- // this can only evaluate constant expressions. If it finds anything
- // not constant, it throws $NOT_CONSTANT.
- function evaluate(expr) {
- switch (expr[0]) {
- case "string":
- case "num":
- return expr[1];
- case "name":
- case "atom":
- switch (expr[1]) {
- case "true": return true;
- case "false": return false;
- }
- break;
- case "unary-prefix":
- switch (expr[1]) {
- case "!": return !evaluate(expr[2]);
- case "typeof": return typeof evaluate(expr[2]);
- case "~": return ~evaluate(expr[2]);
- case "-": return -evaluate(expr[2]);
- case "+": return +evaluate(expr[2]);
- }
- break;
- case "binary":
- var left = expr[2], right = expr[3];
- switch (expr[1]) {
- case "&&" : return evaluate(left) && evaluate(right);
- case "||" : return evaluate(left) || evaluate(right);
- case "|" : return evaluate(left) | evaluate(right);
- case "&" : return evaluate(left) & evaluate(right);
- case "^" : return evaluate(left) ^ evaluate(right);
- case "+" : return evaluate(left) + evaluate(right);
- case "*" : return evaluate(left) * evaluate(right);
- case "/" : return evaluate(left) / evaluate(right);
- case "-" : return evaluate(left) - evaluate(right);
- case "<<" : return evaluate(left) << evaluate(right);
- case ">>" : return evaluate(left) >> evaluate(right);
- case ">>>" : return evaluate(left) >>> evaluate(right);
- case "==" : return evaluate(left) == evaluate(right);
- case "===" : return evaluate(left) === evaluate(right);
- case "!=" : return evaluate(left) != evaluate(right);
- case "!==" : return evaluate(left) !== evaluate(right);
- case "<" : return evaluate(left) < evaluate(right);
- case "<=" : return evaluate(left) <= evaluate(right);
- case ">" : return evaluate(left) > evaluate(right);
- case ">=" : return evaluate(left) >= evaluate(right);
- case "in" : return evaluate(left) in evaluate(right);
- case "instanceof" : return evaluate(left) instanceof evaluate(right);
- }
- }
- throw $NOT_CONSTANT;
- };
-
- return function(expr, yes, no) {
- try {
- var val = evaluate(expr), ast;
- switch (typeof val) {
- case "string": ast = [ "string", val ]; break;
- case "number": ast = [ "num", val ]; break;
- case "boolean": ast = [ "name", String(val) ]; break;
- default: throw new Error("Can't handle constant of type: " + (typeof val));
- }
- return yes.call(expr, ast, val);
- } catch(ex) {
- if (ex === $NOT_CONSTANT) {
- if (expr[0] == "binary"
- && (expr[1] == "===" || expr[1] == "!==")
- && ((is_string(expr[2]) && is_string(expr[3]))
- || (boolean_expr(expr[2]) && boolean_expr(expr[3])))) {
- expr[1] = expr[1].substr(0, 2);
- }
- else if (no && expr[0] == "binary"
- && (expr[1] == "||" || expr[1] == "&&")) {
- // the whole expression is not constant but the lval may be...
- try {
- var lval = evaluate(expr[2]);
- expr = ((expr[1] == "&&" && (lval ? expr[3] : lval)) ||
- (expr[1] == "||" && (lval ? lval : expr[3])) ||
- expr);
- } catch(ex2) {
- // IGNORE... lval is not constant
- }
- }
- return no ? no.call(expr, expr) : null;
- }
- else throw ex;
- }
- };
-
-})();
-
-function warn_unreachable(ast) {
- if (!empty(ast))
- warn("Dropping unreachable code: " + gen_code(ast, true));
-};
-
-function prepare_ifs(ast) {
- var w = ast_walker(), walk = w.walk;
- // In this first pass, we rewrite ifs which abort with no else with an
- // if-else. For example:
- //
- // if (x) {
- // blah();
- // return y;
- // }
- // foobar();
- //
- // is rewritten into:
- //
- // if (x) {
- // blah();
- // return y;
- // } else {
- // foobar();
- // }
- function redo_if(statements) {
- statements = MAP(statements, walk);
-
- for (var i = 0; i < statements.length; ++i) {
- var fi = statements[i];
- if (fi[0] != "if") continue;
-
- if (fi[3] && walk(fi[3])) continue;
-
- var t = walk(fi[2]);
- if (!aborts(t)) continue;
-
- var conditional = walk(fi[1]);
-
- var e_body = statements.slice(i + 1);
- var e;
- if (e_body.length == 1) e = e_body[0];
- else e = [ "block", e_body ];
-
- var ret = statements.slice(0, i).concat([ [
- fi[0], // "if"
- conditional, // conditional
- t, // then
- e // else
- ] ]);
-
- return redo_if(ret);
- }
-
- return statements;
- };
-
- function redo_if_lambda(name, args, body) {
- body = redo_if(body);
- return [ this[0], name, args.slice(), body ];
- };
-
- function redo_if_block(statements) {
- var out = [ this[0] ];
- if (statements != null)
- out.push(redo_if(statements));
- return out;
- };
-
- return w.with_walkers({
- "defun": redo_if_lambda,
- "function": redo_if_lambda,
- "block": redo_if_block,
- "splice": redo_if_block,
- "toplevel": function(statements) {
- return [ this[0], redo_if(statements) ];
- },
- "try": function(t, c, f) {
- return [
- this[0],
- redo_if(t),
- c != null ? [ c[0], redo_if(c[1]) ] : null,
- f != null ? redo_if(f) : null
- ];
- }
- }, function() {
- return walk(ast);
- });
-};
-
-function ast_squeeze(ast, options) {
- options = defaults(options, {
- make_seqs : true,
- dead_code : true,
- keep_comps : true,
- no_warnings : false
- });
-
- var w = ast_walker(), walk = w.walk, scope;
-
- function negate(c) {
- var not_c = [ "unary-prefix", "!", c ];
- switch (c[0]) {
- case "unary-prefix":
- return c[1] == "!" && boolean_expr(c[2]) ? c[2] : not_c;
- case "seq":
- c = slice(c);
- c[c.length - 1] = negate(c[c.length - 1]);
- return c;
- case "conditional":
- return best_of(not_c, [ "conditional", c[1], negate(c[2]), negate(c[3]) ]);
- case "binary":
- var op = c[1], left = c[2], right = c[3];
- if (!options.keep_comps) switch (op) {
- case "<=" : return [ "binary", ">", left, right ];
- case "<" : return [ "binary", ">=", left, right ];
- case ">=" : return [ "binary", "<", left, right ];
- case ">" : return [ "binary", "<=", left, right ];
- }
- switch (op) {
- case "==" : return [ "binary", "!=", left, right ];
- case "!=" : return [ "binary", "==", left, right ];
- case "===" : return [ "binary", "!==", left, right ];
- case "!==" : return [ "binary", "===", left, right ];
- case "&&" : return best_of(not_c, [ "binary", "||", negate(left), negate(right) ]);
- case "||" : return best_of(not_c, [ "binary", "&&", negate(left), negate(right) ]);
- }
- break;
- }
- return not_c;
- };
-
- function with_scope(s, cont) {
- var _scope = scope;
- scope = s;
- var ret = cont();
- ret.scope = s;
- scope = _scope;
- return ret;
- };
-
- function rmblock(block) {
- if (block != null && block[0] == "block" && block[1]) {
- if (block[1].length == 1)
- block = block[1][0];
- else if (block[1].length == 0)
- block = [ "block" ];
- }
- return block;
- };
-
- function _lambda(name, args, body) {
- var is_defun = this[0] == "defun";
- body = with_scope(body.scope, function(){
- var ret = tighten(MAP(body, walk), "lambda");
- if (!is_defun && name && !HOP(scope.refs, name))
- name = null;
- return ret;
- });
- return [ this[0], name, args, body ];
- };
-
- // we get here for blocks that have been already transformed.
- // this function does a few things:
- // 1. discard useless blocks
- // 2. join consecutive var declarations
- // 3. remove obviously dead code
- // 4. transform consecutive statements using the comma operator
- // 5. if block_type == "lambda" and it detects constructs like if(foo) return ... - rewrite like if (!foo) { ... }
- function tighten(statements, block_type) {
- statements = statements.reduce(function(a, stat){
- if (stat[0] == "block") {
- if (stat[1]) {
- a.push.apply(a, stat[1]);
- }
- } else {
- a.push(stat);
- }
- return a;
- }, []);
-
- statements = (function(a, prev){
- statements.forEach(function(cur){
- if (prev && ((cur[0] == "var" && prev[0] == "var") ||
- (cur[0] == "const" && prev[0] == "const"))) {
- prev[1] = prev[1].concat(cur[1]);
- } else {
- a.push(cur);
- prev = cur;
- }
- });
- return a;
- })([]);
-
- if (options.dead_code) statements = (function(a, has_quit){
- statements.forEach(function(st){
- if (has_quit) {
- if (member(st[0], [ "function", "defun" , "var", "const" ])) {
- a.push(st);
- }
- else if (!options.no_warnings)
- warn_unreachable(st);
- }
- else {
- a.push(st);
- if (member(st[0], [ "return", "throw", "break", "continue" ]))
- has_quit = true;
- }
- });
- return a;
- })([]);
-
- if (options.make_seqs) statements = (function(a, prev) {
- statements.forEach(function(cur){
- if (prev && prev[0] == "stat" && cur[0] == "stat") {
- prev[1] = [ "seq", prev[1], cur[1] ];
- } else {
- a.push(cur);
- prev = cur;
- }
- });
- return a;
- })([]);
-
- if (block_type == "lambda") statements = (function(i, a, stat){
- while (i < statements.length) {
- stat = statements[i++];
- if (stat[0] == "if" && !stat[3]) {
- if (stat[2][0] == "return" && stat[2][1] == null) {
- a.push(make_if(negate(stat[1]), [ "block", statements.slice(i) ]));
- break;
- }
- var last = last_stat(stat[2]);
- if (last[0] == "return" && last[1] == null) {
- a.push(make_if(stat[1], [ "block", stat[2][1].slice(0, -1) ], [ "block", statements.slice(i) ]));
- break;
- }
- }
- a.push(stat);
- }
- return a;
- })(0, []);
-
- return statements;
- };
-
- function make_if(c, t, e) {
- return when_constant(c, function(ast, val){
- if (val) {
- warn_unreachable(e);
- return t;
- } else {
- warn_unreachable(t);
- return e;
- }
- }, function() {
- return make_real_if(c, t, e);
- });
- };
-
- function make_real_if(c, t, e) {
- c = walk(c);
- t = walk(t);
- e = walk(e);
-
- if (empty(t)) {
- c = negate(c);
- t = e;
- e = null;
- } else if (empty(e)) {
- e = null;
- } else {
- // if we have both else and then, maybe it makes sense to switch them?
- (function(){
- var a = gen_code(c);
- var n = negate(c);
- var b = gen_code(n);
- if (b.length < a.length) {
- var tmp = t;
- t = e;
- e = tmp;
- c = n;
- }
- })();
- }
- if (empty(e) && empty(t))
- return [ "stat", c ];
- var ret = [ "if", c, t, e ];
- if (t[0] == "if" && empty(t[3]) && empty(e)) {
- ret = best_of(ret, walk([ "if", [ "binary", "&&", c, t[1] ], t[2] ]));
- }
- else if (t[0] == "stat") {
- if (e) {
- if (e[0] == "stat") {
- ret = best_of(ret, [ "stat", make_conditional(c, t[1], e[1]) ]);
- }
- }
- else {
- ret = best_of(ret, [ "stat", make_conditional(c, t[1]) ]);
- }
- }
- else if (e && t[0] == e[0] && (t[0] == "return" || t[0] == "throw") && t[1] && e[1]) {
- ret = best_of(ret, [ t[0], make_conditional(c, t[1], e[1] ) ]);
- }
- else if (e && aborts(t)) {
- ret = [ [ "if", c, t ] ];
- if (e[0] == "block") {
- if (e[1]) ret = ret.concat(e[1]);
- }
- else {
- ret.push(e);
- }
- ret = walk([ "block", ret ]);
- }
- else if (t && aborts(e)) {
- ret = [ [ "if", negate(c), e ] ];
- if (t[0] == "block") {
- if (t[1]) ret = ret.concat(t[1]);
- } else {
- ret.push(t);
- }
- ret = walk([ "block", ret ]);
- }
- return ret;
- };
-
- function _do_while(cond, body) {
- return when_constant(cond, function(cond, val){
- if (!val) {
- warn_unreachable(body);
- return [ "block" ];
- } else {
- return [ "for", null, null, null, walk(body) ];
- }
- });
- };
-
- ast = prepare_ifs(ast);
- ast = ast_add_scope(ast);
-
- return w.with_walkers({
- "sub": function(expr, subscript) {
- if (subscript[0] == "string") {
- var name = subscript[1];
- if (is_identifier(name))
- return [ "dot", walk(expr), name ];
- else if (/^[1-9][0-9]*$/.test(name) || name === "0")
- return [ "sub", walk(expr), [ "num", parseInt(name, 10) ] ];
- }
- },
- "if": make_if,
- "toplevel": function(body) {
- return [ "toplevel", with_scope(this.scope, function(){
- return tighten(MAP(body, walk));
- }) ];
- },
- "switch": function(expr, body) {
- var last = body.length - 1;
- return [ "switch", walk(expr), MAP(body, function(branch, i){
- var block = tighten(MAP(branch[1], walk));
- if (i == last && block.length > 0) {
- var node = block[block.length - 1];
- if (node[0] == "break" && !node[1])
- block.pop();
- }
- return [ branch[0] ? walk(branch[0]) : null, block ];
- }) ];
- },
- "function": _lambda,
- "defun": _lambda,
- "block": function(body) {
- if (body) return rmblock([ "block", tighten(MAP(body, walk)) ]);
- },
- "binary": function(op, left, right) {
- return when_constant([ "binary", op, walk(left), walk(right) ], function yes(c){
- return best_of(walk(c), this);
- }, function no() {
- return this;
- });
- },
- "conditional": function(c, t, e) {
- return make_conditional(walk(c), walk(t), walk(e));
- },
- "try": function(t, c, f) {
- return [
- "try",
- tighten(MAP(t, walk)),
- c != null ? [ c[0], tighten(MAP(c[1], walk)) ] : null,
- f != null ? tighten(MAP(f, walk)) : null
- ];
- },
- "unary-prefix": function(op, expr) {
- expr = walk(expr);
- var ret = [ "unary-prefix", op, expr ];
- if (op == "!")
- ret = best_of(ret, negate(expr));
- return when_constant(ret, function(ast, val){
- return walk(ast); // it's either true or false, so minifies to !0 or !1
- }, function() { return ret });
- },
- "name": function(name) {
- switch (name) {
- case "true": return [ "unary-prefix", "!", [ "num", 0 ]];
- case "false": return [ "unary-prefix", "!", [ "num", 1 ]];
- }
- },
- "new": function(ctor, args) {
- if (ctor[0] == "name" && ctor[1] == "Array" && !scope.has("Array")) {
- if (args.length != 1) {
- return [ "array", args ];
- } else {
- return [ "call", [ "name", "Array" ], args ];
- }
- }
- },
- "call": function(expr, args) {
- if (expr[0] == "name" && expr[1] == "Array" && args.length != 1 && !scope.has("Array")) {
- return [ "array", args ];
- }
- },
- "while": _do_while
- }, function() {
- return walk(ast);
- });
-};
-
-/* -----[ re-generate code from the AST ]----- */
-
-var DOT_CALL_NO_PARENS = jsp.array_to_hash([
- "name",
- "array",
- "object",
- "string",
- "dot",
- "sub",
- "call",
- "regexp"
-]);
-
-function make_string(str, ascii_only) {
- var dq = 0, sq = 0;
- str = str.replace(/[\\\b\f\n\r\t\x22\x27\u2028\u2029]/g, function(s){
- switch (s) {
- case "\\": return "\\\\";
- case "\b": return "\\b";
- case "\f": return "\\f";
- case "\n": return "\\n";
- case "\r": return "\\r";
- case "\t": return "\\t";
- case "\u2028": return "\\u2028";
- case "\u2029": return "\\u2029";
- case '"': ++dq; return '"';
- case "'": ++sq; return "'";
- }
- return s;
- });
- if (ascii_only) str = to_ascii(str);
- if (dq > sq) return "'" + str.replace(/\x27/g, "\\'") + "'";
- else return '"' + str.replace(/\x22/g, '\\"') + '"';
-};
-
-function to_ascii(str) {
- return str.replace(/[\u0080-\uffff]/g, function(ch) {
- var code = ch.charCodeAt(0).toString(16);
- while (code.length < 4) code = "0" + code;
- return "\\u" + code;
- });
-};
-
-var SPLICE_NEEDS_BRACKETS = jsp.array_to_hash([ "if", "while", "do", "for", "for-in", "with" ]);
-
-function gen_code(ast, options) {
- options = defaults(options, {
- indent_start : 0,
- indent_level : 4,
- quote_keys : false,
- space_colon : false,
- beautify : false,
- ascii_only : false,
- inline_script: false
- });
- var beautify = !!options.beautify;
- var indentation = 0,
- newline = beautify ? "\n" : "",
- space = beautify ? " " : "";
-
- function encode_string(str) {
- var ret = make_string(str, options.ascii_only);
- if (options.inline_script)
- ret = ret.replace(/<\x2fscript([>/\t\n\f\r ])/gi, "<\\/script$1");
- return ret;
- };
-
- function make_name(name) {
- name = name.toString();
- if (options.ascii_only)
- name = to_ascii(name);
- return name;
- };
-
- function indent(line) {
- if (line == null)
- line = "";
- if (beautify)
- line = repeat_string(" ", options.indent_start + indentation * options.indent_level) + line;
- return line;
- };
-
- function with_indent(cont, incr) {
- if (incr == null) incr = 1;
- indentation += incr;
- try { return cont.apply(null, slice(arguments, 1)); }
- finally { indentation -= incr; }
- };
-
- function add_spaces(a) {
- if (beautify)
- return a.join(" ");
- var b = [];
- for (var i = 0; i < a.length; ++i) {
- var next = a[i + 1];
- b.push(a[i]);
- if (next &&
- ((/[a-z0-9_\x24]$/i.test(a[i].toString()) && /^[a-z0-9_\x24]/i.test(next.toString())) ||
- (/[\+\-]$/.test(a[i].toString()) && /^[\+\-]/.test(next.toString())))) {
- b.push(" ");
- }
- }
- return b.join("");
- };
-
- function add_commas(a) {
- return a.join("," + space);
- };
-
- function parenthesize(expr) {
- var gen = make(expr);
- for (var i = 1; i < arguments.length; ++i) {
- var el = arguments[i];
- if ((el instanceof Function && el(expr)) || expr[0] == el)
- return "(" + gen + ")";
- }
- return gen;
- };
-
- function best_of(a) {
- if (a.length == 1) {
- return a[0];
- }
- if (a.length == 2) {
- var b = a[1];
- a = a[0];
- return a.length <= b.length ? a : b;
- }
- return best_of([ a[0], best_of(a.slice(1)) ]);
- };
-
- function needs_parens(expr) {
- if (expr[0] == "function" || expr[0] == "object") {
- // dot/call on a literal function requires the
- // function literal itself to be parenthesized
- // only if it's the first "thing" in a
- // statement. This means that the parent is
- // "stat", but it could also be a "seq" and
- // we're the first in this "seq" and the
- // parent is "stat", and so on. Messy stuff,
- // but it worths the trouble.
- var a = slice($stack), self = a.pop(), p = a.pop();
- while (p) {
- if (p[0] == "stat") return true;
- if (((p[0] == "seq" || p[0] == "call" || p[0] == "dot" || p[0] == "sub" || p[0] == "conditional") && p[1] === self) ||
- ((p[0] == "binary" || p[0] == "assign" || p[0] == "unary-postfix") && p[2] === self)) {
- self = p;
- p = a.pop();
- } else {
- return false;
- }
- }
- }
- return !HOP(DOT_CALL_NO_PARENS, expr[0]);
- };
-
- function make_num(num) {
- var str = num.toString(10), a = [ str.replace(/^0\./, ".") ], m;
- if (Math.floor(num) === num) {
- a.push("0x" + num.toString(16).toLowerCase(), // probably pointless
- "0" + num.toString(8)); // same.
- if ((m = /^(.*?)(0+)$/.exec(num))) {
- a.push(m[1] + "e" + m[2].length);
- }
- } else if ((m = /^0?\.(0+)(.*)$/.exec(num))) {
- a.push(m[2] + "e-" + (m[1].length + m[2].length),
- str.substr(str.indexOf(".")));
- }
- return best_of(a);
- };
-
- var generators = {
- "string": encode_string,
- "num": make_num,
- "name": make_name,
- "toplevel": function(statements) {
- return make_block_statements(statements)
- .join(newline + newline);
- },
- "splice": function(statements) {
- var parent = $stack[$stack.length - 2][0];
- if (HOP(SPLICE_NEEDS_BRACKETS, parent)) {
- // we need block brackets in this case
- return make_block.apply(this, arguments);
- } else {
- return MAP(make_block_statements(statements, true),
- function(line, i) {
- // the first line is already indented
- return i > 0 ? indent(line) : line;
- }).join(newline);
- }
- },
- "block": make_block,
- "var": function(defs) {
- return "var " + add_commas(MAP(defs, make_1vardef)) + ";";
- },
- "const": function(defs) {
- return "const " + add_commas(MAP(defs, make_1vardef)) + ";";
- },
- "try": function(tr, ca, fi) {
- var out = [ "try", make_block(tr) ];
- if (ca) out.push("catch", "(" + ca[0] + ")", make_block(ca[1]));
- if (fi) out.push("finally", make_block(fi));
- return add_spaces(out);
- },
- "throw": function(expr) {
- return add_spaces([ "throw", make(expr) ]) + ";";
- },
- "new": function(ctor, args) {
- args = args.length > 0 ? "(" + add_commas(MAP(args, make)) + ")" : "";
- return add_spaces([ "new", parenthesize(ctor, "seq", "binary", "conditional", "assign", function(expr){
- var w = ast_walker(), has_call = {};
- try {
- w.with_walkers({
- "call": function() { throw has_call },
- "function": function() { return this }
- }, function(){
- w.walk(expr);
- });
- } catch(ex) {
- if (ex === has_call)
- return true;
- throw ex;
- }
- }) + args ]);
- },
- "switch": function(expr, body) {
- return add_spaces([ "switch", "(" + make(expr) + ")", make_switch_block(body) ]);
- },
- "break": function(label) {
- var out = "break";
- if (label != null)
- out += " " + make_name(label);
- return out + ";";
- },
- "continue": function(label) {
- var out = "continue";
- if (label != null)
- out += " " + make_name(label);
- return out + ";";
- },
- "conditional": function(co, th, el) {
- return add_spaces([ parenthesize(co, "assign", "seq", "conditional"), "?",
- parenthesize(th, "seq"), ":",
- parenthesize(el, "seq") ]);
- },
- "assign": function(op, lvalue, rvalue) {
- if (op && op !== true) op += "=";
- else op = "=";
- return add_spaces([ make(lvalue), op, parenthesize(rvalue, "seq") ]);
- },
- "dot": function(expr) {
- var out = make(expr), i = 1;
- if (expr[0] == "num") {
- if (!/\./.test(expr[1]))
- out += ".";
- } else if (needs_parens(expr))
- out = "(" + out + ")";
- while (i < arguments.length)
- out += "." + make_name(arguments[i++]);
- return out;
- },
- "call": function(func, args) {
- var f = make(func);
- if (needs_parens(func))
- f = "(" + f + ")";
- return f + "(" + add_commas(MAP(args, function(expr){
- return parenthesize(expr, "seq");
- })) + ")";
- },
- "function": make_function,
- "defun": make_function,
- "if": function(co, th, el) {
- var out = [ "if", "(" + make(co) + ")", el ? make_then(th) : make(th) ];
- if (el) {
- out.push("else", make(el));
- }
- return add_spaces(out);
- },
- "for": function(init, cond, step, block) {
- var out = [ "for" ];
- init = (init != null ? make(init) : "").replace(/;*\s*$/, ";" + space);
- cond = (cond != null ? make(cond) : "").replace(/;*\s*$/, ";" + space);
- step = (step != null ? make(step) : "").replace(/;*\s*$/, "");
- var args = init + cond + step;
- if (args == "; ; ") args = ";;";
- out.push("(" + args + ")", make(block));
- return add_spaces(out);
- },
- "for-in": function(vvar, key, hash, block) {
- return add_spaces([ "for", "(" +
- (vvar ? make(vvar).replace(/;+$/, "") : make(key)),
- "in",
- make(hash) + ")", make(block) ]);
- },
- "while": function(condition, block) {
- return add_spaces([ "while", "(" + make(condition) + ")", make(block) ]);
- },
- "do": function(condition, block) {
- return add_spaces([ "do", make(block), "while", "(" + make(condition) + ")" ]) + ";";
- },
- "return": function(expr) {
- var out = [ "return" ];
- if (expr != null) out.push(make(expr));
- return add_spaces(out) + ";";
- },
- "binary": function(operator, lvalue, rvalue) {
- var left = make(lvalue), right = make(rvalue);
- // XXX: I'm pretty sure other cases will bite here.
- // we need to be smarter.
- // adding parens all the time is the safest bet.
- if (member(lvalue[0], [ "assign", "conditional", "seq" ]) ||
- lvalue[0] == "binary" && PRECEDENCE[operator] > PRECEDENCE[lvalue[1]]) {
- left = "(" + left + ")";
- }
- if (member(rvalue[0], [ "assign", "conditional", "seq" ]) ||
- rvalue[0] == "binary" && PRECEDENCE[operator] >= PRECEDENCE[rvalue[1]] &&
- !(rvalue[1] == operator && member(operator, [ "&&", "||", "*" ]))) {
- right = "(" + right + ")";
- }
- else if (!beautify && options.inline_script && (operator == "<" || operator == "<<")
- && rvalue[0] == "regexp" && /^script/i.test(rvalue[1])) {
- right = " " + right;
- }
- return add_spaces([ left, operator, right ]);
- },
- "unary-prefix": function(operator, expr) {
- var val = make(expr);
- if (!(expr[0] == "num" || (expr[0] == "unary-prefix" && !HOP(OPERATORS, operator + expr[1])) || !needs_parens(expr)))
- val = "(" + val + ")";
- return operator + (jsp.is_alphanumeric_char(operator.charAt(0)) ? " " : "") + val;
- },
- "unary-postfix": function(operator, expr) {
- var val = make(expr);
- if (!(expr[0] == "num" || (expr[0] == "unary-postfix" && !HOP(OPERATORS, operator + expr[1])) || !needs_parens(expr)))
- val = "(" + val + ")";
- return val + operator;
- },
- "sub": function(expr, subscript) {
- var hash = make(expr);
- if (needs_parens(expr))
- hash = "(" + hash + ")";
- return hash + "[" + make(subscript) + "]";
- },
- "object": function(props) {
- if (props.length == 0)
- return "{}";
- return "{" + newline + with_indent(function(){
- return MAP(props, function(p){
- if (p.length == 3) {
- // getter/setter. The name is in p[0], the arg.list in p[1][2], the
- // body in p[1][3] and type ("get" / "set") in p[2].
- return indent(make_function(p[0], p[1][2], p[1][3], p[2]));
- }
- var key = p[0], val = make(p[1]);
- if (options.quote_keys) {
- key = encode_string(key);
- } else if ((typeof key == "number" || !beautify && +key + "" == key)
- && parseFloat(key) >= 0) {
- key = make_num(+key);
- } else if (!is_identifier(key)) {
- key = encode_string(key);
- }
- return indent(add_spaces(beautify && options.space_colon
- ? [ key, ":", val ]
- : [ key + ":", val ]));
- }).join("," + newline);
- }) + newline + indent("}");
- },
- "regexp": function(rx, mods) {
- return "/" + rx + "/" + mods;
- },
- "array": function(elements) {
- if (elements.length == 0) return "[]";
- return add_spaces([ "[", add_commas(MAP(elements, function(el){
- if (!beautify && el[0] == "atom" && el[1] == "undefined") return "";
- return parenthesize(el, "seq");
- })), "]" ]);
- },
- "stat": function(stmt) {
- return make(stmt).replace(/;*\s*$/, ";");
- },
- "seq": function() {
- return add_commas(MAP(slice(arguments), make));
- },
- "label": function(name, block) {
- return add_spaces([ make_name(name), ":", make(block) ]);
- },
- "with": function(expr, block) {
- return add_spaces([ "with", "(" + make(expr) + ")", make(block) ]);
- },
- "atom": function(name) {
- return make_name(name);
- }
- };
-
- // The squeezer replaces "block"-s that contain only a single
- // statement with the statement itself; technically, the AST
- // is correct, but this can create problems when we output an
- // IF having an ELSE clause where the THEN clause ends in an
- // IF *without* an ELSE block (then the outer ELSE would refer
- // to the inner IF). This function checks for this case and
- // adds the block brackets if needed.
- function make_then(th) {
- if (th[0] == "do") {
- // https://github.com/mishoo/UglifyJS/issues/#issue/57
- // IE croaks with "syntax error" on code like this:
- // if (foo) do ... while(cond); else ...
- // we need block brackets around do/while
- return make([ "block", [ th ]]);
- }
- var b = th;
- while (true) {
- var type = b[0];
- if (type == "if") {
- if (!b[3])
- // no else, we must add the block
- return make([ "block", [ th ]]);
- b = b[3];
- }
- else if (type == "while" || type == "do") b = b[2];
- else if (type == "for" || type == "for-in") b = b[4];
- else break;
- }
- return make(th);
- };
-
- function make_function(name, args, body, keyword) {
- var out = keyword || "function";
- if (name) {
- out += " " + make_name(name);
- }
- out += "(" + add_commas(MAP(args, make_name)) + ")";
- return add_spaces([ out, make_block(body) ]);
- };
-
- function make_block_statements(statements, noindent) {
- for (var a = [], last = statements.length - 1, i = 0; i <= last; ++i) {
- var stat = statements[i];
- var code = make(stat);
- if (code != ";") {
- if (!beautify && i == last) {
- if ((stat[0] == "while" && empty(stat[2])) ||
- (member(stat[0], [ "for", "for-in"] ) && empty(stat[4])) ||
- (stat[0] == "if" && empty(stat[2]) && !stat[3]) ||
- (stat[0] == "if" && stat[3] && empty(stat[3]))) {
- code = code.replace(/;*\s*$/, ";");
- } else {
- code = code.replace(/;+\s*$/, "");
- }
- }
- a.push(code);
- }
- }
- return noindent ? a : MAP(a, indent);
- };
-
- function make_switch_block(body) {
- var n = body.length;
- if (n == 0) return "{}";
- return "{" + newline + MAP(body, function(branch, i){
- var has_body = branch[1].length > 0, code = with_indent(function(){
- return indent(branch[0]
- ? add_spaces([ "case", make(branch[0]) + ":" ])
- : "default:");
- }, 0.5) + (has_body ? newline + with_indent(function(){
- return make_block_statements(branch[1]).join(newline);
- }) : "");
- if (!beautify && has_body && i < n - 1)
- code += ";";
- return code;
- }).join(newline) + newline + indent("}");
- };
-
- function make_block(statements) {
- if (!statements) return ";";
- if (statements.length == 0) return "{}";
- return "{" + newline + with_indent(function(){
- return make_block_statements(statements).join(newline);
- }) + newline + indent("}");
- };
-
- function make_1vardef(def) {
- var name = def[0], val = def[1];
- if (val != null)
- name = add_spaces([ make_name(name), "=", parenthesize(val, "seq") ]);
- return name;
- };
-
- var $stack = [];
-
- function make(node) {
- var type = node[0];
- var gen = generators[type];
- if (!gen)
- throw new Error("Can't find generator for \"" + type + "\"");
- $stack.push(node);
- var ret = gen.apply(type, node.slice(1));
- $stack.pop();
- return ret;
- };
-
- return make(ast);
-};
-
-function split_lines(code, max_line_length) {
- var splits = [ 0 ];
- jsp.parse(function(){
- var next_token = jsp.tokenizer(code);
- var last_split = 0;
- var prev_token;
- function current_length(tok) {
- return tok.pos - last_split;
- };
- function split_here(tok) {
- last_split = tok.pos;
- splits.push(last_split);
- };
- function custom(){
- var tok = next_token.apply(this, arguments);
- out: {
- if (prev_token) {
- if (prev_token.type == "keyword") break out;
- }
- if (current_length(tok) > max_line_length) {
- switch (tok.type) {
- case "keyword":
- case "atom":
- case "name":
- case "punc":
- split_here(tok);
- break out;
- }
- }
- }
- prev_token = tok;
- return tok;
- };
- custom.context = function() {
- return next_token.context.apply(this, arguments);
- };
- return custom;
- }());
- return splits.map(function(pos, i){
- return code.substring(pos, splits[i + 1] || code.length);
- }).join("\n");
-};
-
-/* -----[ Utilities ]----- */
-
-function repeat_string(str, i) {
- if (i <= 0) return "";
- if (i == 1) return str;
- var d = repeat_string(str, i >> 1);
- d += d;
- if (i & 1) d += str;
- return d;
-};
-
-function defaults(args, defs) {
- var ret = {};
- if (args === true)
- args = {};
- for (var i in defs) if (HOP(defs, i)) {
- ret[i] = (args && HOP(args, i)) ? args[i] : defs[i];
- }
- return ret;
-};
-
-function is_identifier(name) {
- return /^[a-z_$][a-z0-9_$]*$/i.test(name)
- && name != "this"
- && !HOP(jsp.KEYWORDS_ATOM, name)
- && !HOP(jsp.RESERVED_WORDS, name)
- && !HOP(jsp.KEYWORDS, name);
-};
-
-function HOP(obj, prop) {
- return Object.prototype.hasOwnProperty.call(obj, prop);
-};
-
-// some utilities
-
-var MAP;
-
-(function(){
- MAP = function(a, f, o) {
- var ret = [];
- for (var i = 0; i < a.length; ++i) {
- var val = f.call(o, a[i], i);
- if (val instanceof AtTop) ret.unshift(val.v);
- else ret.push(val);
- }
- return ret;
- };
- MAP.at_top = function(val) { return new AtTop(val) };
- function AtTop(val) { this.v = val };
-})();
-
-/* -----[ Exports ]----- */
-
-exports.ast_walker = ast_walker;
-exports.ast_mangle = ast_mangle;
-exports.ast_squeeze = ast_squeeze;
-exports.gen_code = gen_code;
-exports.ast_add_scope = ast_add_scope;
-exports.set_logger = function(logger) { warn = logger };
-exports.make_string = make_string;
-exports.split_lines = split_lines;
-exports.MAP = MAP;
-
-// keep this last!
-exports.ast_squeeze_more = require("./squeeze-more").ast_squeeze_more;
diff --git a/node/node_modules/___uglify-js.npm/package/lib/squeeze-more.js b/node/node_modules/___uglify-js.npm/package/lib/squeeze-more.js
deleted file mode 100644
index 12380af..0000000
--- a/node/node_modules/___uglify-js.npm/package/lib/squeeze-more.js
+++ /dev/null
@@ -1,22 +0,0 @@
-var jsp = require("./parse-js"),
- pro = require("./process"),
- slice = jsp.slice,
- member = jsp.member,
- PRECEDENCE = jsp.PRECEDENCE,
- OPERATORS = jsp.OPERATORS;
-
-function ast_squeeze_more(ast) {
- var w = pro.ast_walker(), walk = w.walk;
- return w.with_walkers({
- "call": function(expr, args) {
- if (expr[0] == "dot" && expr[2] == "toString" && args.length == 0) {
- // foo.toString() ==> foo+""
- return [ "binary", "+", expr[1], [ "string", "" ]];
- }
- }
- }, function() {
- return walk(ast);
- });
-};
-
-exports.ast_squeeze_more = ast_squeeze_more;
diff --git a/node/node_modules/___uglify-js.npm/package/package.json b/node/node_modules/___uglify-js.npm/package/package.json
deleted file mode 100644
index 49eaddc..0000000
--- a/node/node_modules/___uglify-js.npm/package/package.json
+++ /dev/null
@@ -1,22 +0,0 @@
-{
- "name" : "uglify-js",
-
- "author" : {
- "name" : "Mihai Bazon",
- "email" : "mihai.bazon@gmail.com",
- "url" : "http://mihai.bazon.net/blog"
- },
-
- "version" : "1.0.6",
-
- "main" : "./uglify-js.js",
-
- "bin" : {
- "uglifyjs" : "./bin/uglifyjs"
- },
-
- "repository": {
- "type": "git",
- "url": "git@github.com:mishoo/UglifyJS.git"
- }
-}
diff --git a/node/node_modules/___uglify-js.npm/package/test/beautify.js b/node/node_modules/___uglify-js.npm/package/test/beautify.js
deleted file mode 100644
index f19369e..0000000
--- a/node/node_modules/___uglify-js.npm/package/test/beautify.js
+++ /dev/null
@@ -1,28 +0,0 @@
-#! /usr/bin/env node
-
-global.sys = require("sys");
-var fs = require("fs");
-
-var jsp = require("../lib/parse-js");
-var pro = require("../lib/process");
-
-var filename = process.argv[2];
-fs.readFile(filename, "utf8", function(err, text){
- try {
- var ast = time_it("parse", function(){ return jsp.parse(text); });
- ast = time_it("mangle", function(){ return pro.ast_mangle(ast); });
- ast = time_it("squeeze", function(){ return pro.ast_squeeze(ast); });
- var gen = time_it("generate", function(){ return pro.gen_code(ast, false); });
- sys.puts(gen);
- } catch(ex) {
- sys.debug(ex.stack);
- sys.debug(sys.inspect(ex));
- sys.debug(JSON.stringify(ex));
- }
-});
-
-function time_it(name, cont) {
- var t1 = new Date().getTime();
- try { return cont(); }
- finally { sys.debug("// " + name + ": " + ((new Date().getTime() - t1) / 1000).toFixed(3) + " sec."); }
-};
diff --git a/node/node_modules/___uglify-js.npm/package/test/testparser.js b/node/node_modules/___uglify-js.npm/package/test/testparser.js
deleted file mode 100644
index c16d9a3..0000000
--- a/node/node_modules/___uglify-js.npm/package/test/testparser.js
+++ /dev/null
@@ -1,402 +0,0 @@
-#! /usr/bin/env node
-
-var parseJS = require("../lib/parse-js");
-var sys = require("sys");
-
-// write debug in a very straightforward manner
-var debug = function(){
- sys.log(Array.prototype.slice.call(arguments).join(', '));
-};
-
-ParserTestSuite(function(i, input, desc){
- try {
- parseJS.parse(input);
- debug("ok " + i + ": " + desc);
- } catch(e){
- debug("FAIL " + i + " " + desc + " (" + e + ")");
- }
-});
-
-function ParserTestSuite(callback){
- var inps = [
- ["var abc;", "Regular variable statement w/o assignment"],
- ["var abc = 5;", "Regular variable statement with assignment"],
- ["/* */;", "Multiline comment"],
- ['/** **/;', 'Double star multiline comment'],
- ["var f = function(){;};", "Function expression in var assignment"],
- ['hi; // moo\n;', 'single line comment'],
- ['var varwithfunction;', 'Dont match keywords as substrings'], // difference between `var withsomevar` and `"str"` (local search and lits)
- ['a + b;', 'addition'],
- ["'a';", 'single string literal'],
- ["'a\\n';", 'single string literal with escaped return'],
- ['"a";', 'double string literal'],
- ['"a\\n";', 'double string literal with escaped return'],
- ['"var";', 'string is a keyword'],
- ['"variable";', 'string starts with a keyword'],
- ['"somevariable";', 'string contains a keyword'],
- ['"somevar";', 'string ends with a keyword'],
- ['500;', 'int literal'],
- ['500.;', 'float literal w/o decimals'],
- ['500.432;', 'float literal with decimals'],
- ['.432432;', 'float literal w/o int'],
- ['(a,b,c);', 'parens and comma'],
- ['[1,2,abc];', 'array literal'],
- ['var o = {a:1};', 'object literal unquoted key'],
- ['var o = {"b":2};', 'object literal quoted key'], // opening curly may not be at the start of a statement...
- ['var o = {c:c};', 'object literal keyname is identifier'],
- ['var o = {a:1,"b":2,c:c};', 'object literal combinations'],
- ['var x;\nvar y;', 'two lines'],
- ['var x;\nfunction n(){; }', 'function def'],
- ['var x;\nfunction n(abc){; }', 'function def with arg'],
- ['var x;\nfunction n(abc, def){ ;}', 'function def with args'],
- ['function n(){ "hello"; }', 'function def with body'],
- ['/a/;', 'regex literal'],
- ['/a/b;', 'regex literal with flag'],
- ['/a/ / /b/;', 'regex div regex'],
- ['a/b/c;', 'triple division looks like regex'],
- ['+function(){/regex/;};', 'regex at start of function body'],
- // http://code.google.com/p/es-lab/source/browse/trunk/tests/parser/parsertests.js?r=86
- // http://code.google.com/p/es-lab/source/browse/trunk/tests/parser/parsertests.js?r=430
-
- // first tests for the lexer, should also parse as program (when you append a semi)
-
- // comments
- ['//foo!@#^&$1234\nbar;', 'single line comment'],
- ['/* abcd!@#@$* { } && null*/;', 'single line multi line comment'],
- ['/*foo\nbar*/;','multi line comment'],
- ['/*x*x*/;','multi line comment with *'],
- ['/**/;','empty comment'],
- // identifiers
- ["x;",'1 identifier'],
- ["_x;",'2 identifier'],
- ["xyz;",'3 identifier'],
- ["$x;",'4 identifier'],
- ["x$;",'5 identifier'],
- ["_;",'6 identifier'],
- ["x5;",'7 identifier'],
- ["x_y;",'8 identifier'],
- ["x+5;",'9 identifier'],
- ["xyz123;",'10 identifier'],
- ["x1y1z1;",'11 identifier'],
- ["foo\\u00D8bar;",'12 identifier unicode escape'],
- //["foo�bar;",'13 identifier unicode embedded (might fail)'],
- // numbers
- ["5;", '1 number'],
- ["5.5;", '2 number'],
- ["0;", '3 number'],
- ["0.0;", '4 number'],
- ["0.001;", '5 number'],
- ["1.e2;", '6 number'],
- ["1.e-2;", '7 number'],
- ["1.E2;", '8 number'],
- ["1.E-2;", '9 number'],
- [".5;", '10 number'],
- [".5e3;", '11 number'],
- [".5e-3;", '12 number'],
- ["0.5e3;", '13 number'],
- ["55;", '14 number'],
- ["123;", '15 number'],
- ["55.55;", '16 number'],
- ["55.55e10;", '17 number'],
- ["123.456;", '18 number'],
- ["1+e;", '20 number'],
- ["0x01;", '22 number'],
- ["0XCAFE;", '23 number'],
- ["0x12345678;", '24 number'],
- ["0x1234ABCD;", '25 number'],
- ["0x0001;", '26 number'],
- // strings
- ["\"foo\";", '1 string'],
- ["\'foo\';", '2 string'],
- ["\"x\";", '3 string'],
- ["\'\';", '4 string'],
- ["\"foo\\tbar\";", '5 string'],
- ["\"!@#$%^&*()_+{}[]\";", '6 string'],
- ["\"/*test*/\";", '7 string'],
- ["\"//test\";", '8 string'],
- ["\"\\\\\";", '9 string'],
- ["\"\\u0001\";", '10 string'],
- ["\"\\uFEFF\";", '11 string'],
- ["\"\\u10002\";", '12 string'],
- ["\"\\x55\";", '13 string'],
- ["\"\\x55a\";", '14 string'],
- ["\"a\\\\nb\";", '15 string'],
- ['";"', '16 string: semi in a string'],
- ['"a\\\nb";', '17 string: line terminator escape'],
- // literals
- ["null;", "null"],
- ["true;", "true"],
- ["false;", "false"],
- // regex
- ["/a/;", "1 regex"],
- ["/abc/;", "2 regex"],
- ["/abc[a-z]*def/g;", "3 regex"],
- ["/\\b/;", "4 regex"],
- ["/[a-zA-Z]/;", "5 regex"],
-
- // program tests (for as far as they havent been covered above)
-
- // regexp
- ["/foo(.*)/g;", "another regexp"],
- // arrays
- ["[];", "1 array"],
- ["[ ];", "2 array"],
- ["[1];", "3 array"],
- ["[1,2];", "4 array"],
- ["[1,2,,];", "5 array"],
- ["[1,2,3];", "6 array"],
- ["[1,2,3,,,];", "7 array"],
- // objects
- ["{};", "1 object"],
- ["({x:5});", "2 object"],
- ["({x:5,y:6});", "3 object"],
- ["({x:5,});", "4 object"],
- ["({if:5});", "5 object"],
- ["({ get x() {42;} });", "6 object"],
- ["({ set y(a) {1;} });", "7 object"],
- // member expression
- ["o.m;", "1 member expression"],
- ["o['m'];", "2 member expression"],
- ["o['n']['m'];", "3 member expression"],
- ["o.n.m;", "4 member expression"],
- ["o.if;", "5 member expression"],
- // call and invoke expressions
- ["f();", "1 call/invoke expression"],
- ["f(x);", "2 call/invoke expression"],
- ["f(x,y);", "3 call/invoke expression"],
- ["o.m();", "4 call/invoke expression"],
- ["o['m'];", "5 call/invoke expression"],
- ["o.m(x);", "6 call/invoke expression"],
- ["o['m'](x);", "7 call/invoke expression"],
- ["o.m(x,y);", "8 call/invoke expression"],
- ["o['m'](x,y);", "9 call/invoke expression"],
- ["f(x)(y);", "10 call/invoke expression"],
- ["f().x;", "11 call/invoke expression"],
-
- // eval
- ["eval('x');", "1 eval"],
- ["(eval)('x');", "2 eval"],
- ["(1,eval)('x');", "3 eval"],
- ["eval(x,y);", "4 eval"],
- // new expression
- ["new f();", "1 new expression"],
- ["new o;", "2 new expression"],
- ["new o.m;", "3 new expression"],
- ["new o.m(x);", "4 new expression"],
- ["new o.m(x,y);", "5 new expression"],
- // prefix/postfix
- ["++x;", "1 pre/postfix"],
- ["x++;", "2 pre/postfix"],
- ["--x;", "3 pre/postfix"],
- ["x--;", "4 pre/postfix"],
- ["x ++;", "5 pre/postfix"],
- ["x /* comment */ ++;", "6 pre/postfix"],
- ["++ /* comment */ x;", "7 pre/postfix"],
- // unary operators
- ["delete x;", "1 unary operator"],
- ["void x;", "2 unary operator"],
- ["+ x;", "3 unary operator"],
- ["-x;", "4 unary operator"],
- ["~x;", "5 unary operator"],
- ["!x;", "6 unary operator"],
- // meh
- ["new Date++;", "new date ++"],
- ["+x++;", " + x ++"],
- // expression expressions
- ["1 * 2;", "1 expression expressions"],
- ["1 / 2;", "2 expression expressions"],
- ["1 % 2;", "3 expression expressions"],
- ["1 + 2;", "4 expression expressions"],
- ["1 - 2;", "5 expression expressions"],
- ["1 << 2;", "6 expression expressions"],
- ["1 >>> 2;", "7 expression expressions"],
- ["1 >> 2;", "8 expression expressions"],
- ["1 * 2 + 3;", "9 expression expressions"],
- ["(1+2)*3;", "10 expression expressions"],
- ["1*(2+3);", "11 expression expressions"],
- ["xy;", "13 expression expressions"],
- ["x<=y;", "14 expression expressions"],
- ["x>=y;", "15 expression expressions"],
- ["x instanceof y;", "16 expression expressions"],
- ["x in y;", "17 expression expressions"],
- ["x&y;", "18 expression expressions"],
- ["x^y;", "19 expression expressions"],
- ["x|y;", "20 expression expressions"],
- ["x+y>>= y;", "1 assignment"],
- ["x <<= y;", "2 assignment"],
- ["x = y;", "3 assignment"],
- ["x += y;", "4 assignment"],
- ["x /= y;", "5 assignment"],
- // comma
- ["x, y;", "comma"],
- // block
- ["{};", "1 block"],
- ["{x;};", "2 block"],
- ["{x;y;};", "3 block"],
- // vars
- ["var x;", "1 var"],
- ["var x,y;", "2 var"],
- ["var x=1,y=2;", "3 var"],
- ["var x,y=2;", "4 var"],
- // empty
- [";", "1 empty"],
- ["\n;", "2 empty"],
- // expression statement
- ["x;", "1 expression statement"],
- ["5;", "2 expression statement"],
- ["1+2;", "3 expression statement"],
- // if
- ["if (c) x; else y;", "1 if statement"],
- ["if (c) x;", "2 if statement"],
- ["if (c) {} else {};", "3 if statement"],
- ["if (c1) if (c2) s1; else s2;", "4 if statement"],
- // while
- ["do s; while (e);", "1 while statement"],
- ["do { s; } while (e);", "2 while statement"],
- ["while (e) s;", "3 while statement"],
- ["while (e) { s; };", "4 while statement"],
- // for
- ["for (;;) ;", "1 for statement"],
- ["for (;c;x++) x;", "2 for statement"],
- ["for (i;i> 1;
-var c = 8 >>> 1;
\ No newline at end of file
diff --git a/node/node_modules/___uglify-js.npm/package/test/unit/compress/test/issue34.js b/node/node_modules/___uglify-js.npm/package/test/unit/compress/test/issue34.js
deleted file mode 100644
index 022f7a3..0000000
--- a/node/node_modules/___uglify-js.npm/package/test/unit/compress/test/issue34.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var a = {};
-a["this"] = 1;
-a["that"] = 2;
\ No newline at end of file
diff --git a/node/node_modules/___uglify-js.npm/package/test/unit/compress/test/issue4.js b/node/node_modules/___uglify-js.npm/package/test/unit/compress/test/issue4.js
deleted file mode 100644
index 0b76103..0000000
--- a/node/node_modules/___uglify-js.npm/package/test/unit/compress/test/issue4.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var a = 2e3;
-var b = 2e-3;
-var c = 2e-5;
\ No newline at end of file
diff --git a/node/node_modules/___uglify-js.npm/package/test/unit/compress/test/issue48.js b/node/node_modules/___uglify-js.npm/package/test/unit/compress/test/issue48.js
deleted file mode 100644
index 031e85b..0000000
--- a/node/node_modules/___uglify-js.npm/package/test/unit/compress/test/issue48.js
+++ /dev/null
@@ -1 +0,0 @@
-var s, i; s = ''; i = 0;
\ No newline at end of file
diff --git a/node/node_modules/___uglify-js.npm/package/test/unit/compress/test/issue50.js b/node/node_modules/___uglify-js.npm/package/test/unit/compress/test/issue50.js
deleted file mode 100644
index 060f9df..0000000
--- a/node/node_modules/___uglify-js.npm/package/test/unit/compress/test/issue50.js
+++ /dev/null
@@ -1,9 +0,0 @@
-function bar(a) {
- try {
- foo();
- } catch(e) {
- alert("Exception caught (foo not defined)");
- }
- alert(a); // 10 in FF, "[object Error]" in IE
-}
-bar(10);
diff --git a/node/node_modules/___uglify-js.npm/package/test/unit/compress/test/issue53.js b/node/node_modules/___uglify-js.npm/package/test/unit/compress/test/issue53.js
deleted file mode 100644
index 4f8b32f..0000000
--- a/node/node_modules/___uglify-js.npm/package/test/unit/compress/test/issue53.js
+++ /dev/null
@@ -1 +0,0 @@
-x = (y, z)
diff --git a/node/node_modules/___uglify-js.npm/package/test/unit/compress/test/issue54.1.js b/node/node_modules/___uglify-js.npm/package/test/unit/compress/test/issue54.1.js
deleted file mode 100644
index 967052e..0000000
--- a/node/node_modules/___uglify-js.npm/package/test/unit/compress/test/issue54.1.js
+++ /dev/null
@@ -1,3 +0,0 @@
-foo.toString();
-a.toString(16);
-b.toString.call(c);
diff --git a/node/node_modules/___uglify-js.npm/package/test/unit/compress/test/issue68.js b/node/node_modules/___uglify-js.npm/package/test/unit/compress/test/issue68.js
deleted file mode 100644
index 14054d0..0000000
--- a/node/node_modules/___uglify-js.npm/package/test/unit/compress/test/issue68.js
+++ /dev/null
@@ -1,5 +0,0 @@
-function f() {
- if (a) return;
- g();
- function g(){}
-};
diff --git a/node/node_modules/___uglify-js.npm/package/test/unit/compress/test/issue69.js b/node/node_modules/___uglify-js.npm/package/test/unit/compress/test/issue69.js
deleted file mode 100644
index d25ecd6..0000000
--- a/node/node_modules/___uglify-js.npm/package/test/unit/compress/test/issue69.js
+++ /dev/null
@@ -1 +0,0 @@
-[(a,b)]
diff --git a/node/node_modules/___uglify-js.npm/package/test/unit/compress/test/issue9.js b/node/node_modules/___uglify-js.npm/package/test/unit/compress/test/issue9.js
deleted file mode 100644
index 6158861..0000000
--- a/node/node_modules/___uglify-js.npm/package/test/unit/compress/test/issue9.js
+++ /dev/null
@@ -1,4 +0,0 @@
-var a = {
- a: 1,
- b: 2, // <-- trailing comma
-};
diff --git a/node/node_modules/___uglify-js.npm/package/test/unit/compress/test/mangle.js b/node/node_modules/___uglify-js.npm/package/test/unit/compress/test/mangle.js
deleted file mode 100644
index c271a26..0000000
--- a/node/node_modules/___uglify-js.npm/package/test/unit/compress/test/mangle.js
+++ /dev/null
@@ -1,5 +0,0 @@
-(function() {
- var x = function fun(a, fun, b) {
- return fun;
- };
-}());
diff --git a/node/node_modules/___uglify-js.npm/package/test/unit/compress/test/strict-equals.js b/node/node_modules/___uglify-js.npm/package/test/unit/compress/test/strict-equals.js
deleted file mode 100644
index b631f4c..0000000
--- a/node/node_modules/___uglify-js.npm/package/test/unit/compress/test/strict-equals.js
+++ /dev/null
@@ -1,3 +0,0 @@
-typeof a === 'string'
-b + "" !== c + ""
-d < e === f < g
diff --git a/node/node_modules/___uglify-js.npm/package/test/unit/compress/test/var.js b/node/node_modules/___uglify-js.npm/package/test/unit/compress/test/var.js
deleted file mode 100644
index 609a35d..0000000
--- a/node/node_modules/___uglify-js.npm/package/test/unit/compress/test/var.js
+++ /dev/null
@@ -1,3 +0,0 @@
-// var declarations after each other should be combined
-var a = 1;
-var b = 2;
\ No newline at end of file
diff --git a/node/node_modules/___uglify-js.npm/package/test/unit/compress/test/with.js b/node/node_modules/___uglify-js.npm/package/test/unit/compress/test/with.js
deleted file mode 100644
index de266ed..0000000
--- a/node/node_modules/___uglify-js.npm/package/test/unit/compress/test/with.js
+++ /dev/null
@@ -1,2 +0,0 @@
-with({}) {
-};
diff --git a/node/node_modules/___uglify-js.npm/package/test/unit/scripts.js b/node/node_modules/___uglify-js.npm/package/test/unit/scripts.js
deleted file mode 100644
index 5d1f526..0000000
--- a/node/node_modules/___uglify-js.npm/package/test/unit/scripts.js
+++ /dev/null
@@ -1,55 +0,0 @@
-var fs = require('fs'),
- uglify = require('uglify-js'),
- jsp = uglify.parser,
- nodeunit = require('nodeunit'),
- path = require('path'),
- pro = uglify.uglify;
-
-var Script = process.binding('evals').Script;
-
-var scriptsPath = __dirname;
-
-function compress(code) {
- var ast = jsp.parse(code);
- ast = pro.ast_mangle(ast);
- ast = pro.ast_squeeze(ast, {no_warnings: true, extra: true});
- ast = pro.ast_squeeze_more(ast);
- return pro.gen_code(ast);
-};
-
-var testDir = path.join(scriptsPath, "compress", "test");
-var expectedDir = path.join(scriptsPath, "compress", "expected");
-
-function getTester(script) {
- return function(test) {
- var testPath = path.join(testDir, script);
- var expectedPath = path.join(expectedDir, script);
- var content = fs.readFileSync(testPath, 'utf-8');
- var outputCompress = compress(content);
-
- // Check if the noncompressdata is larger or same size as the compressed data
- test.ok(content.length >= outputCompress.length);
-
- // Check that a recompress gives the same result
- var outputReCompress = compress(content);
- test.equal(outputCompress, outputReCompress);
-
- // Check if the compressed output is what is expected
- var expected = fs.readFileSync(expectedPath, 'utf-8');
- test.equal(outputCompress, expected.replace(/(\r?\n)+$/, ""));
-
- test.done();
- };
-};
-
-var tests = {};
-
-var scripts = fs.readdirSync(testDir);
-for (var i in scripts) {
- var script = scripts[i];
- if (/\.js$/.test(script)) {
- tests[script] = getTester(script);
- }
-}
-
-module.exports = nodeunit.testCase(tests);
diff --git a/node/node_modules/___uglify-js.npm/package/tmp/instrument.js b/node/node_modules/___uglify-js.npm/package/tmp/instrument.js
deleted file mode 100644
index c6a9d79..0000000
--- a/node/node_modules/___uglify-js.npm/package/tmp/instrument.js
+++ /dev/null
@@ -1,97 +0,0 @@
-// sample on how to use the parser and walker API to instrument some code
-
-var jsp = require("uglify-js").parser;
-var pro = require("uglify-js").uglify;
-
-function instrument(code) {
- var ast = jsp.parse(code, false, true); // true for the third arg specifies that we want
- // to have start/end tokens embedded in the
- // statements
- var w = pro.ast_walker();
-
- // we're gonna need this to push elements that we're currently looking at, to avoid
- // endless recursion.
- var analyzing = [];
- function do_stat() {
- var ret;
- if (this[0].start && analyzing.indexOf(this) < 0) {
- // without the `analyzing' hack, w.walk(this) would re-enter here leading
- // to infinite recursion
- analyzing.push(this);
- ret = [ "splice", // XXX: "block" is safer
- [ [ "stat",
- [ "call", [ "name", "trace" ],
- [ [ "string", this[0].toString() ],
- [ "num", this[0].start.line ],
- [ "num", this[0].start.col ],
- [ "num", this[0].end.line ],
- [ "num", this[0].end.col ]]]],
- w.walk(this) ]];
- analyzing.pop(this);
- }
- return ret;
- };
- var new_ast = w.with_walkers({
- "stat" : do_stat,
- "label" : do_stat,
- "break" : do_stat,
- "continue" : do_stat,
- "debugger" : do_stat,
- "var" : do_stat,
- "const" : do_stat,
- "return" : do_stat,
- "throw" : do_stat,
- "try" : do_stat,
- "defun" : do_stat,
- "if" : do_stat,
- "while" : do_stat,
- "do" : do_stat,
- "for" : do_stat,
- "for-in" : do_stat,
- "switch" : do_stat,
- "with" : do_stat
- }, function(){
- return w.walk(ast);
- });
- return pro.gen_code(new_ast, { beautify: true });
-}
-
-
-
-
-////// test code follows.
-
-var code = instrument(test.toString());
-console.log(code);
-
-function test() {
- // simple stats
- a = 5;
- c += a + b;
- "foo";
-
- // var
- var foo = 5;
- const bar = 6, baz = 7;
-
- // switch block. note we can't track case lines the same way.
- switch ("foo") {
- case "foo":
- return 1;
- case "bar":
- return 2;
- }
-
- // for/for in
- for (var i = 0; i < 5; ++i) {
- console.log("Hello " + i);
- }
- for (var i in [ 1, 2, 3]) {
- console.log(i);
- }
-
- // note however that the following is broken. I guess we
- // should add the block brackets in this case...
- for (var i = 0; i < 5; ++i)
- console.log("foo");
-}
diff --git a/node/node_modules/___uglify-js.npm/package/tmp/instrument2.js b/node/node_modules/___uglify-js.npm/package/tmp/instrument2.js
deleted file mode 100644
index 6aee5f3..0000000
--- a/node/node_modules/___uglify-js.npm/package/tmp/instrument2.js
+++ /dev/null
@@ -1,138 +0,0 @@
-// sample on how to use the parser and walker API to instrument some code
-
-var jsp = require("uglify-js").parser;
-var pro = require("uglify-js").uglify;
-
-function instrument(code) {
- var ast = jsp.parse(code, false, true); // true for the third arg specifies that we want
- // to have start/end tokens embedded in the
- // statements
- var w = pro.ast_walker();
-
- function trace (line, comment) {
- var code = pro.gen_code(line, { beautify: true });
- var data = line[0]
-
- var args = []
- if (!comment) comment = ""
- if (typeof data === "object") {
- code = code.split(/\n/).shift()
- args = [ [ "string", data.toString() ],
- [ "string", code ],
- [ "num", data.start.line ],
- [ "num", data.start.col ],
- [ "num", data.end.line ],
- [ "num", data.end.col ]]
- } else {
- args = [ [ "string", data ],
- [ "string", code ]]
-
- }
- return [ "call", [ "name", "trace" ], args ];
- }
-
- // we're gonna need this to push elements that we're currently looking at, to avoid
- // endless recursion.
- var analyzing = [];
- function do_stat() {
- var ret;
- if (this[0].start && analyzing.indexOf(this) < 0) {
- // without the `analyzing' hack, w.walk(this) would re-enter here leading
- // to infinite recursion
- analyzing.push(this);
- ret = [ "splice",
- [ [ "stat", trace(this) ],
- w.walk(this) ]];
- analyzing.pop(this);
- }
- return ret;
- }
-
- function do_cond(c, t, f) {
- return [ this[0], w.walk(c),
- ["seq", trace(t), w.walk(t) ],
- ["seq", trace(f), w.walk(f) ]];
- }
-
- function do_binary(c, l, r) {
- if (c !== "&&" && c !== "||") {
- return [this[0], c, w.walk(l), w.walk(r)];
- }
- return [ this[0], c,
- ["seq", trace(l), w.walk(l) ],
- ["seq", trace(r), w.walk(r) ]];
- }
-
- var new_ast = w.with_walkers({
- "stat" : do_stat,
- "label" : do_stat,
- "break" : do_stat,
- "continue" : do_stat,
- "debugger" : do_stat,
- "var" : do_stat,
- "const" : do_stat,
- "return" : do_stat,
- "throw" : do_stat,
- "try" : do_stat,
- "defun" : do_stat,
- "if" : do_stat,
- "while" : do_stat,
- "do" : do_stat,
- "for" : do_stat,
- "for-in" : do_stat,
- "switch" : do_stat,
- "with" : do_stat,
- "conditional" : do_cond,
- "binary" : do_binary
- }, function(){
- return w.walk(ast);
- });
- return pro.gen_code(new_ast, { beautify: true });
-}
-
-
-////// test code follows.
-
-var code = instrument(test.toString());
-console.log(code);
-
-function test() {
- // simple stats
- a = 5;
- c += a + b;
- "foo";
-
- // var
- var foo = 5;
- const bar = 6, baz = 7;
-
- // switch block. note we can't track case lines the same way.
- switch ("foo") {
- case "foo":
- return 1;
- case "bar":
- return 2;
- }
-
- // for/for in
- for (var i = 0; i < 5; ++i) {
- console.log("Hello " + i);
- }
- for (var i in [ 1, 2, 3]) {
- console.log(i);
- }
-
- for (var i = 0; i < 5; ++i)
- console.log("foo");
-
- for (var i = 0; i < 5; ++i) {
- console.log("foo");
- }
-
- var k = plurp() ? 1 : 0;
- var x = a ? doX(y) && goZoo("zoo")
- : b ? blerg({ x: y })
- : null;
-
- var x = X || Y;
-}
diff --git a/node/node_modules/___uglify-js.npm/package/uglify-js.js b/node/node_modules/___uglify-js.npm/package/uglify-js.js
deleted file mode 100644
index 4305e23..0000000
--- a/node/node_modules/___uglify-js.npm/package/uglify-js.js
+++ /dev/null
@@ -1,17 +0,0 @@
-//convienence function(src, [options]);
-function uglify(orig_code, options){
- options || (options = {});
- var jsp = uglify.parser;
- var pro = uglify.uglify;
-
- var ast = jsp.parse(orig_code, options.strict_semicolons); // parse code and get the initial AST
- ast = pro.ast_mangle(ast, options.mangle_options); // get a new AST with mangled names
- ast = pro.ast_squeeze(ast, options.squeeze_options); // get an AST with compression optimizations
- var final_code = pro.gen_code(ast, options.gen_options); // compressed code here
- return final_code;
-};
-
-uglify.parser = require("./lib/parse-js");
-uglify.uglify = require("./lib/process");
-
-module.exports = uglify
\ No newline at end of file
diff --git a/node/node_modules/jade/History.md b/node/node_modules/jade/History.md
index 98b2116..790a98b 100644
--- a/node/node_modules/jade/History.md
+++ b/node/node_modules/jade/History.md
@@ -1,4 +1,62 @@
+0.15.4 / 2011-09-05
+==================
+
+ * Fixed script template html. Closes #316
+ * Revert "Fixed script() tag with trailing ".". Closes #314"
+
+0.15.3 / 2011-08-30
+==================
+
+ * Added Makefile example. Closes #312
+ * Fixed script() tag with trailing ".". Closes #314
+
+0.15.2 / 2011-08-26
+==================
+
+ * Fixed new conditional boundaries. Closes #307
+
+0.15.1 / 2011-08-26
+==================
+
+ * Fixed jade(1) support due to `res.render()` removal
+ * Removed --watch support (use a makefile + watch...)
+
+0.15.0 / 2011-08-26
+==================
+
+ * Added `client` option to reference runtime helpers
+ * Added `Array.isArray()` for runtime.js as well
+ * Added `Object.keys()` for the client-side runtime
+ * Added first-class `if`, `unless`, `else` and `else if` support
+ * Added first-class `each` / `for` support
+ * Added `make benchmark` for continuous-bench
+ * Removed `inline` option, SS helpers are no longer inlined either
+ * Removed `Parser#debug()`
+ * Removed `jade.render()` and `jade.renderFile()`
+ * Fixed runtime.js `escape()` bug causing window.escape to be used
+ * Fixed a bunch of tests
+
+0.14.2 / 2011-08-16
+==================
+
+ * Added `include` support for non-jade files
+ * Fixed code indentation when followed by newline(s). Closes #295 [reported by masylum]
+
+0.14.1 / 2011-08-14
+==================
+
+ * Added `colons` option for everyone stuck with ":". Closes #231
+ * Optimization: consecutive lines are merged in compiled js
+
+0.14.0 / 2011-08-08
+==================
+
+ * Added array iteration with index example. Closes #276
+ * Added _runtime.js_
+ * Added `compileDebug` option to enable lineno instrumentation
+ * Added `inline` option to disable inlining of helpers (for client-side)
+
0.13.0 / 2011-07-13
==================
diff --git a/node/node_modules/jade/Makefile b/node/node_modules/jade/Makefile
index 714d3da..ea4d5c6 100644
--- a/node/node_modules/jade/Makefile
+++ b/node/node_modules/jade/Makefile
@@ -3,17 +3,15 @@ TESTS = test/*.js
SRC = $(shell find lib -name "*.js" -type f)
UGLIFY_FLAGS = --no-mangle
+all: jade.min.js runtime.min.js
+
test:
@./node_modules/.bin/expresso \
-I node_modules \
$(TESTS)
benchmark:
- @node benchmarks/jade.js \
- && node benchmarks/jade-self.js \
- && node benchmarks/haml.js \
- && node benchmarks/haml2.js \
- && node benchmarks/ejs.js
+ @node support/benchmark
jade.js: $(SRC)
@node support/compile.js $^
@@ -23,8 +21,18 @@ jade.min.js: jade.js
&& du jade.min.js \
&& du jade.js
+runtime.js: lib/runtime.js
+ @cat support/head.js $< support/foot.js > $@
+
+runtime.min.js: runtime.js
+ @uglifyjs $(UGLIFY_FLAGS) $< > $@ \
+ && du runtime.min.js \
+ && du runtime.js
+
clean:
rm -f jade.js
rm -f jade.min.js
+ rm -f runtime.js
+ rm -f runtime.min.js
.PHONY: test benchmark clean
diff --git a/node/node_modules/jade/Readme.md b/node/node_modules/jade/Readme.md
index c70f81b..fd5c42c 100644
--- a/node/node_modules/jade/Readme.md
+++ b/node/node_modules/jade/Readme.md
@@ -1,4 +1,3 @@
-
# Jade - template engine
Jade is a high performance template engine heavily influenced by [Haml](http://haml-lang.com)
@@ -21,7 +20,7 @@
- combine dynamic and static tag classes
- parse tree manipulation via _filters_
- supports [Express JS](http://expressjs.com) out of the box
- - transparent iteration over objects, arrays, and even non-enumerables via `- each`
+ - transparent iteration over objects, arrays, and even non-enumerables via `each`
- block comments
- no tag prefix
- AST filters
@@ -54,37 +53,60 @@ via npm:
$ make jade.js
- Alternatively, if uglifyjs is installed via npm (`npm install uglify-js`) you may execute the following which will create both files.
+ Alternatively, if uglifyjs is installed via npm (`npm install uglify-js`) you may execute the following which will create both files. However each release builds these for you.
$ make jade.min.js
+ By default Jade instruments templates with line number statements such as `__.lineno = 3` for debugging purposes. When used in a browser it's useful to minimize this boiler plate, you can do so by passing the option `{ compileDebug: false }`. The following template
+
+ p Hello #{name}
+
+ Can then be as small as the following generated function:
+
+```js
+function anonymous(locals, attrs, escape, rethrow) {
+ var buf = [];
+ with (locals || {}) {
+ var interp;
+ buf.push('\n
');
+ }
+ return buf.join("");
+}
+```
+
+ Through the use of Jade's `./runtime.js` you may utilize these pre-compiled templates on the client-side _without_ Jade itself, all you need is the associated utility functions (in runtime.js), which are then available as `jade.attrs`, `jade.escape` etc. To enable this you should pass `{ client: true }` to `jade.compile()` to tell Jade to reference the helper functions
+ via `jade.attrs`, `jade.escape` etc.
+
+```js
+function anonymous(locals, attrs, escape, rethrow) {
+ var attrs = jade.attrs, escape = jade.escape, rethrow = jade.rethrow;
+ var buf = [];
+ with (locals || {}) {
+ var interp;
+ buf.push('\n
');
+ }
+ return buf.join("");
+}
+```
+
## Public API
```javascript
var jade = require('jade');
- // Render a string
- jade.render('string of jade', { options: 'here' });
-
- // Render a file
- jade.renderFile('path/to/some.jade', { options: 'here' }, function(err, html){
- // options are optional,
- // the callback can be the second arg
- });
-
// Compile a function
var fn = jade.compile('string of jade', options);
- fn.call(scope, locals);
+ fn(locals);
```
### Options
- - `scope` Evaluation scope (`this`)
- `self` Use a `self` namespace to hold the locals. _false by default_
- `locals` Local variable object
- `filename` Used in exceptions, and required when using includes
- `debug` Outputs tokens and function body generated
- `compiler` Compiler to replace jade's default
+ - `compileDebug` When `false` no debug instrumentation is compiled
## Syntax
@@ -146,8 +168,7 @@ well cool, but how about large bodies of text:
renders `
foo bar baz rawr.....
`
interpolation? yup! both types of text can utilize interpolation,
-if we passed `{ locals: { name: 'tj', email: 'tj@vision-media.ca' }}` to `render()`
-we can do the following:
+if we passed `{ name: 'tj', email: 'tj@vision-media.ca' }` to the compiled function we can do the following:
#user #{name} <#{email}>
@@ -216,6 +237,16 @@ outputs:
.
+
+It should be noted that text blocks should be doubled escaped. For example if you desire the following output.
+
+
foo\bar
+
+use:
+
+ p.
+ foo\\bar
+
### Comments
Single line comments currently look the same as JavaScript comments,
@@ -305,13 +336,18 @@ Jade currently supports '(' and ')' as attribute delimiters.
a(href='/login', title='View login page') Login
+When a value is `undefined` or `null` the attribute is _not_ added,
+so this is fine, it will not compile 'something="null"'.
+
+ div(something=null)
+
Boolean attributes are also supported:
input(type="checkbox", checked)
Boolean attributes with code will only output the attribute when `true`:
- input(type="checkbox", checked= someValue)
+ input(type="checkbox", checked=someValue)
Multiple lines work too:
@@ -343,7 +379,8 @@ we could use regular javascript concatenation:
a(href='/user/' + user.id)= user.name
-or we could use jade's interpolation:
+or we could use jade's interpolation, which I added because everyone
+using Ruby or CoffeeScript seems to think this is legal js..:
a(href='/user/#{user.id}')= user.name
@@ -352,6 +389,45 @@ allowing you to pass an array such as `bodyClasses = ['user', 'authenticated']`
body(class=bodyClasses)
+### HTML
+
+ Inline html is fine, we can use the pipe syntax to
+ write arbitrary text, in this case some html:
+
+```
+html
+ body
+ |
Title
+ |
foo bar baz
+```
+
+ Or we can use the trailing `.` to indicate to Jade that we
+ only want text in this block, allowing us to omit the pipes:
+
+```
+html
+ body.
+
Title
+
foo bar baz
+```
+
+ Both of these examples yield the same result:
+
+```
+
Title
+
foo bar baz
+
+```
+
+ The same rule applies for anywhere you can have text
+ in jade, raw html is fine:
+
+```
+html
+ body
+ h1 User #{name}
+```
+
### Doctypes
To add a doctype simply use `!!!`, or `doctype` followed by an optional value:
@@ -471,15 +547,18 @@ you may use `!=`:
p!= aVarContainingMoreHTML
-The on exception made in terms of allowing "vanilla" JavaScript, is
-the `- each` token. This takes the form of:
+## Iteration
- - each VAL[, KEY] in OBJ
+ Along with vanilla JavaScript Jade also supports a subset of
+ constructs that allow you to create more designer-friendly templates,
+ one of these constructs is `each`, taking the form:
+
+ each VAL[, KEY] in OBJ
An example iterating over an array:
- var items = ["one", "two", "three"]
- - each item in items
+ each item in items
li= item
outputs:
@@ -488,28 +567,68 @@ outputs:
two
three
+iterating an array with index:
+
+ - var items = ["one", "two", "three"]
+ each item, i in items
+ li #{item}: #{i}
+
+outputs:
+
+
one: 0
+
two: 1
+
three: 2
+
iterating an object's keys and values:
- var obj = { foo: 'bar' }
- - each val, key in obj
+ each val, key in obj
li #{key}: #{val}
would output `
foo: bar
`
-You can also nest these!
+Internally Jade converts these statements to regular
+JavaScript loops such as `users.forEach(function(user){`,
+so lexical scope and nesting applies as it would with regular
+JavaScript:
- - each user in users
- - each role in user.roles
+ each user in users
+ each role in user.roles
li= role
-When a property is undefined, Jade will output an empty string. For example:
+ You may also use `for` if you prefer:
+
+ for user in users
+ for role in user.roles
+ li= role
+
+## Conditionals
+
+ Jade conditionals are equivalent to those using the code (`-`) prefix,
+ however allow you to ditch parenthesis to become more designer friendly,
+ however keep in mind the expression given is _regular_ JavaScript:
- textarea= user.signature
+ for user in users
+ if user.role == 'admin'
+ p #{user.name} is an admin
+ else
+ p= user.name
-when undefined would normally output "undefined" in your html, however recent
-versions of Jade will simply render:
+ is equivalent to the following using vanilla JavaScript literals:
-
+ for user in users
+ - if (user.role == 'admin')
+ p #{user.name} is an admin
+ - else
+ p= user.name
+
+ Jade also provides have `unless` which is equivalent to `if (!(expr))`:
+
+ for user in users
+ unless user.isAnonymous
+ p
+ | Click to view
+ a(href='/users/' + user.id)= user.name
## Includes
@@ -534,9 +653,7 @@ and the following _layout.jade_:
both includes _includes/head_ and _includes/foot_ are
read relative to the `filename` option given to _layout.jade_,
-which should be an absolute path to this file, however Express
-and the `renderFile()` method do this for you. Include then parses
-these files, and injects the AST produced to render what you would expect:
+which should be an absolute path to this file, however Express does this for you. Include then parses these files, and injects the AST produced to render what you would expect:
```html
@@ -599,31 +716,132 @@ these files, and injects the AST produced to render what you would expect:
```
-## bin/jade
+## Generated Output
+
+ Suppose we have the following Jade:
+
+```
+- var title = 'yay'
+h1.title #{title}
+p Just an example
+```
+
+ When the `compileDebug` option is not explicitly `false`, Jade
+ will compile the function instrumented with `__.lineno = n;`, which
+ in the event of an exception is passed to `rethrow()` which constructs
+ a useful message relative to the initial Jade input.
+
+```js
+function anonymous(locals) {
+ var __ = { lineno: 1, input: "- var title = 'yay'\nh1.title #{title}\np Just an example", filename: "testing/test.js" };
+ var rethrow = jade.rethrow;
+ try {
+ var attrs = jade.attrs, escape = jade.escape;
+ var buf = [];
+ with (locals || {}) {
+ var interp;
+ __.lineno = 1;
+ var title = 'yay'
+ __.lineno = 2;
+ buf.push('
');
+ }
+ return buf.join("");
+ } catch (err) {
+ rethrow(err, __.input, __.filename, __.lineno);
+ }
+}
+```
+
+When the `compileDebug` option _is_ explicitly `false`, this instrumentation
+is stripped, which is very helpful for light-weight client-side templates. Combining Jade's options with the `./runtime.js` file in this repo allows you
+to toString() compiled templates and avoid running the entire Jade library on
+the client, increasing performance, and decreasing the amount of JavaScript
+required.
+
+```js
+function anonymous(locals) {
+ var attrs = jade.attrs, escape = jade.escape;
+ var buf = [];
+ with (locals || {}) {
+ var interp;
+ var title = 'yay'
+ buf.push('
');
+ }
+ return buf.join("");
+}
+```
-Output html to _stdout_:
+## Example Makefile
- jade < my.jade > my.html
+ Below is an example Makefile used to compile _pages/*.jade_
+ into _pages/*.html_ files by simply executing `make`.
+
+```make
+JADE = $(shell find pages/*.jade)
+HTML = $(JADE:.jade=.html)
-Generate _examples/*.html_:
+all: $(HTML)
+
+%.html: %.jade
+ jade < $< > $@
- jade examples/*.jade
+clean:
+ rm -f $(HTML)
+
+.PHONY: clean
+```
-Pass options:
+this can be combined with the `watch(1)` command to produce
+a watcher-like behaviour:
+
+ $ watch make
+
+## jade(1)
+
+```
- jade examples/layout.jade --options '{ locals: { title: "foo" }}'
+Usage: jade [options] [dir|file ...]
-Usage info:
+Options:
- Usage: jade [options]
- [path ...]
- < in.jade > out.jade
- Options:
- -o, --options JavaScript options object passed
- -h, --help Output help information
- -w, --watch Watch file(s) or folder(s) for changes and re-compile
- -v, --version Output jade version
- --out Output the compiled html to
+ -h, --help output usage information
+ -v, --version output the version number
+ -o, --obj javascript options object
+ -O, --out output the compiled html to
+
+Examples:
+
+ # translate jade the templates dir
+ $ jade templates
+
+ # create {foo,bar}.html
+ $ jade {foo,bar}.jade
+
+ # jade over stdio
+ $ jade < my.jade > my.html
+
+ # jade over stdio
+ $ echo "h1 Jade!" | jade
+
+ # foo, bar dirs rendering to /tmp
+ $ jade foo bar --out /tmp
+
+```
## License
diff --git a/node/node_modules/jade/benchmarks/common.js b/node/node_modules/jade/benchmarks/common.js
deleted file mode 100644
index f7cb3a9..0000000
--- a/node/node_modules/jade/benchmarks/common.js
+++ /dev/null
@@ -1,32 +0,0 @@
-
-/**
- * Module dependencies.
- */
-
-var sys = require('sys');
-
-var currentLabel,
- startTime;
-
-exports.times = 2000;
-
-exports.start = function(label){
- currentLabel = label;
- startTime = new Date;
- sys.print(' - \x1b[33m' + currentLabel + '\x1b[0m: ');
-};
-
-exports.stop = function(){
- var stopTime = new Date,
- duration = stopTime - startTime;
- sys.print(duration + ' ms\n');
-};
-
-exports.locals = {
- one: 'one',
- two: 'two',
- three: 'three',
- items: Array(200).join('test ').split(' ')
-};
-
-console.log('\nbenchmarking %d times\n', exports.times);
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/ejs.js b/node/node_modules/jade/benchmarks/ejs.js
deleted file mode 100644
index a872d47..0000000
--- a/node/node_modules/jade/benchmarks/ejs.js
+++ /dev/null
@@ -1,24 +0,0 @@
-
-/**
- * Module dependencies.
- */
-
-var bm = require('./common'),
- ejs = require('./ejs/lib/ejs'),
- fs = require('fs');
-
-var str = fs.readFileSync(__dirname + '/example.ejs', 'ascii');
-
-var n = bm.times;
-bm.start('ejs compilation');
-while (n--) {
- ejs.render(str, { locals: bm.locals });
-}
-bm.stop();
-
-var n = bm.times;
-bm.start('ejs execution');
-while (n--) {
- ejs.render(str, { locals: bm.locals, cache: true, filename: 'example.ejs' });
-}
-bm.stop();
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/ejs/.gitignore b/node/node_modules/jade/benchmarks/ejs/.gitignore
deleted file mode 100644
index 99a4d6e..0000000
--- a/node/node_modules/jade/benchmarks/ejs/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-# ignore any vim files:
-*.sw[a-z]
-vim/.netrwhist
diff --git a/node/node_modules/jade/benchmarks/ejs/.gitmodules b/node/node_modules/jade/benchmarks/ejs/.gitmodules
deleted file mode 100644
index 51ea138..0000000
--- a/node/node_modules/jade/benchmarks/ejs/.gitmodules
+++ /dev/null
@@ -1,3 +0,0 @@
-[submodule "support/expresso"]
- path = support/expresso
- url = http://github.com/visionmedia/expresso.git
diff --git a/node/node_modules/jade/benchmarks/ejs/History.md b/node/node_modules/jade/benchmarks/ejs/History.md
deleted file mode 100644
index d8307c4..0000000
--- a/node/node_modules/jade/benchmarks/ejs/History.md
+++ /dev/null
@@ -1,50 +0,0 @@
-
-0.3.1 / 2011-02-23
-==================
-
- * Fixed optional `compile()` options
-
-0.3.0 / 2011-02-14
-==================
-
- * Added 'json' filter [Yuriy Bogdanov]
- * Use exported version of parse function to allow monkey-patching [Anatoliy Chakkaev]
-
-0.2.1 / 2010-10-07
-==================
-
- * Added filter support
- * Fixed _cache_ option. ~4x performance increase
-
-0.2.0 / 2010-08-05
-==================
-
- * Added support for global tag config
- * Added custom tag support. Closes #5
- * Fixed whitespace bug. Closes #4
-
-0.1.0 / 2010-08-04
-==================
-
- * Faster implementation [ashleydev]
-
-0.0.4 / 2010-08-02
-==================
-
- * Fixed single quotes for content outside of template tags. [aniero]
- * Changed; `exports.compile()` now expects only "locals"
-
-0.0.3 / 2010-07-15
-==================
-
- * Fixed single quotes
-
-0.0.2 / 2010-07-09
-==================
-
- * Fixed newline preservation
-
-0.0.1 / 2010-07-09
-==================
-
- * Initial release
diff --git a/node/node_modules/jade/benchmarks/ejs/Makefile b/node/node_modules/jade/benchmarks/ejs/Makefile
deleted file mode 100644
index f971a59..0000000
--- a/node/node_modules/jade/benchmarks/ejs/Makefile
+++ /dev/null
@@ -1,5 +0,0 @@
-
-test:
- @./support/expresso/bin/expresso -I lib test/*.test.js
-
-.PHONY: test
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/ejs/Readme.md b/node/node_modules/jade/benchmarks/ejs/Readme.md
deleted file mode 100644
index 85409ab..0000000
--- a/node/node_modules/jade/benchmarks/ejs/Readme.md
+++ /dev/null
@@ -1,137 +0,0 @@
-
-# EJS
-
-Embedded JavaScript templates.
-
-## Installation
-
- $ npm install ejs
-
-## Features
-
- * Complies with the [Express](http://expressjs.com) view system
- * Static caching of intermediate JavaScript
- * Unbuffered code for conditionals etc `<% code %>`
- * Escapes html by default with `<%= code %>`
- * Unescaped buffering with `<%- code %>`
- * Supports tag customization
- * Filter support for designer-friendly templates
-
-## Example
-
- <% if (user) { %>
-
<%= user.name %>
- <% } %>
-
-## Usage
-
- ejs.compile(str, options);
- // => Function
-
- ejs.render(str, options);
- // => str
-
-## Options
-
- - `locals` Local variables object
- - `cache` Compiled functions are cached, requires `filename`
- - `filename` Used by `cache` to key caches
- - `scope` Function execution context
- - `debug` Output generated function body
- - `open` Open tag, defaulting to "<%"
- - `close` Closing tag, defaulting to "%>"
-
-## Custom Tags
-
-Custom tags can also be applied globally:
-
- var ejs = require('ejs');
- ejs.open = '{{';
- ejs.close = '}}';
-
-Which would make the following a valid template:
-
-
{{= title }}
-
-## Filters
-
-EJS conditionally supports the concept of "filters". A "filter chain"
-is a designer friendly api for manipulating data, without writing JavaScript.
-
-Filters can be applied by supplying the _:_ modifier, so for example if we wish to take the array `[{ name: 'tj' }, { name: 'mape' }, { name: 'guillermo' }]` and output a list of names we can do this simply with filters:
-
-Template:
-
-
-
-## Filter List
-
-Currently these filters are available:
-
- - first
- - last
- - capitalize
- - downcase
- - upcase
- - sort
- - sort_by:'prop'
- - size
- - length
- - plus:n
- - minus:n
- - times:n
- - divided_by:n
- - join:'val'
- - truncate:n
- - truncate_words:n
- - replace:pattern,substitution
- - prepend:val
- - append:val
- - map:'prop'
- - reverse
- - get:'prop'
-
-## License
-
-(The MIT License)
-
-Copyright (c) 2009-2010 TJ Holowaychuk <tj@vision-media.ca>
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-'Software'), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/node/node_modules/jade/benchmarks/ejs/benchmark.js b/node/node_modules/jade/benchmarks/ejs/benchmark.js
deleted file mode 100644
index 7b267e1..0000000
--- a/node/node_modules/jade/benchmarks/ejs/benchmark.js
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-var ejs = require('./lib/ejs'),
- str = '<% if (foo) { %>
<%= foo %>
<% } %>',
- times = 50000;
-
-console.log('rendering ' + times + ' times');
-
-var start = new Date;
-while (times--) {
- ejs.render(str, { cache: true, filename: 'test', locals: { foo: 'bar' }});
-}
-
-console.log('took ' + (new Date - start) + 'ms');
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/ejs/examples/list.ejs b/node/node_modules/jade/benchmarks/ejs/examples/list.ejs
deleted file mode 100644
index d571330..0000000
--- a/node/node_modules/jade/benchmarks/ejs/examples/list.ejs
+++ /dev/null
@@ -1,7 +0,0 @@
-<% if (names.length) { %>
-
- <% names.forEach(function(name){ %>
-
<%= name %>
- <% }) %>
-
-<% } %>
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/ejs/examples/list.js b/node/node_modules/jade/benchmarks/ejs/examples/list.js
deleted file mode 100644
index 9cd7168..0000000
--- a/node/node_modules/jade/benchmarks/ejs/examples/list.js
+++ /dev/null
@@ -1,16 +0,0 @@
-
-/**
- * Module dependencies.
- */
-
-var ejs = require('../')
- , fs = require('fs')
- , str = fs.readFileSync(__dirname + '/list.ejs', 'utf8');
-
-var ret = ejs.render(str, {
- locals: {
- names: ['foo', 'bar', 'baz']
- }
-});
-
-console.log(ret);
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/ejs/index.js b/node/node_modules/jade/benchmarks/ejs/index.js
deleted file mode 100644
index 20bf71a..0000000
--- a/node/node_modules/jade/benchmarks/ejs/index.js
+++ /dev/null
@@ -1,2 +0,0 @@
-
-module.exports = require('./lib/ejs');
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/ejs/lib/ejs.js b/node/node_modules/jade/benchmarks/ejs/lib/ejs.js
deleted file mode 100644
index 5c3784c..0000000
--- a/node/node_modules/jade/benchmarks/ejs/lib/ejs.js
+++ /dev/null
@@ -1,193 +0,0 @@
-
-/*!
- * EJS
- * Copyright(c) 2010 TJ Holowaychuk
- * MIT Licensed
- */
-
-/**
- * Module dependencies.
- */
-
-var sys = require('sys')
- , utils = require('./utils');
-
-/**
- * Library version.
- */
-
-exports.version = '0.3.0';
-
-/**
- * Filters.
- *
- * @type Object
- */
-
-var filters = exports.filters = require('./filters');
-
-/**
- * Intermediate js cache.
- *
- * @type Object
- */
-
-var cache = {};
-
-/**
- * Clear intermediate js cache.
- *
- * @api public
- */
-
-exports.clearCache = function(){
- cache = {};
-};
-
-/**
- * Translate filtered code into function calls.
- *
- * @param {String} js
- * @return {String}
- * @api private
- */
-
-function filtered(js) {
- return js.substr(1).split('|').reduce(function(js, filter){
- var parts = filter.split(':')
- , name = parts.shift()
- , args = parts.shift() || '';
- if (args) args = ', ' + args;
- return 'filters.' + name + '(' + js + args + ')';
- });
-};
-
-/**
- * Parse the given `str` of ejs, returning the function body.
- *
- * @param {String} str
- * @return {String}
- * @api public
- */
-
-var parse = exports.parse = function(str, options){
- var options = options || {}
- , open = options.open || exports.open || '<%'
- , close = options.close || exports.close || '%>';
-
- var buf = [
- "var buf = [];"
- , "\nwith (locals) {"
- , "\n buf.push('"
- ];
-
- for (var i = 0, len = str.length; i < len; ++i) {
- if (str.slice(i, open.length + i) == open) {
- i += open.length
-
- var prefix, postfix;
- switch (str[i]) {
- case '=':
- prefix = "', escape(";
- postfix = "), '";
- ++i;
- break;
- case '-':
- prefix = "', ";
- postfix = ", '";
- ++i;
- break;
- default:
- prefix = "'); ";
- postfix = "; buf.push('";
- }
-
- var start = i;
- var end = str.indexOf(close, i);
- var js = str.substring(i, end);
- if (js[0] == ':') js = filtered(js);
- buf.push(prefix, js, postfix);
- i += end - start + close.length - 1;
-
- } else if (str[i] == "\\") {
- buf.push("\\\\");
- } else if (str[i] == "'") {
- buf.push("\\'");
- } else if (str[i] == "\r") {
- buf.push(" ");
- } else if (str[i] == "\n") {
- buf.push("\\n");
- } else {
- buf.push(str[i]);
- }
- }
- buf.push("');\n}\nreturn buf.join('');");
- return buf.join('');
-};
-
-/**
- * Compile the given `str` of ejs into a `Function`.
- *
- * @param {String} str
- * @param {Object} options
- * @return {Function}
- * @api public
- */
-
-var compile = exports.compile = function(str, options){
- options = options || {};
- if (options.debug) sys.puts(exports.parse(str));
- var fn = new Function('locals, filters, escape', exports.parse(str, options));
- return function(locals){
- return fn.call(this, locals, filters, utils.escape);
- }
-};
-
-/**
- * Render the given `str` of ejs.
- *
- * Options:
- *
- * - `locals` Local variables object
- * - `cache` Compiled functions are cached, requires `filename`
- * - `filename` Used by `cache` to key caches
- * - `scope` Function execution context
- * - `debug` Output generated function body
- * - `open` Open tag, defaulting to "<%"
- * - `close` Closing tag, defaulting to "%>"
- *
- * @param {String} str
- * @param {Object} options
- * @return {String}
- * @api public
- */
-
-exports.render = function(str, options){
- var fn
- , options = options || {};
- if (options.cache) {
- if (options.filename) {
- fn = cache[options.filename] || (cache[options.filename] = compile(str, options));
- } else {
- throw new Error('"cache" option requires "filename".');
- }
- } else {
- fn = compile(str, options);
- }
- return fn.call(options.scope, options.locals || {});
-};
-
-/**
- * Expose to require().
- */
-
-if (require.extensions) {
- require.extensions['.ejs'] = function(module, filename) {
- source = require('fs').readFileSync(filename, 'utf-8');
- module._compile(compile(source, {}), filename);
- };
-} else if (require.registerExtension) {
- require.registerExtension('.ejs', function(src) {
- return compile(src, {});
- });
-}
diff --git a/node/node_modules/jade/benchmarks/ejs/lib/filters.js b/node/node_modules/jade/benchmarks/ejs/lib/filters.js
deleted file mode 100644
index d425c8d..0000000
--- a/node/node_modules/jade/benchmarks/ejs/lib/filters.js
+++ /dev/null
@@ -1,198 +0,0 @@
-
-/*!
- * EJS - Filters
- * Copyright(c) 2010 TJ Holowaychuk
- * MIT Licensed
- */
-
-/**
- * First element of the target `obj`.
- */
-
-exports.first = function(obj) {
- return obj[0];
-};
-
-/**
- * Last element of the target `obj`.
- */
-
-exports.last = function(obj) {
- return obj[obj.length - 1];
-};
-
-/**
- * Capitalize the first letter of the target `str`.
- */
-
-exports.capitalize = function(str){
- str = String(str);
- return str[0].toUpperCase() + str.substr(1, str.length);
-};
-
-/**
- * Downcase the target `str`.
- */
-
-exports.downcase = function(str){
- return String(str).toLowerCase();
-};
-
-/**
- * Uppercase the target `str`.
- */
-
-exports.upcase = function(str){
- return String(str).toUpperCase();
-};
-
-/**
- * Sort the target `obj`.
- */
-
-exports.sort = function(obj){
- return Object.create(obj).sort();
-};
-
-/**
- * Sort the target `obj` by the given `prop` ascending.
- */
-
-exports.sort_by = function(obj, prop){
- return Object.create(obj).sort(function(a, b){
- a = a[prop], b = b[prop];
- if (a > b) return 1;
- if (a < b) return -1;
- return 0;
- });
-};
-
-/**
- * Size or length of the target `obj`.
- */
-
-exports.size = exports.length = function(obj) {
- return obj.length;
-};
-
-/**
- * Add `a` and `b`.
- */
-
-exports.plus = function(a, b){
- return Number(a) + Number(b);
-};
-
-/**
- * Subtract `b` from `a`.
- */
-
-exports.minus = function(a, b){
- return Number(a) - Number(b);
-};
-
-/**
- * Multiply `a` by `b`.
- */
-
-exports.times = function(a, b){
- return Number(a) * Number(b);
-};
-
-/**
- * Divide `a` by `b`.
- */
-
-exports.divided_by = function(a, b){
- return Number(a) / Number(b);
-};
-
-/**
- * Join `obj` with the given `str`.
- */
-
-exports.join = function(obj, str){
- return obj.join(str || ', ');
-};
-
-/**
- * Truncate `str` to `len`.
- */
-
-exports.truncate = function(str, len){
- str = String(str);
- return str.substr(0, len);
-};
-
-/**
- * Truncate `str` to `n` words.
- */
-
-exports.truncate_words = function(str, n){
- var str = String(str)
- , words = str.split(/ +/);
- return words.slice(0, n).join(' ');
-};
-
-/**
- * Replace `pattern` with `substitution` in `str`.
- */
-
-exports.replace = function(str, pattern, substitution){
- return String(str).replace(pattern, substitution || '');
-};
-
-/**
- * Prepend `val` to `obj`.
- */
-
-exports.prepend = function(obj, val){
- return Array.isArray(obj)
- ? [val].concat(obj)
- : val + obj;
-};
-
-/**
- * Append `val` to `obj`.
- */
-
-exports.append = function(obj, val){
- return Array.isArray(obj)
- ? obj.concat(val)
- : obj + val;
-};
-
-/**
- * Map the given `prop`.
- */
-
-exports.map = function(arr, prop){
- return arr.map(function(obj){
- return obj[prop];
- });
-};
-
-/**
- * Reverse the given `obj`.
- */
-
-exports.reverse = function(obj){
- return Array.isArray(obj)
- ? obj.reverse()
- : String(obj).split('').reverse().join('');
-};
-
-/**
- * Get `prop` of the given `obj`.
- */
-
-exports.get = function(obj, prop){
- return obj[prop];
-};
-
-/**
- * Packs the given `obj` into json string
- */
-exports.json = function(obj){
- return JSON.stringify(obj);
-};
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/ejs/lib/utils.js b/node/node_modules/jade/benchmarks/ejs/lib/utils.js
deleted file mode 100644
index 8d569d6..0000000
--- a/node/node_modules/jade/benchmarks/ejs/lib/utils.js
+++ /dev/null
@@ -1,23 +0,0 @@
-
-/*!
- * EJS
- * Copyright(c) 2010 TJ Holowaychuk
- * MIT Licensed
- */
-
-/**
- * Escape the given string of `html`.
- *
- * @param {String} html
- * @return {String}
- * @api private
- */
-
-exports.escape = function(html){
- return String(html)
- .replace(/&(?!\w+;)/g, '&')
- .replace(//g, '>')
- .replace(/"/g, '"');
-};
-
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/ejs/package.json b/node/node_modules/jade/benchmarks/ejs/package.json
deleted file mode 100644
index 6b82fce..0000000
--- a/node/node_modules/jade/benchmarks/ejs/package.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "name": "ejs",
- "description": "Embedded JavaScript templates",
- "version": "0.3.1",
- "author": "TJ Holowaychuk ",
- "keywords": ["template", "engine", "ejs"],
- "main": "./lib/ejs.js"
-}
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/ejs/test/ejs.test.js b/node/node_modules/jade/benchmarks/ejs/test/ejs.test.js
deleted file mode 100644
index 1f8b614..0000000
--- a/node/node_modules/jade/benchmarks/ejs/test/ejs.test.js
+++ /dev/null
@@ -1,225 +0,0 @@
-
-/**
- * Module dependencies.
- */
-
-var ejs = require('ejs');
-
-module.exports = {
- 'test .version': function(assert){
- assert.ok(/^\d+\.\d+\.\d+$/.test(ejs.version), 'Test .version format');
- },
-
- 'test html': function(assert){
- assert.equal('
yay
', ejs.render('
yay
'));
- },
-
- 'test buffered code': function(assert){
- var html = '
';
- assert.equal(html, ejs.render(str, { scope: 'tj' }));
- },
-
- 'test escaping': function(assert){
- assert.equal('<script>', ejs.render('<%= "
- Script and Css test
-
-
- COLOR ME PINK
-
-
-## Get Involved
-
-If you want to use this project and something is missing then send me a message. I'm very busy and have several open source projects I manage. I'll contribute to this project as I have time, but if there is more interest for some particular aspect, I'll work on it a lot faster. Also you're welcome to fork this project and send me patches/pull-requests.
-
-## About Performance
-
-The haml compiler isn't built for speed, it's built for maintainability. The actual generated templates, however are blazing fast. I benchmarked them with over 65 million renders per second on a small (20 line) template with some dynamic data on my laptop. Compare this to the 629 compiles per second I got out of the compiler. The idea is that you pre-compile your templates and reuse them on every request. While 629 per second is nothing compared to 65 million, that still means that your server with over 600 different views can boot up in about a second. I think that's fine for something that only happens every few weeks.
-
-## License
-
-Haml-js is [licensed][] under the [MIT license][].
-
-[MIT license]: http://creativecommons.org/licenses/MIT/
-[licensed]: http://github.com/creationix/haml-js/blob/master/LICENSE
-[jquery-haml]: http://github.com/creationix/jquery-haml
-[haml]: http://haml-lang.com/
-[test.js]: http://github.com/creationix/haml-js/blob/master/test/test.js
-
-
-
-
diff --git a/node/node_modules/jade/benchmarks/haml-js/lib/haml.js b/node/node_modules/jade/benchmarks/haml-js/lib/haml.js
deleted file mode 100755
index b5ec4d3..0000000
--- a/node/node_modules/jade/benchmarks/haml-js/lib/haml.js
+++ /dev/null
@@ -1,506 +0,0 @@
-var Haml;
-
-(function () {
-
- var matchers, self_close_tags, embedder, forceXML;
-
- function html_escape(text) {
- return (text + "").
- replace(/&/g, "&").
- replace(//g, ">").
- replace(/\"/g, """);
- }
-
- function render_attribs(attribs) {
- var key, value, result = [];
- for (key in attribs) {
- if (key !== '_content' && attribs.hasOwnProperty(key)) {
- switch (attribs[key]) {
- case 'undefined':
- case 'false':
- case 'null':
- case '""':
- break;
- default:
- try {
- value = JSON.parse("[" + attribs[key] +"]")[0];
- if (value === true) {
- value = key;
- } else if (typeof value === 'string' && embedder.test(value)) {
- value = '" +\n' + parse_interpol(html_escape(value)) + ' +\n"';
- } else {
- value = html_escape(value);
- }
- result.push(" " + key + '=\\"' + value + '\\"');
- } catch (e) {
- result.push(" " + key + '=\\"" + html_escape(' + attribs[key] + ') + "\\"');
- }
- }
- }
- }
- return result.join("");
- }
-
- // Parse the attribute block using a state machine
- function parse_attribs(line) {
- var attributes = {},
- l = line.length,
- i, c,
- count = 1,
- quote = false,
- skip = false,
- open, close, joiner, seperator,
- pair = {
- start: 1,
- middle: null,
- end: null
- };
-
- if (!(l > 0 && (line.charAt(0) === '{' || line.charAt(0) === '('))) {
- return {
- _content: line[0] === ' ' ? line.substr(1, l) : line
- };
- }
- open = line.charAt(0);
- close = (open === '{') ? '}' : ')';
- joiner = (open === '{') ? ':' : '=';
- seperator = (open === '{') ? ',' : ' ';
-
- function process_pair() {
- if (typeof pair.start === 'number' &&
- typeof pair.middle === 'number' &&
- typeof pair.end === 'number') {
- var key = line.substr(pair.start, pair.middle - pair.start).trim(),
- value = line.substr(pair.middle + 1, pair.end - pair.middle - 1).trim();
- attributes[key] = value;
- }
- pair = {
- start: null,
- middle: null,
- end: null
- };
- }
-
- for (i = 1; count > 0; i += 1) {
-
- // If we reach the end of the line, then there is a problem
- if (i > l) {
- throw "Malformed attribute block";
- }
-
- c = line.charAt(i);
- if (skip) {
- skip = false;
- } else {
- if (quote) {
- if (c === '\\') {
- skip = true;
- }
- if (c === quote) {
- quote = false;
- }
- } else {
- if (c === '"' || c === "'") {
- quote = c;
- }
-
- if (count === 1) {
- if (c === joiner) {
- pair.middle = i;
- }
- if (c === seperator || c === close) {
- pair.end = i;
- process_pair();
- if (c === seperator) {
- pair.start = i + 1;
- }
- }
- }
-
- if (c === open || c === "(") {
- count += 1;
- }
- if (c === close || (count > 1 && c === ")")) {
- count -= 1;
- }
- }
- }
- }
- attributes._content = line.substr(i, line.length);
- return attributes;
- }
-
- // Split interpolated strings into an array of literals and code fragments.
- function parse_interpol(value) {
- var items = [],
- pos = 0,
- next = 0,
- match;
- while (true) {
- // Match up to embedded string
- next = value.substr(pos).search(embedder);
- if (next < 0) {
- if (pos < value.length) {
- items.push(JSON.stringify(value.substr(pos)));
- }
- break;
- }
- items.push(JSON.stringify(value.substr(pos, next)));
- pos += next;
-
- // Match embedded string
- match = value.substr(pos).match(embedder);
- next = match[0].length;
- if (next < 0) { break; }
- items.push(match[1] || match[2]);
- pos += next;
- }
- return items.filter(function (part) { return part && part.length > 0}).join(" +\n");
- }
-
- // Used to find embedded code in interpolated strings.
- embedder = /\#\{([^}]*)\}/;
-
- self_close_tags = ["meta", "img", "link", "br", "hr", "input", "area", "base"];
-
- // All matchers' regexps should capture leading whitespace in first capture
- // and trailing content in last capture
- matchers = [
- // html tags
- {
- regexp: /^(\s*)((?:[.#%][a-z_\-][a-z0-9_:\-]*)+)(.*)$/i,
- process: function () {
- var tag, classes, ids, attribs, content;
- tag = this.matches[2];
- classes = tag.match(/\.([a-z_\-][a-z0-9_\-]*)/gi);
- ids = tag.match(/\#([a-z_\-][a-z0-9_\-]*)/gi);
- tag = tag.match(/\%([a-z_\-][a-z0-9_:\-]*)/gi);
-
- // Default to
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml-js/test/embedded_code.js b/node/node_modules/jade/benchmarks/haml-js/test/embedded_code.js
deleted file mode 100644
index 5e04d9d..0000000
--- a/node/node_modules/jade/benchmarks/haml-js/test/embedded_code.js
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- locals: {
- chapter: {name: "Ninja", page: 42},
- name: "Tim",
- id: 42
- }
-}
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml-js/test/foreach.haml b/node/node_modules/jade/benchmarks/haml-js/test/foreach.haml
deleted file mode 100644
index 9ab286f..0000000
--- a/node/node_modules/jade/benchmarks/haml-js/test/foreach.haml
+++ /dev/null
@@ -1,12 +0,0 @@
-:each color in colors
- .preview{style: "color: " + color + ";"}&= name
-:each item in data
- :if item.age < 100
- %dl
- :each name, value in item
- %dt&= name
- %dd&= value
-:each number in [1,2,3,4,5,6,7]
- = number
-:for word in "Hello World".split(" ")
- = word
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml-js/test/foreach.html b/node/node_modules/jade/benchmarks/haml-js/test/foreach.html
deleted file mode 100644
index 2f81fd1..0000000
--- a/node/node_modules/jade/benchmarks/haml-js/test/foreach.html
+++ /dev/null
@@ -1 +0,0 @@
-
My Rainbow
My Rainbow
My Rainbow
name
Tim Caswell
age
27
1234567HelloWorld
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml-js/test/foreach.js b/node/node_modules/jade/benchmarks/haml-js/test/foreach.js
deleted file mode 100644
index 97de8e1..0000000
--- a/node/node_modules/jade/benchmarks/haml-js/test/foreach.js
+++ /dev/null
@@ -1,10 +0,0 @@
-{
- locals: {
- colors: ["#f80", "#08f", "#4f4"],
- name: "My Rainbow",
- data: [
- {name: "Tim Caswell", age: 27},
- {name: "John Smith", age: 107},
- ]
- }
-}
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml-js/test/meta.haml b/node/node_modules/jade/benchmarks/haml-js/test/meta.haml
deleted file mode 100644
index 59700e7..0000000
--- a/node/node_modules/jade/benchmarks/haml-js/test/meta.haml
+++ /dev/null
@@ -1 +0,0 @@
-%meta(http-equiv="content-type" content="text/html; charset=UTF-8")
diff --git a/node/node_modules/jade/benchmarks/haml-js/test/meta.html b/node/node_modules/jade/benchmarks/haml-js/test/meta.html
deleted file mode 100644
index fec8b93..0000000
--- a/node/node_modules/jade/benchmarks/haml-js/test/meta.html
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml-js/test/nanline.haml b/node/node_modules/jade/benchmarks/haml-js/test/nanline.haml
deleted file mode 100644
index f57fe22..0000000
--- a/node/node_modules/jade/benchmarks/haml-js/test/nanline.haml
+++ /dev/null
@@ -1,6 +0,0 @@
-!!! 5
-%html
- %head
- %title atomix
-
- %script(src='atomix_xlib.js')
diff --git a/node/node_modules/jade/benchmarks/haml-js/test/nanline.html b/node/node_modules/jade/benchmarks/haml-js/test/nanline.html
deleted file mode 100644
index 78e1623..0000000
--- a/node/node_modules/jade/benchmarks/haml-js/test/nanline.html
+++ /dev/null
@@ -1,2 +0,0 @@
-
-atomix
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml-js/test/nested_context.haml b/node/node_modules/jade/benchmarks/haml-js/test/nested_context.haml
deleted file mode 100644
index 907c484..0000000
--- a/node/node_modules/jade/benchmarks/haml-js/test/nested_context.haml
+++ /dev/null
@@ -1,6 +0,0 @@
-%p= this.name
-#main
- :each item in items
- .item= this.name + ": " + item
- :if items
- #cool= this.name
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml-js/test/nested_context.html b/node/node_modules/jade/benchmarks/haml-js/test/nested_context.html
deleted file mode 100644
index 0aa937e..0000000
--- a/node/node_modules/jade/benchmarks/haml-js/test/nested_context.html
+++ /dev/null
@@ -1 +0,0 @@
-
Frank
Frank: 1
Frank: 2
Frank: 3
Frank
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml-js/test/nested_context.js b/node/node_modules/jade/benchmarks/haml-js/test/nested_context.js
deleted file mode 100644
index f823655..0000000
--- a/node/node_modules/jade/benchmarks/haml-js/test/nested_context.js
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- context: {
- name: "Frank"
- },
- locals: {
- items: [1,2,3]
- }
-}
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml-js/test/no_self_close_div.haml b/node/node_modules/jade/benchmarks/haml-js/test/no_self_close_div.haml
deleted file mode 100644
index 05ccbee..0000000
--- a/node/node_modules/jade/benchmarks/haml-js/test/no_self_close_div.haml
+++ /dev/null
@@ -1,8 +0,0 @@
-%html
- %body
- %div#a
- %div I do not self close.
- :javascript
- (function(){
- document.getElementById('a').textContent='I self close';
- })();
diff --git a/node/node_modules/jade/benchmarks/haml-js/test/no_self_close_div.html b/node/node_modules/jade/benchmarks/haml-js/test/no_self_close_div.html
deleted file mode 100644
index 5067557..0000000
--- a/node/node_modules/jade/benchmarks/haml-js/test/no_self_close_div.html
+++ /dev/null
@@ -1,9 +0,0 @@
-
I do not self close.
-
-
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml-js/test/non-string-attribs.haml b/node/node_modules/jade/benchmarks/haml-js/test/non-string-attribs.haml
deleted file mode 100644
index 4e70727..0000000
--- a/node/node_modules/jade/benchmarks/haml-js/test/non-string-attribs.haml
+++ /dev/null
@@ -1,8 +0,0 @@
-#plain= "Plain Text"
-#escaped&= ""
-%input{checked: true}
-%input{checked: false}
-%input{checked: null}
-%input{checked: undefined}
-%input{checked: 0}
-%input{checked: ""}
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml-js/test/non-string-attribs.html b/node/node_modules/jade/benchmarks/haml-js/test/non-string-attribs.html
deleted file mode 100644
index b390396..0000000
--- a/node/node_modules/jade/benchmarks/haml-js/test/non-string-attribs.html
+++ /dev/null
@@ -1 +0,0 @@
-
Plain Text
<escaped>
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml-js/test/script_css.haml b/node/node_modules/jade/benchmarks/haml-js/test/script_css.haml
deleted file mode 100644
index ed9a9d4..0000000
--- a/node/node_modules/jade/benchmarks/haml-js/test/script_css.haml
+++ /dev/null
@@ -1,12 +0,0 @@
-%head
- :javascript
- function greet(message) {
- alert("Message from MCP: " + message);
- }
- %title Script and Css test
- :css
- body {
- color: pink;
- }
-%body{onload: "greet(\"I'm Pink\")"} COLOR ME PINK
-
diff --git a/node/node_modules/jade/benchmarks/haml-js/test/script_css.html b/node/node_modules/jade/benchmarks/haml-js/test/script_css.html
deleted file mode 100644
index f4bd4c4..0000000
--- a/node/node_modules/jade/benchmarks/haml-js/test/script_css.html
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
-Script and Css test
-
-COLOR ME PINK
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml-js/test/self_close.haml b/node/node_modules/jade/benchmarks/haml-js/test/self_close.haml
deleted file mode 100644
index a26cdcd..0000000
--- a/node/node_modules/jade/benchmarks/haml-js/test/self_close.haml
+++ /dev/null
@@ -1,8 +0,0 @@
-%html
- %head
- :if url !='/'
- %script
- %meta{name: "test", value:"Monkey"}
- %body
- %a{ href: url }
- link
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml-js/test/self_close.html b/node/node_modules/jade/benchmarks/haml-js/test/self_close.html
deleted file mode 100644
index 90b50a0..0000000
--- a/node/node_modules/jade/benchmarks/haml-js/test/self_close.html
+++ /dev/null
@@ -1 +0,0 @@
-link
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml-js/test/self_close.js b/node/node_modules/jade/benchmarks/haml-js/test/self_close.js
deleted file mode 100644
index 5f6f85c..0000000
--- a/node/node_modules/jade/benchmarks/haml-js/test/self_close.js
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- locals: {
- url: "http://nodejs.org/"
- }
-}
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml-js/test/standard.haml b/node/node_modules/jade/benchmarks/haml-js/test/standard.haml
deleted file mode 100644
index 955fe05..0000000
--- a/node/node_modules/jade/benchmarks/haml-js/test/standard.haml
+++ /dev/null
@@ -1,14 +0,0 @@
-!!! XML
-!!! strict
-%html{ xmlns: "http://www.w3.org/1999/xhtml" }
- %head
- %title
- Sample haml template
- %body
- .profile
- .left.column
- #date= print_date()
- #address= current_user.address
- .right.column
- #email= current_user.email
- #bio= current_user.bio
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml-js/test/standard.html b/node/node_modules/jade/benchmarks/haml-js/test/standard.html
deleted file mode 100644
index bb24daa..0000000
--- a/node/node_modules/jade/benchmarks/haml-js/test/standard.html
+++ /dev/null
@@ -1,3 +0,0 @@
-
-
-Sample haml template
January 1, 2009
Richardson, TX
tim@creationix.com
Experienced software professional...
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml-js/test/standard.js b/node/node_modules/jade/benchmarks/haml-js/test/standard.js
deleted file mode 100644
index 23abf66..0000000
--- a/node/node_modules/jade/benchmarks/haml-js/test/standard.js
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- locals: {
- print_date: function () {
- return 'January 1, 2009';
- },
- current_user: {
- address: "Richardson, TX",
- email: "tim@creationix.com",
- bio: "Experienced software professional..."
- }
- }
-}
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml-js/test/test-commonjs.js b/node/node_modules/jade/benchmarks/haml-js/test/test-commonjs.js
deleted file mode 100644
index b20c2ac..0000000
--- a/node/node_modules/jade/benchmarks/haml-js/test/test-commonjs.js
+++ /dev/null
@@ -1,23 +0,0 @@
-var FILE = require("file");
-var ASSERT = require("assert");
-
-var Haml = require("../lib/haml");
-
-FILE.glob("test/*.haml").forEach(function(hamlFile) {
- exports["test " + hamlFile] = function() {
- var scopeFile = hamlFile.replace(/haml$/, "js");
- var htmlFile = hamlFile.replace(/haml$/, "html");
-
- var haml = FILE.read(hamlFile);
- var expected = FILE.read(htmlFile);
- var scope = FILE.exists(scopeFile) ? eval("("+FILE.read(scopeFile)+")") : {};
-
- var js = Haml.compile(haml);
- var js_opt = Haml.optimize(js);
- var actual = Haml.execute(js_opt, scope.context, scope.locals);
- ASSERT.equal(actual.trim(), expected.trim());
- }
-});
-
-if (module == require.main)
- require("os").exit(require("test").run(exports));
diff --git a/node/node_modules/jade/benchmarks/haml-js/test/test.js b/node/node_modules/jade/benchmarks/haml-js/test/test.js
deleted file mode 100644
index 9bbcadb..0000000
--- a/node/node_modules/jade/benchmarks/haml-js/test/test.js
+++ /dev/null
@@ -1,52 +0,0 @@
-var fs = require('fs');
-var assert = require('assert');
-var sys = require('sys');
-
-var Haml = require("../lib/haml");
-
-fs.readdir('.', function (err, files) {
- files.forEach(function (haml_file) {
- var m = haml_file.match(/^(.*)\.haml/),
- base;
- if (!m) {
- return;
- }
- base = m[1];
-
- function load_haml(scope) {
- fs.readFile(haml_file, "utf8", function (err, haml) {
- fs.readFile(base + ".html", "utf8", function (err, expected) {
- try {
- var js = Haml.compile(haml);
- var js_opt = Haml.optimize(js);
- var actual = Haml(haml).call(scope.context, scope.locals);
- assert.equal(actual, expected);
-
- sys.puts(haml_file + " Passed")
- } catch (e) {
- var message = e.name;
- if (e.message) { message += ": " + e.message; }
- sys.error(haml_file + " FAILED")
- sys.error(message);
- sys.error("\nJS:\n\n" + js);
- sys.error("\nOptimized JS:\n\n" + js_opt);
- sys.error("\nActual:\n\n" + actual);
- sys.error("\nExpected:\n\n" + expected);
- process.exit();
- }
- });
- });
- }
-
- // Load scope
- if (files.indexOf(base + ".js") >= 0) {
- fs.readFile(base + ".js", "utf8", function (err, js) {
- load_haml(eval("(" + js + ")"));
- });
- } else {
- load_haml({});
- }
- });
-});
-
-
diff --git a/node/node_modules/jade/benchmarks/haml.js b/node/node_modules/jade/benchmarks/haml.js
deleted file mode 100644
index 7afbf36..0000000
--- a/node/node_modules/jade/benchmarks/haml.js
+++ /dev/null
@@ -1,25 +0,0 @@
-
-/**
- * Module dependencies.
- */
-
-var bm = require('./common'),
- haml = require('./haml-js/lib/haml'),
- fs = require('fs');
-
-var str = fs.readFileSync(__dirname + '/example.haml', 'ascii');
-
-var n = bm.times;
-bm.start('haml-js compilation');
-while (n--) {
- haml(str);
-}
-bm.stop();
-
-var n = bm.times;
-var fn = haml(str);
-bm.start('haml-js execution');
-while (n--) {
- fn.call('whatever scope', bm.locals);
-}
-bm.stop();
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/.gitmodules b/node/node_modules/jade/benchmarks/haml/.gitmodules
deleted file mode 100644
index 83fc8f9..0000000
--- a/node/node_modules/jade/benchmarks/haml/.gitmodules
+++ /dev/null
@@ -1,3 +0,0 @@
-[submodule "benchmarks/haml-js"]
- path = benchmarks/haml-js
- url = git://github.com/creationix/haml-js.git
diff --git a/node/node_modules/jade/benchmarks/haml/.ignore b/node/node_modules/jade/benchmarks/haml/.ignore
deleted file mode 100644
index 81736c9..0000000
--- a/node/node_modules/jade/benchmarks/haml/.ignore
+++ /dev/null
@@ -1 +0,0 @@
-benchmarks
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/History.md b/node/node_modules/jade/benchmarks/haml/History.md
deleted file mode 100644
index 814f78c..0000000
--- a/node/node_modules/jade/benchmarks/haml/History.md
+++ /dev/null
@@ -1,88 +0,0 @@
-
-0.4.5 / 2010-06-04
-==================
-
- * Ignoring stray indent
-
-0.4.4 / 2010-05-27
-==================
-
- * Fixed arbitrary whitespace support
-
-0.4.3 / 2010-05-25
-==================
-
- * Fixed support for CRLF / CR line-endings, converted on input
- * Exporting HamlError
-
-0.4.2 / 2010-05-25
-==================
-
- * Added HamlError
- * Buffer newline indentation. Closes #23
- * Benchmarks with node-bench
-
-0.4.1 / 2010-05-17
-==================
-
- * Fixed "- each" with non-enumerables, no longer throws exception
- * Fixed array iteration
-
-0.4.0 / 2010-05-06
-==================
-
- * Using Function constructor instead of eval()
- * Performance enhanced by faster iteration implementation for "- each"
-
-0.3.1 / 2010-04-26
-==================
-
- * Fixed support for tags with hypens (both namespace / tag name, ex: "fb:login-button")
-
-0.3.0 / 2010-04-16
-==================
-
- * Added xml namespace support
- * Added xml support
-
-0.2.0 / 2010-04-06
-==================
-
- * Added conditional comment support [ciaranj]
- * Fixed; Trimming input string before tokenization
- * Fixed issue requiring quoting of "for" when used in attrs [aheckmann]
- * Fixed; Exposing Haml compilation cache. Closes #12
- * Fixed :javascript "type" attr, now "text/javascript" [aheckmann]
-
-0.1.0 / 2010-03-31
-==================
-
- * Added "cache" option, making haml.js over 90 times faster than haml-js
- * Improved textBlock whitespace replication
- * Fixed empty tags followed by class / ids on new lines. Closes #6
-
-0.0.4 / 2010-03-29
-==================
-
- * Added better error reporting
-
-0.0.3 / 2010-03-29
-==================
-
- * Added "filename" option support to aid in error reporting
- * Added exports.compile() to create intermediate javascript
- * Added `make benchmark`
- * Changed; caching function templates to increase performance
- * Fixed; ids and classes allowing underscores. Closes #5
- * Fixed outdent issue when \n is not followed by whitespace. Closes #8
-
-0.0.2 / 2010-03-26
-==================
-
- * Added haml.js vs haml-js benchmarks
- * Fixed; commenting :javascript CDATA
-
-0.0.1 / 2010-03-26
-==================
-
- * Initial release
diff --git a/node/node_modules/jade/benchmarks/haml/Makefile b/node/node_modules/jade/benchmarks/haml/Makefile
deleted file mode 100644
index 5580ecf..0000000
--- a/node/node_modules/jade/benchmarks/haml/Makefile
+++ /dev/null
@@ -1,8 +0,0 @@
-
-test:
- @node spec/node.js
-
-benchmark:
- @node-bench benchmarks/run.js
-
-.PHONY: test benchmark
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/Readme.md b/node/node_modules/jade/benchmarks/haml/Readme.md
deleted file mode 100644
index c629679..0000000
--- a/node/node_modules/jade/benchmarks/haml/Readme.md
+++ /dev/null
@@ -1,339 +0,0 @@
-
-# Haml.js
-
- High performance JavaScript [Haml](http://haml-lang.com) implementation for [nodejs](http://nodejs.org)
-
- For a higher quality implementation you may want to look at my [Jade](http://jade-lang.com) template engine,
- however the syntax is slightly different. Jade's engine may be back-ported to haml.js in the future.
-
-## Installation
-
- Install the [Kiwi package manager for nodejs](http://github.com/visionmedia/kiwi)
- and run:
-
- $ kiwi install haml
-
- node> require('haml')
-
-Or npm:
-
- $ npm install hamljs
-
- node> require('hamljs')
-
-## About
-
- Benchmarks rendering the same 21 line haml file located at _benchmarks/page.haml_,
- shows that this library is nearly **65%** or **3 times** faster than haml-js.
-
- Winner: haml.js
- Compared with next highest (haml-js), it's:
- 65.39% faster
- 2.89 times as fast
- 0 order(s) of magnitude faster
-
- Haml.js attempts to comply with the original [Haml](http://haml-lang.com/docs/yardoc/file.HAML_REFERENCE.html)
- implementation as well as possible. There are no magic "plugins" like
- found in other JavaScript haml implementations, for example the following
- will work just fine:
-
- - if (items)
- %ul
- - for (var i = 0; i < items.length; ++i)
- %li= items[i]
-
- Iteration is the one exception to these magical plugins,
- since this is **ugly** in JavaScript, you may also:
-
- - if (items)
- %ul
- - each item in items
- %li= item
-
-## Usage
-
- var haml = require('haml')
- haml.render('a string of haml', { a: 'hash', of: 'options' })
-
-## Options
-
- * context
- - when passed the value of "this" becomes the given "context" object
- * locals
- - when passed all members of this object become available to this template
- * filename
- - required when _cache_ is enabled
- * cache
- - compiled intermediate javascript is cached in memory keyed by _filename_
-
-## Tags
-
- %div text
-
-html:
-
-
text
-
-## Classes
-
- %div.article.first
- article text here
- and here
-
-html:
-
-
- article text here and here
-
-
-## Div Class Shortcut
-
- .comment hey
-
-html:
-
-
hey
-
-## Div Id Shortcut
-
- #article-1 foo
-
-html:
-
-
foo
-
-## Combining Ids and Classes
-
-You may chain id and classes in any order:
-
- .article#first.summary content
-
-html:
-
-
context
-
-## Attributes
-
- %a{ href: 'http://google.com', title: 'Google It' } Google
-
-html:
-
- Google
-
-Attribute keys such as "for" are automatically quoted
-by haml.js, so instead of:
-
- %label{ 'for': 'something' }
-
-you should:
-
- %label{ for: 'something' }
-
-which will render:
-
-
-
-## Boolean Attributes
-
- %input{ type: 'checkbox', checked: true }
-
-html:
-
-
-
-## Combining Attributes, Ids, and Classes
-
-Wemay also contain id and classes before or after:
-
- %a.button{ href: 'http://google.com', title: 'Google It' }.first Google
-
-html:
-
- Google
-
-## Code
-
-Code starting with a hyphen will be executed but
-not buffered, where as code using the equals sign
-will be buffered:
-
- - a = 1
- - b = 2
- = a + b
-
-html:
-
- 3
-
-HTML buffered with equals sign will **always** be escaped:
-
- = " "
-
-html:
-
- <br/>
-
-To prevent escaping of HTML entities we can use _!=_:
-
- != " "
-
-html:
-
-
-
-## Iteration
-
- %ul
- - each item in items
- %li= item
-
-html:
-
-
-
one
-
two
-
three
-
-
-If you require the key or index of the object
-or array during iteration simple append a comma
-following another id:
-
- %ul
- - each item, index in items
- %li= item + '(' + index + ')'
-
-html:
-
-
-
one(0)
-
two(1)
-
three(2)
-
-
-## Doctypes
-
-Defaults to transitional:
-
- !!!
-
-html:
-
-
-
-Optionally pass a supported doctype name:
-
- !!! strict
-
-html:
-
-
-
-currently supported doctypes, which can be
-extended simply by adding values to to _haml.doctypes_.
-
- '5': '',
- 'xml': '',
- 'default': '',
- 'strict': '',
- 'frameset': '',
- '1.1': '',
- 'basic': '',
- 'mobile': ''
-
-
-## :cdata
-
- %script
- :cdata
- foo
-
-html:
-
-
-
-## :javascript
-
- %head
- :javascript
- if (foo)
- if (bar)
- alert('baz')
-
-html:
-
-
-
-
-
-## Extending Haml
-
-### Adding Filters
-
- var haml = require('haml')
- haml.filters.my_filter = function(str) {
- return doSomethingWith(str)
- }
-
-by registering the filter function _my_filter_ we can now
-utilize it within our Haml templates as shown below:
- %p
- :my_filter
- some text
- here yay
- whoop awesome
-
-### Adding Doctypes
-
- var haml = require('haml')
- haml.doctypes.foo = ''
-
-Will now allow you to:
- !!! foo
-
-## Running Benchmarks
-
-To run benchmarks against [haml-js](http://github.com/creationix/haml-js)
-simply execute:
-
- $ git submodule update --init
- $ node benchmarks/run.js
-
-## More Information
-
- * View _spec/fixtures_ for more examples
- * Official [Haml](http://haml-lang.com/docs/yardoc/file.HAML_REFERENCE.html) reference
- * JavaScript [Sass](http://github.com/visionmedia/sass.js) implementation
-
-## License
-
-(The MIT License)
-
-Copyright (c) 2010 TJ Holowaychuk <tj@vision-media.ca>
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-'Software'), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/benchmarks/page.haml b/node/node_modules/jade/benchmarks/haml/benchmarks/page.haml
deleted file mode 100644
index 98b40fb..0000000
--- a/node/node_modules/jade/benchmarks/haml/benchmarks/page.haml
+++ /dev/null
@@ -1,30 +0,0 @@
-!!!
-%html
- %head
- %title Welcome
- %script{ src: 'http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js', type: 'javascript' }
- -# javascript filter (and others)
- -# support arbitrary whitespace
- :javascript
- $(function(){
- alert('yay!')
- })
- %meta{ name: 'keywords', content: 'foo bar baz' }
- %body
- %h1 Title
- %ul
- %li one
- %li two
- %li
- %ol
- %li one
- %li two
- %li three
- %li four
- %ul
- %li five
- %li six
- %li
- %ol
- %li seven
- %li eight
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/benchmarks/run.js b/node/node_modules/jade/benchmarks/haml/benchmarks/run.js
deleted file mode 100644
index 190aec8..0000000
--- a/node/node_modules/jade/benchmarks/haml/benchmarks/run.js
+++ /dev/null
@@ -1,25 +0,0 @@
-
-var fs = require('fs'),
- haml = require('../lib/haml'),
- hamlJS = require('./haml-js/lib/haml'),
- page = fs.readFileSync('benchmarks/page.haml')
-
-var js = hamlJS.compile(page)
-
-exports.compare = {
- 'haml.js': function(){
- haml.render(page)
- },
- 'haml.js cached': function(){
- haml.render(page, { cache: true, filename: 'page.haml' })
- },
- 'haml-js': function(){
- hamlJS.render(page)
- },
- 'haml-js cached': function(){
- hamlJS.execute(js)
- },
- 'haml-js cached / optimized': function(){
- hamlJS.execute(js)
- }
-}
diff --git a/node/node_modules/jade/benchmarks/haml/examples/example.js b/node/node_modules/jade/benchmarks/haml/examples/example.js
deleted file mode 100644
index b3e7816..0000000
--- a/node/node_modules/jade/benchmarks/haml/examples/example.js
+++ /dev/null
@@ -1,15 +0,0 @@
-
-var sys = require('sys'),
- fs = require('fs'),
- haml = require('../lib/haml')
-
-var options = {
- filename: 'page.haml',
- locals: {
- title: 'Welcome',
- body: 'wahoo',
- usersOnline: 15
- }
-}
-
-sys.puts(haml.render(fs.readFileSync('examples/page.haml'), options))
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/examples/page.haml b/node/node_modules/jade/benchmarks/haml/examples/page.haml
deleted file mode 100644
index ffb69ef..0000000
--- a/node/node_modules/jade/benchmarks/haml/examples/page.haml
+++ /dev/null
@@ -1,22 +0,0 @@
-%html
- %head
- %title= title
-
- %script{ src: 'jquery.js' }
-
- %script{ src: 'jquery.ui.js' }
-
- %body
- %h1 Welcome
-
- %ul#menu
- %li.first one
- %li two
- %li.last three
- %li
- %ul
- %li nested
-
- #content
- = body
- #usersOnline= usersOnline
diff --git a/node/node_modules/jade/benchmarks/haml/index.js b/node/node_modules/jade/benchmarks/haml/index.js
deleted file mode 120000
index 55a170f..0000000
--- a/node/node_modules/jade/benchmarks/haml/index.js
+++ /dev/null
@@ -1 +0,0 @@
-lib/haml.js
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/lib/haml.js b/node/node_modules/jade/benchmarks/haml/lib/haml.js
deleted file mode 100644
index 8da6ba3..0000000
--- a/node/node_modules/jade/benchmarks/haml/lib/haml.js
+++ /dev/null
@@ -1,666 +0,0 @@
-
-// Haml - Copyright TJ Holowaychuk (MIT Licensed)
-
-/**
- * Module dependencies.
- */
-
-var sys = require('sys')
-
-/**
- * Version.
- */
-
-exports.version = '0.4.5'
-
-/**
- * Haml template cache.
- */
-
-exports.cache = {}
-
-/**
- * Default error context length.
- */
-
-exports.errorContextLength = 15
-
-/**
- * Self closing tags.
- */
-
-exports.selfClosing = [
- 'meta',
- 'img',
- 'link',
- 'br',
- 'hr',
- 'input',
- 'area',
- 'base'
- ]
-
-/**
- * Default supported doctypes.
- */
-
-exports.doctypes = {
- '5': '',
- 'xml': '',
- 'default': '',
- 'strict': '',
- 'frameset': '',
- '1.1': '',
- 'basic': '',
- 'mobile': ''
-}
-
-/**
- * Default filters.
- */
-
-exports.filters = {
-
- /**
- * Return plain string.
- */
-
- plain: function(str) {
- return str
- },
-
- /**
- * Wrap with CDATA tags.
- */
-
- cdata: function(str) {
- return ''
- },
-
- /**
- * Wrap with '
- }
-}
-
-/**
- * Function templates.
- */
-
-exports.templates = {
-
- /**
- * Execute __code__.
- */
-
- code: (function(){
- __code__;
- return ""
- }).toString(),
-
- /**
- * Execute __code__ followed by buffering __block__.
- */
-
- codeBlock: (function(){
- var buf = [];
- __code__
- buf.push(__block__);
- return buf.join("")
- }).toString(),
-
- /**
- * Iterate __vals__ as __val__ while buffering __block__.
- */
-
- iterate: (function(){
- var buf = [];
- if (__vals__ instanceof Array) {
- for (var i = 0, len = __vals__.length; i < len; ++i) {
- var __key__ = i;
- var __val__ = __vals__[i];
- buf.push(__block__);
- }
- } else if (__vals__) {
- var keys = Object.keys(__vals__);
- for (var i = 0, len = keys.length; i < len; ++i) {
- var __key__ = keys[i];
- var __val__ = __vals__[__key__];
- buf.push(__block__);
- }
- }
- return buf.join("")
- }).toString()
-}
-
-/**
- * HamlError.
- */
-
-var HamlError = exports.HamlError = function(msg) {
- this.name = 'HamlError'
- this.message = msg
- Error.captureStackTrace(this, exports.render)
-}
-sys.inherits(HamlError, Error)
-
-/**
- * Lexing rules.
- */
-
-var rules = {
- indent: /^\n( *)(?! *-#)/,
- conditionalComment: /^\/(\[[^\n]+\])/,
- comment: /^\n? *\/ */,
- silentComment: /^\n? *-#([^\n]*)/,
- doctype: /^!!! *([^\n]*)/,
- escape: /^\\(.)/,
- filter: /^:(\w+) */,
- each: /^\- *each *(\w+)(?: *, *(\w+))? * in ([^\n]+)/,
- code: /^\-([^\n]+)/,
- outputCode: /^!=([^\n]+)/,
- escapeCode: /^=([^\n]+)/,
- attrs: /^\{(.*?)\}/,
- tag: /^%([-a-zA-Z][-a-zA-Z0-9:]*)/,
- class: /^\.([\w\-]+)/,
- id: /^\#([\w\-]+)/,
- text: /^([^\n]+)/
-}
-
-/**
- * Return error context _str_.
- *
- * @param {string} str
- * @return {string}
- * @api private
- */
-
-function context(str) {
- return String(str)
- .substr(0, exports.errorContextLength)
- .replace(/\n/g, '\\n')
-}
-
-/**
- * Tokenize _str_.
- *
- * @param {string} str
- * @return {array}
- * @api private
- */
-
-function tokenize(str) {
- var captures,
- token,
- tokens = [],
- line = 1,
- lastIndents = 0,
- str = String(str).trim().replace(/\r\n|\r/g, '\n')
- function error(msg){ throw new HamlError('(Haml):' + line + ' ' + msg) }
- while (str.length) {
- for (var type in rules)
- if (captures = rules[type].exec(str)) {
- token = {
- type: type,
- line: line,
- match: captures[0],
- val: captures.length > 2
- ? captures.slice(1)
- : captures[1]
- }
- str = str.substr(captures[0].length)
- if (type === 'newline' ||
- type === 'indent') ++line
- if (type !== 'indent') break
- var indents = token.val.length / 2
- if (indents % 1)
- error('invalid indentation; got ' + token.val.length + ' spaces, should be multiple of 2')
- else if (indents - 1 > lastIndents)
- error('invalid indentation; got ' + indents + ', when previous was ' + lastIndents)
- else if (lastIndents > indents)
- while (lastIndents-- > indents)
- tokens.push({ type: 'outdent', line: line })
- else if (lastIndents !== indents)
- tokens.push({ type: 'indent', line: line })
- else
- tokens.push({ type: 'newline', line: line })
- lastIndents = indents
- }
- if (token) {
- if (token.type !== 'silentComment')
- tokens.push(token)
- token = null
- } else
- error('near "' + context(str) + '"')
- }
- return tokens.concat({ type: 'eof' })
-}
-
-/**
- * Render template _name_ with the given placeholder _vals_.
- *
- * @param {string} name
- * @param {object} vals
- * @return {string}
- * @api private
- */
-
-function template(name, vals) {
- var buf = '(' + exports.templates[name] + ').call(this)'
- for (var key in vals)
- buf = buf.replace(new RegExp(key, 'g'), vals[key])
- return buf
-}
-
-// --- Parser
-
-/**
- * Initialize parser with _str_ and _options_.
- */
-
-function Parser(str, options) {
- options = options || {}
- this.tokens = tokenize(str)
- this.xml = options.xml
-}
-
-Parser.prototype = {
-
- /**
- * Lookahead a single token.
- *
- * @return {object}
- * @api private
- */
-
- get peek() {
- return this.tokens[0]
- },
-
- /**
- * Advance a single token.
- *
- * @return {object}
- * @api private
- */
-
- get advance() {
- return this.current = this.tokens.shift()
- },
-
- /**
- * outdent
- * | eof
- */
-
- get outdent() {
- switch (this.peek.type) {
- case 'eof':
- return
- case 'outdent':
- return this.advance
- default:
- throw new HamlError('expected outdent, got ' + this.peek.type)
- }
- },
-
- /**
- * text
- */
-
- get text() {
- return '"' + this.advance.val.trim() + '"'
- },
-
- /**
- * indent expr outdent
- */
-
- get block() {
- var buf = []
- this.advance
- while (this.peek.type !== 'outdent' &&
- this.peek.type !== 'eof')
- buf.push(this.expr)
- this.outdent
- return buf.join(' + ')
- },
-
- /**
- * indent expr
- */
-
- get textBlock() {
- var token,
- indents = 1,
- buf = []
- this.advance
- while (this.peek.type !== 'eof' && indents)
- switch((token = this.advance).type) {
- case 'newline':
- buf.push('"\\n' + Array(indents).join(' ') + '"')
- break
- case 'indent':
- ++indents
- buf.push('"\\n' + Array(indents).join(' ') + '"')
- break
- case 'outdent':
- --indents
- if (indents === 1) buf.push('"\\n"')
- break
- default:
- buf.push('"' + token.match.replace(/"/g, '\\\"') + '"')
- }
- return buf.join(' + ')
- },
-
- /**
- * ( attrs | class | id )*
- */
-
- get attrs() {
- var attrs = ['attrs', 'class', 'id'],
- classes = [],
- buf = []
- while (attrs.indexOf(this.peek.type) !== -1)
- switch (this.peek.type) {
- case 'id':
- buf.push('id: "' + this.advance.val + '"')
- break
- case 'class':
- classes.push(this.advance.val)
- break
- case 'attrs':
- buf.push(this.advance.val.replace(/(for) *:/gi, '"$1":'))
- }
- if (classes.length)
- buf.push('"class": "' + classes.join(' ') + '"')
- return buf.length
- ? ' " + attrs({' + buf.join() + '}) + "'
- : ''
- },
-
- /**
- * tag
- * | tag text
- * | tag conditionalComment
- * | tag comment
- * | tag outputCode
- * | tag escapeCode
- * | tag block
- */
-
- get tag() {
- var tag = this.advance.val,
- selfClosing = !this.xml && exports.selfClosing.indexOf(tag) !== -1,
- buf = ['"\\n<' + tag + this.attrs + (selfClosing ? '/>"' : '>"')]
- switch (this.peek.type) {
- case 'text':
- buf.push(this.text)
- break
- case 'conditionalComment':
- buf.push(this.conditionalComment)
- break;
- case 'comment':
- buf.push(this.comment)
- break
- case 'outputCode':
- buf.push(this.outputCode)
- break
- case 'escapeCode':
- buf.push(this.escapeCode)
- break
- case 'indent':
- buf.push(this.block)
- }
- if (!selfClosing) buf.push('"' + tag + '>"')
- return buf.join(' + ')
- },
-
- /**
- * outputCode
- */
-
- get outputCode() {
- return this.advance.val
- },
-
- /**
- * escapeCode
- */
-
- get escapeCode() {
- return 'escape(' + this.advance.val + ')'
- },
-
- /**
- * doctype
- */
-
- get doctype() {
- var doctype = this.advance.val.trim().toLowerCase() || 'default'
- if (doctype in exports.doctypes)
- return '"' + exports.doctypes[doctype].replace(/"/g, '\\"') + '"'
- else
- throw new HamlError("doctype `" + doctype + "' does not exist")
- },
-
- /**
- * conditional comment expr
- */
-
- get conditionalComment() {
- var condition= this.advance.val
- var buf = this.peek.type === 'indent'
- ? this.block
- : this.expr
- return '""'
- },
-
- /**
- * comment expr
- */
-
- get comment() {
- this.advance
- var buf = this.peek.type === 'indent'
- ? this.block
- : this.expr
- return '""'
- },
-
- /**
- * code
- * | code block
- */
-
- get code() {
- var code = this.advance.val
- if (this.peek.type === 'indent')
- return template('codeBlock', { __code__: code, __block__: this.block })
- return template('code', { __code__: code })
- },
-
- /**
- * filter textBlock
- */
-
- get filter() {
- var filter = this.advance.val
- if (!(filter in exports.filters))
- throw new HamlError("filter `" + filter + "' does not exist")
- if (this.peek.type !== 'indent')
- throw new HamlError("filter `" + filter + "' expects a text block")
- return 'exports.filters.' + filter + '(' + this.textBlock + ')'
- },
-
- /**
- * each block
- */
-
- get iterate() {
- var each = this.advance
- if (this.peek.type !== 'indent')
- throw new HamlError("'- each' expects a block, but got " + this.peek.type)
- return template('iterate', {
- __key__: each.val[1],
- __vals__: each.val[2],
- __val__: each.val[0],
- __block__: this.block
- })
- },
-
- /**
- * eof
- * | tag
- * | text*
- * | each
- * | code
- * | escape
- * | doctype
- * | filter
- * | comment
- * | conditionalComment
- * | escapeCode
- * | outputCode
- */
-
- get expr() {
- switch (this.peek.type) {
- case 'id':
- case 'class':
- this.tokens.unshift({ type: 'tag', val: 'div' })
- return this.tag
- case 'tag':
- return this.tag
- case 'text':
- var buf = []
- while (this.peek.type === 'text') {
- buf.push(this.advance.val.trim())
- if (this.peek.type === 'newline')
- this.advance
- }
- return '"' + buf.join(' ') + '"'
- case 'each':
- return this.iterate
- case 'code':
- return this.code
- case 'escape':
- return '"' + this.advance.val + '"'
- case 'doctype':
- return this.doctype
- case 'filter':
- return this.filter
- case 'conditionalComment':
- return this.conditionalComment
- case 'comment':
- return this.comment
- case 'escapeCode':
- return this.escapeCode
- case 'outputCode':
- return this.outputCode
- case 'newline':
- case 'indent':
- case 'outdent':
- this.advance
- return this.expr
- default:
- throw new HamlError('unexpected ' + this.peek.type)
- }
- },
-
- /**
- * expr*
- */
-
- get js() {
- var buf = []
- while (this.peek.type !== 'eof')
- buf.push(this.expr)
- return buf.join(' + ')
- }
-}
-
-/**
- * Escape html entities in _str_.
- *
- * @param {string} str
- * @return {string}
- * @api private
- */
-
-function escape(str) {
- return String(str)
- .replace(/&/g, '&')
- .replace(/>/g, '>')
- .replace(/",
- "version": "0.4.5",
- "directories": {
- "lib": "."
- }
-}
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/seed.yml b/node/node_modules/jade/benchmarks/haml/seed.yml
deleted file mode 100644
index 9fdfe3b..0000000
--- a/node/node_modules/jade/benchmarks/haml/seed.yml
+++ /dev/null
@@ -1,5 +0,0 @@
----
- name: Haml
- description: Faster, harder, better HAML template engine
- tags: haml html template engine
- version: 0.4.5
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/class.haml b/node/node_modules/jade/benchmarks/haml/spec/fixtures/class.haml
deleted file mode 100644
index f11f685..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/class.haml
+++ /dev/null
@@ -1 +0,0 @@
-.users
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/class.html b/node/node_modules/jade/benchmarks/haml/spec/fixtures/class.html
deleted file mode 100644
index 4dc2d12..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/class.html
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/classes.haml b/node/node_modules/jade/benchmarks/haml/spec/fixtures/classes.haml
deleted file mode 100644
index dc250ce..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/classes.haml
+++ /dev/null
@@ -1 +0,0 @@
-.foo.bar.baz_is-awesome
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/classes.html b/node/node_modules/jade/benchmarks/haml/spec/fixtures/classes.html
deleted file mode 100644
index 94bf993..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/classes.html
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/code.each.haml b/node/node_modules/jade/benchmarks/haml/spec/fixtures/code.each.haml
deleted file mode 100644
index 9dbc82e..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/code.each.haml
+++ /dev/null
@@ -1,3 +0,0 @@
-%ul
- - each item in items
- %li= item
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/code.each.html b/node/node_modules/jade/benchmarks/haml/spec/fixtures/code.each.html
deleted file mode 100644
index bfdb0cd..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/code.each.html
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
one
-
two
-
three
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/code.each.index.haml b/node/node_modules/jade/benchmarks/haml/spec/fixtures/code.each.index.haml
deleted file mode 100644
index bfaf81f..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/code.each.index.haml
+++ /dev/null
@@ -1,3 +0,0 @@
-%ul
- - each item, index in items
- %li= item + '(' + index + ')'
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/code.each.index.html b/node/node_modules/jade/benchmarks/haml/spec/fixtures/code.each.index.html
deleted file mode 100644
index b449d4b..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/code.each.index.html
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
one(0)
-
two(1)
-
three(2)
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/code.each.non-enumerable.haml b/node/node_modules/jade/benchmarks/haml/spec/fixtures/code.each.non-enumerable.haml
deleted file mode 100644
index bfaf81f..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/code.each.non-enumerable.haml
+++ /dev/null
@@ -1,3 +0,0 @@
-%ul
- - each item, index in items
- %li= item + '(' + index + ')'
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/code.each.non-enumerable.html b/node/node_modules/jade/benchmarks/haml/spec/fixtures/code.each.non-enumerable.html
deleted file mode 100644
index e2d1b04..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/code.each.non-enumerable.html
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/code.escape.haml b/node/node_modules/jade/benchmarks/haml/spec/fixtures/code.escape.haml
deleted file mode 100644
index aacec56..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/code.escape.haml
+++ /dev/null
@@ -1 +0,0 @@
-= " "
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/code.escape.html b/node/node_modules/jade/benchmarks/haml/spec/fixtures/code.escape.html
deleted file mode 100644
index a18ba70..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/code.escape.html
+++ /dev/null
@@ -1 +0,0 @@
-<br/>
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/code.haml b/node/node_modules/jade/benchmarks/haml/spec/fixtures/code.haml
deleted file mode 100644
index 4236fe0..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/code.haml
+++ /dev/null
@@ -1 +0,0 @@
-!= "foo" + "bar"
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/code.html b/node/node_modules/jade/benchmarks/haml/spec/fixtures/code.html
deleted file mode 100644
index f6ea049..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/code.html
+++ /dev/null
@@ -1 +0,0 @@
-foobar
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/code.if.haml b/node/node_modules/jade/benchmarks/haml/spec/fixtures/code.if.haml
deleted file mode 100644
index 6731782..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/code.if.haml
+++ /dev/null
@@ -1,3 +0,0 @@
-- name = "tj"
-- if (name === 'tj')
- %p You are logged in
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/code.if.html b/node/node_modules/jade/benchmarks/haml/spec/fixtures/code.if.html
deleted file mode 100644
index 07c3d71..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/code.if.html
+++ /dev/null
@@ -1 +0,0 @@
-
You are logged in
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/code.nested.haml b/node/node_modules/jade/benchmarks/haml/spec/fixtures/code.nested.haml
deleted file mode 100644
index a86a44f..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/code.nested.haml
+++ /dev/null
@@ -1,5 +0,0 @@
-- if (true)
- - if (false)
- %p nope
- - if (true)
- %p yay
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/code.nested.html b/node/node_modules/jade/benchmarks/haml/spec/fixtures/code.nested.html
deleted file mode 100644
index 26c4fe1..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/code.nested.html
+++ /dev/null
@@ -1 +0,0 @@
-
yay
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/comment.block.conditional.haml b/node/node_modules/jade/benchmarks/haml/spec/fixtures/comment.block.conditional.haml
deleted file mode 100644
index 213e9a9..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/comment.block.conditional.haml
+++ /dev/null
@@ -1,9 +0,0 @@
-/[if IE]
- %a{ 'href' : 'http://www.mozilla.com/en-US/firefox/' }
- %h1 Get Firefox
-/[if IE]
- %a{ 'href' : 'http://www.mozilla.com/en-US/firefox/' }
- /[if IE 6]
- %h1 Get Firefox (IE6 user)
- /[if IE 7]
- %h1 Get Firefox (IE7 user)
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/comment.block.conditional.html b/node/node_modules/jade/benchmarks/haml/spec/fixtures/comment.block.conditional.html
deleted file mode 100644
index f0020fa..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/comment.block.conditional.html
+++ /dev/null
@@ -1,6 +0,0 @@
-
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/comment.block.haml b/node/node_modules/jade/benchmarks/haml/spec/fixtures/comment.block.haml
deleted file mode 100644
index 39041ea..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/comment.block.haml
+++ /dev/null
@@ -1,5 +0,0 @@
-/
- %ul
- %li nope
- %li nope
- %li nope
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/comment.block.html b/node/node_modules/jade/benchmarks/haml/spec/fixtures/comment.block.html
deleted file mode 100644
index cfbdcb7..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/comment.block.html
+++ /dev/null
@@ -1,5 +0,0 @@
-
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/comment.haml b/node/node_modules/jade/benchmarks/haml/spec/fixtures/comment.haml
deleted file mode 100644
index 92d8988..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/comment.haml
+++ /dev/null
@@ -1,3 +0,0 @@
--# nothing
-%p yay
- -# whatever you want
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/comment.html b/node/node_modules/jade/benchmarks/haml/spec/fixtures/comment.html
deleted file mode 100644
index 26c4fe1..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/comment.html
+++ /dev/null
@@ -1 +0,0 @@
-
yay
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/comment.tag.haml b/node/node_modules/jade/benchmarks/haml/spec/fixtures/comment.tag.haml
deleted file mode 100644
index 880db37..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/comment.tag.haml
+++ /dev/null
@@ -1 +0,0 @@
- / %p foo
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/comment.tag.html b/node/node_modules/jade/benchmarks/haml/spec/fixtures/comment.tag.html
deleted file mode 100644
index 1fde28f..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/comment.tag.html
+++ /dev/null
@@ -1,2 +0,0 @@
-
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/comment.text.complex.haml b/node/node_modules/jade/benchmarks/haml/spec/fixtures/comment.text.complex.haml
deleted file mode 100644
index 187cb4f..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/comment.text.complex.haml
+++ /dev/null
@@ -1,7 +0,0 @@
-%ul
- %li one
- / first item
- %li two
- / second item
- %ul
- %li three
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/comment.text.complex.html b/node/node_modules/jade/benchmarks/haml/spec/fixtures/comment.text.complex.html
deleted file mode 100644
index 301aaf7..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/comment.text.complex.html
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
one
-
two
-
-
three
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/comment.text.haml b/node/node_modules/jade/benchmarks/haml/spec/fixtures/comment.text.haml
deleted file mode 100644
index 4dfe18d..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/comment.text.haml
+++ /dev/null
@@ -1,2 +0,0 @@
-%p
- / foo bar baz
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/comment.text.html b/node/node_modules/jade/benchmarks/haml/spec/fixtures/comment.text.html
deleted file mode 100644
index 0d5b7c9..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/comment.text.html
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/context.haml b/node/node_modules/jade/benchmarks/haml/spec/fixtures/context.haml
deleted file mode 100644
index a22be1c..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/context.haml
+++ /dev/null
@@ -1 +0,0 @@
-%p= this
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/context.html b/node/node_modules/jade/benchmarks/haml/spec/fixtures/context.html
deleted file mode 100644
index 26c4fe1..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/context.html
+++ /dev/null
@@ -1 +0,0 @@
-
yay
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/cr.haml b/node/node_modules/jade/benchmarks/haml/spec/fixtures/cr.haml
deleted file mode 100644
index a492ae1..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/cr.haml
+++ /dev/null
@@ -1 +0,0 @@
-#foo
.bar
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/cr.html b/node/node_modules/jade/benchmarks/haml/spec/fixtures/cr.html
deleted file mode 100644
index 65e61f7..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/cr.html
+++ /dev/null
@@ -1,3 +0,0 @@
-
-
-
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/crlf.haml b/node/node_modules/jade/benchmarks/haml/spec/fixtures/crlf.haml
deleted file mode 100644
index 7263f27..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/crlf.haml
+++ /dev/null
@@ -1,2 +0,0 @@
-#foo
- .bar
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/crlf.html b/node/node_modules/jade/benchmarks/haml/spec/fixtures/crlf.html
deleted file mode 100644
index 65e61f7..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/crlf.html
+++ /dev/null
@@ -1,3 +0,0 @@
-
-
-
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/doctype.haml b/node/node_modules/jade/benchmarks/haml/spec/fixtures/doctype.haml
deleted file mode 100644
index 08faabd..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/doctype.haml
+++ /dev/null
@@ -1 +0,0 @@
-!!!
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/doctype.html b/node/node_modules/jade/benchmarks/haml/spec/fixtures/doctype.html
deleted file mode 100644
index f38b71c..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/doctype.html
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/doctype.xml.case.haml b/node/node_modules/jade/benchmarks/haml/spec/fixtures/doctype.xml.case.haml
deleted file mode 100644
index 57e66ca..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/doctype.xml.case.haml
+++ /dev/null
@@ -1 +0,0 @@
-!!! xml
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/doctype.xml.case.html b/node/node_modules/jade/benchmarks/haml/spec/fixtures/doctype.xml.case.html
deleted file mode 100644
index 3297f54..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/doctype.xml.case.html
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/doctype.xml.haml b/node/node_modules/jade/benchmarks/haml/spec/fixtures/doctype.xml.haml
deleted file mode 100644
index 3f0fe33..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/doctype.xml.haml
+++ /dev/null
@@ -1 +0,0 @@
-!!! XML
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/doctype.xml.html b/node/node_modules/jade/benchmarks/haml/spec/fixtures/doctype.xml.html
deleted file mode 100644
index 3297f54..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/doctype.xml.html
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/error.haml b/node/node_modules/jade/benchmarks/haml/spec/fixtures/error.haml
deleted file mode 100644
index c5b0877..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/error.haml
+++ /dev/null
@@ -1,3 +0,0 @@
-%html
- %body
- %p
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/escape.haml b/node/node_modules/jade/benchmarks/haml/spec/fixtures/escape.haml
deleted file mode 100644
index d226974..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/escape.haml
+++ /dev/null
@@ -1,2 +0,0 @@
-%p
- \.foo
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/escape.html b/node/node_modules/jade/benchmarks/haml/spec/fixtures/escape.html
deleted file mode 100644
index a919d0c..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/escape.html
+++ /dev/null
@@ -1 +0,0 @@
-
.foo
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/feed.haml b/node/node_modules/jade/benchmarks/haml/spec/fixtures/feed.haml
deleted file mode 100644
index bc4b080..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/feed.haml
+++ /dev/null
@@ -1,11 +0,0 @@
-!!! xml
-%rss{ version: '2.0' }
- %channel
- %title ExpressJS
- %link http://expressjs.com
- %description Is super cool
- %language en-us
- %item
- %title Creating Routes
- %description Some stuff
- %link http://expressjs.com/routes
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/feed.xml b/node/node_modules/jade/benchmarks/haml/spec/fixtures/feed.xml
deleted file mode 100644
index 6e0633d..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/feed.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
-ExpressJS
-http://expressjs.com
-Is super cool
-en-us
-
-Creating Routes
-Some stuff
-http://expressjs.com/routes
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/filter.cdata.haml b/node/node_modules/jade/benchmarks/haml/spec/fixtures/filter.cdata.haml
deleted file mode 100644
index ede8c5b..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/filter.cdata.haml
+++ /dev/null
@@ -1,3 +0,0 @@
-%script
- :cdata
- foo
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/filter.cdata.html b/node/node_modules/jade/benchmarks/haml/spec/fixtures/filter.cdata.html
deleted file mode 100644
index 8cefa09..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/filter.cdata.html
+++ /dev/null
@@ -1,3 +0,0 @@
-
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/filter.cdata.whitespace.haml b/node/node_modules/jade/benchmarks/haml/spec/fixtures/filter.cdata.whitespace.haml
deleted file mode 100644
index 30db588..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/filter.cdata.whitespace.haml
+++ /dev/null
@@ -1,7 +0,0 @@
-%script
- :cdata
- $(function(){
- if (foo)
- if (bar)
- alert('yay')
- })
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/filter.cdata.whitespace.html b/node/node_modules/jade/benchmarks/haml/spec/fixtures/filter.cdata.whitespace.html
deleted file mode 100644
index c09bdd9..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/filter.cdata.whitespace.html
+++ /dev/null
@@ -1,7 +0,0 @@
-
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/filter.javascript.haml b/node/node_modules/jade/benchmarks/haml/spec/fixtures/filter.javascript.haml
deleted file mode 100644
index 6a4fb39..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/filter.javascript.haml
+++ /dev/null
@@ -1,8 +0,0 @@
-%head
- :javascript
- if (foo)
- if (bar)
- alert("baz")
- foo()
- bar()
- %title Yay
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/filter.javascript.html b/node/node_modules/jade/benchmarks/haml/spec/fixtures/filter.javascript.html
deleted file mode 100644
index 62eefe2..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/filter.javascript.html
+++ /dev/null
@@ -1,9 +0,0 @@
-
-Yay
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/filter.plain.haml b/node/node_modules/jade/benchmarks/haml/spec/fixtures/filter.plain.haml
deleted file mode 100644
index 3d70c5d..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/filter.plain.haml
+++ /dev/null
@@ -1,5 +0,0 @@
-%body
- :plain
- .foo
- bar
- = baz
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/filter.plain.html b/node/node_modules/jade/benchmarks/haml/spec/fixtures/filter.plain.html
deleted file mode 100644
index d2b9084..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/filter.plain.html
+++ /dev/null
@@ -1,3 +0,0 @@
-.foo
-bar
-= baz
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/html.haml b/node/node_modules/jade/benchmarks/haml/spec/fixtures/html.haml
deleted file mode 100644
index a516e3c..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/html.haml
+++ /dev/null
@@ -1,2 +0,0 @@
-%div
-
literal
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/html.html b/node/node_modules/jade/benchmarks/haml/spec/fixtures/html.html
deleted file mode 100644
index cf23b5b..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/html.html
+++ /dev/null
@@ -1 +0,0 @@
-
literal
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/id.haml b/node/node_modules/jade/benchmarks/haml/spec/fixtures/id.haml
deleted file mode 100644
index f2c7c82..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/id.haml
+++ /dev/null
@@ -1 +0,0 @@
-#users
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/id.html b/node/node_modules/jade/benchmarks/haml/spec/fixtures/id.html
deleted file mode 100644
index c0171e2..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/id.html
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/issue.#10.haml b/node/node_modules/jade/benchmarks/haml/spec/fixtures/issue.#10.haml
deleted file mode 100644
index d6a16e3..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/issue.#10.haml
+++ /dev/null
@@ -1 +0,0 @@
-%label{ for: "forsomething"}
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/issue.#10.html b/node/node_modules/jade/benchmarks/haml/spec/fixtures/issue.#10.html
deleted file mode 100644
index c3e1e61..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/issue.#10.html
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/issue.#8.haml b/node/node_modules/jade/benchmarks/haml/spec/fixtures/issue.#8.haml
deleted file mode 100644
index 6611716..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/issue.#8.haml
+++ /dev/null
@@ -1,4 +0,0 @@
-%ul
- - each item in items
- %li= item
-%p= "Total: " + items.length
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/issue.#8.html b/node/node_modules/jade/benchmarks/haml/spec/fixtures/issue.#8.html
deleted file mode 100644
index b0d3442..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/issue.#8.html
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
foo
-
bar
-
baz
-
Total: 3
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/literals.haml b/node/node_modules/jade/benchmarks/haml/spec/fixtures/literals.haml
deleted file mode 100644
index 8ddd574..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/literals.haml
+++ /dev/null
@@ -1 +0,0 @@
-%p= user
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/literals.html b/node/node_modules/jade/benchmarks/haml/spec/fixtures/literals.html
deleted file mode 100644
index ab8d4e5..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/literals.html
+++ /dev/null
@@ -1 +0,0 @@
-
tj
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/namespace.haml b/node/node_modules/jade/benchmarks/haml/spec/fixtures/namespace.haml
deleted file mode 100644
index 45fbdb6..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/namespace.haml
+++ /dev/null
@@ -1 +0,0 @@
-%h:table{ 'xmlns:h': 'http://www.w3.org/1999/xhtml' }
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/namespace.tag.haml b/node/node_modules/jade/benchmarks/haml/spec/fixtures/namespace.tag.haml
deleted file mode 100644
index ab6f9b2..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/namespace.tag.haml
+++ /dev/null
@@ -1,5 +0,0 @@
-%body
- %fb:test.a
- %fb:bar
- %fb:foo{ title: 'home' }
- %fb:login-button
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/namespace.tag.html b/node/node_modules/jade/benchmarks/haml/spec/fixtures/namespace.tag.html
deleted file mode 100644
index a5db0c0..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/namespace.tag.html
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/namespace.xml b/node/node_modules/jade/benchmarks/haml/spec/fixtures/namespace.xml
deleted file mode 100644
index 8d1888a..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/namespace.xml
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/nesting.complex.haml b/node/node_modules/jade/benchmarks/haml/spec/fixtures/nesting.complex.haml
deleted file mode 100644
index b3bc8cc..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/nesting.complex.haml
+++ /dev/null
@@ -1,6 +0,0 @@
-%html
- %head
- %title Page Title
- %body
- %h1 Title
- %p some stuff
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/nesting.complex.html b/node/node_modules/jade/benchmarks/haml/spec/fixtures/nesting.complex.html
deleted file mode 100644
index b6eb8b5..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/nesting.complex.html
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-Page Title
-
-
Title
-
some stuff
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/nesting.simple.haml b/node/node_modules/jade/benchmarks/haml/spec/fixtures/nesting.simple.haml
deleted file mode 100644
index 7a91ed3..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/nesting.simple.haml
+++ /dev/null
@@ -1,6 +0,0 @@
-%ul
- %li one
- %li two
- %li
- %ul
- %li three
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/nesting.simple.html b/node/node_modules/jade/benchmarks/haml/spec/fixtures/nesting.simple.html
deleted file mode 100644
index 50544e2..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/nesting.simple.html
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
one
-
two
-
-
-
three
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/newlines.haml b/node/node_modules/jade/benchmarks/haml/spec/fixtures/newlines.haml
deleted file mode 100644
index b087e44..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/newlines.haml
+++ /dev/null
@@ -1,12 +0,0 @@
-%ul
- %li one
- %li two
- %li three
- %li
- %ul
- %li four
-
-%p foo
-%p
- bar
- baz
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/newlines.html b/node/node_modules/jade/benchmarks/haml/spec/fixtures/newlines.html
deleted file mode 100644
index 5beb1f9..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/newlines.html
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
one
-
two
-
three
-
-
-
four
-
foo
-
bar baz
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.attrs.bools.haml b/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.attrs.bools.haml
deleted file mode 100644
index 7e0dc4f..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.attrs.bools.haml
+++ /dev/null
@@ -1 +0,0 @@
-%input{ type: 'checkbox', checked: true }
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.attrs.bools.html b/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.attrs.bools.html
deleted file mode 100644
index 84416da..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.attrs.bools.html
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.attrs.escape.haml b/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.attrs.escape.haml
deleted file mode 100644
index b9f40e1..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.attrs.escape.haml
+++ /dev/null
@@ -1 +0,0 @@
-%option{ value: '' }
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.attrs.escape.html b/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.attrs.escape.html
deleted file mode 100644
index a958f38..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.attrs.escape.html
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.attrs.haml b/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.attrs.haml
deleted file mode 100644
index 84d2729..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.attrs.haml
+++ /dev/null
@@ -1 +0,0 @@
-%a{ href: '/', title: 'home' }
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.attrs.html b/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.attrs.html
deleted file mode 100644
index 2f8ca31..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.attrs.html
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.class.haml b/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.class.haml
deleted file mode 100644
index 66dbc04..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.class.haml
+++ /dev/null
@@ -1 +0,0 @@
-%h1.title
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.class.html b/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.class.html
deleted file mode 100644
index 101bb29..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.class.html
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.classes.haml b/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.classes.haml
deleted file mode 100644
index 61a79a6..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.classes.haml
+++ /dev/null
@@ -1 +0,0 @@
-%body.front-page.editing-user
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.classes.html b/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.classes.html
deleted file mode 100644
index 173556e..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.classes.html
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.code.haml b/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.code.haml
deleted file mode 100644
index 679e61c..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.code.haml
+++ /dev/null
@@ -1 +0,0 @@
-%div= "yay"
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.code.html b/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.code.html
deleted file mode 100644
index b3d55fc..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.code.html
+++ /dev/null
@@ -1 +0,0 @@
-
yay
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.code.no-escape.haml b/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.code.no-escape.haml
deleted file mode 100644
index f092e67..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.code.no-escape.haml
+++ /dev/null
@@ -1 +0,0 @@
-%div!= " "
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.code.no-escape.html b/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.code.no-escape.html
deleted file mode 100644
index 2c2ec7a..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.code.no-escape.html
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.complex.haml b/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.complex.haml
deleted file mode 100644
index 307f672..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.complex.haml
+++ /dev/null
@@ -1 +0,0 @@
-%a#delete-user.first.button{ href: '/', title: 'Click to delete' }= "Delete " + "tj"
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.complex.html b/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.complex.html
deleted file mode 100644
index 4ddee81..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.complex.html
+++ /dev/null
@@ -1 +0,0 @@
-Delete tj
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.empty.haml b/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.empty.haml
deleted file mode 100644
index fdfb6cb..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.empty.haml
+++ /dev/null
@@ -1,7 +0,0 @@
-%body
- %div.a
- %div.b
- .c
- .d
- #e
- #f
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.empty.html b/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.empty.html
deleted file mode 100644
index ddc05d3..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.empty.html
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.escape.haml b/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.escape.haml
deleted file mode 100644
index d33a301..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.escape.haml
+++ /dev/null
@@ -1 +0,0 @@
-%div= " "
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.escape.html b/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.escape.html
deleted file mode 100644
index 5b703e7..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.escape.html
+++ /dev/null
@@ -1 +0,0 @@
-
<br/>
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.self-close.haml b/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.self-close.haml
deleted file mode 100644
index 63096c9..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.self-close.haml
+++ /dev/null
@@ -1 +0,0 @@
-%br
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.self-close.html b/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.self-close.html
deleted file mode 100644
index 4bbea23..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.self-close.html
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.simple.haml b/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.simple.haml
deleted file mode 100644
index 20d531e..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.simple.haml
+++ /dev/null
@@ -1 +0,0 @@
-%div
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.simple.html b/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.simple.html
deleted file mode 100644
index 281c686..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.simple.html
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.text.block.complex.haml b/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.text.block.complex.haml
deleted file mode 100644
index cc55e16..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.text.block.complex.haml
+++ /dev/null
@@ -1,5 +0,0 @@
-%p
- Visit
- %a{ href: 'http://vision-media.ca' } Vision Media
- because im amazing,
- yes...
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.text.block.complex.html b/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.text.block.complex.html
deleted file mode 100644
index 07c2b6b..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.text.block.complex.html
+++ /dev/null
@@ -1,2 +0,0 @@
-
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.text.block.haml b/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.text.block.haml
deleted file mode 100644
index 20c5bcf..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.text.block.haml
+++ /dev/null
@@ -1,5 +0,0 @@
-%p
- some text
- and more text
- and even more text!
- OMG
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.text.block.html b/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.text.block.html
deleted file mode 100644
index e02ce19..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.text.block.html
+++ /dev/null
@@ -1 +0,0 @@
-
some text and more text and even more text! OMG
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.text.haml b/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.text.haml
deleted file mode 100644
index 8718f9a..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.text.haml
+++ /dev/null
@@ -1 +0,0 @@
-%div some text
\ No newline at end of file
diff --git a/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.text.html b/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.text.html
deleted file mode 100644
index e64083b..0000000
--- a/node/node_modules/jade/benchmarks/haml/spec/fixtures/tag.text.html
+++ /dev/null
@@ -1 +0,0 @@
-