package
This commit is contained in:
parent
a13ba68fa2
commit
112c5e8959
7 changed files with 889 additions and 286 deletions
|
|
@ -6142,7 +6142,7 @@ exports.commands = [{
|
||||||
*
|
*
|
||||||
* ***** END LICENSE BLOCK ***** */
|
* ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
define('ace/edit_session', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/lib/event_emitter', 'ace/selection', 'ace/mode/text', 'ace/range', 'ace/document', 'ace/background_tokenizer', 'ace/edit_session/folding'], function(require, exports, module) {
|
define('ace/edit_session', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/lib/event_emitter', 'ace/selection', 'ace/mode/text', 'ace/range', 'ace/document', 'ace/background_tokenizer', 'ace/edit_session/folding', 'ace/edit_session/bracket_match'], function(require, exports, module) {
|
||||||
|
|
||||||
var oop = require("./lib/oop");
|
var oop = require("./lib/oop");
|
||||||
var lang = require("./lib/lang");
|
var lang = require("./lib/lang");
|
||||||
|
|
@ -6716,98 +6716,6 @@ var EditSession = function(text, mode) {
|
||||||
return this.doc.getTextRange(range);
|
return this.doc.getTextRange(range);
|
||||||
};
|
};
|
||||||
|
|
||||||
this.findMatchingBracket = function(position) {
|
|
||||||
if (position.column == 0) return null;
|
|
||||||
|
|
||||||
var charBeforeCursor = this.getLine(position.row).charAt(position.column-1);
|
|
||||||
if (charBeforeCursor == "") return null;
|
|
||||||
|
|
||||||
var match = charBeforeCursor.match(/([\(\[\{])|([\)\]\}])/);
|
|
||||||
if (!match) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (match[1]) {
|
|
||||||
return this.$findClosingBracket(match[1], position);
|
|
||||||
} else {
|
|
||||||
return this.$findOpeningBracket(match[2], position);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
this.$brackets = {
|
|
||||||
")": "(",
|
|
||||||
"(": ")",
|
|
||||||
"]": "[",
|
|
||||||
"[": "]",
|
|
||||||
"{": "}",
|
|
||||||
"}": "{"
|
|
||||||
};
|
|
||||||
|
|
||||||
this.$findOpeningBracket = function(bracket, position) {
|
|
||||||
var openBracket = this.$brackets[bracket];
|
|
||||||
|
|
||||||
var column = position.column - 2;
|
|
||||||
var row = position.row;
|
|
||||||
var depth = 1;
|
|
||||||
|
|
||||||
var line = this.getLine(row);
|
|
||||||
|
|
||||||
while (true) {
|
|
||||||
while(column >= 0) {
|
|
||||||
var ch = line.charAt(column);
|
|
||||||
if (ch == openBracket) {
|
|
||||||
depth -= 1;
|
|
||||||
if (depth == 0) {
|
|
||||||
return {row: row, column: column};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (ch == bracket) {
|
|
||||||
depth +=1;
|
|
||||||
}
|
|
||||||
column -= 1;
|
|
||||||
}
|
|
||||||
row -=1;
|
|
||||||
if (row < 0) break;
|
|
||||||
|
|
||||||
var line = this.getLine(row);
|
|
||||||
var column = line.length-1;
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
};
|
|
||||||
|
|
||||||
this.$findClosingBracket = function(bracket, position) {
|
|
||||||
var closingBracket = this.$brackets[bracket];
|
|
||||||
|
|
||||||
var column = position.column;
|
|
||||||
var row = position.row;
|
|
||||||
var depth = 1;
|
|
||||||
|
|
||||||
var line = this.getLine(row);
|
|
||||||
var lineCount = this.getLength();
|
|
||||||
|
|
||||||
while (true) {
|
|
||||||
while(column < line.length) {
|
|
||||||
var ch = line.charAt(column);
|
|
||||||
if (ch == closingBracket) {
|
|
||||||
depth -= 1;
|
|
||||||
if (depth == 0) {
|
|
||||||
return {row: row, column: column};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (ch == bracket) {
|
|
||||||
depth +=1;
|
|
||||||
}
|
|
||||||
column += 1;
|
|
||||||
}
|
|
||||||
row +=1;
|
|
||||||
if (row >= lineCount) break;
|
|
||||||
|
|
||||||
var line = this.getLine(row);
|
|
||||||
var column = 0;
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
};
|
|
||||||
|
|
||||||
this.insert = function(position, text) {
|
this.insert = function(position, text) {
|
||||||
return this.doc.insert(position, text);
|
return this.doc.insert(position, text);
|
||||||
};
|
};
|
||||||
|
|
@ -7840,6 +7748,7 @@ var EditSession = function(text, mode) {
|
||||||
}).call(EditSession.prototype);
|
}).call(EditSession.prototype);
|
||||||
|
|
||||||
require("./edit_session/folding").Folding.call(EditSession.prototype);
|
require("./edit_session/folding").Folding.call(EditSession.prototype);
|
||||||
|
require("./edit_session/bracket_match").BracketMatch.call(EditSession.prototype);
|
||||||
|
|
||||||
exports.EditSession = EditSession;
|
exports.EditSession = EditSession;
|
||||||
});
|
});
|
||||||
|
|
@ -10715,6 +10624,298 @@ var Fold = exports.Fold = function(range, placeholder) {
|
||||||
}).call(Fold.prototype);
|
}).call(Fold.prototype);
|
||||||
|
|
||||||
});/* vim:ts=4:sts=4:sw=4:
|
});/* vim:ts=4:sts=4:sw=4:
|
||||||
|
* ***** BEGIN LICENSE BLOCK *****
|
||||||
|
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||||
|
*
|
||||||
|
* The contents of this file are subject to the Mozilla Public License Version
|
||||||
|
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||||
|
* the License. You may obtain a copy of the License at
|
||||||
|
* http://www.mozilla.org/MPL/
|
||||||
|
*
|
||||||
|
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||||
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||||
|
* for the specific language governing rights and limitations under the
|
||||||
|
* License.
|
||||||
|
*
|
||||||
|
* The Original Code is Ajax.org Code Editor (ACE).
|
||||||
|
*
|
||||||
|
* The Initial Developer of the Original Code is
|
||||||
|
* Ajax.org B.V.
|
||||||
|
* Portions created by the Initial Developer are Copyright (C) 2010
|
||||||
|
* the Initial Developer. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
* Fabian Jakobs <fabian AT ajax DOT org>
|
||||||
|
*
|
||||||
|
* Alternatively, the contents of this file may be used under the terms of
|
||||||
|
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||||
|
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||||
|
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||||
|
* of those above. If you wish to allow use of your version of this file only
|
||||||
|
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||||
|
* use your version of this file under the terms of the MPL, indicate your
|
||||||
|
* decision by deleting the provisions above and replace them with the notice
|
||||||
|
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||||
|
* the provisions above, a recipient may use your version of this file under
|
||||||
|
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||||
|
*
|
||||||
|
* ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
|
define('ace/edit_session/bracket_match', ['require', 'exports', 'module' , 'ace/token_iterator'], function(require, exports, module) {
|
||||||
|
|
||||||
|
var TokenIterator = require("../token_iterator").TokenIterator;
|
||||||
|
|
||||||
|
function BracketMatch() {
|
||||||
|
|
||||||
|
this.findMatchingBracket = function(position) {
|
||||||
|
if (position.column == 0) return null;
|
||||||
|
|
||||||
|
var charBeforeCursor = this.getLine(position.row).charAt(position.column-1);
|
||||||
|
if (charBeforeCursor == "") return null;
|
||||||
|
|
||||||
|
var match = charBeforeCursor.match(/([\(\[\{])|([\)\]\}])/);
|
||||||
|
if (!match) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (match[1]) {
|
||||||
|
return this.$findClosingBracket(match[1], position);
|
||||||
|
} else {
|
||||||
|
return this.$findOpeningBracket(match[2], position);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
this.$brackets = {
|
||||||
|
")": "(",
|
||||||
|
"(": ")",
|
||||||
|
"]": "[",
|
||||||
|
"[": "]",
|
||||||
|
"{": "}",
|
||||||
|
"}": "{"
|
||||||
|
};
|
||||||
|
|
||||||
|
this.$findOpeningBracket = function(bracket, position) {
|
||||||
|
var openBracket = this.$brackets[bracket];
|
||||||
|
var depth = 1;
|
||||||
|
|
||||||
|
var iterator = new TokenIterator(this, position.row, position.column);
|
||||||
|
var token = iterator.getCurrentToken();
|
||||||
|
if (!token) return null;
|
||||||
|
|
||||||
|
// token.type contains a period-delimited list of token identifiers
|
||||||
|
// (e.g.: "constant.numeric" or "paren.lparen"). Create a pattern that
|
||||||
|
// matches any token containing the same identifiers or a subset. In
|
||||||
|
// addition, if token.type includes "rparen", then also match "lparen".
|
||||||
|
// So if type.token is "paren.rparen", then typeRe will match "lparen.paren".
|
||||||
|
var typeRe = new RegExp("(\\.?" +
|
||||||
|
token.type.replace(".", "|").replace("rparen", "lparen|rparen") + ")+");
|
||||||
|
|
||||||
|
// Start searching in token, just before the character at position.column
|
||||||
|
var valueIndex = position.column - iterator.getCurrentTokenColumn() - 2;
|
||||||
|
var value = token.value;
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
|
||||||
|
while (valueIndex >= 0) {
|
||||||
|
var char = value.charAt(valueIndex);
|
||||||
|
if (char == openBracket) {
|
||||||
|
depth -= 1;
|
||||||
|
if (depth == 0) {
|
||||||
|
return {row: iterator.getCurrentTokenRow(),
|
||||||
|
column: valueIndex + iterator.getCurrentTokenColumn()};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (char == bracket) {
|
||||||
|
depth += 1;
|
||||||
|
}
|
||||||
|
valueIndex -= 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Scan backward through the document, looking for the next token
|
||||||
|
// whose type matches typeRe
|
||||||
|
do {
|
||||||
|
token = iterator.stepBackward();
|
||||||
|
} while (token && !typeRe.test(token.type));
|
||||||
|
|
||||||
|
if (token == null)
|
||||||
|
break;
|
||||||
|
|
||||||
|
value = token.value;
|
||||||
|
valueIndex = value.length - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
};
|
||||||
|
|
||||||
|
this.$findClosingBracket = function(bracket, position) {
|
||||||
|
var closingBracket = this.$brackets[bracket];
|
||||||
|
var depth = 1;
|
||||||
|
|
||||||
|
var iterator = new TokenIterator(this, position.row, position.column);
|
||||||
|
var token = iterator.getCurrentToken();
|
||||||
|
if (!token) return null;
|
||||||
|
|
||||||
|
// token.type contains a period-delimited list of token identifiers
|
||||||
|
// (e.g.: "constant.numeric" or "paren.lparen"). Create a pattern that
|
||||||
|
// matches any token containing the same identifiers or a subset. In
|
||||||
|
// addition, if token.type includes "lparen", then also match "rparen".
|
||||||
|
// So if type.token is "lparen.paren", then typeRe will match "paren.rparen".
|
||||||
|
var typeRe = new RegExp("(\\.?" +
|
||||||
|
token.type.replace(".", "|").replace("lparen", "lparen|rparen") + ")+");
|
||||||
|
|
||||||
|
// Start searching in token, after the character at position.column
|
||||||
|
var valueIndex = position.column - iterator.getCurrentTokenColumn();
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
|
||||||
|
var value = token.value;
|
||||||
|
var valueLength = value.length;
|
||||||
|
while (valueIndex < valueLength) {
|
||||||
|
var char = value.charAt(valueIndex);
|
||||||
|
if (char == closingBracket) {
|
||||||
|
depth -= 1;
|
||||||
|
if (depth == 0) {
|
||||||
|
return {row: iterator.getCurrentTokenRow(),
|
||||||
|
column: valueIndex + iterator.getCurrentTokenColumn()};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (char == bracket) {
|
||||||
|
depth += 1;
|
||||||
|
}
|
||||||
|
valueIndex += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Scan forward through the document, looking for the next token
|
||||||
|
// whose type matches typeRe
|
||||||
|
do {
|
||||||
|
token = iterator.stepForward();
|
||||||
|
} while (token && !typeRe.test(token.type));
|
||||||
|
|
||||||
|
if (token == null)
|
||||||
|
break;
|
||||||
|
|
||||||
|
valueIndex = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
exports.BracketMatch = BracketMatch;
|
||||||
|
|
||||||
|
});
|
||||||
|
/* vim:ts=4:sts=4:sw=4:
|
||||||
|
* ***** BEGIN LICENSE BLOCK *****
|
||||||
|
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||||
|
*
|
||||||
|
* The contents of this file are subject to the Mozilla Public License Version
|
||||||
|
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||||
|
* the License. You may obtain a copy of the License at
|
||||||
|
* http://www.mozilla.org/MPL/
|
||||||
|
*
|
||||||
|
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||||
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||||
|
* for the specific language governing rights and limitations under the
|
||||||
|
* License.
|
||||||
|
*
|
||||||
|
* The Original Code is Ajax.org Code Editor (ACE).
|
||||||
|
*
|
||||||
|
* The Initial Developer of the Original Code is
|
||||||
|
* Ajax.org B.V.
|
||||||
|
* Portions created by the Initial Developer are Copyright (C) 2010
|
||||||
|
* the Initial Developer. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
* Fabian Jakobs <fabian AT ajax DOT org>
|
||||||
|
*
|
||||||
|
* Alternatively, the contents of this file may be used under the terms of
|
||||||
|
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||||
|
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||||
|
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||||
|
* of those above. If you wish to allow use of your version of this file only
|
||||||
|
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||||
|
* use your version of this file under the terms of the MPL, indicate your
|
||||||
|
* decision by deleting the provisions above and replace them with the notice
|
||||||
|
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||||
|
* the provisions above, a recipient may use your version of this file under
|
||||||
|
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||||
|
*
|
||||||
|
* ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
|
define('ace/token_iterator', ['require', 'exports', 'module' ], function(require, exports, module) {
|
||||||
|
|
||||||
|
var TokenIterator = function(session, initialRow, initialColumn) {
|
||||||
|
this.$session = session;
|
||||||
|
this.$row = initialRow;
|
||||||
|
this.$rowTokens = session.getTokens(initialRow, initialRow)[0].tokens;
|
||||||
|
|
||||||
|
var token = session.getTokenAt(initialRow, initialColumn);
|
||||||
|
this.$tokenIndex = token ? token.index : -1;
|
||||||
|
};
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
|
||||||
|
this.stepBackward = function() {
|
||||||
|
this.$tokenIndex -= 1;
|
||||||
|
|
||||||
|
while (this.$tokenIndex < 0) {
|
||||||
|
this.$row -= 1;
|
||||||
|
if (this.$row < 0)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
this.$rowTokens = this.$session.getTokens(this.$row, this.$row)[0].tokens;
|
||||||
|
this.$tokenIndex = this.$rowTokens.length - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.$rowTokens[this.$tokenIndex];
|
||||||
|
}
|
||||||
|
|
||||||
|
this.stepForward = function() {
|
||||||
|
var rowCount = this.$session.getLength();
|
||||||
|
this.$tokenIndex += 1;
|
||||||
|
|
||||||
|
while (this.$tokenIndex >= this.$rowTokens.length) {
|
||||||
|
this.$row += 1;
|
||||||
|
if (this.$row >= rowCount)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
this.$rowTokens = this.$session.getTokens(this.$row, this.$row)[0].tokens;
|
||||||
|
this.$tokenIndex = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.$rowTokens[this.$tokenIndex];
|
||||||
|
}
|
||||||
|
|
||||||
|
this.getCurrentToken = function () {
|
||||||
|
return this.$rowTokens[this.$tokenIndex];
|
||||||
|
}
|
||||||
|
|
||||||
|
this.getCurrentTokenRow = function () {
|
||||||
|
return this.$row;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.getCurrentTokenColumn = function() {
|
||||||
|
var rowTokens = this.$rowTokens;
|
||||||
|
var tokenIndex = this.$tokenIndex;
|
||||||
|
|
||||||
|
// If a column was cached by EditSession.getTokenAt, then use it
|
||||||
|
var column = rowTokens[tokenIndex].start;
|
||||||
|
if (column !== undefined)
|
||||||
|
return column;
|
||||||
|
|
||||||
|
column = 0;
|
||||||
|
while (tokenIndex > 0) {
|
||||||
|
tokenIndex -= 1;
|
||||||
|
column += rowTokens[tokenIndex].value.length;
|
||||||
|
}
|
||||||
|
|
||||||
|
return column;
|
||||||
|
}
|
||||||
|
|
||||||
|
}).call(TokenIterator.prototype);
|
||||||
|
|
||||||
|
exports.TokenIterator = TokenIterator;
|
||||||
|
});
|
||||||
|
/* vim:ts=4:sts=4:sw=4:
|
||||||
* ***** BEGIN LICENSE BLOCK *****
|
* ***** BEGIN LICENSE BLOCK *****
|
||||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||||
*
|
*
|
||||||
|
|
@ -11220,7 +11421,7 @@ var CursorLayer = require("./layer/cursor").Cursor;
|
||||||
var ScrollBar = require("./scrollbar").ScrollBar;
|
var ScrollBar = require("./scrollbar").ScrollBar;
|
||||||
var RenderLoop = require("./renderloop").RenderLoop;
|
var RenderLoop = require("./renderloop").RenderLoop;
|
||||||
var EventEmitter = require("./lib/event_emitter").EventEmitter;
|
var EventEmitter = require("./lib/event_emitter").EventEmitter;
|
||||||
var editorCss = require("text!ace/css/editor.css");
|
var editorCss = require("text!./css/editor.css");
|
||||||
|
|
||||||
var VirtualRenderer = function(container, theme) {
|
var VirtualRenderer = function(container, theme) {
|
||||||
this.container = container;
|
this.container = container;
|
||||||
|
|
|
||||||
File diff suppressed because one or more lines are too long
|
|
@ -11,7 +11,7 @@
|
||||||
|
|
||||||
Ace
|
Ace
|
||||||
version 0.2.0
|
version 0.2.0
|
||||||
commit 2d9382fb477a18c626fec8a801ee7ccb87fdbda7
|
commit a13ba68fa2b424f3a223214f71167d68ab8cdf43
|
||||||
|
|
||||||
|
|
||||||
-->
|
-->
|
||||||
|
|
|
||||||
|
|
@ -5287,7 +5287,7 @@ exports.commands = [{
|
||||||
*
|
*
|
||||||
* ***** END LICENSE BLOCK ***** */
|
* ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
define('ace/edit_session', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/lib/event_emitter', 'ace/selection', 'ace/mode/text', 'ace/range', 'ace/document', 'ace/background_tokenizer', 'ace/edit_session/folding'], function(require, exports, module) {
|
define('ace/edit_session', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/lib/event_emitter', 'ace/selection', 'ace/mode/text', 'ace/range', 'ace/document', 'ace/background_tokenizer', 'ace/edit_session/folding', 'ace/edit_session/bracket_match'], function(require, exports, module) {
|
||||||
|
|
||||||
var oop = require("./lib/oop");
|
var oop = require("./lib/oop");
|
||||||
var lang = require("./lib/lang");
|
var lang = require("./lib/lang");
|
||||||
|
|
@ -5861,98 +5861,6 @@ var EditSession = function(text, mode) {
|
||||||
return this.doc.getTextRange(range);
|
return this.doc.getTextRange(range);
|
||||||
};
|
};
|
||||||
|
|
||||||
this.findMatchingBracket = function(position) {
|
|
||||||
if (position.column == 0) return null;
|
|
||||||
|
|
||||||
var charBeforeCursor = this.getLine(position.row).charAt(position.column-1);
|
|
||||||
if (charBeforeCursor == "") return null;
|
|
||||||
|
|
||||||
var match = charBeforeCursor.match(/([\(\[\{])|([\)\]\}])/);
|
|
||||||
if (!match) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (match[1]) {
|
|
||||||
return this.$findClosingBracket(match[1], position);
|
|
||||||
} else {
|
|
||||||
return this.$findOpeningBracket(match[2], position);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
this.$brackets = {
|
|
||||||
")": "(",
|
|
||||||
"(": ")",
|
|
||||||
"]": "[",
|
|
||||||
"[": "]",
|
|
||||||
"{": "}",
|
|
||||||
"}": "{"
|
|
||||||
};
|
|
||||||
|
|
||||||
this.$findOpeningBracket = function(bracket, position) {
|
|
||||||
var openBracket = this.$brackets[bracket];
|
|
||||||
|
|
||||||
var column = position.column - 2;
|
|
||||||
var row = position.row;
|
|
||||||
var depth = 1;
|
|
||||||
|
|
||||||
var line = this.getLine(row);
|
|
||||||
|
|
||||||
while (true) {
|
|
||||||
while(column >= 0) {
|
|
||||||
var ch = line.charAt(column);
|
|
||||||
if (ch == openBracket) {
|
|
||||||
depth -= 1;
|
|
||||||
if (depth == 0) {
|
|
||||||
return {row: row, column: column};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (ch == bracket) {
|
|
||||||
depth +=1;
|
|
||||||
}
|
|
||||||
column -= 1;
|
|
||||||
}
|
|
||||||
row -=1;
|
|
||||||
if (row < 0) break;
|
|
||||||
|
|
||||||
var line = this.getLine(row);
|
|
||||||
var column = line.length-1;
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
};
|
|
||||||
|
|
||||||
this.$findClosingBracket = function(bracket, position) {
|
|
||||||
var closingBracket = this.$brackets[bracket];
|
|
||||||
|
|
||||||
var column = position.column;
|
|
||||||
var row = position.row;
|
|
||||||
var depth = 1;
|
|
||||||
|
|
||||||
var line = this.getLine(row);
|
|
||||||
var lineCount = this.getLength();
|
|
||||||
|
|
||||||
while (true) {
|
|
||||||
while(column < line.length) {
|
|
||||||
var ch = line.charAt(column);
|
|
||||||
if (ch == closingBracket) {
|
|
||||||
depth -= 1;
|
|
||||||
if (depth == 0) {
|
|
||||||
return {row: row, column: column};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (ch == bracket) {
|
|
||||||
depth +=1;
|
|
||||||
}
|
|
||||||
column += 1;
|
|
||||||
}
|
|
||||||
row +=1;
|
|
||||||
if (row >= lineCount) break;
|
|
||||||
|
|
||||||
var line = this.getLine(row);
|
|
||||||
var column = 0;
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
};
|
|
||||||
|
|
||||||
this.insert = function(position, text) {
|
this.insert = function(position, text) {
|
||||||
return this.doc.insert(position, text);
|
return this.doc.insert(position, text);
|
||||||
};
|
};
|
||||||
|
|
@ -6985,6 +6893,7 @@ var EditSession = function(text, mode) {
|
||||||
}).call(EditSession.prototype);
|
}).call(EditSession.prototype);
|
||||||
|
|
||||||
require("./edit_session/folding").Folding.call(EditSession.prototype);
|
require("./edit_session/folding").Folding.call(EditSession.prototype);
|
||||||
|
require("./edit_session/bracket_match").BracketMatch.call(EditSession.prototype);
|
||||||
|
|
||||||
exports.EditSession = EditSession;
|
exports.EditSession = EditSession;
|
||||||
});
|
});
|
||||||
|
|
@ -10171,6 +10080,298 @@ var Fold = exports.Fold = function(range, placeholder) {
|
||||||
}).call(Fold.prototype);
|
}).call(Fold.prototype);
|
||||||
|
|
||||||
});/* vim:ts=4:sts=4:sw=4:
|
});/* vim:ts=4:sts=4:sw=4:
|
||||||
|
* ***** BEGIN LICENSE BLOCK *****
|
||||||
|
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||||
|
*
|
||||||
|
* The contents of this file are subject to the Mozilla Public License Version
|
||||||
|
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||||
|
* the License. You may obtain a copy of the License at
|
||||||
|
* http://www.mozilla.org/MPL/
|
||||||
|
*
|
||||||
|
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||||
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||||
|
* for the specific language governing rights and limitations under the
|
||||||
|
* License.
|
||||||
|
*
|
||||||
|
* The Original Code is Ajax.org Code Editor (ACE).
|
||||||
|
*
|
||||||
|
* The Initial Developer of the Original Code is
|
||||||
|
* Ajax.org B.V.
|
||||||
|
* Portions created by the Initial Developer are Copyright (C) 2010
|
||||||
|
* the Initial Developer. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
* Fabian Jakobs <fabian AT ajax DOT org>
|
||||||
|
*
|
||||||
|
* Alternatively, the contents of this file may be used under the terms of
|
||||||
|
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||||
|
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||||
|
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||||
|
* of those above. If you wish to allow use of your version of this file only
|
||||||
|
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||||
|
* use your version of this file under the terms of the MPL, indicate your
|
||||||
|
* decision by deleting the provisions above and replace them with the notice
|
||||||
|
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||||
|
* the provisions above, a recipient may use your version of this file under
|
||||||
|
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||||
|
*
|
||||||
|
* ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
|
define('ace/edit_session/bracket_match', ['require', 'exports', 'module' , 'ace/token_iterator'], function(require, exports, module) {
|
||||||
|
|
||||||
|
var TokenIterator = require("../token_iterator").TokenIterator;
|
||||||
|
|
||||||
|
function BracketMatch() {
|
||||||
|
|
||||||
|
this.findMatchingBracket = function(position) {
|
||||||
|
if (position.column == 0) return null;
|
||||||
|
|
||||||
|
var charBeforeCursor = this.getLine(position.row).charAt(position.column-1);
|
||||||
|
if (charBeforeCursor == "") return null;
|
||||||
|
|
||||||
|
var match = charBeforeCursor.match(/([\(\[\{])|([\)\]\}])/);
|
||||||
|
if (!match) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (match[1]) {
|
||||||
|
return this.$findClosingBracket(match[1], position);
|
||||||
|
} else {
|
||||||
|
return this.$findOpeningBracket(match[2], position);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
this.$brackets = {
|
||||||
|
")": "(",
|
||||||
|
"(": ")",
|
||||||
|
"]": "[",
|
||||||
|
"[": "]",
|
||||||
|
"{": "}",
|
||||||
|
"}": "{"
|
||||||
|
};
|
||||||
|
|
||||||
|
this.$findOpeningBracket = function(bracket, position) {
|
||||||
|
var openBracket = this.$brackets[bracket];
|
||||||
|
var depth = 1;
|
||||||
|
|
||||||
|
var iterator = new TokenIterator(this, position.row, position.column);
|
||||||
|
var token = iterator.getCurrentToken();
|
||||||
|
if (!token) return null;
|
||||||
|
|
||||||
|
// token.type contains a period-delimited list of token identifiers
|
||||||
|
// (e.g.: "constant.numeric" or "paren.lparen"). Create a pattern that
|
||||||
|
// matches any token containing the same identifiers or a subset. In
|
||||||
|
// addition, if token.type includes "rparen", then also match "lparen".
|
||||||
|
// So if type.token is "paren.rparen", then typeRe will match "lparen.paren".
|
||||||
|
var typeRe = new RegExp("(\\.?" +
|
||||||
|
token.type.replace(".", "|").replace("rparen", "lparen|rparen") + ")+");
|
||||||
|
|
||||||
|
// Start searching in token, just before the character at position.column
|
||||||
|
var valueIndex = position.column - iterator.getCurrentTokenColumn() - 2;
|
||||||
|
var value = token.value;
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
|
||||||
|
while (valueIndex >= 0) {
|
||||||
|
var char = value.charAt(valueIndex);
|
||||||
|
if (char == openBracket) {
|
||||||
|
depth -= 1;
|
||||||
|
if (depth == 0) {
|
||||||
|
return {row: iterator.getCurrentTokenRow(),
|
||||||
|
column: valueIndex + iterator.getCurrentTokenColumn()};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (char == bracket) {
|
||||||
|
depth += 1;
|
||||||
|
}
|
||||||
|
valueIndex -= 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Scan backward through the document, looking for the next token
|
||||||
|
// whose type matches typeRe
|
||||||
|
do {
|
||||||
|
token = iterator.stepBackward();
|
||||||
|
} while (token && !typeRe.test(token.type));
|
||||||
|
|
||||||
|
if (token == null)
|
||||||
|
break;
|
||||||
|
|
||||||
|
value = token.value;
|
||||||
|
valueIndex = value.length - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
};
|
||||||
|
|
||||||
|
this.$findClosingBracket = function(bracket, position) {
|
||||||
|
var closingBracket = this.$brackets[bracket];
|
||||||
|
var depth = 1;
|
||||||
|
|
||||||
|
var iterator = new TokenIterator(this, position.row, position.column);
|
||||||
|
var token = iterator.getCurrentToken();
|
||||||
|
if (!token) return null;
|
||||||
|
|
||||||
|
// token.type contains a period-delimited list of token identifiers
|
||||||
|
// (e.g.: "constant.numeric" or "paren.lparen"). Create a pattern that
|
||||||
|
// matches any token containing the same identifiers or a subset. In
|
||||||
|
// addition, if token.type includes "lparen", then also match "rparen".
|
||||||
|
// So if type.token is "lparen.paren", then typeRe will match "paren.rparen".
|
||||||
|
var typeRe = new RegExp("(\\.?" +
|
||||||
|
token.type.replace(".", "|").replace("lparen", "lparen|rparen") + ")+");
|
||||||
|
|
||||||
|
// Start searching in token, after the character at position.column
|
||||||
|
var valueIndex = position.column - iterator.getCurrentTokenColumn();
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
|
||||||
|
var value = token.value;
|
||||||
|
var valueLength = value.length;
|
||||||
|
while (valueIndex < valueLength) {
|
||||||
|
var char = value.charAt(valueIndex);
|
||||||
|
if (char == closingBracket) {
|
||||||
|
depth -= 1;
|
||||||
|
if (depth == 0) {
|
||||||
|
return {row: iterator.getCurrentTokenRow(),
|
||||||
|
column: valueIndex + iterator.getCurrentTokenColumn()};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (char == bracket) {
|
||||||
|
depth += 1;
|
||||||
|
}
|
||||||
|
valueIndex += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Scan forward through the document, looking for the next token
|
||||||
|
// whose type matches typeRe
|
||||||
|
do {
|
||||||
|
token = iterator.stepForward();
|
||||||
|
} while (token && !typeRe.test(token.type));
|
||||||
|
|
||||||
|
if (token == null)
|
||||||
|
break;
|
||||||
|
|
||||||
|
valueIndex = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
exports.BracketMatch = BracketMatch;
|
||||||
|
|
||||||
|
});
|
||||||
|
/* vim:ts=4:sts=4:sw=4:
|
||||||
|
* ***** BEGIN LICENSE BLOCK *****
|
||||||
|
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||||
|
*
|
||||||
|
* The contents of this file are subject to the Mozilla Public License Version
|
||||||
|
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||||
|
* the License. You may obtain a copy of the License at
|
||||||
|
* http://www.mozilla.org/MPL/
|
||||||
|
*
|
||||||
|
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||||
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||||
|
* for the specific language governing rights and limitations under the
|
||||||
|
* License.
|
||||||
|
*
|
||||||
|
* The Original Code is Ajax.org Code Editor (ACE).
|
||||||
|
*
|
||||||
|
* The Initial Developer of the Original Code is
|
||||||
|
* Ajax.org B.V.
|
||||||
|
* Portions created by the Initial Developer are Copyright (C) 2010
|
||||||
|
* the Initial Developer. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
* Fabian Jakobs <fabian AT ajax DOT org>
|
||||||
|
*
|
||||||
|
* Alternatively, the contents of this file may be used under the terms of
|
||||||
|
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||||
|
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||||
|
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||||
|
* of those above. If you wish to allow use of your version of this file only
|
||||||
|
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||||
|
* use your version of this file under the terms of the MPL, indicate your
|
||||||
|
* decision by deleting the provisions above and replace them with the notice
|
||||||
|
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||||
|
* the provisions above, a recipient may use your version of this file under
|
||||||
|
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||||
|
*
|
||||||
|
* ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
|
define('ace/token_iterator', ['require', 'exports', 'module' ], function(require, exports, module) {
|
||||||
|
|
||||||
|
var TokenIterator = function(session, initialRow, initialColumn) {
|
||||||
|
this.$session = session;
|
||||||
|
this.$row = initialRow;
|
||||||
|
this.$rowTokens = session.getTokens(initialRow, initialRow)[0].tokens;
|
||||||
|
|
||||||
|
var token = session.getTokenAt(initialRow, initialColumn);
|
||||||
|
this.$tokenIndex = token ? token.index : -1;
|
||||||
|
};
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
|
||||||
|
this.stepBackward = function() {
|
||||||
|
this.$tokenIndex -= 1;
|
||||||
|
|
||||||
|
while (this.$tokenIndex < 0) {
|
||||||
|
this.$row -= 1;
|
||||||
|
if (this.$row < 0)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
this.$rowTokens = this.$session.getTokens(this.$row, this.$row)[0].tokens;
|
||||||
|
this.$tokenIndex = this.$rowTokens.length - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.$rowTokens[this.$tokenIndex];
|
||||||
|
}
|
||||||
|
|
||||||
|
this.stepForward = function() {
|
||||||
|
var rowCount = this.$session.getLength();
|
||||||
|
this.$tokenIndex += 1;
|
||||||
|
|
||||||
|
while (this.$tokenIndex >= this.$rowTokens.length) {
|
||||||
|
this.$row += 1;
|
||||||
|
if (this.$row >= rowCount)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
this.$rowTokens = this.$session.getTokens(this.$row, this.$row)[0].tokens;
|
||||||
|
this.$tokenIndex = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.$rowTokens[this.$tokenIndex];
|
||||||
|
}
|
||||||
|
|
||||||
|
this.getCurrentToken = function () {
|
||||||
|
return this.$rowTokens[this.$tokenIndex];
|
||||||
|
}
|
||||||
|
|
||||||
|
this.getCurrentTokenRow = function () {
|
||||||
|
return this.$row;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.getCurrentTokenColumn = function() {
|
||||||
|
var rowTokens = this.$rowTokens;
|
||||||
|
var tokenIndex = this.$tokenIndex;
|
||||||
|
|
||||||
|
// If a column was cached by EditSession.getTokenAt, then use it
|
||||||
|
var column = rowTokens[tokenIndex].start;
|
||||||
|
if (column !== undefined)
|
||||||
|
return column;
|
||||||
|
|
||||||
|
column = 0;
|
||||||
|
while (tokenIndex > 0) {
|
||||||
|
tokenIndex -= 1;
|
||||||
|
column += rowTokens[tokenIndex].value.length;
|
||||||
|
}
|
||||||
|
|
||||||
|
return column;
|
||||||
|
}
|
||||||
|
|
||||||
|
}).call(TokenIterator.prototype);
|
||||||
|
|
||||||
|
exports.TokenIterator = TokenIterator;
|
||||||
|
});
|
||||||
|
/* vim:ts=4:sts=4:sw=4:
|
||||||
* ***** BEGIN LICENSE BLOCK *****
|
* ***** BEGIN LICENSE BLOCK *****
|
||||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||||
*
|
*
|
||||||
|
|
@ -10769,7 +10970,7 @@ var CursorLayer = require("./layer/cursor").Cursor;
|
||||||
var ScrollBar = require("./scrollbar").ScrollBar;
|
var ScrollBar = require("./scrollbar").ScrollBar;
|
||||||
var RenderLoop = require("./renderloop").RenderLoop;
|
var RenderLoop = require("./renderloop").RenderLoop;
|
||||||
var EventEmitter = require("./lib/event_emitter").EventEmitter;
|
var EventEmitter = require("./lib/event_emitter").EventEmitter;
|
||||||
var editorCss = require("text!ace/css/editor.css");
|
var editorCss = require("text!./css/editor.css");
|
||||||
|
|
||||||
var VirtualRenderer = function(container, theme) {
|
var VirtualRenderer = function(container, theme) {
|
||||||
this.container = container;
|
this.container = container;
|
||||||
|
|
|
||||||
File diff suppressed because one or more lines are too long
|
|
@ -5241,7 +5241,7 @@ exports.commands = [{
|
||||||
*
|
*
|
||||||
* ***** END LICENSE BLOCK ***** */
|
* ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
__ace_shadowed__.define('ace/edit_session', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/lib/event_emitter', 'ace/selection', 'ace/mode/text', 'ace/range', 'ace/document', 'ace/background_tokenizer', 'ace/edit_session/folding'], function(require, exports, module) {
|
__ace_shadowed__.define('ace/edit_session', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/lib/event_emitter', 'ace/selection', 'ace/mode/text', 'ace/range', 'ace/document', 'ace/background_tokenizer', 'ace/edit_session/folding', 'ace/edit_session/bracket_match'], function(require, exports, module) {
|
||||||
|
|
||||||
var oop = require("./lib/oop");
|
var oop = require("./lib/oop");
|
||||||
var lang = require("./lib/lang");
|
var lang = require("./lib/lang");
|
||||||
|
|
@ -5815,98 +5815,6 @@ var EditSession = function(text, mode) {
|
||||||
return this.doc.getTextRange(range);
|
return this.doc.getTextRange(range);
|
||||||
};
|
};
|
||||||
|
|
||||||
this.findMatchingBracket = function(position) {
|
|
||||||
if (position.column == 0) return null;
|
|
||||||
|
|
||||||
var charBeforeCursor = this.getLine(position.row).charAt(position.column-1);
|
|
||||||
if (charBeforeCursor == "") return null;
|
|
||||||
|
|
||||||
var match = charBeforeCursor.match(/([\(\[\{])|([\)\]\}])/);
|
|
||||||
if (!match) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (match[1]) {
|
|
||||||
return this.$findClosingBracket(match[1], position);
|
|
||||||
} else {
|
|
||||||
return this.$findOpeningBracket(match[2], position);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
this.$brackets = {
|
|
||||||
")": "(",
|
|
||||||
"(": ")",
|
|
||||||
"]": "[",
|
|
||||||
"[": "]",
|
|
||||||
"{": "}",
|
|
||||||
"}": "{"
|
|
||||||
};
|
|
||||||
|
|
||||||
this.$findOpeningBracket = function(bracket, position) {
|
|
||||||
var openBracket = this.$brackets[bracket];
|
|
||||||
|
|
||||||
var column = position.column - 2;
|
|
||||||
var row = position.row;
|
|
||||||
var depth = 1;
|
|
||||||
|
|
||||||
var line = this.getLine(row);
|
|
||||||
|
|
||||||
while (true) {
|
|
||||||
while(column >= 0) {
|
|
||||||
var ch = line.charAt(column);
|
|
||||||
if (ch == openBracket) {
|
|
||||||
depth -= 1;
|
|
||||||
if (depth == 0) {
|
|
||||||
return {row: row, column: column};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (ch == bracket) {
|
|
||||||
depth +=1;
|
|
||||||
}
|
|
||||||
column -= 1;
|
|
||||||
}
|
|
||||||
row -=1;
|
|
||||||
if (row < 0) break;
|
|
||||||
|
|
||||||
var line = this.getLine(row);
|
|
||||||
var column = line.length-1;
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
};
|
|
||||||
|
|
||||||
this.$findClosingBracket = function(bracket, position) {
|
|
||||||
var closingBracket = this.$brackets[bracket];
|
|
||||||
|
|
||||||
var column = position.column;
|
|
||||||
var row = position.row;
|
|
||||||
var depth = 1;
|
|
||||||
|
|
||||||
var line = this.getLine(row);
|
|
||||||
var lineCount = this.getLength();
|
|
||||||
|
|
||||||
while (true) {
|
|
||||||
while(column < line.length) {
|
|
||||||
var ch = line.charAt(column);
|
|
||||||
if (ch == closingBracket) {
|
|
||||||
depth -= 1;
|
|
||||||
if (depth == 0) {
|
|
||||||
return {row: row, column: column};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (ch == bracket) {
|
|
||||||
depth +=1;
|
|
||||||
}
|
|
||||||
column += 1;
|
|
||||||
}
|
|
||||||
row +=1;
|
|
||||||
if (row >= lineCount) break;
|
|
||||||
|
|
||||||
var line = this.getLine(row);
|
|
||||||
var column = 0;
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
};
|
|
||||||
|
|
||||||
this.insert = function(position, text) {
|
this.insert = function(position, text) {
|
||||||
return this.doc.insert(position, text);
|
return this.doc.insert(position, text);
|
||||||
};
|
};
|
||||||
|
|
@ -6939,6 +6847,7 @@ var EditSession = function(text, mode) {
|
||||||
}).call(EditSession.prototype);
|
}).call(EditSession.prototype);
|
||||||
|
|
||||||
require("./edit_session/folding").Folding.call(EditSession.prototype);
|
require("./edit_session/folding").Folding.call(EditSession.prototype);
|
||||||
|
require("./edit_session/bracket_match").BracketMatch.call(EditSession.prototype);
|
||||||
|
|
||||||
exports.EditSession = EditSession;
|
exports.EditSession = EditSession;
|
||||||
});
|
});
|
||||||
|
|
@ -10125,6 +10034,298 @@ var Fold = exports.Fold = function(range, placeholder) {
|
||||||
}).call(Fold.prototype);
|
}).call(Fold.prototype);
|
||||||
|
|
||||||
});/* vim:ts=4:sts=4:sw=4:
|
});/* vim:ts=4:sts=4:sw=4:
|
||||||
|
* ***** BEGIN LICENSE BLOCK *****
|
||||||
|
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||||
|
*
|
||||||
|
* The contents of this file are subject to the Mozilla Public License Version
|
||||||
|
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||||
|
* the License. You may obtain a copy of the License at
|
||||||
|
* http://www.mozilla.org/MPL/
|
||||||
|
*
|
||||||
|
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||||
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||||
|
* for the specific language governing rights and limitations under the
|
||||||
|
* License.
|
||||||
|
*
|
||||||
|
* The Original Code is Ajax.org Code Editor (ACE).
|
||||||
|
*
|
||||||
|
* The Initial Developer of the Original Code is
|
||||||
|
* Ajax.org B.V.
|
||||||
|
* Portions created by the Initial Developer are Copyright (C) 2010
|
||||||
|
* the Initial Developer. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
* Fabian Jakobs <fabian AT ajax DOT org>
|
||||||
|
*
|
||||||
|
* Alternatively, the contents of this file may be used under the terms of
|
||||||
|
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||||
|
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||||
|
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||||
|
* of those above. If you wish to allow use of your version of this file only
|
||||||
|
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||||
|
* use your version of this file under the terms of the MPL, indicate your
|
||||||
|
* decision by deleting the provisions above and replace them with the notice
|
||||||
|
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||||
|
* the provisions above, a recipient may use your version of this file under
|
||||||
|
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||||
|
*
|
||||||
|
* ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
|
__ace_shadowed__.define('ace/edit_session/bracket_match', ['require', 'exports', 'module' , 'ace/token_iterator'], function(require, exports, module) {
|
||||||
|
|
||||||
|
var TokenIterator = require("../token_iterator").TokenIterator;
|
||||||
|
|
||||||
|
function BracketMatch() {
|
||||||
|
|
||||||
|
this.findMatchingBracket = function(position) {
|
||||||
|
if (position.column == 0) return null;
|
||||||
|
|
||||||
|
var charBeforeCursor = this.getLine(position.row).charAt(position.column-1);
|
||||||
|
if (charBeforeCursor == "") return null;
|
||||||
|
|
||||||
|
var match = charBeforeCursor.match(/([\(\[\{])|([\)\]\}])/);
|
||||||
|
if (!match) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (match[1]) {
|
||||||
|
return this.$findClosingBracket(match[1], position);
|
||||||
|
} else {
|
||||||
|
return this.$findOpeningBracket(match[2], position);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
this.$brackets = {
|
||||||
|
")": "(",
|
||||||
|
"(": ")",
|
||||||
|
"]": "[",
|
||||||
|
"[": "]",
|
||||||
|
"{": "}",
|
||||||
|
"}": "{"
|
||||||
|
};
|
||||||
|
|
||||||
|
this.$findOpeningBracket = function(bracket, position) {
|
||||||
|
var openBracket = this.$brackets[bracket];
|
||||||
|
var depth = 1;
|
||||||
|
|
||||||
|
var iterator = new TokenIterator(this, position.row, position.column);
|
||||||
|
var token = iterator.getCurrentToken();
|
||||||
|
if (!token) return null;
|
||||||
|
|
||||||
|
// token.type contains a period-delimited list of token identifiers
|
||||||
|
// (e.g.: "constant.numeric" or "paren.lparen"). Create a pattern that
|
||||||
|
// matches any token containing the same identifiers or a subset. In
|
||||||
|
// addition, if token.type includes "rparen", then also match "lparen".
|
||||||
|
// So if type.token is "paren.rparen", then typeRe will match "lparen.paren".
|
||||||
|
var typeRe = new RegExp("(\\.?" +
|
||||||
|
token.type.replace(".", "|").replace("rparen", "lparen|rparen") + ")+");
|
||||||
|
|
||||||
|
// Start searching in token, just before the character at position.column
|
||||||
|
var valueIndex = position.column - iterator.getCurrentTokenColumn() - 2;
|
||||||
|
var value = token.value;
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
|
||||||
|
while (valueIndex >= 0) {
|
||||||
|
var char = value.charAt(valueIndex);
|
||||||
|
if (char == openBracket) {
|
||||||
|
depth -= 1;
|
||||||
|
if (depth == 0) {
|
||||||
|
return {row: iterator.getCurrentTokenRow(),
|
||||||
|
column: valueIndex + iterator.getCurrentTokenColumn()};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (char == bracket) {
|
||||||
|
depth += 1;
|
||||||
|
}
|
||||||
|
valueIndex -= 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Scan backward through the document, looking for the next token
|
||||||
|
// whose type matches typeRe
|
||||||
|
do {
|
||||||
|
token = iterator.stepBackward();
|
||||||
|
} while (token && !typeRe.test(token.type));
|
||||||
|
|
||||||
|
if (token == null)
|
||||||
|
break;
|
||||||
|
|
||||||
|
value = token.value;
|
||||||
|
valueIndex = value.length - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
};
|
||||||
|
|
||||||
|
this.$findClosingBracket = function(bracket, position) {
|
||||||
|
var closingBracket = this.$brackets[bracket];
|
||||||
|
var depth = 1;
|
||||||
|
|
||||||
|
var iterator = new TokenIterator(this, position.row, position.column);
|
||||||
|
var token = iterator.getCurrentToken();
|
||||||
|
if (!token) return null;
|
||||||
|
|
||||||
|
// token.type contains a period-delimited list of token identifiers
|
||||||
|
// (e.g.: "constant.numeric" or "paren.lparen"). Create a pattern that
|
||||||
|
// matches any token containing the same identifiers or a subset. In
|
||||||
|
// addition, if token.type includes "lparen", then also match "rparen".
|
||||||
|
// So if type.token is "lparen.paren", then typeRe will match "paren.rparen".
|
||||||
|
var typeRe = new RegExp("(\\.?" +
|
||||||
|
token.type.replace(".", "|").replace("lparen", "lparen|rparen") + ")+");
|
||||||
|
|
||||||
|
// Start searching in token, after the character at position.column
|
||||||
|
var valueIndex = position.column - iterator.getCurrentTokenColumn();
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
|
||||||
|
var value = token.value;
|
||||||
|
var valueLength = value.length;
|
||||||
|
while (valueIndex < valueLength) {
|
||||||
|
var char = value.charAt(valueIndex);
|
||||||
|
if (char == closingBracket) {
|
||||||
|
depth -= 1;
|
||||||
|
if (depth == 0) {
|
||||||
|
return {row: iterator.getCurrentTokenRow(),
|
||||||
|
column: valueIndex + iterator.getCurrentTokenColumn()};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (char == bracket) {
|
||||||
|
depth += 1;
|
||||||
|
}
|
||||||
|
valueIndex += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Scan forward through the document, looking for the next token
|
||||||
|
// whose type matches typeRe
|
||||||
|
do {
|
||||||
|
token = iterator.stepForward();
|
||||||
|
} while (token && !typeRe.test(token.type));
|
||||||
|
|
||||||
|
if (token == null)
|
||||||
|
break;
|
||||||
|
|
||||||
|
valueIndex = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
exports.BracketMatch = BracketMatch;
|
||||||
|
|
||||||
|
});
|
||||||
|
/* vim:ts=4:sts=4:sw=4:
|
||||||
|
* ***** BEGIN LICENSE BLOCK *****
|
||||||
|
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||||
|
*
|
||||||
|
* The contents of this file are subject to the Mozilla Public License Version
|
||||||
|
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||||
|
* the License. You may obtain a copy of the License at
|
||||||
|
* http://www.mozilla.org/MPL/
|
||||||
|
*
|
||||||
|
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||||
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||||
|
* for the specific language governing rights and limitations under the
|
||||||
|
* License.
|
||||||
|
*
|
||||||
|
* The Original Code is Ajax.org Code Editor (ACE).
|
||||||
|
*
|
||||||
|
* The Initial Developer of the Original Code is
|
||||||
|
* Ajax.org B.V.
|
||||||
|
* Portions created by the Initial Developer are Copyright (C) 2010
|
||||||
|
* the Initial Developer. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
* Fabian Jakobs <fabian AT ajax DOT org>
|
||||||
|
*
|
||||||
|
* Alternatively, the contents of this file may be used under the terms of
|
||||||
|
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||||
|
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||||
|
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||||
|
* of those above. If you wish to allow use of your version of this file only
|
||||||
|
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||||
|
* use your version of this file under the terms of the MPL, indicate your
|
||||||
|
* decision by deleting the provisions above and replace them with the notice
|
||||||
|
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||||
|
* the provisions above, a recipient may use your version of this file under
|
||||||
|
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||||
|
*
|
||||||
|
* ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
|
__ace_shadowed__.define('ace/token_iterator', ['require', 'exports', 'module' ], function(require, exports, module) {
|
||||||
|
|
||||||
|
var TokenIterator = function(session, initialRow, initialColumn) {
|
||||||
|
this.$session = session;
|
||||||
|
this.$row = initialRow;
|
||||||
|
this.$rowTokens = session.getTokens(initialRow, initialRow)[0].tokens;
|
||||||
|
|
||||||
|
var token = session.getTokenAt(initialRow, initialColumn);
|
||||||
|
this.$tokenIndex = token ? token.index : -1;
|
||||||
|
};
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
|
||||||
|
this.stepBackward = function() {
|
||||||
|
this.$tokenIndex -= 1;
|
||||||
|
|
||||||
|
while (this.$tokenIndex < 0) {
|
||||||
|
this.$row -= 1;
|
||||||
|
if (this.$row < 0)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
this.$rowTokens = this.$session.getTokens(this.$row, this.$row)[0].tokens;
|
||||||
|
this.$tokenIndex = this.$rowTokens.length - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.$rowTokens[this.$tokenIndex];
|
||||||
|
}
|
||||||
|
|
||||||
|
this.stepForward = function() {
|
||||||
|
var rowCount = this.$session.getLength();
|
||||||
|
this.$tokenIndex += 1;
|
||||||
|
|
||||||
|
while (this.$tokenIndex >= this.$rowTokens.length) {
|
||||||
|
this.$row += 1;
|
||||||
|
if (this.$row >= rowCount)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
this.$rowTokens = this.$session.getTokens(this.$row, this.$row)[0].tokens;
|
||||||
|
this.$tokenIndex = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.$rowTokens[this.$tokenIndex];
|
||||||
|
}
|
||||||
|
|
||||||
|
this.getCurrentToken = function () {
|
||||||
|
return this.$rowTokens[this.$tokenIndex];
|
||||||
|
}
|
||||||
|
|
||||||
|
this.getCurrentTokenRow = function () {
|
||||||
|
return this.$row;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.getCurrentTokenColumn = function() {
|
||||||
|
var rowTokens = this.$rowTokens;
|
||||||
|
var tokenIndex = this.$tokenIndex;
|
||||||
|
|
||||||
|
// If a column was cached by EditSession.getTokenAt, then use it
|
||||||
|
var column = rowTokens[tokenIndex].start;
|
||||||
|
if (column !== undefined)
|
||||||
|
return column;
|
||||||
|
|
||||||
|
column = 0;
|
||||||
|
while (tokenIndex > 0) {
|
||||||
|
tokenIndex -= 1;
|
||||||
|
column += rowTokens[tokenIndex].value.length;
|
||||||
|
}
|
||||||
|
|
||||||
|
return column;
|
||||||
|
}
|
||||||
|
|
||||||
|
}).call(TokenIterator.prototype);
|
||||||
|
|
||||||
|
exports.TokenIterator = TokenIterator;
|
||||||
|
});
|
||||||
|
/* vim:ts=4:sts=4:sw=4:
|
||||||
* ***** BEGIN LICENSE BLOCK *****
|
* ***** BEGIN LICENSE BLOCK *****
|
||||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||||
*
|
*
|
||||||
|
|
@ -10723,7 +10924,7 @@ var CursorLayer = require("./layer/cursor").Cursor;
|
||||||
var ScrollBar = require("./scrollbar").ScrollBar;
|
var ScrollBar = require("./scrollbar").ScrollBar;
|
||||||
var RenderLoop = require("./renderloop").RenderLoop;
|
var RenderLoop = require("./renderloop").RenderLoop;
|
||||||
var EventEmitter = require("./lib/event_emitter").EventEmitter;
|
var EventEmitter = require("./lib/event_emitter").EventEmitter;
|
||||||
var editorCss = require("text!ace/css/editor.css");
|
var editorCss = require("text!./css/editor.css");
|
||||||
|
|
||||||
var VirtualRenderer = function(container, theme) {
|
var VirtualRenderer = function(container, theme) {
|
||||||
this.container = container;
|
this.container = container;
|
||||||
|
|
|
||||||
File diff suppressed because one or more lines are too long
Loading…
Add table
Add a link
Reference in a new issue