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