diff --git a/Commands/Copy as Bookmarklet to Clipboard.tmCommand b/Commands/Copy as Bookmarklet to Clipboard.tmCommand
new file mode 100644
index 0000000..7410fbf
--- /dev/null
+++ b/Commands/Copy as Bookmarklet to Clipboard.tmCommand
@@ -0,0 +1,54 @@
+
+
+
+
+ beforeRunningCommand
+ nop
+ command
+ #!/usr/bin/env perl
+#
+# Written by John Gruber, taken with permission from:
+# http://daringfireball.net/2007/03/javascript_bookmarklet_builder
+
+use strict;
+use warnings;
+use URI::Escape qw(uri_escape_utf8);
+use open IO => ":utf8", # UTF8 by default
+ ":std"; # Apply to STDIN/STDOUT/STDERR
+
+my $src = do { local $/; <> };
+
+# Zap the first line if there's already a bookmarklet comment:
+$src =~ s{^// ?javascript:.+\n}{};
+my $bookmarklet = $src;
+
+$bookmarklet =~ s{^\s*//.+\n}{}gm; # Kill comments.
+$bookmarklet =~ s{\t}{ }gm; # Tabs to spaces
+$bookmarklet =~ s{ +}{ }gm; # Space runs to one space
+$bookmarklet =~ s{^\s+}{}gm; # Kill line-leading whitespace
+$bookmarklet =~ s{\s+$}{}gm; # Kill line-ending whitespace
+$bookmarklet =~ s{\n}{}gm; # Kill newlines
+
+# Escape single- and double-quotes, spaces, control chars, unicode:
+$bookmarklet = "javascript:" .
+ uri_escape_utf8($bookmarklet, qq('" \x00-\x1f\x7f-\xff));
+
+print "// $bookmarklet\n" . $src;
+
+# Put bookmarklet on clipboard:
+`/bin/echo -n '$bookmarklet' | /usr/bin/pbcopy`;
+
+ input
+ selection
+ keyEquivalent
+ ^H
+ name
+ Copy as Bookmarklet to Clipboard
+ output
+ replaceSelectedText
+ scope
+ source.js
+ uuid
+ 20E61C43-B81F-4FB9-9362-BFFE668EB9C9
+
+
diff --git a/Commands/Reformat Document : Selection.tmCommand b/Commands/Reformat Document : Selection.tmCommand
new file mode 100644
index 0000000..4ef9cec
--- /dev/null
+++ b/Commands/Reformat Document : Selection.tmCommand
@@ -0,0 +1,591 @@
+
+
+
+
+ beforeRunningCommand
+ nop
+ command
+ #!/usr/bin/env php
+<?php
+/*
+
+JS Beautifier
+
+(c) 2007, Einars "elfz" Lielmanis
+
+http://elfz.laacz.lv/beautify/
+
+You are free to use this in any way you want, in case you find this useful or working for you.
+
+Ported with permission to TextMate by Ale Muñoz.
+
+(Based on v35 of JS Beautifier)
+
+*/
+
+error_reporting(E_ALL);
+ini_set('display_errors', 'on');
+
+
+$n = 1;
+define('IN_EXPR', ++$n);
+define('IN_BLOCK', ++$n);
+
+
+define('TK_UNKNOWN', ++$n);
+define('TK_WORD', ++$n);
+define('TK_START_EXPR', ++$n);
+define('TK_END_EXPR', ++$n);
+define('TK_START_BLOCK', ++$n);
+define('TK_END_BLOCK', ++$n);
+define('TK_END_COMMAND', ++$n);
+define('TK_EOF', ++$n);
+define('TK_STRING', ++$n);
+
+define('TK_BLOCK_COMMENT', ++$n);
+define('TK_COMMENT', ++$n);
+
+define('TK_OPERATOR', ++$n);
+
+// internal flags
+define('PRINT_NONE', ++$n);
+define('PRINT_SPACE', ++$n);
+define('PRINT_NL', ++$n);
+
+
+function js_beautify($js_source_text, $tab_size = 4)
+{
+ global $output, $token_text, $last_type, $last_text, $in, $ins, $indent, $tab_string, $is_last_nl;
+
+ global $input, $input_length;
+
+ $tab_string = str_repeat(' ', $tab_size);
+
+ $input = $js_source_text;
+ $input_length = strlen($input);
+
+ $last_word = ''; // last TK_WORD passed
+ $last_type = TK_START_EXPR; // last token type
+ $last_text = ''; // last token text
+ $output = '';
+
+ $is_last_nl = true; // was the last character written a newline?
+
+ // words which should always start on new line.
+ // simple hack for cases when lines aren't ending with semicolon.
+ // feel free to tell me about the ones that need to be added.
+ $line_starters = explode(',', 'continue,try,throw,return,var,if,switch,case,default,for,while,break,function');
+
+ // states showing if we are currently in expression (i.e. "if" case) - IN_EXPR, or in usual block (like, procedure), IN_BLOCK.
+ // some formatting depends on that.
+ $in = IN_BLOCK;
+ $ins = array($in);
+
+
+ $indent = 0;
+ $pos = 0; // parser position
+ $in_case = false; // flag for parser that case/default has been processed, and next colon needs special attention
+
+ while (true) {
+ list($token_text, $token_type) = get_next_token($pos);
+ if ($token_type == TK_EOF) {
+ break;
+ }
+
+ // $output .= " [$token_type:$last_type]";
+
+ switch($token_type) {
+
+ case TK_START_EXPR:
+
+ in(IN_EXPR);
+ if ($last_type == TK_END_EXPR or $last_type == TK_START_EXPR) {
+ // do nothing on (( and )( and ][ and ]( ..
+ } elseif ($last_type != TK_WORD and $last_type != TK_OPERATOR) {
+ space();
+ } elseif (in_array($last_word, $line_starters) and $last_word != 'function') {
+ space();
+ }
+ token();
+ break;
+
+ case TK_END_EXPR:
+
+ token();
+ in_pop();
+ break;
+
+ case TK_START_BLOCK:
+
+ in(IN_BLOCK);
+ if ($last_type != TK_OPERATOR and $last_type != TK_START_EXPR) {
+ if ($last_type == TK_START_BLOCK) {
+ nl();
+ } else {
+ space();
+ }
+ }
+ token();
+ indent();
+ break;
+
+ case TK_END_BLOCK:
+
+ if ($last_type == TK_END_EXPR) {
+ unindent();
+ nl(false);
+ } elseif ($last_type == TK_END_BLOCK) {
+ unindent();
+ nl(false);
+ } elseif ($last_type == TK_START_BLOCK) {
+ // nothing
+ unindent();
+ } else {
+ unindent();
+ nl(false);
+ }
+ token();
+ in_pop();
+ break;
+
+ case TK_WORD:
+
+ if ($token_text == 'case' or $token_text == 'default') {
+ if ($last_text == ':') {
+ // switch cases following one another
+ remove_indent();
+ } else {
+ $indent--;
+ nl();
+ $indent++;
+ }
+ token();
+ $in_case = true;
+ break;
+ }
+
+ $prefix = PRINT_NONE;
+ if ($last_type == TK_END_BLOCK) {
+ if (!in_array(strtolower($token_text), array('else', 'catch', 'finally'))) {
+ $prefix = PRINT_NL;
+ } else {
+ $prefix = PRINT_SPACE;
+ space();
+ }
+ } elseif ($last_type == TK_END_COMMAND && $in == IN_BLOCK) {
+ $prefix = PRINT_NL;
+ } elseif ($last_type == TK_END_COMMAND && $in == IN_EXPR) {
+ $prefix = PRINT_SPACE;
+ } elseif ($last_type == TK_WORD) {
+ if ($last_word == 'else') { // else if
+ $prefix = PRINT_SPACE;
+ } else {
+ $prefix = PRINT_SPACE;
+ }
+ } elseif ($last_type == TK_START_BLOCK) {
+ $prefix = PRINT_NL;
+ } elseif ($last_type == TK_END_EXPR) {
+ space();
+ }
+
+ if (in_array($token_text, $line_starters) or $prefix == PRINT_NL) {
+
+ if ($last_text == 'else') {
+ // no need to force newline on else break
+ // DONOTHING
+ space();
+ } elseif (($last_type == TK_START_EXPR or $last_text == '=') and $token_text == 'function') {
+ // no need to force newline on 'function': (function
+ // DONOTHING
+ } else
+ if ($last_type != TK_END_EXPR) {
+ if (($last_type != TK_START_EXPR or $token_text != 'var') and $last_text != ':') {
+ // no need to force newline on 'var': for (var x = 0...)
+ if ($token_text == 'if' and $last_type == TK_WORD and $last_word == 'else') {
+ // no newline for } else if {
+ space();
+ } else {
+ nl();
+ }
+ }
+ }
+ } elseif ($prefix == PRINT_SPACE) {
+ space();
+ }
+ token();
+ $last_word = strtolower($token_text);
+ break;
+
+ case TK_END_COMMAND:
+
+ token();
+ break;
+
+ case TK_STRING:
+
+ if ($last_type == TK_START_BLOCK or $last_type == TK_END_BLOCK) {
+ nl();
+ } elseif ($last_type == TK_WORD) {
+ space();
+ }
+ token();
+ break;
+
+ case TK_OPERATOR:
+ $start_delim = true;
+ $end_delim = true;
+
+ if ($token_text == ':' and $in_case) {
+ token(); // colon really asks for separate treatment
+ nl();
+ $expecting_case = false;
+ break;
+ }
+
+ $in_case = false;
+
+
+
+ if ($token_text == ',') {
+ if ($last_type == TK_END_BLOCK) {
+ token();
+ nl();
+ } else {
+ if ($in == IN_BLOCK) {
+ token();
+ nl();
+ } else {
+ token();
+ space();
+ }
+ }
+ break;
+ } elseif ($token_text == '--' or $token_text == '++') { // unary operators special case
+ if ($last_text == ';') {
+ // space for (;; ++i)
+ $start_delim = true;
+ $end_delim = false;
+ } else {
+ $start_delim = false;
+ $end_delim = false;
+ }
+ } elseif ($token_text == '!' and $last_type == TK_START_EXPR) {
+ // special case handling: if (!a)
+ $start_delim = false;
+ $end_delim = false;
+ } elseif ($last_type == TK_OPERATOR) {
+ $start_delim = false;
+ $end_delim = false;
+ } elseif ($last_type == TK_END_EXPR) {
+ $start_delim = true;
+ $end_delim = true;
+ } elseif ($token_text == '.') {
+ // decimal digits or object.property
+ $start_delim = false;
+ $end_delim = false;
+
+ } elseif ($token_text == ':') {
+ // zz: xx
+ // can't differentiate ternary op, so for now it's a ? b: c; without space before colon
+ $start_delim = false;
+ }
+ if ($start_delim) {
+ space();
+ }
+
+ token();
+
+ if ($end_delim) {
+ space();
+ }
+ break;
+
+ case TK_BLOCK_COMMENT:
+
+ nl();
+ token();
+ nl();
+ break;
+
+ case TK_COMMENT:
+
+ //if ($last_type != TK_COMMENT) {
+ nl();
+ //}
+ token();
+ nl();
+ break;
+
+ case TK_UNKNOWN:
+ token();
+ break;
+ }
+
+ if ($token_type != TK_COMMENT) {
+ $last_type = $token_type;
+ $last_text = $token_text;
+ }
+ }
+
+ // clean empty lines from redundant spaces
+ $output = preg_replace('/^ +$/m', '', $output);
+
+ return $output;
+}
+
+
+
+
+function nl($ignore_repeated = true)
+{
+ global $indent, $output, $tab_string, $is_last_nl;
+
+ if ($output == '') return; // no newline on start of file
+
+ if ($ignore_repeated and $is_last_nl) {
+ return;
+ }
+
+ $is_last_nl = true;
+
+ $output .= "\n" . str_repeat($tab_string, $indent);
+}
+
+
+// hack for correct multiple newline handling
+function safe_nl($newlines = 1)
+{
+ global $output;
+ if ($newlines) {
+ $output .= str_repeat("\n", $newlines - 1);
+ }
+ nl();
+}
+
+
+function space()
+{
+ global $output, $is_last_nl;
+
+ $is_last_nl = false;
+
+ if ($output and substr($output, -1) != ' ') { // prevent occassional duplicate space
+ $output .= ' ';
+ }
+}
+
+
+function token()
+{
+ global $token_text, $output, $is_last_nl;
+ $output .= $token_text;
+ $is_last_nl = false;
+}
+
+function indent()
+{
+ global $indent;
+ $indent ++;
+}
+
+
+function unindent()
+{
+ global $indent;
+ if ($indent) {
+ $indent --;
+ }
+}
+
+
+function remove_indent()
+{
+ global $tab_string, $output;
+ $tab_string_len = strlen($tab_string);
+ if (substr($output, -$tab_string_len) == $tab_string) {
+ $output = substr($output, 0, -$tab_string_len);
+ }
+}
+
+
+function in($where)
+{
+ global $ins, $in;
+ array_push($ins, $in);
+ $in = $where;
+}
+
+
+function in_pop()
+{
+ global $ins, $in;
+ $in = array_pop($ins);
+}
+
+
+
+function make_array($str)
+{
+ $res = array();
+ for ($i = 0; $i < strlen($str); $i++) {
+ $res[] = $str[$i];
+ }
+ return $res;
+}
+
+
+
+function get_next_token(&$pos)
+{
+ global $last_type, $last_text;
+ global $whitespace, $wordchar, $punct;
+ global $input, $input_length, $is_last_nl;
+
+
+ if (!$whitespace) $whitespace = make_array("\n\r\t ");
+ if (!$wordchar) $wordchar = make_array('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_$');
+ if (!$punct) $punct = explode(' ', '+ - * / % & ++ -- = += -= *= /= %= == === != !== > < >= <= >> << >>> <<< >>= <<= && &= | || ! !! , : ? ^ ^= |=');
+
+ $n_newlines = 0;
+ do {
+ if ($pos >= $input_length) {
+ return array('', TK_EOF);
+ }
+ $c = $input[$pos];
+ $pos += 1;
+ if ($c == "\n") {
+ $n_newlines += 1;
+ }
+ } while (in_array($c, $whitespace));
+
+ if ($n_newlines) {
+ safe_nl($n_newlines);
+ }
+
+ if (in_array($c, $wordchar)) {
+ if ($pos < $input_length) {
+ while (in_array($input[$pos], $wordchar)) {
+ $c .= $input[$pos];
+ $pos += 1;
+ if ($pos == $input_length) break;
+ }
+ }
+ if ($c == 'in') { // hack for 'in' operator
+ return array($c, TK_OPERATOR);
+ }
+ return array($c, TK_WORD);
+ }
+
+ if ($c == '(' || $c == '[') {
+ return array($c, TK_START_EXPR);
+ }
+
+ if ($c == ')' || $c == ']') {
+ return array($c, TK_END_EXPR);
+ }
+
+ if ($c == '{') {
+ return array($c, TK_START_BLOCK);
+ }
+
+ if ($c == '}') {
+ return array($c, TK_END_BLOCK);
+ }
+
+ if ($c == ';') {
+ return array($c, TK_END_COMMAND);
+ }
+
+ if ($c == '/') {
+ // peek for comment /* ... */
+ if ($input[$pos] == '*') {
+ $comment = '';
+ $pos += 1;
+ if ($pos < $input_length){
+ while (!($input[$pos] == '*' && isset($input[$pos + 1]) && $input[$pos + 1] == '/') && $pos < $input_length) {
+ $comment .= $input[$pos];
+ $pos += 1;
+ if ($pos >= $input_length) break;
+ }
+ }
+ $pos +=2;
+ return array("/*$comment*/", TK_BLOCK_COMMENT);
+ }
+ // peek for comment // ...
+ if ($input[$pos] == '/') {
+ $comment = $c;
+ while ($input[$pos] != "\x0d" && $input[$pos] != "\x0a") {
+ $comment .= $input[$pos];
+ $pos += 1;
+ if ($pos >= $input_length) break;
+ }
+ $pos += 1;
+ return array($comment, TK_COMMENT);
+ }
+
+ }
+
+ if ($c == "'" || // string
+ $c == '"' || // string
+ ($c == '/' &&
+ (($last_type == TK_WORD and $last_text == 'return') or ($last_type == TK_START_EXPR || $last_type == TK_END_BLOCK || $last_type == TK_OPERATOR || $last_type == TK_EOF || $last_type == TK_END_COMMAND)))) { // regexp
+ $sep = $c;
+ $c = '';
+ $esc = false;
+
+ if ($pos < $input_length) {
+
+ while ($esc || $input[$pos] != $sep) {
+ $c .= $input[$pos];
+ if (!$esc) {
+ $esc = $input[$pos] == '\\';
+ } else {
+ $esc = false;
+ }
+ $pos += 1;
+ if ($pos >= $input_length) break;
+ }
+
+ }
+
+ $pos += 1;
+ if ($last_type == TK_END_COMMAND) {
+ nl();
+ }
+ return array($sep . $c . $sep, TK_STRING);
+ }
+
+ if (in_array($c, $punct)) {
+ while (in_array($c . $input[$pos], $punct)) {
+ $c .= $input[$pos];
+ $pos += 1;
+ if ($pos >= $input_length) break;
+ }
+ return array($c, TK_OPERATOR);
+ }
+
+ return array($c, TK_UNKNOWN);
+}
+
+if (isset($_ENV['TM_SELECTED_TEXT'])) {
+ $input = get_magic_quotes_gpc() ? stripslashes($_ENV['TM_SELECTED_TEXT']) : $_ENV['TM_SELECTED_TEXT'];
+} else {
+ $input = file_get_contents('php://stdin');
+}
+
+print js_beautify($input);
+?>
+ input
+ selection
+ keyEquivalent
+ ^H
+ name
+ Reformat Document / Selection
+ output
+ replaceSelectedText
+ scope
+ source.js
+ uuid
+ 36EC03E9-EFF4-479A-AB90-8DFA16800642
+
+
diff --git a/Syntaxes/JavaScript Basic.tmLanguage b/Syntaxes/JavaScript Basic.tmLanguage
new file mode 100644
index 0000000..e4771e9
--- /dev/null
+++ b/Syntaxes/JavaScript Basic.tmLanguage
@@ -0,0 +1,651 @@
+
+
+
+
+ comment
+ JavaScript Syntax: version 2.0
+ fileTypes
+
+ js
+ htc
+ jsx
+
+ foldingStartMarker
+ ^.*(\bfunction\s*(\w+\s*)?\([^\)]*\)(\s*\{[^\}]*)?\s*$)|(={\s*$)|(\({$)
+ foldingStopMarker
+ (^\s*\})|(^}\));
+ keyEquivalent
+ ^~J
+ name
+ JavaScript Basic
+ patterns
+
+
+ captures
+
+ 1
+
+ name
+ support.class.js
+
+ 2
+
+ name
+ support.constant.js
+
+
+ comment
+ match stuff like: Sound.prototype = { … } when extending an object
+ match
+ ([a-zA-Z_?.$][\w?.$]*)\.(prototype)\s*=\s*
+ name
+ meta.class.js
+
+
+ captures
+
+ 1
+
+ name
+ support.class.js
+
+ 2
+
+ name
+ support.constant.js
+
+ 3
+
+ name
+ entity.name.function.js
+
+ 4
+
+ name
+ storage.type.function.js
+
+ 5
+
+ name
+ punctuation.definition.parameters.begin.js
+
+ 6
+
+ name
+ variable.parameter.function.js
+
+ 7
+
+ name
+ punctuation.definition.parameters.end.js
+
+
+ comment
+ match stuff like: Sound.prototype.play = function() { … }
+ match
+ ([a-zA-Z_?.$][\w?.$]*)\.(prototype)\.([a-zA-Z_?.$][\w?.$]*)\s*=\s*(function)?\s*(\()(.*?)(\))
+ name
+ meta.function.prototype.js
+
+
+ captures
+
+ 1
+
+ name
+ support.class.js
+
+ 2
+
+ name
+ support.constant.js
+
+ 3
+
+ name
+ entity.name.function.js
+
+
+ comment
+ match stuff like: Sound.prototype.play = myfunc
+ match
+ ([a-zA-Z_?.$][\w?.$]*)\.(prototype)\.([a-zA-Z_?.$][\w?.$]*)\s*=\s*
+ name
+ meta.function.js
+
+
+ captures
+
+ 1
+
+ name
+ support.class.js
+
+ 2
+
+ name
+ entity.name.function.js
+
+ 3
+
+ name
+ storage.type.function.js
+
+ 4
+
+ name
+ punctuation.definition.parameters.begin.js
+
+ 5
+
+ name
+ variable.parameter.function.js
+
+ 6
+
+ name
+ punctuation.definition.parameters.end.js
+
+
+ comment
+ match stuff like: Sound.play = function() { … }
+ match
+ ([a-zA-Z_?.$][\w?.$]*)\.([a-zA-Z_?.$][\w?.$]*)\s*=\s*(function)\s*(\()(.*?)(\))
+ name
+ meta.function.js
+
+
+ captures
+
+ 1
+
+ name
+ storage.type.function.js
+
+ 2
+
+ name
+ entity.name.function.js
+
+ 3
+
+ name
+ punctuation.definition.parameters.begin.js
+
+ 4
+
+ name
+ variable.parameter.function.js
+
+ 5
+
+ name
+ punctuation.definition.parameters.end.js
+
+
+ comment
+ match regular function like: function myFunc(arg) { … }
+ match
+ \b(function)\s+([a-zA-Z_$]\w*)?\s*(\()(.*?)(\))
+ name
+ meta.function.js
+
+
+ captures
+
+ 1
+
+ name
+ entity.name.function.js
+
+ 2
+
+ name
+ storage.type.function.js
+
+ 3
+
+ name
+ punctuation.definition.parameters.begin.js
+
+ 4
+
+ name
+ variable.parameter.function.js
+
+ 5
+
+ name
+ punctuation.definition.parameters.end.js
+
+
+ comment
+ match stuff like: foobar: function() { … }
+ match
+ \b([a-zA-Z_?.$][\w?.$]*)\s*:\s*\b(function)?\s*(\()(.*?)(\))
+ name
+ meta.function.json.js
+
+
+ captures
+
+ 1
+
+ name
+ string.quoted.single.js
+
+ 10
+
+ name
+ punctuation.definition.parameters.begin.js
+
+ 11
+
+ name
+ variable.parameter.function.js
+
+ 12
+
+ name
+ punctuation.definition.parameters.end.js
+
+ 2
+
+ name
+ punctuation.definition.string.begin.js
+
+ 3
+
+ name
+ entity.name.function.js
+
+ 4
+
+ name
+ punctuation.definition.string.end.js
+
+ 5
+
+ name
+ string.quoted.double.js
+
+ 6
+
+ name
+ punctuation.definition.string.begin.js
+
+ 7
+
+ name
+ entity.name.function.js
+
+ 8
+
+ name
+ punctuation.definition.string.end.js
+
+ 9
+
+ name
+ entity.name.function.js
+
+
+ comment
+ Attempt to match "foo": function
+ match
+ (?:((')(.*?)('))|((")(.*?)(")))\s*:\s*\b(function)?\s*(\()(.*?)(\))
+ name
+ meta.function.json.js
+
+
+ captures
+
+ 1
+
+ name
+ keyword.operator.new.js
+
+ 2
+
+ name
+ entity.name.type.instance.js
+
+
+ match
+ (new)\s+(\w+(?:\.\w*)?)
+ name
+ meta.class.instance.constructor
+
+
+ match
+ \b(console)\b
+ name
+ entity.name.type.object.js.firebug
+
+
+ match
+ \.(warn|info|log|error|time|timeEnd|assert)\b
+ name
+ support.function.js.firebug
+
+
+ match
+ \b((0(x|X)[0-9a-fA-F]+)|([0-9]+(\.[0-9]+)?))\b
+ name
+ constant.numeric.js
+
+
+ begin
+ '
+ beginCaptures
+
+ 0
+
+ name
+ punctuation.definition.string.begin.js
+
+
+ end
+ '
+ endCaptures
+
+ 0
+
+ name
+ punctuation.definition.string.end.js
+
+
+ name
+ string.quoted.single.js
+ patterns
+
+
+ match
+ \\(x\h{2}|[0-2][0-7]{,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.)
+ name
+ constant.character.escape.js
+
+
+
+
+ begin
+ "
+ beginCaptures
+
+ 0
+
+ name
+ punctuation.definition.string.begin.js
+
+
+ end
+ "
+ endCaptures
+
+ 0
+
+ name
+ punctuation.definition.string.end.js
+
+
+ name
+ string.quoted.double.js
+ patterns
+
+
+ match
+ \\(x\h{2}|[0-2][0-7]{,2}|3[0-6][0-7]|37[0-7]?|[4-7][0-7]?|.)
+ name
+ constant.character.escape.js
+
+
+
+
+ begin
+ /\*\*
+ captures
+
+ 0
+
+ name
+ punctuation.definition.comment.js
+
+
+ end
+ \*/
+ name
+ comment.block.documentation.js
+
+
+ begin
+ /\*
+ captures
+
+ 0
+
+ name
+ punctuation.definition.comment.js
+
+
+ end
+ \*/
+ name
+ comment.block.js
+
+
+ captures
+
+ 1
+
+ name
+ punctuation.definition.comment.js
+
+
+ match
+ (//).*$\n?
+ name
+ comment.line.double-slash.js
+
+
+ captures
+
+ 0
+
+ name
+ punctuation.definition.comment.html.js
+
+ 2
+
+ name
+ punctuation.definition.comment.html.js
+
+
+ match
+ (<!--|-->)
+ name
+ comment.block.html.js
+
+
+ match
+ \b(boolean|byte|char|class|double|enum|float|function|int|interface|long|short|var|void)\b
+ name
+ storage.type.js
+
+
+ match
+ \b(const|export|extends|final|implements|native|private|protected|public|static|synchronized|throws|transient|volatile)\b
+ name
+ storage.modifier.js
+
+
+ match
+ \b(break|case|catch|continue|default|do|else|finally|for|goto|if|import|package|return|switch|throw|try|while)\b
+ name
+ keyword.control.js
+
+
+ match
+ \b(delete|in|instanceof|new|typeof|with)\b
+ name
+ keyword.operator.js
+
+
+ match
+ \btrue\b
+ name
+ constant.language.boolean.true.js
+
+
+ match
+ \bfalse\b
+ name
+ constant.language.boolean.false.js
+
+
+ match
+ \bnull\b
+ name
+ constant.language.null.js
+
+
+ match
+ \b(super|this)\b
+ name
+ variable.language.js
+
+
+ match
+ \b(debugger)\b
+ name
+ keyword.other.js
+
+
+ match
+ \b(Anchor|Applet|Area|Array|Boolean|Button|Checkbox|Date|document|event|FileUpload|Form|Frame|Function|Hidden|History|Image|JavaArray|JavaClass|JavaObject|JavaPackage|java|Layer|Link|Location|Math|MimeType|Number|navigator|netscape|Object|Option|Packages|Password|Plugin|Radio|RegExp|Reset|Select|String|Style|Submit|screen|sun|Text|Textarea|window|XMLHttpRequest)\b
+ name
+ support.class.js
+
+
+ match
+ \b(s(h(ift|ow(Mod(elessDialog|alDialog)|Help))|croll(X|By(Pages|Lines)?|Y|To)?|t(op|rike)|i(n|zeToContent|debar|gnText)|ort|u(p|b(str(ing)?)?)|pli(ce|t)|e(nd|t(Re(sizable|questHeader)|M(i(nutes|lliseconds)|onth)|Seconds|Ho(tKeys|urs)|Year|Cursor|Time(out)?|Interval|ZOptions|Date|UTC(M(i(nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(ome|andleEvent)|navigate|c(har(CodeAt|At)|o(s|n(cat|textual|firm)|mpile)|eil|lear(Timeout|Interval)?|a(ptureEvents|ll)|reate(StyleSheet|Popup|EventObject))|t(o(GMTString|S(tring|ource)|U(TCString|pperCase)|Lo(caleString|werCase))|est|a(n|int(Enabled)?))|i(s(NaN|Finite)|ndexOf|talics)|d(isableExternalCapture|ump|etachEvent)|u(n(shift|taint|escape|watch)|pdateCommands)|j(oin|avaEnabled)|p(o(p|w)|ush|lugins.refresh|a(ddings|rse(Int|Float)?)|r(int|ompt|eference))|e(scape|nableExternalCapture|val|lementFromPoint|x(p|ec(Script|Command)?))|valueOf|UTC|queryCommand(State|Indeterm|Enabled|Value)|f(i(nd|le(ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(nt(size|color)|rward)|loor|romCharCode)|watch|l(ink|o(ad|g)|astIndexOf)|a(sin|nchor|cos|t(tachEvent|ob|an(2)?)|pply|lert|b(s|ort))|r(ou(nd|teEvents)|e(size(By|To)|calc|turnValue|place|verse|l(oad|ease(Capture|Events)))|andom)|g(o|et(ResponseHeader|M(i(nutes|lliseconds)|onth)|Se(conds|lection)|Hours|Year|Time(zoneOffset)?|Da(y|te)|UTC(M(i(nutes|lliseconds)|onth)|Seconds|Hours|Da(y|te)|FullYear)|FullYear|A(ttention|llResponseHeaders)))|m(in|ove(B(y|elow)|To(Absolute)?|Above)|ergeAttributes|a(tch|rgins|x))|b(toa|ig|o(ld|rderWidths)|link|ack))\b(?=\()
+ name
+ support.function.js
+
+
+ match
+ \b(s(ub(stringData|mit)|plitText|e(t(NamedItem|Attribute(Node)?)|lect))|has(ChildNodes|Feature)|namedItem|c(l(ick|o(se|neNode))|reate(C(omment|DATASection|aption)|T(Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(ntityReference|lement)|Attribute))|tabIndex|i(nsert(Row|Before|Cell|Data)|tem)|open|delete(Row|C(ell|aption)|T(Head|Foot)|Data)|focus|write(ln)?|a(dd|ppend(Child|Data))|re(set|place(Child|Data)|move(NamedItem|Child|Attribute(Node)?)?)|get(NamedItem|Element(sBy(Name|TagName)|ById)|Attribute(Node)?)|blur)\b(?=\()
+ name
+ support.function.dom.js
+
+
+ match
+ (?<=\.)(s(ystemLanguage|cr(ipts|ollbars|een(X|Y|Top|Left))|t(yle(Sheets)?|atus(Text|bar)?)|ibling(Below|Above)|ource|uffixes|e(curity(Policy)?|l(ection|f)))|h(istory|ost(name)?|as(h|Focus))|y|X(MLDocument|SLDocument)|n(ext|ame(space(s|URI)|Prop))|M(IN_VALUE|AX_VALUE)|c(haracterSet|o(n(structor|trollers)|okieEnabled|lorDepth|mp(onents|lete))|urrent|puClass|l(i(p(boardData)?|entInformation)|osed|asses)|alle(e|r)|rypto)|t(o(olbar|p)|ext(Transform|Indent|Decoration|Align)|ags)|SQRT(1_2|2)|i(n(ner(Height|Width)|put)|ds|gnoreCase)|zIndex|o(scpu|n(readystatechange|Line)|uter(Height|Width)|p(sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(i(splay|alog(Height|Top|Width|Left|Arguments)|rectories)|e(scription|fault(Status|Ch(ecked|arset)|View)))|u(ser(Profile|Language|Agent)|n(iqueID|defined)|pdateInterval)|_content|p(ixelDepth|ort|ersonalbar|kcs11|l(ugins|atform)|a(thname|dding(Right|Bottom|Top|Left)|rent(Window|Layer)?|ge(X(Offset)?|Y(Offset)?))|r(o(to(col|type)|duct(Sub)?|mpter)|e(vious|fix)))|e(n(coding|abledPlugin)|x(ternal|pando)|mbeds)|v(isibility|endor(Sub)?|Linkcolor)|URLUnencoded|P(I|OSITIVE_INFINITY)|f(ilename|o(nt(Size|Family|Weight)|rmName)|rame(s|Element)|gColor)|E|whiteSpace|l(i(stStyleType|n(eHeight|kColor))|o(ca(tion(bar)?|lName)|wsrc)|e(ngth|ft(Context)?)|a(st(M(odified|atch)|Index|Paren)|yer(s|X)|nguage))|a(pp(MinorVersion|Name|Co(deName|re)|Version)|vail(Height|Top|Width|Left)|ll|r(ity|guments)|Linkcolor|bove)|r(ight(Context)?|e(sponse(XML|Text)|adyState))|global|x|m(imeTypes|ultiline|enubar|argin(Right|Bottom|Top|Left))|L(N(10|2)|OG(10E|2E))|b(o(ttom|rder(RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(Color|Image)))\b
+ name
+ support.constant.js
+
+
+ match
+ (?<=\.)(s(hape|ystemId|c(heme|ope|rolling)|ta(ndby|rt)|ize|ummary|pecified|e(ctionRowIndex|lected(Index)?)|rc)|h(space|t(tpEquiv|mlFor)|e(ight|aders)|ref(lang)?)|n(o(Resize|tation(s|Name)|Shade|Href|de(Name|Type|Value)|Wrap)|extSibling|ame)|c(h(ildNodes|Off|ecked|arset)?|ite|o(ntent|o(kie|rds)|de(Base|Type)?|l(s|Span|or)|mpact)|ell(s|Spacing|Padding)|l(ear|assName)|aption)|t(ype|Bodies|itle|Head|ext|a(rget|gName)|Foot)|i(sMap|ndex|d|m(plementation|ages))|o(ptions|wnerDocument|bject)|d(i(sabled|r)|o(c(type|umentElement)|main)|e(clare|f(er|ault(Selected|Checked|Value)))|at(eTime|a))|useMap|p(ublicId|arentNode|r(o(file|mpt)|eviousSibling))|e(n(ctype|tities)|vent|lements)|v(space|ersion|alue(Type)?|Link|Align)|URL|f(irstChild|orm(s)?|ace|rame(Border)?)|width|l(ink(s)?|o(ngDesc|wSrc)|a(stChild|ng|bel))|a(nchors|c(ce(ssKey|pt(Charset)?)|tion)|ttributes|pplets|l(t|ign)|r(chive|eas)|xis|Link|bbr)|r(ow(s|Span|Index)|ules|e(v|ferrer|l|adOnly))|m(ultiple|e(thod|dia)|a(rgin(Height|Width)|xLength))|b(o(dy|rder)|ackground|gColor))\b
+ name
+ support.constant.dom.js
+
+
+ match
+ \b(ELEMENT_NODE|ATTRIBUTE_NODE|TEXT_NODE|CDATA_SECTION_NODE|ENTITY_REFERENCE_NODE|ENTITY_NODE|PROCESSING_INSTRUCTION_NODE|COMMENT_NODE|DOCUMENT_NODE|DOCUMENT_TYPE_NODE|DOCUMENT_FRAGMENT_NODE|NOTATION_NODE|INDEX_SIZE_ERR|DOMSTRING_SIZE_ERR|HIERARCHY_REQUEST_ERR|WRONG_DOCUMENT_ERR|INVALID_CHARACTER_ERR|NO_DATA_ALLOWED_ERR|NO_MODIFICATION_ALLOWED_ERR|NOT_FOUND_ERR|NOT_SUPPORTED_ERR|INUSE_ATTRIBUTE_ERR)\b
+ name
+ support.constant.dom.js
+
+
+ match
+ \bon(R(ow(s(inserted|delete)|e(nter|xit))|e(s(ize(start|end)?|et)|adystatechange))|Mouse(o(ut|ver)|down|up|move)|B(efore(cut|deactivate|u(nload|pdate)|p(aste|rint)|editfocus|activate)|lur)|S(croll|top|ubmit|elect(start|ionchange)?)|H(over|elp)|C(hange|ont(extmenu|rolselect)|ut|ellchange|l(ick|ose))|D(eactivate|ata(setc(hanged|omplete)|available)|r(op|ag(start|over|drop|en(ter|d)|leave)?)|blclick)|Unload|P(aste|ropertychange)|Error(update)?|Key(down|up|press)|Focus|Load|A(ctivate|fter(update|print)|bort))\b
+ name
+ support.function.event-handler.js
+
+
+ match
+ !|%|&|\*|\-\-|\-|\+\+|\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\|\||\?\:|\*=|/=|%=|\+=|\-=|&=|\^=|\b(in|instanceof|new|delete|typeof|void)\b
+ name
+ keyword.operator.js
+
+
+ match
+ \b(Infinity|NaN|Undefined)\b
+ name
+ constant.language.js
+
+
+ begin
+ (?<=[=(:]|^|return)\s*(/)(?![/*+{}?])
+ beginCaptures
+
+ 1
+
+ name
+ punctuation.definition.string.begin.js
+
+
+ end
+ (/)[igm]*
+ endCaptures
+
+ 1
+
+ name
+ punctuation.definition.string.end.js
+
+
+ name
+ string.regexp.js
+ patterns
+
+
+ match
+ \\.
+ name
+ constant.character.escape.js
+
+
+
+
+ match
+ \;
+ name
+ punctuation.terminator.statement.js
+
+
+ match
+ ,[ |\t]*
+ name
+ meta.delimiter.object.comma.js
+
+
+ match
+ \.
+ name
+ meta.delimiter.method.period.js
+
+
+ match
+ \{|\}
+ name
+ meta.brace.curly.js
+
+
+ match
+ \(|\)
+ name
+ meta.brace.round.js
+
+
+ match
+ \[|\]
+ name
+ meta.brace.square.js
+
+
+ scopeName
+ source.js.basic
+ uuid
+ 0D2D03B9-F18B-4D9D-A960-716FDEC35331
+
+
diff --git a/info.plist b/info.plist
index 16ac3e7..b804b73 100644
--- a/info.plist
+++ b/info.plist
@@ -130,7 +130,6 @@
009A3E6C-FE3F-4A18-8759-2DC31F17BBE2
7B9AEFCC-B450-416D-8527-430FE2A08568
9E0E3BCC-7F20-4D6B-891D-A44D6EC56E31
- 0C6DE5D1-2AAA-4327-A746-94FCCD7A45C9
6D3097A0-7065-480A-9DE2-D7EEE181E783
uuid