mirror of
https://github.com/hpd840321/starRiverProperty.git
synced 2026-06-10 00:40:30 +08:00
chore: init frontend-source directory with tooling scaffold
Former-commit-id: 435fb8e3e4f8e334ad3b0e95052edbdd9547d197
This commit is contained in:
+58
@@ -0,0 +1,58 @@
|
||||
/* jshint node: true, curly: false */
|
||||
// Parts of this section of code is taken from acorn.
|
||||
//
|
||||
// Acorn was written by Marijn Haverbeke and released under an MIT
|
||||
// license. The Unicode regexps (for identifiers and whitespace) were
|
||||
// taken from [Esprima](http://esprima.org) by Ariya Hidayat.
|
||||
//
|
||||
// Git repositories for Acorn are available at
|
||||
//
|
||||
// http://marijnhaverbeke.nl/git/acorn
|
||||
// https://github.com/marijnh/acorn.git
|
||||
|
||||
// ## Character categories
|
||||
|
||||
|
||||
'use strict';
|
||||
|
||||
// acorn used char codes to squeeze the last bit of performance out
|
||||
// Beautifier is okay without that, so we're using regex
|
||||
// permit # (23), $ (36), and @ (64). @ is used in ES7 decorators.
|
||||
// 65 through 91 are uppercase letters.
|
||||
// permit _ (95).
|
||||
// 97 through 123 are lowercase letters.
|
||||
var baseASCIIidentifierStartChars = "\\x23\\x24\\x40\\x41-\\x5a\\x5f\\x61-\\x7a";
|
||||
|
||||
// inside an identifier @ is not allowed but 0-9 are.
|
||||
var baseASCIIidentifierChars = "\\x24\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a";
|
||||
|
||||
// Big ugly regular expressions that match characters in the
|
||||
// whitespace, identifier, and identifier-start categories. These
|
||||
// are only applied when a character is found to actually have a
|
||||
// code point above 128.
|
||||
var nonASCIIidentifierStartChars = "\\xaa\\xb5\\xba\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\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";
|
||||
var nonASCIIidentifierChars = "\\u0300-\\u036f\\u0483-\\u0487\\u0591-\\u05bd\\u05bf\\u05c1\\u05c2\\u05c4\\u05c5\\u05c7\\u0610-\\u061a\\u0620-\\u0649\\u0672-\\u06d3\\u06e7-\\u06e8\\u06fb-\\u06fc\\u0730-\\u074a\\u0800-\\u0814\\u081b-\\u0823\\u0825-\\u0827\\u0829-\\u082d\\u0840-\\u0857\\u08e4-\\u08fe\\u0900-\\u0903\\u093a-\\u093c\\u093e-\\u094f\\u0951-\\u0957\\u0962-\\u0963\\u0966-\\u096f\\u0981-\\u0983\\u09bc\\u09be-\\u09c4\\u09c7\\u09c8\\u09d7\\u09df-\\u09e0\\u0a01-\\u0a03\\u0a3c\\u0a3e-\\u0a42\\u0a47\\u0a48\\u0a4b-\\u0a4d\\u0a51\\u0a66-\\u0a71\\u0a75\\u0a81-\\u0a83\\u0abc\\u0abe-\\u0ac5\\u0ac7-\\u0ac9\\u0acb-\\u0acd\\u0ae2-\\u0ae3\\u0ae6-\\u0aef\\u0b01-\\u0b03\\u0b3c\\u0b3e-\\u0b44\\u0b47\\u0b48\\u0b4b-\\u0b4d\\u0b56\\u0b57\\u0b5f-\\u0b60\\u0b66-\\u0b6f\\u0b82\\u0bbe-\\u0bc2\\u0bc6-\\u0bc8\\u0bca-\\u0bcd\\u0bd7\\u0be6-\\u0bef\\u0c01-\\u0c03\\u0c46-\\u0c48\\u0c4a-\\u0c4d\\u0c55\\u0c56\\u0c62-\\u0c63\\u0c66-\\u0c6f\\u0c82\\u0c83\\u0cbc\\u0cbe-\\u0cc4\\u0cc6-\\u0cc8\\u0cca-\\u0ccd\\u0cd5\\u0cd6\\u0ce2-\\u0ce3\\u0ce6-\\u0cef\\u0d02\\u0d03\\u0d46-\\u0d48\\u0d57\\u0d62-\\u0d63\\u0d66-\\u0d6f\\u0d82\\u0d83\\u0dca\\u0dcf-\\u0dd4\\u0dd6\\u0dd8-\\u0ddf\\u0df2\\u0df3\\u0e34-\\u0e3a\\u0e40-\\u0e45\\u0e50-\\u0e59\\u0eb4-\\u0eb9\\u0ec8-\\u0ecd\\u0ed0-\\u0ed9\\u0f18\\u0f19\\u0f20-\\u0f29\\u0f35\\u0f37\\u0f39\\u0f41-\\u0f47\\u0f71-\\u0f84\\u0f86-\\u0f87\\u0f8d-\\u0f97\\u0f99-\\u0fbc\\u0fc6\\u1000-\\u1029\\u1040-\\u1049\\u1067-\\u106d\\u1071-\\u1074\\u1082-\\u108d\\u108f-\\u109d\\u135d-\\u135f\\u170e-\\u1710\\u1720-\\u1730\\u1740-\\u1750\\u1772\\u1773\\u1780-\\u17b2\\u17dd\\u17e0-\\u17e9\\u180b-\\u180d\\u1810-\\u1819\\u1920-\\u192b\\u1930-\\u193b\\u1951-\\u196d\\u19b0-\\u19c0\\u19c8-\\u19c9\\u19d0-\\u19d9\\u1a00-\\u1a15\\u1a20-\\u1a53\\u1a60-\\u1a7c\\u1a7f-\\u1a89\\u1a90-\\u1a99\\u1b46-\\u1b4b\\u1b50-\\u1b59\\u1b6b-\\u1b73\\u1bb0-\\u1bb9\\u1be6-\\u1bf3\\u1c00-\\u1c22\\u1c40-\\u1c49\\u1c5b-\\u1c7d\\u1cd0-\\u1cd2\\u1d00-\\u1dbe\\u1e01-\\u1f15\\u200c\\u200d\\u203f\\u2040\\u2054\\u20d0-\\u20dc\\u20e1\\u20e5-\\u20f0\\u2d81-\\u2d96\\u2de0-\\u2dff\\u3021-\\u3028\\u3099\\u309a\\ua640-\\ua66d\\ua674-\\ua67d\\ua69f\\ua6f0-\\ua6f1\\ua7f8-\\ua800\\ua806\\ua80b\\ua823-\\ua827\\ua880-\\ua881\\ua8b4-\\ua8c4\\ua8d0-\\ua8d9\\ua8f3-\\ua8f7\\ua900-\\ua909\\ua926-\\ua92d\\ua930-\\ua945\\ua980-\\ua983\\ua9b3-\\ua9c0\\uaa00-\\uaa27\\uaa40-\\uaa41\\uaa4c-\\uaa4d\\uaa50-\\uaa59\\uaa7b\\uaae0-\\uaae9\\uaaf2-\\uaaf3\\uabc0-\\uabe1\\uabec\\uabed\\uabf0-\\uabf9\\ufb20-\\ufb28\\ufe00-\\ufe0f\\ufe20-\\ufe26\\ufe33\\ufe34\\ufe4d-\\ufe4f\\uff10-\\uff19\\uff3f";
|
||||
//var nonASCIIidentifierStart = new RegExp("[" + nonASCIIidentifierStartChars + "]");
|
||||
//var nonASCIIidentifier = new RegExp("[" + nonASCIIidentifierStartChars + nonASCIIidentifierChars + "]");
|
||||
|
||||
var unicodeEscapeOrCodePoint = "\\\\u[0-9a-fA-F]{4}|\\\\u\\{[0-9a-fA-F]+\\}";
|
||||
var identifierStart = "(?:" + unicodeEscapeOrCodePoint + "|[" + baseASCIIidentifierStartChars + nonASCIIidentifierStartChars + "])";
|
||||
var identifierChars = "(?:" + unicodeEscapeOrCodePoint + "|[" + baseASCIIidentifierChars + nonASCIIidentifierStartChars + nonASCIIidentifierChars + "])*";
|
||||
|
||||
exports.identifier = new RegExp(identifierStart + identifierChars, 'g');
|
||||
exports.identifierStart = new RegExp(identifierStart);
|
||||
exports.identifierMatch = new RegExp("(?:" + unicodeEscapeOrCodePoint + "|[" + baseASCIIidentifierChars + nonASCIIidentifierStartChars + nonASCIIidentifierChars + "])+");
|
||||
|
||||
var nonASCIIwhitespace = /[\u1680\u180e\u2000-\u200a\u202f\u205f\u3000\ufeff]/; // jshint ignore:line
|
||||
|
||||
// Whether a single character denotes a newline.
|
||||
|
||||
exports.newline = /[\n\r\u2028\u2029]/;
|
||||
|
||||
// Matches a whole line break (where CRLF is considered a single
|
||||
// line break). Used to count lines.
|
||||
|
||||
// in javascript, these two differ
|
||||
// in python they are the same, different methods are called on them
|
||||
exports.lineBreak = new RegExp('\r\n|' + exports.newline.source);
|
||||
exports.allLineBreaks = new RegExp(exports.lineBreak.source, 'g');
|
||||
+1480
File diff suppressed because it is too large
Load Diff
+42
@@ -0,0 +1,42 @@
|
||||
/*jshint node:true */
|
||||
/*
|
||||
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.
|
||||
|
||||
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.
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var Beautifier = require('./beautifier').Beautifier,
|
||||
Options = require('./options').Options;
|
||||
|
||||
function js_beautify(js_source_text, options) {
|
||||
var beautifier = new Beautifier(js_source_text, options);
|
||||
return beautifier.beautify();
|
||||
}
|
||||
|
||||
module.exports = js_beautify;
|
||||
module.exports.defaultOptions = function() {
|
||||
return new Options();
|
||||
};
|
||||
+93
@@ -0,0 +1,93 @@
|
||||
/*jshint node:true */
|
||||
/*
|
||||
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.
|
||||
|
||||
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.
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var BaseOptions = require('../core/options').Options;
|
||||
|
||||
var validPositionValues = ['before-newline', 'after-newline', 'preserve-newline'];
|
||||
|
||||
function Options(options) {
|
||||
BaseOptions.call(this, options, 'js');
|
||||
|
||||
// compatibility, re
|
||||
var raw_brace_style = this.raw_options.brace_style || null;
|
||||
if (raw_brace_style === "expand-strict") { //graceful handling of deprecated option
|
||||
this.raw_options.brace_style = "expand";
|
||||
} else if (raw_brace_style === "collapse-preserve-inline") { //graceful handling of deprecated option
|
||||
this.raw_options.brace_style = "collapse,preserve-inline";
|
||||
} else if (this.raw_options.braces_on_own_line !== undefined) { //graceful handling of deprecated option
|
||||
this.raw_options.brace_style = this.raw_options.braces_on_own_line ? "expand" : "collapse";
|
||||
// } else if (!raw_brace_style) { //Nothing exists to set it
|
||||
// raw_brace_style = "collapse";
|
||||
}
|
||||
|
||||
//preserve-inline in delimited string will trigger brace_preserve_inline, everything
|
||||
//else is considered a brace_style and the last one only will have an effect
|
||||
|
||||
var brace_style_split = this._get_selection_list('brace_style', ['collapse', 'expand', 'end-expand', 'none', 'preserve-inline']);
|
||||
|
||||
this.brace_preserve_inline = false; //Defaults in case one or other was not specified in meta-option
|
||||
this.brace_style = "collapse";
|
||||
|
||||
for (var bs = 0; bs < brace_style_split.length; bs++) {
|
||||
if (brace_style_split[bs] === "preserve-inline") {
|
||||
this.brace_preserve_inline = true;
|
||||
} else {
|
||||
this.brace_style = brace_style_split[bs];
|
||||
}
|
||||
}
|
||||
|
||||
this.unindent_chained_methods = this._get_boolean('unindent_chained_methods');
|
||||
this.break_chained_methods = this._get_boolean('break_chained_methods');
|
||||
this.space_in_paren = this._get_boolean('space_in_paren');
|
||||
this.space_in_empty_paren = this._get_boolean('space_in_empty_paren');
|
||||
this.jslint_happy = this._get_boolean('jslint_happy');
|
||||
this.space_after_anon_function = this._get_boolean('space_after_anon_function');
|
||||
this.space_after_named_function = this._get_boolean('space_after_named_function');
|
||||
this.keep_array_indentation = this._get_boolean('keep_array_indentation');
|
||||
this.space_before_conditional = this._get_boolean('space_before_conditional', true);
|
||||
this.unescape_strings = this._get_boolean('unescape_strings');
|
||||
this.e4x = this._get_boolean('e4x');
|
||||
this.comma_first = this._get_boolean('comma_first');
|
||||
this.operator_position = this._get_selection('operator_position', validPositionValues);
|
||||
|
||||
// For testing of beautify preserve:start directive
|
||||
this.test_output_raw = this._get_boolean('test_output_raw');
|
||||
|
||||
// force this._options.space_after_anon_function to true if this._options.jslint_happy
|
||||
if (this.jslint_happy) {
|
||||
this.space_after_anon_function = true;
|
||||
}
|
||||
|
||||
}
|
||||
Options.prototype = new BaseOptions();
|
||||
|
||||
|
||||
|
||||
module.exports.Options = Options;
|
||||
+586
@@ -0,0 +1,586 @@
|
||||
/*jshint node:true */
|
||||
/*
|
||||
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.
|
||||
|
||||
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.
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var InputScanner = require('../core/inputscanner').InputScanner;
|
||||
var BaseTokenizer = require('../core/tokenizer').Tokenizer;
|
||||
var BASETOKEN = require('../core/tokenizer').TOKEN;
|
||||
var Directives = require('../core/directives').Directives;
|
||||
var acorn = require('./acorn');
|
||||
var Pattern = require('../core/pattern').Pattern;
|
||||
var TemplatablePattern = require('../core/templatablepattern').TemplatablePattern;
|
||||
|
||||
|
||||
function in_array(what, arr) {
|
||||
return arr.indexOf(what) !== -1;
|
||||
}
|
||||
|
||||
|
||||
var TOKEN = {
|
||||
START_EXPR: 'TK_START_EXPR',
|
||||
END_EXPR: 'TK_END_EXPR',
|
||||
START_BLOCK: 'TK_START_BLOCK',
|
||||
END_BLOCK: 'TK_END_BLOCK',
|
||||
WORD: 'TK_WORD',
|
||||
RESERVED: 'TK_RESERVED',
|
||||
SEMICOLON: 'TK_SEMICOLON',
|
||||
STRING: 'TK_STRING',
|
||||
EQUALS: 'TK_EQUALS',
|
||||
OPERATOR: 'TK_OPERATOR',
|
||||
COMMA: 'TK_COMMA',
|
||||
BLOCK_COMMENT: 'TK_BLOCK_COMMENT',
|
||||
COMMENT: 'TK_COMMENT',
|
||||
DOT: 'TK_DOT',
|
||||
UNKNOWN: 'TK_UNKNOWN',
|
||||
START: BASETOKEN.START,
|
||||
RAW: BASETOKEN.RAW,
|
||||
EOF: BASETOKEN.EOF
|
||||
};
|
||||
|
||||
|
||||
var directives_core = new Directives(/\/\*/, /\*\//);
|
||||
|
||||
var number_pattern = /0[xX][0123456789abcdefABCDEF_]*n?|0[oO][01234567_]*n?|0[bB][01_]*n?|\d[\d_]*n|(?:\.\d[\d_]*|\d[\d_]*\.?[\d_]*)(?:[eE][+-]?[\d_]+)?/;
|
||||
|
||||
var digit = /[0-9]/;
|
||||
|
||||
// Dot "." must be distinguished from "..." and decimal
|
||||
var dot_pattern = /[^\d\.]/;
|
||||
|
||||
var positionable_operators = (
|
||||
">>> === !== &&= ??= ||= " +
|
||||
"<< && >= ** != == <= >> || ?? |> " +
|
||||
"< / - + > : & % ? ^ | *").split(' ');
|
||||
|
||||
// IMPORTANT: this must be sorted longest to shortest or tokenizing many not work.
|
||||
// Also, you must update possitionable operators separately from punct
|
||||
var punct =
|
||||
">>>= " +
|
||||
"... >>= <<= === >>> !== **= &&= ??= ||= " +
|
||||
"=> ^= :: /= << <= == && -= >= >> != -- += ** || ?? ++ %= &= *= |= |> " +
|
||||
"= ! ? > < : / ^ - + * & % ~ |";
|
||||
|
||||
punct = punct.replace(/[-[\]{}()*+?.,\\^$|#]/g, "\\$&");
|
||||
// ?. but not if followed by a number
|
||||
punct = '\\?\\.(?!\\d) ' + punct;
|
||||
punct = punct.replace(/ /g, '|');
|
||||
|
||||
var punct_pattern = new RegExp(punct);
|
||||
|
||||
// words which should always start on new line.
|
||||
var line_starters = 'continue,try,throw,return,var,let,const,if,switch,case,default,for,while,break,function,import,export'.split(',');
|
||||
var reserved_words = line_starters.concat(['do', 'in', 'of', 'else', 'get', 'set', 'new', 'catch', 'finally', 'typeof', 'yield', 'async', 'await', 'from', 'as', 'class', 'extends']);
|
||||
var reserved_word_pattern = new RegExp('^(?:' + reserved_words.join('|') + ')$');
|
||||
|
||||
// var template_pattern = /(?:(?:<\?php|<\?=)[\s\S]*?\?>)|(?:<%[\s\S]*?%>)/g;
|
||||
|
||||
var in_html_comment;
|
||||
|
||||
var Tokenizer = function(input_string, options) {
|
||||
BaseTokenizer.call(this, input_string, options);
|
||||
|
||||
this._patterns.whitespace = this._patterns.whitespace.matching(
|
||||
/\u00A0\u1680\u180e\u2000-\u200a\u202f\u205f\u3000\ufeff/.source,
|
||||
/\u2028\u2029/.source);
|
||||
|
||||
var pattern_reader = new Pattern(this._input);
|
||||
var templatable = new TemplatablePattern(this._input)
|
||||
.read_options(this._options);
|
||||
|
||||
this.__patterns = {
|
||||
template: templatable,
|
||||
identifier: templatable.starting_with(acorn.identifier).matching(acorn.identifierMatch),
|
||||
number: pattern_reader.matching(number_pattern),
|
||||
punct: pattern_reader.matching(punct_pattern),
|
||||
// comment ends just before nearest linefeed or end of file
|
||||
comment: pattern_reader.starting_with(/\/\//).until(/[\n\r\u2028\u2029]/),
|
||||
// /* ... */ comment ends with nearest */ or end of file
|
||||
block_comment: pattern_reader.starting_with(/\/\*/).until_after(/\*\//),
|
||||
html_comment_start: pattern_reader.matching(/<!--/),
|
||||
html_comment_end: pattern_reader.matching(/-->/),
|
||||
include: pattern_reader.starting_with(/#include/).until_after(acorn.lineBreak),
|
||||
shebang: pattern_reader.starting_with(/#!/).until_after(acorn.lineBreak),
|
||||
xml: pattern_reader.matching(/[\s\S]*?<(\/?)([-a-zA-Z:0-9_.]+|{[^}]+?}|!\[CDATA\[[^\]]*?\]\]|)(\s*{[^}]+?}|\s+[-a-zA-Z:0-9_.]+|\s+[-a-zA-Z:0-9_.]+\s*=\s*('[^']*'|"[^"]*"|{([^{}]|{[^}]+?})+?}))*\s*(\/?)\s*>/),
|
||||
single_quote: templatable.until(/['\\\n\r\u2028\u2029]/),
|
||||
double_quote: templatable.until(/["\\\n\r\u2028\u2029]/),
|
||||
template_text: templatable.until(/[`\\$]/),
|
||||
template_expression: templatable.until(/[`}\\]/)
|
||||
};
|
||||
|
||||
};
|
||||
Tokenizer.prototype = new BaseTokenizer();
|
||||
|
||||
Tokenizer.prototype._is_comment = function(current_token) {
|
||||
return current_token.type === TOKEN.COMMENT || current_token.type === TOKEN.BLOCK_COMMENT || current_token.type === TOKEN.UNKNOWN;
|
||||
};
|
||||
|
||||
Tokenizer.prototype._is_opening = function(current_token) {
|
||||
return current_token.type === TOKEN.START_BLOCK || current_token.type === TOKEN.START_EXPR;
|
||||
};
|
||||
|
||||
Tokenizer.prototype._is_closing = function(current_token, open_token) {
|
||||
return (current_token.type === TOKEN.END_BLOCK || current_token.type === TOKEN.END_EXPR) &&
|
||||
(open_token && (
|
||||
(current_token.text === ']' && open_token.text === '[') ||
|
||||
(current_token.text === ')' && open_token.text === '(') ||
|
||||
(current_token.text === '}' && open_token.text === '{')));
|
||||
};
|
||||
|
||||
Tokenizer.prototype._reset = function() {
|
||||
in_html_comment = false;
|
||||
};
|
||||
|
||||
Tokenizer.prototype._get_next_token = function(previous_token, open_token) { // jshint unused:false
|
||||
var token = null;
|
||||
this._readWhitespace();
|
||||
var c = this._input.peek();
|
||||
|
||||
if (c === null) {
|
||||
return this._create_token(TOKEN.EOF, '');
|
||||
}
|
||||
|
||||
token = token || this._read_non_javascript(c);
|
||||
token = token || this._read_string(c);
|
||||
token = token || this._read_pair(c, this._input.peek(1)); // Issue #2062 hack for record type '#{'
|
||||
token = token || this._read_word(previous_token);
|
||||
token = token || this._read_singles(c);
|
||||
token = token || this._read_comment(c);
|
||||
token = token || this._read_regexp(c, previous_token);
|
||||
token = token || this._read_xml(c, previous_token);
|
||||
token = token || this._read_punctuation();
|
||||
token = token || this._create_token(TOKEN.UNKNOWN, this._input.next());
|
||||
|
||||
return token;
|
||||
};
|
||||
|
||||
Tokenizer.prototype._read_word = function(previous_token) {
|
||||
var resulting_string;
|
||||
resulting_string = this.__patterns.identifier.read();
|
||||
if (resulting_string !== '') {
|
||||
resulting_string = resulting_string.replace(acorn.allLineBreaks, '\n');
|
||||
if (!(previous_token.type === TOKEN.DOT ||
|
||||
(previous_token.type === TOKEN.RESERVED && (previous_token.text === 'set' || previous_token.text === 'get'))) &&
|
||||
reserved_word_pattern.test(resulting_string)) {
|
||||
if ((resulting_string === 'in' || resulting_string === 'of') &&
|
||||
(previous_token.type === TOKEN.WORD || previous_token.type === TOKEN.STRING)) { // hack for 'in' and 'of' operators
|
||||
return this._create_token(TOKEN.OPERATOR, resulting_string);
|
||||
}
|
||||
return this._create_token(TOKEN.RESERVED, resulting_string);
|
||||
}
|
||||
return this._create_token(TOKEN.WORD, resulting_string);
|
||||
}
|
||||
|
||||
resulting_string = this.__patterns.number.read();
|
||||
if (resulting_string !== '') {
|
||||
return this._create_token(TOKEN.WORD, resulting_string);
|
||||
}
|
||||
};
|
||||
|
||||
Tokenizer.prototype._read_singles = function(c) {
|
||||
var token = null;
|
||||
if (c === '(' || c === '[') {
|
||||
token = this._create_token(TOKEN.START_EXPR, c);
|
||||
} else if (c === ')' || c === ']') {
|
||||
token = this._create_token(TOKEN.END_EXPR, c);
|
||||
} else if (c === '{') {
|
||||
token = this._create_token(TOKEN.START_BLOCK, c);
|
||||
} else if (c === '}') {
|
||||
token = this._create_token(TOKEN.END_BLOCK, c);
|
||||
} else if (c === ';') {
|
||||
token = this._create_token(TOKEN.SEMICOLON, c);
|
||||
} else if (c === '.' && dot_pattern.test(this._input.peek(1))) {
|
||||
token = this._create_token(TOKEN.DOT, c);
|
||||
} else if (c === ',') {
|
||||
token = this._create_token(TOKEN.COMMA, c);
|
||||
}
|
||||
|
||||
if (token) {
|
||||
this._input.next();
|
||||
}
|
||||
return token;
|
||||
};
|
||||
|
||||
Tokenizer.prototype._read_pair = function(c, d) {
|
||||
var token = null;
|
||||
if (c === '#' && d === '{') {
|
||||
token = this._create_token(TOKEN.START_BLOCK, c + d);
|
||||
}
|
||||
|
||||
if (token) {
|
||||
this._input.next();
|
||||
this._input.next();
|
||||
}
|
||||
return token;
|
||||
};
|
||||
|
||||
Tokenizer.prototype._read_punctuation = function() {
|
||||
var resulting_string = this.__patterns.punct.read();
|
||||
|
||||
if (resulting_string !== '') {
|
||||
if (resulting_string === '=') {
|
||||
return this._create_token(TOKEN.EQUALS, resulting_string);
|
||||
} else if (resulting_string === '?.') {
|
||||
return this._create_token(TOKEN.DOT, resulting_string);
|
||||
} else {
|
||||
return this._create_token(TOKEN.OPERATOR, resulting_string);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
Tokenizer.prototype._read_non_javascript = function(c) {
|
||||
var resulting_string = '';
|
||||
|
||||
if (c === '#') {
|
||||
if (this._is_first_token()) {
|
||||
resulting_string = this.__patterns.shebang.read();
|
||||
|
||||
if (resulting_string) {
|
||||
return this._create_token(TOKEN.UNKNOWN, resulting_string.trim() + '\n');
|
||||
}
|
||||
}
|
||||
|
||||
// handles extendscript #includes
|
||||
resulting_string = this.__patterns.include.read();
|
||||
|
||||
if (resulting_string) {
|
||||
return this._create_token(TOKEN.UNKNOWN, resulting_string.trim() + '\n');
|
||||
}
|
||||
|
||||
c = this._input.next();
|
||||
|
||||
// Spidermonkey-specific sharp variables for circular references. Considered obsolete.
|
||||
var sharp = '#';
|
||||
if (this._input.hasNext() && this._input.testChar(digit)) {
|
||||
do {
|
||||
c = this._input.next();
|
||||
sharp += c;
|
||||
} while (this._input.hasNext() && c !== '#' && c !== '=');
|
||||
if (c === '#') {
|
||||
//
|
||||
} else if (this._input.peek() === '[' && this._input.peek(1) === ']') {
|
||||
sharp += '[]';
|
||||
this._input.next();
|
||||
this._input.next();
|
||||
} else if (this._input.peek() === '{' && this._input.peek(1) === '}') {
|
||||
sharp += '{}';
|
||||
this._input.next();
|
||||
this._input.next();
|
||||
}
|
||||
return this._create_token(TOKEN.WORD, sharp);
|
||||
}
|
||||
|
||||
this._input.back();
|
||||
|
||||
} else if (c === '<' && this._is_first_token()) {
|
||||
resulting_string = this.__patterns.html_comment_start.read();
|
||||
if (resulting_string) {
|
||||
while (this._input.hasNext() && !this._input.testChar(acorn.newline)) {
|
||||
resulting_string += this._input.next();
|
||||
}
|
||||
in_html_comment = true;
|
||||
return this._create_token(TOKEN.COMMENT, resulting_string);
|
||||
}
|
||||
} else if (in_html_comment && c === '-') {
|
||||
resulting_string = this.__patterns.html_comment_end.read();
|
||||
if (resulting_string) {
|
||||
in_html_comment = false;
|
||||
return this._create_token(TOKEN.COMMENT, resulting_string);
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
};
|
||||
|
||||
Tokenizer.prototype._read_comment = function(c) {
|
||||
var token = null;
|
||||
if (c === '/') {
|
||||
var comment = '';
|
||||
if (this._input.peek(1) === '*') {
|
||||
// peek for comment /* ... */
|
||||
comment = this.__patterns.block_comment.read();
|
||||
var directives = directives_core.get_directives(comment);
|
||||
if (directives && directives.ignore === 'start') {
|
||||
comment += directives_core.readIgnored(this._input);
|
||||
}
|
||||
comment = comment.replace(acorn.allLineBreaks, '\n');
|
||||
token = this._create_token(TOKEN.BLOCK_COMMENT, comment);
|
||||
token.directives = directives;
|
||||
} else if (this._input.peek(1) === '/') {
|
||||
// peek for comment // ...
|
||||
comment = this.__patterns.comment.read();
|
||||
token = this._create_token(TOKEN.COMMENT, comment);
|
||||
}
|
||||
}
|
||||
return token;
|
||||
};
|
||||
|
||||
Tokenizer.prototype._read_string = function(c) {
|
||||
if (c === '`' || c === "'" || c === '"') {
|
||||
var resulting_string = this._input.next();
|
||||
this.has_char_escapes = false;
|
||||
|
||||
if (c === '`') {
|
||||
resulting_string += this._read_string_recursive('`', true, '${');
|
||||
} else {
|
||||
resulting_string += this._read_string_recursive(c);
|
||||
}
|
||||
|
||||
if (this.has_char_escapes && this._options.unescape_strings) {
|
||||
resulting_string = unescape_string(resulting_string);
|
||||
}
|
||||
|
||||
if (this._input.peek() === c) {
|
||||
resulting_string += this._input.next();
|
||||
}
|
||||
|
||||
resulting_string = resulting_string.replace(acorn.allLineBreaks, '\n');
|
||||
|
||||
return this._create_token(TOKEN.STRING, resulting_string);
|
||||
}
|
||||
|
||||
return null;
|
||||
};
|
||||
|
||||
Tokenizer.prototype._allow_regexp_or_xml = function(previous_token) {
|
||||
// regex and xml can only appear in specific locations during parsing
|
||||
return (previous_token.type === TOKEN.RESERVED && in_array(previous_token.text, ['return', 'case', 'throw', 'else', 'do', 'typeof', 'yield'])) ||
|
||||
(previous_token.type === TOKEN.END_EXPR && previous_token.text === ')' &&
|
||||
previous_token.opened.previous.type === TOKEN.RESERVED && in_array(previous_token.opened.previous.text, ['if', 'while', 'for'])) ||
|
||||
(in_array(previous_token.type, [TOKEN.COMMENT, TOKEN.START_EXPR, TOKEN.START_BLOCK, TOKEN.START,
|
||||
TOKEN.END_BLOCK, TOKEN.OPERATOR, TOKEN.EQUALS, TOKEN.EOF, TOKEN.SEMICOLON, TOKEN.COMMA
|
||||
]));
|
||||
};
|
||||
|
||||
Tokenizer.prototype._read_regexp = function(c, previous_token) {
|
||||
|
||||
if (c === '/' && this._allow_regexp_or_xml(previous_token)) {
|
||||
// handle regexp
|
||||
//
|
||||
var resulting_string = this._input.next();
|
||||
var esc = false;
|
||||
|
||||
var in_char_class = false;
|
||||
while (this._input.hasNext() &&
|
||||
((esc || in_char_class || this._input.peek() !== c) &&
|
||||
!this._input.testChar(acorn.newline))) {
|
||||
resulting_string += this._input.peek();
|
||||
if (!esc) {
|
||||
esc = this._input.peek() === '\\';
|
||||
if (this._input.peek() === '[') {
|
||||
in_char_class = true;
|
||||
} else if (this._input.peek() === ']') {
|
||||
in_char_class = false;
|
||||
}
|
||||
} else {
|
||||
esc = false;
|
||||
}
|
||||
this._input.next();
|
||||
}
|
||||
|
||||
if (this._input.peek() === c) {
|
||||
resulting_string += this._input.next();
|
||||
|
||||
// regexps may have modifiers /regexp/MOD , so fetch those, too
|
||||
// Only [gim] are valid, but if the user puts in garbage, do what we can to take it.
|
||||
resulting_string += this._input.read(acorn.identifier);
|
||||
}
|
||||
return this._create_token(TOKEN.STRING, resulting_string);
|
||||
}
|
||||
return null;
|
||||
};
|
||||
|
||||
Tokenizer.prototype._read_xml = function(c, previous_token) {
|
||||
|
||||
if (this._options.e4x && c === "<" && this._allow_regexp_or_xml(previous_token)) {
|
||||
var xmlStr = '';
|
||||
var match = this.__patterns.xml.read_match();
|
||||
// handle e4x xml literals
|
||||
//
|
||||
if (match) {
|
||||
// Trim root tag to attempt to
|
||||
var rootTag = match[2].replace(/^{\s+/, '{').replace(/\s+}$/, '}');
|
||||
var isCurlyRoot = rootTag.indexOf('{') === 0;
|
||||
var depth = 0;
|
||||
while (match) {
|
||||
var isEndTag = !!match[1];
|
||||
var tagName = match[2];
|
||||
var isSingletonTag = (!!match[match.length - 1]) || (tagName.slice(0, 8) === "![CDATA[");
|
||||
if (!isSingletonTag &&
|
||||
(tagName === rootTag || (isCurlyRoot && tagName.replace(/^{\s+/, '{').replace(/\s+}$/, '}')))) {
|
||||
if (isEndTag) {
|
||||
--depth;
|
||||
} else {
|
||||
++depth;
|
||||
}
|
||||
}
|
||||
xmlStr += match[0];
|
||||
if (depth <= 0) {
|
||||
break;
|
||||
}
|
||||
match = this.__patterns.xml.read_match();
|
||||
}
|
||||
// if we didn't close correctly, keep unformatted.
|
||||
if (!match) {
|
||||
xmlStr += this._input.match(/[\s\S]*/g)[0];
|
||||
}
|
||||
xmlStr = xmlStr.replace(acorn.allLineBreaks, '\n');
|
||||
return this._create_token(TOKEN.STRING, xmlStr);
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
};
|
||||
|
||||
function unescape_string(s) {
|
||||
// You think that a regex would work for this
|
||||
// return s.replace(/\\x([0-9a-f]{2})/gi, function(match, val) {
|
||||
// return String.fromCharCode(parseInt(val, 16));
|
||||
// })
|
||||
// However, dealing with '\xff', '\\xff', '\\\xff' makes this more fun.
|
||||
var out = '',
|
||||
escaped = 0;
|
||||
|
||||
var input_scan = new InputScanner(s);
|
||||
var matched = null;
|
||||
|
||||
while (input_scan.hasNext()) {
|
||||
// Keep any whitespace, non-slash characters
|
||||
// also keep slash pairs.
|
||||
matched = input_scan.match(/([\s]|[^\\]|\\\\)+/g);
|
||||
|
||||
if (matched) {
|
||||
out += matched[0];
|
||||
}
|
||||
|
||||
if (input_scan.peek() === '\\') {
|
||||
input_scan.next();
|
||||
if (input_scan.peek() === 'x') {
|
||||
matched = input_scan.match(/x([0-9A-Fa-f]{2})/g);
|
||||
} else if (input_scan.peek() === 'u') {
|
||||
matched = input_scan.match(/u([0-9A-Fa-f]{4})/g);
|
||||
if (!matched) {
|
||||
matched = input_scan.match(/u\{([0-9A-Fa-f]+)\}/g);
|
||||
}
|
||||
} else {
|
||||
out += '\\';
|
||||
if (input_scan.hasNext()) {
|
||||
out += input_scan.next();
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
// If there's some error decoding, return the original string
|
||||
if (!matched) {
|
||||
return s;
|
||||
}
|
||||
|
||||
escaped = parseInt(matched[1], 16);
|
||||
|
||||
if (escaped > 0x7e && escaped <= 0xff && matched[0].indexOf('x') === 0) {
|
||||
// we bail out on \x7f..\xff,
|
||||
// leaving whole string escaped,
|
||||
// as it's probably completely binary
|
||||
return s;
|
||||
} else if (escaped >= 0x00 && escaped < 0x20) {
|
||||
// leave 0x00...0x1f escaped
|
||||
out += '\\' + matched[0];
|
||||
} else if (escaped > 0x10FFFF) {
|
||||
// If the escape sequence is out of bounds, keep the original sequence and continue conversion
|
||||
out += '\\' + matched[0];
|
||||
} else if (escaped === 0x22 || escaped === 0x27 || escaped === 0x5c) {
|
||||
// single-quote, apostrophe, backslash - escape these
|
||||
out += '\\' + String.fromCharCode(escaped);
|
||||
} else {
|
||||
out += String.fromCharCode(escaped);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return out;
|
||||
}
|
||||
|
||||
// handle string
|
||||
//
|
||||
Tokenizer.prototype._read_string_recursive = function(delimiter, allow_unescaped_newlines, start_sub) {
|
||||
var current_char;
|
||||
var pattern;
|
||||
if (delimiter === '\'') {
|
||||
pattern = this.__patterns.single_quote;
|
||||
} else if (delimiter === '"') {
|
||||
pattern = this.__patterns.double_quote;
|
||||
} else if (delimiter === '`') {
|
||||
pattern = this.__patterns.template_text;
|
||||
} else if (delimiter === '}') {
|
||||
pattern = this.__patterns.template_expression;
|
||||
}
|
||||
|
||||
var resulting_string = pattern.read();
|
||||
var next = '';
|
||||
while (this._input.hasNext()) {
|
||||
next = this._input.next();
|
||||
if (next === delimiter ||
|
||||
(!allow_unescaped_newlines && acorn.newline.test(next))) {
|
||||
this._input.back();
|
||||
break;
|
||||
} else if (next === '\\' && this._input.hasNext()) {
|
||||
current_char = this._input.peek();
|
||||
|
||||
if (current_char === 'x' || current_char === 'u') {
|
||||
this.has_char_escapes = true;
|
||||
} else if (current_char === '\r' && this._input.peek(1) === '\n') {
|
||||
this._input.next();
|
||||
}
|
||||
next += this._input.next();
|
||||
} else if (start_sub) {
|
||||
if (start_sub === '${' && next === '$' && this._input.peek() === '{') {
|
||||
next += this._input.next();
|
||||
}
|
||||
|
||||
if (start_sub === next) {
|
||||
if (delimiter === '`') {
|
||||
next += this._read_string_recursive('}', allow_unescaped_newlines, '`');
|
||||
} else {
|
||||
next += this._read_string_recursive('`', allow_unescaped_newlines, '${');
|
||||
}
|
||||
if (this._input.hasNext()) {
|
||||
next += this._input.next();
|
||||
}
|
||||
}
|
||||
}
|
||||
next += pattern.read();
|
||||
resulting_string += next;
|
||||
}
|
||||
|
||||
return resulting_string;
|
||||
};
|
||||
|
||||
module.exports.Tokenizer = Tokenizer;
|
||||
module.exports.TOKEN = TOKEN;
|
||||
module.exports.positionable_operators = positionable_operators.slice();
|
||||
module.exports.line_starters = line_starters.slice();
|
||||
Reference in New Issue
Block a user