Socket
Socket
Sign inDemoInstall

esprima

Package Overview
Dependencies
0
Maintainers
1
Versions
46
Alerts
File Explorer

Advanced tools

Install Socket

Detect and block malicious and high-risk dependencies

Install

Comparing version 0.9.9 to 1.0.0

assets/forkme_right_red_aa0000.png

9

assets/codemirror/javascript.js

@@ -57,3 +57,3 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) {

}
else if (/\d/.test(ch)) {
else if (/\d/.test(ch) || ch == "-" && stream.eat(/\d/)) {
stream.match(/^\d*(?:\.\d*)?(?:[eE][+\-]?\d+)?/);

@@ -247,3 +247,3 @@ return ret("number", "number");

if (type == "operator" && /\+\+|--/.test(value)) return cont(maybeoperator);
if (type == "operator") return cont(expression);
if (type == "operator" || type == ":") return cont(expression);
if (type == ";") return;

@@ -346,4 +346,5 @@ if (type == "(") return cont(pushlex(")"), commasep(expression, ")"), poplex, maybeoperator);

if (state.tokenize != jsTokenBase) return 0;
var firstChar = textAfter && textAfter.charAt(0), lexical = state.lexical,
type = lexical.type, closing = firstChar == type;
var firstChar = textAfter && textAfter.charAt(0), lexical = state.lexical;
if (lexical.type == "stat" && firstChar == "}") lexical = lexical.prev;
var type = lexical.type, closing = firstChar == type;
if (type == "vardef") return lexical.indented + 4;

@@ -350,0 +351,0 @@ else if (type == "form" && firstChar == "{") return lexical.indented;

#!/usr/bin/env node
/*
Copyright (C) 2012 Ariya Hidayat <ariya.hidayat@gmail.com>
Copyright (C) 2011 Ariya Hidayat <ariya.hidayat@gmail.com>

@@ -26,18 +27,92 @@

/*jslint sloppy:true node:true */
/*jslint sloppy:true node:true rhino:true */
var fs = require('fs'),
esprima = require('esprima'),
files = process.argv.splice(2);
var fs, esprima, fname, content, options, syntax;
if (files.length === 0) {
if (typeof require === 'function') {
fs = require('fs');
esprima = require('esprima');
} else if (typeof load === 'function') {
try {
load('esprima.js');
} catch (e) {
load('../esprima.js');
}
}
// Shims to Node.js objects when running under Rhino.
if (typeof console === 'undefined' && typeof process === 'undefined') {
console = { log: print };
fs = { readFileSync: readFile };
process = { argv: arguments, exit: quit };
process.argv.unshift('esparse.js');
process.argv.unshift('rhino');
}
function showUsage() {
console.log('Usage:');
console.log(' esparse file.js');
console.log(' esparse [options] file.js');
console.log();
console.log('Available options:');
console.log();
console.log(' --comment Gather all line and block comments in an array');
console.log(' --loc Include line-column location info for each syntax node');
console.log(' --range Include index-based range for each syntax node');
console.log(' --raw Display the raw value of literals');
console.log(' --tokens List all tokens in an array');
console.log(' --tolerant Tolerate errors on a best-effort basis (experimental)');
console.log(' -v, --version Shows program version');
console.log();
process.exit(1);
}
files.forEach(function (filename) {
var content = fs.readFileSync(filename, 'utf-8');
console.log(JSON.stringify(esprima.parse(content), null, 4));
if (process.argv.length <= 2) {
showUsage();
}
options = {};
process.argv.splice(2).forEach(function (entry) {
if (entry === '-h' || entry === '--help') {
showUsage();
} else if (entry === '-v' || entry === '--version') {
console.log('ECMAScript Parser (using Esprima version', esprima.version, ')');
console.log();
process.exit(0);
} else if (entry === '--comment') {
options.comment = true;
} else if (entry === '--loc') {
options.loc = true;
} else if (entry === '--range') {
options.range = true;
} else if (entry === '--raw') {
options.raw = true;
} else if (entry === '--tokens') {
options.tokens = true;
} else if (entry === '--tolerant') {
options.tolerant = true;
} else if (entry.slice(0, 2) === '--') {
console.log('Error: unknown option ' + entry + '.');
process.exit(1);
} else if (typeof fname === 'string') {
console.log('Error: more than one input file.');
process.exit(1);
} else {
fname = entry;
}
});
/* vim: set sw=4 ts=4 et tw=80 : */
if (typeof fname !== 'string') {
console.log('Error: no input file.');
process.exit(1);
}
try {
content = fs.readFileSync(fname, 'utf-8');
syntax = esprima.parse(content, options);
console.log(JSON.stringify(syntax, null, 4));
} catch (e) {
console.log('Error: ' + e.message);
process.exit(1);
}

@@ -27,5 +27,3 @@ /*

var timerId;
function traceRun() {
(function (global) {
'use strict';

@@ -56,3 +54,73 @@

function insertTracer() {
// Remove all previous tracing.
function untrace(code) {
var i, trace, traces = [];
// Executes visitor on the object and its children (recursively).
function traverse(object, visitor, master) {
var key, child, parent, path;
parent = (typeof master === 'undefined') ? [] : master;
if (visitor.call(null, object, parent) === false) {
return;
}
for (key in object) {
if (object.hasOwnProperty(key)) {
child = object[key];
path = [ object ];
path.push(parent);
if (typeof child === 'object' && child !== null) {
traverse(child, visitor, path);
}
}
}
}
// In order to remove all previous tracing, we need to find the syntax
// nodes associated with the tracing.
traverse(global.esprima.parse(code, { range: true }), function (node, parent) {
var n = node;
if (n.type !== 'CallExpression') {
return;
}
n = n.callee;
if (!n || n.type !== 'MemberExpression') {
return;
}
if (n.property.type !== 'Identifier' || n.property.name !== 'enterFunction') {
return;
}
n = n.object;
if (!n || n.type !== 'MemberExpression') {
return;
}
if (n.object.type !== 'Identifier' || n.object.name !== 'window') {
return;
}
if (n.property.type !== 'Identifier' || n.property.name !== 'TRACE') {
return;
}
traces.push({ start: parent[0].range[0], end: parent[0].range[1] });
});
// Remove the farther trace first, this is to avoid changing the range
// info for each trace node.
for (i = traces.length - 1; i >= 0; i -= 1) {
trace = traces[i];
if (code[trace.end] === '\n') {
trace.end = trace.end + 1;
}
code = code.slice(0, trace.start) + code.slice(trace.end, code.length);
}
return code;
}
global.traceInstrument = function () {
var tracer, code, i, functionList, signature, pos;

@@ -66,5 +134,21 @@

tracer = window.esmorph.Tracer.FunctionEntrance('window.TRACE.enterFunction');
code = untrace(code);
tracer = window.esmorph.Tracer.FunctionEntrance(function (fn) {
signature = 'window.TRACE.enterFunction({ ';
signature += 'name: "' + fn.name + '", ';
signature += 'lineNumber: ' + fn.loc.start.line + ', ';
signature += 'range: [' + fn.range[0] + ',' + fn.range[1] + ']';
signature += ' });';
return signature;
});
code = window.esmorph.modify(code, tracer);
if (typeof window.editor === 'undefined') {
document.getElementById('code').value = code;
} else {
window.editor.setValue(code);
}
// Enclose in IIFE.

@@ -74,3 +158,3 @@ code = '(function() {\n' + code + '\n}())';

return code;
}
};

@@ -95,34 +179,41 @@ function showResult() {

window.TRACE = {
hits: {},
enterFunction: function (info) {
var key = info.name + ' at line ' + info.lineNumber;
if (this.hits.hasOwnProperty(key)) {
this.hits[key] = this.hits[key] + 1;
} else {
this.hits[key] = 1;
}
},
getHistogram: function () {
var entry,
sorted = [];
for (entry in this.hits) {
if (this.hits.hasOwnProperty(entry)) {
sorted.push({ name: entry, count: this.hits[entry]});
function createTraceCollector() {
global.TRACE = {
hits: {},
enterFunction: function (info) {
var key = info.name + ' at line ' + info.lineNumber;
if (this.hits.hasOwnProperty(key)) {
this.hits[key] = this.hits[key] + 1;
} else {
this.hits[key] = 1;
}
},
getHistogram: function () {
var entry,
sorted = [];
for (entry in this.hits) {
if (this.hits.hasOwnProperty(entry)) {
sorted.push({ name: entry, count: this.hits[entry]});
}
}
sorted.sort(function (a, b) {
return b.count - a.count;
});
return sorted;
}
sorted.sort(function (a, b) {
return b.count - a.count;
});
return sorted;
};
}
global.traceRun = function () {
var code;
try {
code = global.traceInstrument();
createTraceCollector();
eval(code);
showResult();
} catch (e) {
id('result').innerText = e.toString();
}
};
try {
eval(insertTracer());
showResult();
} catch (e) {
id('result').innerText = e.toString();
}
}
}(window));
/* vim: set sw=4 ts=4 et tw=80 : */

@@ -25,18 +25,25 @@ /*

/*jslint browser:true evil:true */
/*jslint browser:true */
/*global esprima:true, escodegen:true */
function id(i) {
'use strict';
return document.getElementById(i);
}
function setText(id, str) {
'use strict';
var el = document.getElementById(id);
if (typeof el.innerText === 'string') {
el.innerText = str;
} else {
el.textContent = str;
}
}
function sourceRewrite() {
'use strict';
var code, syntax, indent;
var code, syntax, indent, quotes, option;
function setText(id, str) {
var el = document.getElementById(id);
if (typeof el.innerText === 'string') {
el.innerText = str;
} else {
el.textContent = str;
}
}
setText('error', '');

@@ -48,17 +55,33 @@ if (typeof window.editor !== 'undefined') {

// Plain textarea, likely in a situation where CodeMirror does not work.
code = document.getElementById('code').value;
code = id('code').value;
}
indent = '';
if (document.getElementById('onetab').checked) {
if (id('onetab').checked) {
indent = '\t';
} else if (document.getElementById('twospaces').checked) {
} else if (id('twospaces').checked) {
indent = ' ';
} else if (document.getElementById('fourspaces').checked) {
} else if (id('fourspaces').checked) {
indent = ' ';
}
quotes = 'auto';
if (id('singlequotes').checked) {
quotes = 'single';
} else if (id('doublequotes').checked) {
quotes = 'double';
}
option = {
format: {
indent: {
style: indent
},
quotes: quotes
}
};
try {
syntax = window.esprima.parse(code, { raw: true });
code = window.escodegen.generate(syntax, { indent: indent });
code = window.escodegen.generate(syntax, option);
} catch (e) {

@@ -70,5 +93,40 @@ setText('error', e.toString());

} else {
document.getElementById('code').value = code;
id('code').value = code;
}
}
}
/*jslint sloppy:true browser:true */
/*global sourceRewrite:true, CodeMirror:true */
window.onload = function () {
var version, el;
version = 'Using Esprima version ' + esprima.version;
version += ' and Escodegen version ' + escodegen.version + '.';
el = id('version');
if (typeof el.innerText === 'string') {
el.innerText = version;
} else {
el.textContent = version;
}
id('rewrite').onclick = sourceRewrite;
try {
window.checkEnv();
// This is just testing, to detect whether CodeMirror would fail or not
window.editor = CodeMirror.fromTextArea(id("test"));
window.editor = CodeMirror.fromTextArea(id("code"), {
lineNumbers: true,
matchBrackets: true
});
} catch (e) {
// CodeMirror failed to initialize, possible in e.g. old IE.
id('codemirror').innerHTML = '';
} finally {
id('testbox').parentNode.removeChild(id('testbox'));
}
};

@@ -7,5 +7,6 @@ {

"bin": {
"esparse": "./bin/esparse.js"
"esparse": "./bin/esparse.js",
"esvalidate": "./bin/esvalidate.js"
},
"version": "0.9.9",
"version": "1.0.0",
"engines": {

@@ -12,0 +13,0 @@ "node": ">=0.4.0"

@@ -1,53 +0,52 @@

Esprima ([esprima.org](http://esprima.org)) is an educational
[ECMAScript](http://www.ecma-international.org/publications/standards/Ecma-262.htm)
(also popularly known as [JavaScript](http://en.wikipedia.org/wiki/JavaScript>JavaScript))
parsing infrastructure for multipurpose analysis. It is also written in ECMAScript.
**Esprima** ([esprima.org](http://esprima.org)) is a high performance,
standard-compliant [ECMAScript](http://www.ecma-international.org/publications/standards/Ecma-262.htm)
parser written in ECMAScript (also popularly known as
[JavaScript](http://en.wikipedia.org/wiki/JavaScript>JavaScript)).
Esprima is created and maintained by [Ariya Hidayat](http://twitter.com/ariyahidayat),
with the help of [many contributors](https://github.com/ariya/esprima/contributors).
Esprima serves as a good basis for various tools such as source
modification ([Esmorph](https://github.com/ariya/esmorph)), coverage analyzer
([node-cover](https://github.com/itay/node-cover) and
[coveraje](https://github.com/coveraje/coveraje)),
source-to-source compiler ([Marv](https://github.com/Yoric/Marv-the-Tinker)),
syntax formatter ([Code Painter](https://github.com/fawek/codepainter)),
and code generator ([escodegen](https://github.com/Constellation/escodegen)).
Esprima runs on web browsers (IE 6+, Firefox 1+, Safari 3+, Chrome 1+, Konqueror 4.6+, Opera 8+) as well as
[Node.js](http://nodejs.org).
Esprima can be used in a web browser:
### Features
<script src="esprima.js"></script>
- Full support for [ECMAScript 5.1](http://www.ecma-international.org/publications/standards/Ecma-262.htm)(ECMA-262)
- Sensible [syntax tree format](http://esprima.org/doc/index.html#ast) compatible with Mozilla
[Parser AST](https://developer.mozilla.org/en/SpiderMonkey/Parser_API)
- Heavily tested (> 550 [unit tests](http://esprima.org/test/) with solid 100% statement coverage)
- Optional tracking of syntax node location (index-based and line-column)
- Experimental support for ES6/Harmony (module, class, destructuring, ...)
or in a Node.js application via the package manager:
Esprima is blazing fast (see the [benchmark suite](http://esprima.org/test/benchmarks.html)).
It is up to 3x faster than UglifyJS v1 and it is still [competitive](http://esprima.org/test/compare.html)
with the new generation of fast parsers.
npm install esprima
### Applications
Esprima parser output is compatible with Mozilla (SpiderMonkey)
[Parser API](https://developer.mozilla.org/en/SpiderMonkey/Parser_API).
Esprima serves as the basis for many popular JavaScript development tools:
A very simple example:
- Code coverage analysis: [node-cover](https://github.com/itay/node-cover), [Istanbul](https://github.com/yahoo/Istanbul)
- Documentation tool: [JFDoc](https://github.com/thejohnfreeman/jfdoc), [JSDuck](https://github.com/senchalabs/jsduck)
- Language extension: [LLJS](http://mbebenita.github.com/LLJS/) (low-level JS),
[Sweet.js](http://sweetjs.org/) (macro)
- ES6/Harmony transpiler: [Six](https://github.com/matthewrobb/six), [Harmonizr](https://github.com/jdiamond/harmonizr)
- Eclipse Orion smart editing ([outline view](https://github.com/aclement/esprima-outline), [content assist](http://contraptionsforprogramming.blogspot.com/2012/02/better-javascript-content-assist-in.html))
- Source code modification: [Esmorph](https://github.com/ariya/esmorph), [Code Painter](https://github.com/fawek/codepainter),
- Source transformation: [node-falafel](https://github.com/substack/node-falafel), [Esmangle](https://github.com/Constellation/esmangle), [escodegen](https://github.com/Constellation/escodegen)
esprima.parse('var answer=42').body[0].declarations[0].init
### Questions?
- [Documentation](http://esprima.org/doc)
- [Issue tracker](http://issues.esprima.org): [known problems](http://code.google.com/p/esprima/issues/list?q=Defect)
and [future plans](http://code.google.com/p/esprima/issues/list?q=Enhancement)
- [Mailing list](http://groups.google.com/group/esprima)
- [Contribution guide](http://esprima.org/doc/index.html#contribution)
produces the following object:
Follow [@Esprima](http://twitter.com/Esprima) on Twitter to get the
development updates.
Feedback and contribution are welcomed!
{ type: 'Literal', value: 42 }
Esprima is still in the development, for now please check
[the wiki documentation](http://wiki.esprima.org).
Since it is not comprehensive nor complete, refer to the
[issue tracker](http://issues.esprima.org) for
[known problems](http://code.google.com/p/esprima/issues/list?q=Defect)
and [future plans](http://code.google.com/p/esprima/issues/list?q=Enhancement).
Esprima is supported on [many browsers](http://code.google.com/p/esprima/wiki/BrowserCompatibility):
IE 6+, Firefox 1+, Safari 3+, Chrome 1+, and Opera 8+.
Feedback and contribution are welcomed! Please join the
[mailing list](http://groups.google.com/group/esprima) and read the
[contribution guide](http://code.google.com/p/esprima/wiki/ContributionGuide)
for further info.
### License
Copyright (C) 2012, 2011 [Ariya Hidayat](http://ariya.ofilabs.com/about)
(twitter: [@ariyahidayat](http://twitter.com/ariyahidayat)) and other contributors.
and other contributors.

@@ -54,0 +53,0 @@ Redistribution and use in source and binary forms, with or without

@@ -194,3 +194,3 @@ /***********************************************************************

var PUNC_BEFORE_EXPRESSION = array_to_hash(characters("[{}(,.;:"));
var PUNC_BEFORE_EXPRESSION = array_to_hash(characters("[{(,.;:"));

@@ -203,8 +203,7 @@ var PUNC_CHARS = array_to_hash(characters("[]{}(),;:"));

// 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]")
var UNICODE = { // Unicode 6.1
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-\\u0527\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0620-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0800-\\u0815\\u081A\\u0824\\u0828\\u0840-\\u0858\\u08A0\\u08A2-\\u08AC\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971-\\u0977\\u0979-\\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\\u0CF1\\u0CF2\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\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-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\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-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16EE-\\u16F0\\u1700-\\u170C\\u170E-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u1820-\\u1877\\u1880-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191C\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19C1-\\u19C7\\u1A00-\\u1A16\\u1A20-\\u1A54\\u1AA7\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1BBA-\\u1BE5\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1CE9-\\u1CEC\\u1CEE-\\u1CF1\\u1CF5\\u1CF6\\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-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2160-\\u2188\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2E2F\\u3005-\\u3007\\u3021-\\u3029\\u3031-\\u3035\\u3038-\\u303C\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FCC\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA66E\\uA67F-\\uA697\\uA6A0-\\uA6EF\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA78E\\uA790-\\uA793\\uA7A0-\\uA7AA\\uA7F8-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9CF\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA76\\uAA7A\\uAA80-\\uAAAF\\uAAB1\\uAAB5\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEA\\uAAF2-\\uAAF4\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uABC0-\\uABE2\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\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]"),
combining_mark: new RegExp("[\\u0300-\\u036F\\u0483-\\u0487\\u0591-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u0610-\\u061A\\u064B-\\u065F\\u0670\\u06D6-\\u06DC\\u06DF-\\u06E4\\u06E7\\u06E8\\u06EA-\\u06ED\\u0711\\u0730-\\u074A\\u07A6-\\u07B0\\u07EB-\\u07F3\\u0816-\\u0819\\u081B-\\u0823\\u0825-\\u0827\\u0829-\\u082D\\u0859-\\u085B\\u08E4-\\u08FE\\u0900-\\u0903\\u093A-\\u093C\\u093E-\\u094F\\u0951-\\u0957\\u0962\\u0963\\u0981-\\u0983\\u09BC\\u09BE-\\u09C4\\u09C7\\u09C8\\u09CB-\\u09CD\\u09D7\\u09E2\\u09E3\\u0A01-\\u0A03\\u0A3C\\u0A3E-\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A70\\u0A71\\u0A75\\u0A81-\\u0A83\\u0ABC\\u0ABE-\\u0AC5\\u0AC7-\\u0AC9\\u0ACB-\\u0ACD\\u0AE2\\u0AE3\\u0B01-\\u0B03\\u0B3C\\u0B3E-\\u0B44\\u0B47\\u0B48\\u0B4B-\\u0B4D\\u0B56\\u0B57\\u0B62\\u0B63\\u0B82\\u0BBE-\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCD\\u0BD7\\u0C01-\\u0C03\\u0C3E-\\u0C44\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C62\\u0C63\\u0C82\\u0C83\\u0CBC\\u0CBE-\\u0CC4\\u0CC6-\\u0CC8\\u0CCA-\\u0CCD\\u0CD5\\u0CD6\\u0CE2\\u0CE3\\u0D02\\u0D03\\u0D3E-\\u0D44\\u0D46-\\u0D48\\u0D4A-\\u0D4D\\u0D57\\u0D62\\u0D63\\u0D82\\u0D83\\u0DCA\\u0DCF-\\u0DD4\\u0DD6\\u0DD8-\\u0DDF\\u0DF2\\u0DF3\\u0E31\\u0E34-\\u0E3A\\u0E47-\\u0E4E\\u0EB1\\u0EB4-\\u0EB9\\u0EBB\\u0EBC\\u0EC8-\\u0ECD\\u0F18\\u0F19\\u0F35\\u0F37\\u0F39\\u0F3E\\u0F3F\\u0F71-\\u0F84\\u0F86\\u0F87\\u0F8D-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u102B-\\u103E\\u1056-\\u1059\\u105E-\\u1060\\u1062-\\u1064\\u1067-\\u106D\\u1071-\\u1074\\u1082-\\u108D\\u108F\\u109A-\\u109D\\u135D-\\u135F\\u1712-\\u1714\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17B4-\\u17D3\\u17DD\\u180B-\\u180D\\u18A9\\u1920-\\u192B\\u1930-\\u193B\\u19B0-\\u19C0\\u19C8\\u19C9\\u1A17-\\u1A1B\\u1A55-\\u1A5E\\u1A60-\\u1A7C\\u1A7F\\u1B00-\\u1B04\\u1B34-\\u1B44\\u1B6B-\\u1B73\\u1B80-\\u1B82\\u1BA1-\\u1BAD\\u1BE6-\\u1BF3\\u1C24-\\u1C37\\u1CD0-\\u1CD2\\u1CD4-\\u1CE8\\u1CED\\u1CF2-\\u1CF4\\u1DC0-\\u1DE6\\u1DFC-\\u1DFF\\u20D0-\\u20DC\\u20E1\\u20E5-\\u20F0\\u2CEF-\\u2CF1\\u2D7F\\u2DE0-\\u2DFF\\u302A-\\u302F\\u3099\\u309A\\uA66F\\uA674-\\uA67D\\uA69F\\uA6F0\\uA6F1\\uA802\\uA806\\uA80B\\uA823-\\uA827\\uA880\\uA881\\uA8B4-\\uA8C4\\uA8E0-\\uA8F1\\uA926-\\uA92D\\uA947-\\uA953\\uA980-\\uA983\\uA9B3-\\uA9C0\\uAA29-\\uAA36\\uAA43\\uAA4C\\uAA4D\\uAA7B\\uAAB0\\uAAB2-\\uAAB4\\uAAB7\\uAAB8\\uAABE\\uAABF\\uAAC1\\uAAEB-\\uAAEF\\uAAF5\\uAAF6\\uABE3-\\uABEA\\uABEC\\uABED\\uFB1E\\uFE00-\\uFE0F\\uFE20-\\uFE26]"),
connector_punctuation: new RegExp("[\\u005F\\u203F\\u2040\\u2054\\uFE33\\uFE34\\uFE4D-\\uFE4F\\uFF3F]"),
digit: new RegExp("[\\u0030-\\u0039\\u0660-\\u0669\\u06F0-\\u06F9\\u07C0-\\u07C9\\u0966-\\u096F\\u09E6-\\u09EF\\u0A66-\\u0A6F\\u0AE6-\\u0AEF\\u0B66-\\u0B6F\\u0BE6-\\u0BEF\\u0C66-\\u0C6F\\u0CE6-\\u0CEF\\u0D66-\\u0D6F\\u0E50-\\u0E59\\u0ED0-\\u0ED9\\u0F20-\\u0F29\\u1040-\\u1049\\u1090-\\u1099\\u17E0-\\u17E9\\u1810-\\u1819\\u1946-\\u194F\\u19D0-\\u19D9\\u1A80-\\u1A89\\u1A90-\\u1A99\\u1B50-\\u1B59\\u1BB0-\\u1BB9\\u1C40-\\u1C49\\u1C50-\\u1C59\\uA620-\\uA629\\uA8D0-\\uA8D9\\uA900-\\uA909\\uA9D0-\\uA9D9\\uAA50-\\uAA59\\uABF0-\\uABF9\\uFF10-\\uFF19]")
};

@@ -218,5 +217,9 @@

ch = ch.charCodeAt(0);
return ch >= 48 && ch <= 57; //XXX: find out if "UnicodeDigit" means something else than 0..9
return ch >= 48 && ch <= 57;
};
function is_unicode_digit(ch) {
return UNICODE.digit.test(ch);
}
function is_alphanumeric_char(ch) {

@@ -227,3 +230,3 @@ 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);
return UNICODE.combining_mark.test(ch);
};

@@ -242,3 +245,3 @@

|| is_unicode_combining_mark(ch)
|| is_digit(ch)
|| is_unicode_digit(ch)
|| is_unicode_connector_punctuation(ch)

@@ -345,2 +348,6 @@ || ch == "\u200c" // zero-width non-joiner <ZWNJ>

S.comments_before = [];
// make note of any newlines in the comments that came before
for (var i = 0, len = ret.comments_before.length; i < len; i++) {
ret.nlb = ret.nlb || ret.comments_before[i].nlb;
}
}

@@ -387,3 +394,3 @@ S.newline_before = false;

if (ch == ".") {
if (!has_dot && !has_x)
if (!has_dot && !has_x && !has_e)
return has_dot = true;

@@ -482,3 +489,3 @@ return false;

S.line += text.split("\n").length - 1;
S.newline_before = text.indexOf("\n") >= 0;
S.newline_before = S.newline_before || text.indexOf("\n") >= 0;

@@ -497,6 +504,6 @@ // https://github.com/mishoo/UglifyJS/issues/#issue/100

function read_name() {
var backslash = false, name = "", ch;
var backslash = false, name = "", ch, escaped = false, hex;
while ((ch = peek()) != null) {
if (!backslash) {
if (ch == "\\") backslash = true, next();
if (ch == "\\") escaped = backslash = true, next();
else if (is_identifier_char(ch)) name += next();

@@ -513,2 +520,6 @@ else break;

}
if (HOP(KEYWORDS, name) && escaped) {
hex = name.charCodeAt(0).toString(16).toUpperCase();
name = "\\u" + "0000".substr(hex.length) + hex + name.slice(1);
}
return name;

@@ -693,9 +704,10 @@ };

var S = {
input : typeof $TEXT == "string" ? tokenizer($TEXT, true) : $TEXT,
token : null,
prev : null,
peeked : null,
in_function : 0,
in_loop : 0,
labels : []
input : typeof $TEXT == "string" ? tokenizer($TEXT, true) : $TEXT,
token : null,
prev : null,
peeked : null,
in_function : 0,
in_directives : true,
in_loop : 0,
labels : []
};

@@ -719,2 +731,5 @@

}
S.in_directives = S.in_directives && (
S.token.type == "string" || is("punc", ";")
);
return S.token;

@@ -796,4 +811,8 @@ };

switch (S.token.type) {
case "string":
var dir = S.in_directives, stat = simple_statement();
if (dir && stat[1][0] == "string" && !is("punc", ","))
return as("directive", stat[1][1]);
return stat;
case "num":
case "string":
case "regexp":

@@ -973,2 +992,3 @@ case "operator":

var loop = S.in_loop;
S.in_directives = true;
S.in_loop = 0;

@@ -1354,4 +1374,6 @@ var a = block_();

exports.is_alphanumeric_char = is_alphanumeric_char;
exports.is_identifier_start = is_identifier_start;
exports.is_identifier_char = is_identifier_char;
exports.set_logger = function(logger) {
warn = logger;
};

@@ -263,2 +263,5 @@ /*

// UMD workaround for V8 shell.
var window;
(function (global) {

@@ -277,3 +280,6 @@ 'use strict';

load(dirname + '/3rdparty/benchmark.js');
window = global;
load(dirname + '/../esprima.js');
Benchmark = global.Benchmark;

@@ -280,0 +286,0 @@ esprima = global.esprima;

/*
Copyright (C) 2012 Ariya Hidayat <ariya.hidayat@gmail.com>
Copyright (C) 2011 Ariya Hidayat <ariya.hidayat@gmail.com>

@@ -25,247 +26,304 @@

/*jslint browser: true */
/*jslint browser: true node: true */
/*global load:true, print:true */
var setupBenchmarks,
parsers,
fixtureList,
suite;
function runBenchmarks() {
parsers = [
'Esprima',
'parse-js',
'Acorn'
];
fixtureList = [
'jQuery 1.7.1',
'Prototype 1.7.0.0',
'MooTools 1.4.1',
'Ext Core 3.1.0'
];
function slug(name) {
'use strict';
return name.toLowerCase().replace(/\s/g, '-');
}
var index = 0,
totalSize = 0,
totalTime = {},
fixture;
function kb(bytes) {
'use strict';
return (bytes / 1024).toFixed(1);
}
fixture = [
'esprima jquery-1.7.1',
'parsejs jquery-1.7.1',
'zeparser jquery-1.7.1',
'narcissus jquery-1.7.1',
function inject(fname) {
'use strict';
var head = document.getElementsByTagName('head')[0],
script = document.createElement('script');
'esprima prototype-1.7.0.0',
'parsejs prototype-1.7.0.0',
'zeparser prototype-1.7.0.0',
'narcissus prototype-1.7.0.0',
script.src = fname;
script.type = 'text/javascript';
head.appendChild(script);
}
'esprima mootools-1.4.1',
'parsejs mootools-1.4.1',
'zeparser mootools-1.4.1',
'narcissus mootools-1.4.1',
if (typeof window !== 'undefined') {
'esprima ext-core-3.1.0',
'parsejs ext-core-3.1.0',
'zeparser ext-core-3.1.0',
'narcissus ext-core-3.1.0'
];
// Run all tests in a browser environment.
setupBenchmarks = function () {
'use strict';
function id(i) {
return document.getElementById(i);
}
function id(i) {
return document.getElementById(i);
}
function kb(bytes) {
return (bytes / 1024).toFixed(1);
}
function setText(id, str) {
var el = document.getElementById(id);
if (typeof el.innerText === 'string') {
el.innerText = str;
} else {
el.textContent = str;
}
}
function setText(id, str) {
var el = document.getElementById(id);
if (typeof el.innerText === 'string') {
el.innerText = str;
} else {
el.textContent = str;
function enableRunButtons() {
id('run').disabled = false;
}
}
function ready() {
setText('status', 'Ready.');
id('run').disabled = false;
id('run').style.visibility = 'visible';
}
function disableRunButtons() {
id('run').disabled = true;
}
function load(tst, callback) {
var xhr = new XMLHttpRequest(),
src = '3rdparty/' + tst + '.js';
function createTable() {
var str = '',
i,
index,
test,
name;
// Already available? Don't reload from server.
if (window.data && window.data.hasOwnProperty(tst)) {
callback.apply();
str += '<table>';
str += '<thead><tr><th>Source</th><th>Size (KiB)</th>';
for (i = 0; i < parsers.length; i += 1) {
str += '<th>' + parsers[i] + '</th>';
}
str += '</tr></thead>';
str += '<tbody>';
for (index = 0; index < fixtureList.length; index += 1) {
test = fixtureList[index];
name = slug(test);
str += '<tr>';
str += '<td>' + test + '</td>';
if (window.data && window.data[name]) {
str += '<td id="' + name + '-size">' + kb(window.data[name].length) + '</td>';
} else {
str += '<td id="' + name + '-size"></td>';
}
for (i = 0; i < parsers.length; i += 1) {
str += '<td id="' + name + '-' + slug(parsers[i]) + '-time"></td>';
}
str += '</tr>';
}
str += '<tr><td><b>Total</b></td>';
str += '<td id="total-size"></td>';
for (i = 0; i < parsers.length; i += 1) {
str += '<td id="' + slug(parsers[i]) + '-total"></td>';
}
str += '</tr>';
str += '</tbody>';
str += '</table>';
id('result').innerHTML = str;
}
try {
xhr.timeout = 30000;
xhr.open('GET', src, true);
setText('status', 'Please wait. Loading ' + src);
function loadFixtures() {
xhr.ontimeout = function () {
setText('status', 'Please wait. Error: time out while loading ' + src + ' ');
callback.apply();
};
var index = 0,
totalSize = 0;
xhr.onreadystatechange = function () {
var success = false,
size = 0;
function load(test, callback) {
var xhr = new XMLHttpRequest(),
src = '3rdparty/' + test + '.js';
if (this.readyState === XMLHttpRequest.DONE) {
if (this.status === 200) {
window.data = window.data || {};
window.data[tst] = this.responseText;
size = this.responseText.length;
totalSize += size;
success = true;
}
}
window.data = window.data || {};
window.data[test] = '';
if (success) {
setText(tst + '-size', kb(size));
} else {
setText('status', 'Please wait. Error loading ' + src);
setText(tst + '-size', 'Error');
}
try {
xhr.timeout = 30000;
xhr.open('GET', src, true);
callback.apply();
};
xhr.ontimeout = function () {
setText('status', 'Error: time out while loading ' + test);
callback.apply();
};
xhr.send(null);
} catch (e) {
setText('status', 'Please wait. Error loading ' + src);
callback.apply();
}
}
xhr.onreadystatechange = function () {
var success = false,
size = 0;
if (this.readyState === XMLHttpRequest.DONE) {
if (this.status === 200) {
window.data[test] = this.responseText;
size = this.responseText.length;
totalSize += size;
success = true;
}
}
function loadTests() {
var sources = fixture.slice();
if (success) {
setText(test + '-size', kb(size));
} else {
setText('status', 'Please wait. Error loading ' + src);
setText(test + '-size', 'Error');
}
function loadNextTest() {
var tst;
callback.apply();
};
if (sources.length > 0) {
tst = sources[0].split(' ');
tst = tst[1];
sources.splice(0, 1);
window.setTimeout(function () {
load(tst, loadNextTest);
}, 100);
} else {
setText('total-size', kb(totalSize));
ready();
xhr.send(null);
} catch (e) {
setText('status', 'Please wait. Error loading ' + src);
callback.apply();
}
}
}
id('run').style.visibility = 'hidden';
loadNextTest();
}
function loadNextTest() {
var test;
function runBenchmark() {
var test, source, parser, fn, benchmark;
if (index < fixtureList.length) {
test = fixtureList[index];
index += 1;
setText('status', 'Please wait. Loading ' + test +
' (' + index + ' of ' + fixtureList.length + ')');
window.setTimeout(function () {
load(slug(test), loadNextTest);
}, 100);
} else {
setText('total-size', kb(totalSize));
setText('status', 'Ready.');
enableRunButtons();
}
}
function formatTime(t) {
return (t === 0) ? 'N/A' : (1000 * t).toFixed(1) + ' ms';
loadNextTest();
}
if (index >= fixture.length) {
setText('total-size', kb(totalSize));
setText('esprima-time', formatTime(totalTime.esprima));
setText('parsejs-time', formatTime(totalTime.parsejs));
setText('zeparser-time', formatTime(totalTime.zeparser));
setText('narcissus-time', formatTime(totalTime.narcissus));
ready();
return;
}
function setupParser() {
var i, j;
test = fixture[index].split(' ');
parser = test[0];
test = test[1];
suite = [];
for (i = 0; i < fixtureList.length; i += 1) {
for (j = 0; j < parsers.length; j += 1) {
suite.push({
fixture: fixtureList[i],
parser: parsers[j]
});
}
}
source = window.data[test];
setText(parser + '-' + test, 'Running...');
createTable();
}
// Force the result to be held in this array, thus defeating any
// possible "dead core elimination" optimization.
window.tree = [];
function runBenchmarks() {
switch (parser) {
case 'esprima':
fn = function () {
var syntax = window.esprima.parse(source);
window.tree.push(syntax.body.length);
};
break;
case 'narcissus':
fn = function () {
var syntax = window.Narcissus.parser.parse(source);
window.tree.push(syntax.children.length);
};
break;
case 'parsejs':
fn = function () {
var syntax = window.parseJS.parse(source);
window.tree.push(syntax.length);
};
break;
case 'zeparser':
fn = function () {
var syntax = window.ZeParser.parse(source, false);
window.tree.push(syntax.length);
};
break;
default:
throw 'Unknown parser type ' + parser;
}
var index = 0,
totalTime = {};
benchmark = new window.Benchmark(test, fn, {
'onComplete': function () {
setText(parser + '-' + this.name, formatTime(this.stats.mean));
totalSize += source.length;
totalTime[parser] += this.stats.mean;
function reset() {
var i, name;
for (i = 0; i < suite.length; i += 1) {
name = slug(suite[i].fixture) + '-' + slug(suite[i].parser);
setText(name + '-time', '');
}
}
});
window.setTimeout(function () {
benchmark.run();
index += 1;
window.setTimeout(runBenchmark, 211);
}, 211);
}
function run() {
var fixture, parser, test, source, fn, benchmark;
id('run').onclick = function () {
if (index >= suite.length) {
setText('status', 'Ready.');
enableRunButtons();
return;
}
var test;
fixture = suite[index].fixture;
parser = suite[index].parser;
for (index = 0; index < fixture.length; index += 1) {
test = fixture[index].split(' ').join('-');
setText(test, '');
}
source = window.data[slug(fixture)];
setText('status', 'Please wait. Running benchmarks...');
id('run').style.visibility = 'hidden';
test = slug(fixture) + '-' + slug(parser);
setText(test + '-time', 'Running...');
index = 0;
totalTime = {
'esprima': 0,
'narcissus': 0,
'parsejs': 0,
'zeparser': 0
};
setText('status', 'Please wait. Parsing ' + fixture + '...');
for (test in totalTime) {
if (totalTime.hasOwnProperty(test)) {
setText(test + '-time', '');
// Force the result to be held in this array, thus defeating any
// possible "dead code elimination" optimization.
window.tree = [];
switch (parser) {
case 'Esprima':
fn = function () {
var syntax = window.esprima.parse(source);
window.tree.push(syntax.body.length);
};
break;
case 'parse-js':
fn = function () {
var syntax = window.parseJS.parse(source);
window.tree.push(syntax.length);
};
break;
case 'Acorn':
fn = function () {
var syntax = window.acorn.parse(source);
window.tree.push(syntax.body.length);
};
break;
default:
throw 'Unknown parser type ' + parser;
}
benchmark = new window.Benchmark(test, fn, {
'onComplete': function () {
setText(this.name + '-time', (1000 * this.stats.mean).toFixed(1));
if (!totalTime[parser]) {
totalTime[parser] = this.stats.mean;
} else {
totalTime[parser] += this.stats.mean;
}
setText(slug(parser) + '-total', (1000 * totalTime[parser]).toFixed(1));
}
});
window.setTimeout(function () {
benchmark.run();
index += 1;
window.setTimeout(run, 211);
}, 211);
}
}
if (typeof window.Narcissus !== 'object') {
window.Narcissus = {
parser: {
parse: function (code) {
throw new Error('Narcissus is not available!');
}
}
};
disableRunButtons();
setText('status', 'Please wait. Running benchmarks...');
reset();
run();
}
runBenchmark();
};
id('run').onclick = function () {
runBenchmarks();
};
setText('benchmarkjs-version', ' version ' + window.Benchmark.version);
setText('version', window.esprima.version);
setText('benchmarkjs-version', ' version ' + window.Benchmark.version);
setText('version', window.esprima.version);
loadTests();
setupParser();
createTable();
disableRunButtons();
loadFixtures();
};
} else {
// TODO
console.log('Not implemented yet!');
}
/* vim: set sw=4 ts=4 et tw=80 : */

@@ -32,3 +32,7 @@ // This is modified from Mozilla Reflect.parse test suite (the file is located

params: params,
body: body
defaults: [],
body: body,
rest: null,
generator: false,
expression: false
}) }

@@ -38,3 +42,7 @@ function genFunDecl(id, params, body) { return Pattern({ type: "FunctionDeclaration",

params: params,
body: body
defaults: [],
body: body,
rest: null,
generator: false,
expression: false
}) }

@@ -63,4 +71,4 @@ function declarator(id, init) { return Pattern({ type: "VariableDeclarator", id: id, init: init }) }

function defaultClause(stmts) { return Pattern({ type: "SwitchCase", test: null, consequent: stmts }) }
function catchClause(id, guard, body) { return Pattern({ type: "CatchClause", param: id, guard: guard, body: body }) }
function tryStmt(body, catches, fin) { return Pattern({ type: "TryStatement", block: body, handlers: catches, finalizer: fin }) }
function catchClause(id, guard, body) { if (guard) { return Pattern({ type: "GuardedCatchClause", param: id, guard: guard, body: body }) } else { return Pattern({ type: "CatchClause", param: id, body: body }) } }
function tryStmt(body, guarded, catches, fin) { return Pattern({ type: "TryStatement", block: body, guardedHandlers: guarded, handlers: catches, finalizer: fin }) }
function letStmt(head, body) { return Pattern({ type: "LetStatement", head: head, body: body }) }

@@ -70,3 +78,7 @@ function funExpr(id, args, body, gen) { return Pattern({ type: "FunctionExpression",

params: args,
body: body
defaults: [],
body: body,
rest: null,
generator: false,
expression: false
}) }

@@ -76,3 +88,7 @@ function genFunExpr(id, args, body) { return Pattern({ type: "FunctionExpression",

params: args,
body: body
defaults: [],
body: body,
rest: null,
generator: false,
expression: false
}) }

@@ -368,2 +384,3 @@

tryStmt(blockStmt([]),
[],
[ catchClause(ident("e"), null, blockStmt([])) ],

@@ -373,2 +390,3 @@ null));

tryStmt(blockStmt([]),
[],
[ catchClause(ident("e"), null, blockStmt([])) ],

@@ -379,2 +397,3 @@ blockStmt([])));

[],
[],
blockStmt([])));

@@ -381,0 +400,0 @@

@@ -38,3 +38,3 @@ /*

suites = [
'test',
'runner',
'compat'

@@ -41,0 +41,0 @@ ];

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc