1
define('ace/mode/jsx', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/jsx_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/mode/behaviour/cstyle', 'ace/mode/folding/cstyle'], function(require, exports, module) {
4
var oop = require("../lib/oop");
5
var TextMode = require("./text").Mode;
6
var Tokenizer = require("../tokenizer").Tokenizer;
7
var JsxHighlightRules = require("./jsx_highlight_rules").JsxHighlightRules;
8
var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent;
9
var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour;
10
var CStyleFoldMode = require("./folding/cstyle").FoldMode;
13
this.$tokenizer = new Tokenizer(new JsxHighlightRules().getRules());
14
this.$outdent = new MatchingBraceOutdent();
15
this.$behaviour = new CstyleBehaviour();
16
this.foldingRules = new CStyleFoldMode();
18
oop.inherits(Mode, TextMode);
22
this.lineCommentStart = "//";
23
this.blockComment = {start: "/*", end: "*/"};
25
this.getNextLineIndent = function(state, line, tab) {
26
var indent = this.$getIndent(line);
28
var tokenizedLine = this.$tokenizer.getLineTokens(line, state);
29
var tokens = tokenizedLine.tokens;
31
if (tokens.length && tokens[tokens.length-1].type == "comment") {
35
if (state == "start") {
36
var match = line.match(/^.*[\{\(\[]\s*$/);
45
this.checkOutdent = function(state, line, input) {
46
return this.$outdent.checkOutdent(line, input);
49
this.autoOutdent = function(state, doc, row) {
50
this.$outdent.autoOutdent(doc, row);
53
}).call(Mode.prototype);
57
define('ace/mode/jsx_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/mode/doc_comment_highlight_rules', 'ace/mode/text_highlight_rules'], function(require, exports, module) {
58
var oop = require("../lib/oop");
59
var lang = require("../lib/lang");
60
var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules;
61
var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;
63
var JsxHighlightRules = function() {
64
var keywords = lang.arrayToMap(
65
("break|do|instanceof|typeof|case|else|new|var|catch|finally|return|void|continue|for|switch|default|while|function|this|" +
68
"class|extends|super|import|from|into|implements|interface|static|mixin|override|abstract|final|" +
69
"number|int|string|boolean|variant|" +
70
"log|assert").split("|")
73
var buildinConstants = lang.arrayToMap(
74
("null|true|false|NaN|Infinity|__FILE__|__LINE__|undefined").split("|")
77
var reserved = lang.arrayToMap(
80
"let|private|public|yield|protected|" +
81
"extern|native|as|operator|__fake__|__readonly__").split("|")
84
var identifierRe = "[a-zA-Z_][a-zA-Z0-9_]*\\b";
92
DocCommentHighlightRules.getStartRule("doc-start"),
94
token : "comment", // multi line comment
98
token : "string.regexp",
99
regex : "[/](?:(?:\\[(?:\\\\]|[^\\]])+\\])|(?:\\\\/|[^\\]/]))*[/]\\w*\\s*(?=[).,;]|$)"
101
token : "string", // single line
102
regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]'
104
token : "string", // single line
105
regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']"
107
token : "constant.numeric", // hex
108
regex : "0[xX][0-9a-fA-F]+\\b"
110
token : "constant.numeric", // float
111
regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b"
113
token : "constant.language.boolean",
114
regex : "(?:true|false)\\b"
119
"entity.name.function"
121
regex : "(function)(\\s+)(" + identifierRe + ")"
123
token : function(value) {
125
return "variable.language";
126
else if (value == "function")
127
return "storage.type";
128
else if (keywords.hasOwnProperty(value) || reserved.hasOwnProperty(value))
130
else if (buildinConstants.hasOwnProperty(value))
131
return "constant.language";
132
else if (/^_?[A-Z][a-zA-Z0-9_]*$/.test(value))
133
return "language.support.class";
139
token : "keyword.operator",
140
regex : "!|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|==|=|!=|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)"
142
token : "punctuation.operator",
143
regex : "\\?|\\:|\\,|\\;|\\."
145
token : "paren.lparen",
148
token : "paren.rparen",
157
token : "comment", // closing comment
161
token : "comment", // comment spanning whole line
167
this.embedRules(DocCommentHighlightRules, "doc-",
168
[ DocCommentHighlightRules.getEndRule("start") ]);
171
oop.inherits(JsxHighlightRules, TextHighlightRules);
173
exports.JsxHighlightRules = JsxHighlightRules;
176
define('ace/mode/doc_comment_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) {
179
var oop = require("../lib/oop");
180
var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;
182
var DocCommentHighlightRules = function() {
186
token : "comment.doc.tag",
187
regex : "@[\\w\\d_]+" // TODO: fix email addresses
189
token : "comment.doc.tag",
192
defaultToken : "comment.doc"
197
oop.inherits(DocCommentHighlightRules, TextHighlightRules);
199
DocCommentHighlightRules.getStartRule = function(start) {
201
token : "comment.doc", // doc comment
202
regex : "\\/\\*(?=\\*)",
207
DocCommentHighlightRules.getEndRule = function (start) {
209
token : "comment.doc", // closing comment
216
exports.DocCommentHighlightRules = DocCommentHighlightRules;
220
define('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {
223
var Range = require("../range").Range;
225
var MatchingBraceOutdent = function() {};
229
this.checkOutdent = function(line, input) {
230
if (! /^\s+$/.test(line))
233
return /^\s*\}/.test(input);
236
this.autoOutdent = function(doc, row) {
237
var line = doc.getLine(row);
238
var match = line.match(/^(\s*\})/);
240
if (!match) return 0;
242
var column = match[1].length;
243
var openBracePos = doc.findMatchingBracket({row: row, column: column});
245
if (!openBracePos || openBracePos.row == row) return 0;
247
var indent = this.$getIndent(doc.getLine(openBracePos.row));
248
doc.replace(new Range(row, 0, row, column-1), indent);
251
this.$getIndent = function(line) {
252
return line.match(/^\s*/)[0];
255
}).call(MatchingBraceOutdent.prototype);
257
exports.MatchingBraceOutdent = MatchingBraceOutdent;
260
define('ace/mode/behaviour/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/token_iterator', 'ace/lib/lang'], function(require, exports, module) {
263
var oop = require("../../lib/oop");
264
var Behaviour = require("../behaviour").Behaviour;
265
var TokenIterator = require("../../token_iterator").TokenIterator;
266
var lang = require("../../lib/lang");
268
var SAFE_INSERT_IN_TOKENS =
269
["text", "paren.rparen", "punctuation.operator"];
270
var SAFE_INSERT_BEFORE_TOKENS =
271
["text", "paren.rparen", "punctuation.operator", "comment"];
274
var autoInsertedBrackets = 0;
275
var autoInsertedRow = -1;
276
var autoInsertedLineEnd = "";
277
var maybeInsertedBrackets = 0;
278
var maybeInsertedRow = -1;
279
var maybeInsertedLineStart = "";
280
var maybeInsertedLineEnd = "";
282
var CstyleBehaviour = function () {
284
CstyleBehaviour.isSaneInsertion = function(editor, session) {
285
var cursor = editor.getCursorPosition();
286
var iterator = new TokenIterator(session, cursor.row, cursor.column);
287
if (!this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) {
288
var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1);
289
if (!this.$matchTokenType(iterator2.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS))
292
iterator.stepForward();
293
return iterator.getCurrentTokenRow() !== cursor.row ||
294
this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_BEFORE_TOKENS);
297
CstyleBehaviour.$matchTokenType = function(token, types) {
298
return types.indexOf(token.type || token) > -1;
301
CstyleBehaviour.recordAutoInsert = function(editor, session, bracket) {
302
var cursor = editor.getCursorPosition();
303
var line = session.doc.getLine(cursor.row);
304
if (!this.isAutoInsertedClosing(cursor, line, autoInsertedLineEnd[0]))
305
autoInsertedBrackets = 0;
306
autoInsertedRow = cursor.row;
307
autoInsertedLineEnd = bracket + line.substr(cursor.column);
308
autoInsertedBrackets++;
311
CstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) {
312
var cursor = editor.getCursorPosition();
313
var line = session.doc.getLine(cursor.row);
314
if (!this.isMaybeInsertedClosing(cursor, line))
315
maybeInsertedBrackets = 0;
316
maybeInsertedRow = cursor.row;
317
maybeInsertedLineStart = line.substr(0, cursor.column) + bracket;
318
maybeInsertedLineEnd = line.substr(cursor.column);
319
maybeInsertedBrackets++;
322
CstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) {
323
return autoInsertedBrackets > 0 &&
324
cursor.row === autoInsertedRow &&
325
bracket === autoInsertedLineEnd[0] &&
326
line.substr(cursor.column) === autoInsertedLineEnd;
329
CstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) {
330
return maybeInsertedBrackets > 0 &&
331
cursor.row === maybeInsertedRow &&
332
line.substr(cursor.column) === maybeInsertedLineEnd &&
333
line.substr(0, cursor.column) == maybeInsertedLineStart;
336
CstyleBehaviour.popAutoInsertedClosing = function() {
337
autoInsertedLineEnd = autoInsertedLineEnd.substr(1);
338
autoInsertedBrackets--;
341
CstyleBehaviour.clearMaybeInsertedClosing = function() {
342
maybeInsertedBrackets = 0;
343
maybeInsertedRow = -1;
346
this.add("braces", "insertion", function (state, action, editor, session, text) {
347
var cursor = editor.getCursorPosition();
348
var line = session.doc.getLine(cursor.row);
350
var selection = editor.getSelectionRange();
351
var selected = session.doc.getTextRange(selection);
352
if (selected !== "" && selected !== "{" && editor.getWrapBehavioursEnabled()) {
354
text: '{' + selected + '}',
357
} else if (CstyleBehaviour.isSaneInsertion(editor, session)) {
358
if (/[\]\}\)]/.test(line[cursor.column])) {
359
CstyleBehaviour.recordAutoInsert(editor, session, "}");
365
CstyleBehaviour.recordMaybeInsert(editor, session, "{");
372
} else if (text == '}') {
373
var rightChar = line.substring(cursor.column, cursor.column + 1);
374
if (rightChar == '}') {
375
var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});
376
if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {
377
CstyleBehaviour.popAutoInsertedClosing();
384
} else if (text == "\n" || text == "\r\n") {
386
if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) {
387
closing = lang.stringRepeat("}", maybeInsertedBrackets);
388
CstyleBehaviour.clearMaybeInsertedClosing();
390
var rightChar = line.substring(cursor.column, cursor.column + 1);
391
if (rightChar == '}' || closing !== "") {
392
var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column}, '}');
396
var indent = this.getNextLineIndent(state, line.substring(0, cursor.column), session.getTabString());
397
var next_indent = this.$getIndent(line);
400
text: '\n' + indent + '\n' + next_indent + closing,
401
selection: [1, indent.length, 1, indent.length]
407
this.add("braces", "deletion", function (state, action, editor, session, range) {
408
var selected = session.doc.getTextRange(range);
409
if (!range.isMultiLine() && selected == '{') {
410
var line = session.doc.getLine(range.start.row);
411
var rightChar = line.substring(range.end.column, range.end.column + 1);
412
if (rightChar == '}') {
416
maybeInsertedBrackets--;
421
this.add("parens", "insertion", function (state, action, editor, session, text) {
423
var selection = editor.getSelectionRange();
424
var selected = session.doc.getTextRange(selection);
425
if (selected !== "" && editor.getWrapBehavioursEnabled()) {
427
text: '(' + selected + ')',
430
} else if (CstyleBehaviour.isSaneInsertion(editor, session)) {
431
CstyleBehaviour.recordAutoInsert(editor, session, ")");
437
} else if (text == ')') {
438
var cursor = editor.getCursorPosition();
439
var line = session.doc.getLine(cursor.row);
440
var rightChar = line.substring(cursor.column, cursor.column + 1);
441
if (rightChar == ')') {
442
var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});
443
if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {
444
CstyleBehaviour.popAutoInsertedClosing();
454
this.add("parens", "deletion", function (state, action, editor, session, range) {
455
var selected = session.doc.getTextRange(range);
456
if (!range.isMultiLine() && selected == '(') {
457
var line = session.doc.getLine(range.start.row);
458
var rightChar = line.substring(range.start.column + 1, range.start.column + 2);
459
if (rightChar == ')') {
466
this.add("brackets", "insertion", function (state, action, editor, session, text) {
468
var selection = editor.getSelectionRange();
469
var selected = session.doc.getTextRange(selection);
470
if (selected !== "" && editor.getWrapBehavioursEnabled()) {
472
text: '[' + selected + ']',
475
} else if (CstyleBehaviour.isSaneInsertion(editor, session)) {
476
CstyleBehaviour.recordAutoInsert(editor, session, "]");
482
} else if (text == ']') {
483
var cursor = editor.getCursorPosition();
484
var line = session.doc.getLine(cursor.row);
485
var rightChar = line.substring(cursor.column, cursor.column + 1);
486
if (rightChar == ']') {
487
var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});
488
if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {
489
CstyleBehaviour.popAutoInsertedClosing();
499
this.add("brackets", "deletion", function (state, action, editor, session, range) {
500
var selected = session.doc.getTextRange(range);
501
if (!range.isMultiLine() && selected == '[') {
502
var line = session.doc.getLine(range.start.row);
503
var rightChar = line.substring(range.start.column + 1, range.start.column + 2);
504
if (rightChar == ']') {
511
this.add("string_dquotes", "insertion", function (state, action, editor, session, text) {
512
if (text == '"' || text == "'") {
514
var selection = editor.getSelectionRange();
515
var selected = session.doc.getTextRange(selection);
516
if (selected !== "" && selected !== "'" && selected != '"' && editor.getWrapBehavioursEnabled()) {
518
text: quote + selected + quote,
522
var cursor = editor.getCursorPosition();
523
var line = session.doc.getLine(cursor.row);
524
var leftChar = line.substring(cursor.column-1, cursor.column);
525
if (leftChar == '\\') {
528
var tokens = session.getTokens(selection.start.row);
530
var quotepos = -1; // Track whether we're inside an open quote.
532
for (var x = 0; x < tokens.length; x++) {
534
if (token.type == "string") {
536
} else if (quotepos < 0) {
537
quotepos = token.value.indexOf(quote);
539
if ((token.value.length + col) > selection.start.column) {
542
col += tokens[x].value.length;
544
if (!token || (quotepos < 0 && token.type !== "comment" && (token.type !== "string" || ((selection.start.column !== token.value.length+col-1) && token.value.lastIndexOf(quote) === token.value.length-1)))) {
545
if (!CstyleBehaviour.isSaneInsertion(editor, session))
551
} else if (token && token.type === "string") {
552
var rightChar = line.substring(cursor.column, cursor.column + 1);
553
if (rightChar == quote) {
564
this.add("string_dquotes", "deletion", function (state, action, editor, session, range) {
565
var selected = session.doc.getTextRange(range);
566
if (!range.isMultiLine() && (selected == '"' || selected == "'")) {
567
var line = session.doc.getLine(range.start.row);
568
var rightChar = line.substring(range.start.column + 1, range.start.column + 2);
569
if (rightChar == selected) {
578
oop.inherits(CstyleBehaviour, Behaviour);
580
exports.CstyleBehaviour = CstyleBehaviour;
583
define('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) {
586
var oop = require("../../lib/oop");
587
var Range = require("../../range").Range;
588
var BaseFoldMode = require("./fold_mode").FoldMode;
590
var FoldMode = exports.FoldMode = function(commentRegex) {
592
this.foldingStartMarker = new RegExp(
593
this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start)
595
this.foldingStopMarker = new RegExp(
596
this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end)
600
oop.inherits(FoldMode, BaseFoldMode);
604
this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/;
605
this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/;
607
this.getFoldWidgetRange = function(session, foldStyle, row) {
608
var line = session.getLine(row);
609
var match = line.match(this.foldingStartMarker);
614
return this.openingBracketBlock(session, match[1], row, i);
616
return session.getCommentFoldRange(row, i + match[0].length, 1);
619
if (foldStyle !== "markbeginend")
622
var match = line.match(this.foldingStopMarker);
624
var i = match.index + match[0].length;
627
return this.closingBracketBlock(session, match[1], row, i);
629
return session.getCommentFoldRange(row, i, -1);
633
}).call(FoldMode.prototype);