Path: blob/master/web-gui/buildyourownbotnet/assets/js/codemirror/addon/wrap/hardwrap.js
1293 views
(function() {1"use strict";23var Pos = CodeMirror.Pos;45function findParagraph(cm, pos, options) {6var startRE = options.paragraphStart || cm.getHelper(pos, "paragraphStart");7for (var start = pos.line, first = cm.firstLine(); start > first; --start) {8var line = cm.getLine(start);9if (startRE && startRE.test(line)) break;10if (!/\S/.test(line)) { ++start; break; }11}12var endRE = options.paragraphEnd || cm.getHelper(pos, "paragraphEnd");13for (var end = pos.line + 1, last = cm.lastLine(); end <= last; ++end) {14var line = cm.getLine(end);15if (endRE && endRE.test(line)) { ++end; break; }16if (!/\S/.test(line)) break;17}18return {from: start, to: end};19}2021function findBreakPoint(text, column, wrapOn, killTrailingSpace) {22for (var at = column; at > 0; --at)23if (wrapOn.test(text.slice(at - 1, at + 1))) break;24if (at == 0) at = column;25var endOfText = at;26if (killTrailingSpace)27while (text.charAt(endOfText - 1) == " ") --endOfText;28return {from: endOfText, to: at};29}3031function wrapRange(cm, from, to, options) {32from = cm.clipPos(from); to = cm.clipPos(to);33var column = options.column || 80;34var wrapOn = options.wrapOn || /\s\S|-[^\.\d]/;35var killTrailing = options.killTrailingSpace !== false;36var changes = [], curLine = "", curNo = from.line;37var lines = cm.getRange(from, to, false);38if (!lines.length) return null;39var leadingSpace = lines[0].match(/^[ \t]*/)[0];4041for (var i = 0; i < lines.length; ++i) {42var text = lines[i], oldLen = curLine.length, spaceInserted = 0;43if (curLine && text && !wrapOn.test(curLine.charAt(curLine.length - 1) + text.charAt(0))) {44curLine += " ";45spaceInserted = 1;46}47var spaceTrimmed = "";48if (i) {49spaceTrimmed = text.match(/^\s*/)[0];50text = text.slice(spaceTrimmed.length);51}52curLine += text;53if (i) {54var firstBreak = curLine.length > column && leadingSpace == spaceTrimmed &&55findBreakPoint(curLine, column, wrapOn, killTrailing);56// If this isn't broken, or is broken at a different point, remove old break57if (!firstBreak || firstBreak.from != oldLen || firstBreak.to != oldLen + spaceInserted) {58changes.push({text: [spaceInserted ? " " : ""],59from: Pos(curNo, oldLen),60to: Pos(curNo + 1, spaceTrimmed.length)});61} else {62curLine = leadingSpace + text;63++curNo;64}65}66while (curLine.length > column) {67var bp = findBreakPoint(curLine, column, wrapOn, killTrailing);68changes.push({text: ["", leadingSpace],69from: Pos(curNo, bp.from),70to: Pos(curNo, bp.to)});71curLine = leadingSpace + curLine.slice(bp.to);72++curNo;73}74}75if (changes.length) cm.operation(function() {76for (var i = 0; i < changes.length; ++i) {77var change = changes[i];78cm.replaceRange(change.text, change.from, change.to);79}80});81return changes.length ? {from: changes[0].from, to: CodeMirror.changeEnd(changes[changes.length - 1])} : null;82}8384CodeMirror.defineExtension("wrapParagraph", function(pos, options) {85options = options || {};86if (!pos) pos = this.getCursor();87var para = findParagraph(this, pos, options);88return wrapRange(this, Pos(para.from, 0), Pos(para.to - 1), options);89});9091CodeMirror.defineExtension("wrapRange", function(from, to, options) {92return wrapRange(this, from, to, options || {});93});9495CodeMirror.defineExtension("wrapParagraphsInRange", function(from, to, options) {96options = options || {};97var cm = this, paras = [];98for (var line = from.line; line <= to.line;) {99var para = findParagraph(cm, Pos(line, 0), options);100paras.push(para);101line = para.to;102}103var madeChange = false;104if (paras.length) cm.operation(function() {105for (var i = paras.length - 1; i >= 0; --i)106madeChange = madeChange || wrapRange(cm, Pos(paras[i].from, 0), Pos(paras[i].to - 1), options);107});108return madeChange;109});110})();111112113