mirror of
https://gerrit.wikimedia.org/r/mediawiki/extensions/CodeEditor
synced 2024-12-02 18:56:38 +00:00
941cc7c109
- Improved ES6 support Bug: T324609 Change-Id: I22234ee259c2663a511f9285d4c43d4256e29c66
116 lines
4.3 KiB
JavaScript
116 lines
4.3 KiB
JavaScript
ace.define("ace/ext/hardwrap",["require","exports","module","ace/range","ace/editor","ace/config"], function(require, exports, module){"use strict";
|
|
var Range = require("../range").Range;
|
|
function hardWrap(editor, options) {
|
|
var max = options.column || editor.getOption("printMarginColumn");
|
|
var allowMerge = options.allowMerge != false;
|
|
var row = Math.min(options.startRow, options.endRow);
|
|
var endRow = Math.max(options.startRow, options.endRow);
|
|
var session = editor.session;
|
|
while (row <= endRow) {
|
|
var line = session.getLine(row);
|
|
if (line.length > max) {
|
|
var space = findSpace(line, max, 5);
|
|
if (space) {
|
|
var indentation = /^\s*/.exec(line)[0];
|
|
session.replace(new Range(row, space.start, row, space.end), "\n" + indentation);
|
|
}
|
|
endRow++;
|
|
}
|
|
else if (allowMerge && /\S/.test(line) && row != endRow) {
|
|
var nextLine = session.getLine(row + 1);
|
|
if (nextLine && /\S/.test(nextLine)) {
|
|
var trimmedLine = line.replace(/\s+$/, "");
|
|
var trimmedNextLine = nextLine.replace(/^\s+/, "");
|
|
var mergedLine = trimmedLine + " " + trimmedNextLine;
|
|
var space = findSpace(mergedLine, max, 5);
|
|
if (space && space.start > trimmedLine.length || mergedLine.length < max) {
|
|
var replaceRange = new Range(row, trimmedLine.length, row + 1, nextLine.length - trimmedNextLine.length);
|
|
session.replace(replaceRange, " ");
|
|
row--;
|
|
endRow--;
|
|
}
|
|
else if (trimmedLine.length < line.length) {
|
|
session.remove(new Range(row, trimmedLine.length, row, line.length));
|
|
}
|
|
}
|
|
}
|
|
row++;
|
|
}
|
|
function findSpace(line, max, min) {
|
|
if (line.length < max)
|
|
return;
|
|
var before = line.slice(0, max);
|
|
var after = line.slice(max);
|
|
var spaceAfter = /^(?:(\s+)|(\S+)(\s+))/.exec(after);
|
|
var spaceBefore = /(?:(\s+)|(\s+)(\S+))$/.exec(before);
|
|
var start = 0;
|
|
var end = 0;
|
|
if (spaceBefore && !spaceBefore[2]) {
|
|
start = max - spaceBefore[1].length;
|
|
end = max;
|
|
}
|
|
if (spaceAfter && !spaceAfter[2]) {
|
|
if (!start)
|
|
start = max;
|
|
end = max + spaceAfter[1].length;
|
|
}
|
|
if (start) {
|
|
return {
|
|
start: start,
|
|
end: end
|
|
};
|
|
}
|
|
if (spaceBefore && spaceBefore[2] && spaceBefore.index > min) {
|
|
return {
|
|
start: spaceBefore.index,
|
|
end: spaceBefore.index + spaceBefore[2].length
|
|
};
|
|
}
|
|
if (spaceAfter && spaceAfter[2]) {
|
|
start = max + spaceAfter[2].length;
|
|
return {
|
|
start: start,
|
|
end: start + spaceAfter[3].length
|
|
};
|
|
}
|
|
}
|
|
}
|
|
function wrapAfterInput(e) {
|
|
if (e.command.name == "insertstring" && /\S/.test(e.args)) {
|
|
var editor = e.editor;
|
|
var cursor = editor.selection.cursor;
|
|
if (cursor.column <= editor.renderer.$printMarginColumn)
|
|
return;
|
|
var lastDelta = editor.session.$undoManager.$lastDelta;
|
|
hardWrap(editor, {
|
|
startRow: cursor.row, endRow: cursor.row,
|
|
allowMerge: false
|
|
});
|
|
if (lastDelta != editor.session.$undoManager.$lastDelta)
|
|
editor.session.markUndoGroup();
|
|
}
|
|
}
|
|
var Editor = require("../editor").Editor;
|
|
require("../config").defineOptions(Editor.prototype, "editor", {
|
|
hardWrap: {
|
|
set: function (val) {
|
|
if (val) {
|
|
this.commands.on("afterExec", wrapAfterInput);
|
|
}
|
|
else {
|
|
this.commands.off("afterExec", wrapAfterInput);
|
|
}
|
|
},
|
|
value: false
|
|
}
|
|
});
|
|
exports.hardWrap = hardWrap;
|
|
|
|
}); (function() {
|
|
ace.require(["ace/ext/hardwrap"], function(m) {
|
|
if (typeof module == "object" && typeof exports == "object" && module) {
|
|
module.exports = m;
|
|
}
|
|
});
|
|
})();
|
|
|