PluginProbe
WP Coder – Insert & Manage Code Snippets / 4.3
WP Coder – Insert & Manage Code Snippets v4.3
4.5.1 1.1 2.3.1 2.3.2 2.4.1 2.5.1 2.5.2 2.5.3 2.5.4 2.5.5 2.5.6 3.0 3.0.1 3.0.2 3.0.3 3.0.4 3.0.5 3.1 3.1.1 3.2 3.2.1 3.3 3.4 3.5 3.5.1 All 39 releases
wp-coder / assets / js / codemirror / comment.js

comment.js in WP Coder – Insert & Manage Code Snippets 4.3, at assets/js/codemirror/comment.js

212 lines 9.0 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 // CodeMirror, copyright (c) by Marijn Haverbeke and others
2 // Distributed under an MIT license: https://codemirror.net/5/LICENSE
3
4 (function(mod) {
5 if (typeof exports == "object" && typeof module == "object") // CommonJS
6 mod(require("../../lib/codemirror"));
7 else if (typeof define == "function" && define.amd) // AMD
8 define(["../../lib/codemirror"], mod);
9 else // Plain browser env
10 mod(CodeMirror);
11 })(function(CodeMirror) {
12 "use strict";
13
14 var noOptions = {};
15 var nonWS = /[^\s\u00a0]/;
16 var Pos = CodeMirror.Pos, cmp = CodeMirror.cmpPos;
17
18 function firstNonWS(str) {
19 var found = str.search(nonWS);
20 return found == -1 ? 0 : found;
21 }
22
23 CodeMirror.commands.toggleComment = function(cm) {
24 cm.toggleComment();
25 };
26
27 CodeMirror.defineExtension("toggleComment", function(options) {
28 if (!options) options = noOptions;
29 var cm = this;
30 var minLine = Infinity, ranges = this.listSelections(), mode = null;
31 for (var i = ranges.length - 1; i >= 0; i--) {
32 var from = ranges[i].from(), to = ranges[i].to();
33 if (from.line >= minLine) continue;
34 if (to.line >= minLine) to = Pos(minLine, 0);
35 minLine = from.line;
36 if (mode == null) {
37 if (cm.uncomment(from, to, options)) mode = "un";
38 else { cm.lineComment(from, to, options); mode = "line"; }
39 } else if (mode == "un") {
40 cm.uncomment(from, to, options);
41 } else {
42 cm.lineComment(from, to, options);
43 }
44 }
45 });
46
47 // Rough heuristic to try and detect lines that are part of multi-line string
48 function probablyInsideString(cm, pos, line) {
49 return /\bstring\b/.test(cm.getTokenTypeAt(Pos(pos.line, 0))) && !/^[\'\"\`]/.test(line)
50 }
51
52 function getMode(cm, pos) {
53 var mode = cm.getMode()
54 return mode.useInnerComments === false || !mode.innerMode ? mode : cm.getModeAt(pos)
55 }
56
57 CodeMirror.defineExtension("lineComment", function(from, to, options) {
58 if (!options) options = noOptions;
59 var self = this, mode = getMode(self, from);
60 var firstLine = self.getLine(from.line);
61 if (firstLine == null || probablyInsideString(self, from, firstLine)) return;
62
63 var commentString = options.lineComment || mode.lineComment;
64 if (!commentString) {
65 if (options.blockCommentStart || mode.blockCommentStart) {
66 options.fullLines = true;
67 self.blockComment(from, to, options);
68 }
69 return;
70 }
71
72 var end = Math.min(to.ch != 0 || to.line == from.line ? to.line + 1 : to.line, self.lastLine() + 1);
73 var pad = options.padding == null ? " " : options.padding;
74 var blankLines = options.commentBlankLines || from.line == to.line;
75
76 self.operation(function() {
77 if (options.indent) {
78 var baseString = null;
79 for (var i = from.line; i < end; ++i) {
80 var line = self.getLine(i);
81 var whitespace = line.search(nonWS) === -1 ? line : line.slice(0, firstNonWS(line));
82 if (baseString == null || baseString.length > whitespace.length) {
83 baseString = whitespace;
84 }
85 }
86 for (var i = from.line; i < end; ++i) {
87 var line = self.getLine(i), cut = baseString.length;
88 if (!blankLines && !nonWS.test(line)) continue;
89 if (line.slice(0, cut) != baseString) cut = firstNonWS(line);
90 self.replaceRange(baseString + commentString + pad, Pos(i, 0), Pos(i, cut));
91 }
92 } else {
93 for (var i = from.line; i < end; ++i) {
94 if (blankLines || nonWS.test(self.getLine(i)))
95 self.replaceRange(commentString + pad, Pos(i, 0));
96 }
97 }
98 });
99 });
100
101 CodeMirror.defineExtension("blockComment", function(from, to, options) {
102 if (!options) options = noOptions;
103 var self = this, mode = getMode(self, from);
104 var startString = options.blockCommentStart || mode.blockCommentStart;
105 var endString = options.blockCommentEnd || mode.blockCommentEnd;
106 if (!startString || !endString) {
107 if ((options.lineComment || mode.lineComment) && options.fullLines != false)
108 self.lineComment(from, to, options);
109 return;
110 }
111 if (/\bcomment\b/.test(self.getTokenTypeAt(Pos(from.line, 0)))) return
112
113 var end = Math.min(to.line, self.lastLine());
114 if (end != from.line && to.ch == 0 && nonWS.test(self.getLine(end))) --end;
115
116 var pad = options.padding == null ? " " : options.padding;
117 if (from.line > end) return;
118
119 self.operation(function() {
120 if (options.fullLines != false) {
121 var lastLineHasText = nonWS.test(self.getLine(end));
122 self.replaceRange(pad + endString, Pos(end));
123 self.replaceRange(startString + pad, Pos(from.line, 0));
124 var lead = options.blockCommentLead || mode.blockCommentLead;
125 if (lead != null) for (var i = from.line + 1; i <= end; ++i)
126 if (i != end || lastLineHasText)
127 self.replaceRange(lead + pad, Pos(i, 0));
128 } else {
129 var atCursor = cmp(self.getCursor("to"), to) == 0, empty = !self.somethingSelected()
130 self.replaceRange(endString, to);
131 if (atCursor) self.setSelection(empty ? to : self.getCursor("from"), to)
132 self.replaceRange(startString, from);
133 }
134 });
135 });
136
137 CodeMirror.defineExtension("uncomment", function(from, to, options) {
138 if (!options) options = noOptions;
139 var self = this, mode = getMode(self, from);
140 var end = Math.min(to.ch != 0 || to.line == from.line ? to.line : to.line - 1, self.lastLine()), start = Math.min(from.line, end);
141
142 // Try finding line comments
143 var lineString = options.lineComment || mode.lineComment, lines = [];
144 var pad = options.padding == null ? " " : options.padding, didSomething;
145 lineComment: {
146 if (!lineString) break lineComment;
147 for (var i = start; i <= end; ++i) {
148 var line = self.getLine(i);
149 var found = line.indexOf(lineString);
150 if (found > -1 && !/comment/.test(self.getTokenTypeAt(Pos(i, found + 1)))) found = -1;
151 if (found == -1 && nonWS.test(line)) break lineComment;
152 if (found > -1 && nonWS.test(line.slice(0, found))) break lineComment;
153 lines.push(line);
154 }
155 self.operation(function() {
156 for (var i = start; i <= end; ++i) {
157 var line = lines[i - start];
158 var pos = line.indexOf(lineString), endPos = pos + lineString.length;
159 if (pos < 0) continue;
160 if (line.slice(endPos, endPos + pad.length) == pad) endPos += pad.length;
161 didSomething = true;
162 self.replaceRange("", Pos(i, pos), Pos(i, endPos));
163 }
164 });
165 if (didSomething) return true;
166 }
167
168 // Try block comments
169 var startString = options.blockCommentStart || mode.blockCommentStart;
170 var endString = options.blockCommentEnd || mode.blockCommentEnd;
171 if (!startString || !endString) return false;
172 var lead = options.blockCommentLead || mode.blockCommentLead;
173 var startLine = self.getLine(start), open = startLine.indexOf(startString)
174 if (open == -1) return false
175 var endLine = end == start ? startLine : self.getLine(end)
176 var close = endLine.indexOf(endString, end == start ? open + startString.length : 0);
177 var insideStart = Pos(start, open + 1), insideEnd = Pos(end, close + 1)
178 if (close == -1 ||
179 !/comment/.test(self.getTokenTypeAt(insideStart)) ||
180 !/comment/.test(self.getTokenTypeAt(insideEnd)) ||
181 self.getRange(insideStart, insideEnd, "\n").indexOf(endString) > -1)
182 return false;
183
184 // Avoid killing block comments completely outside the selection.
185 // Positions of the last startString before the start of the selection, and the first endString after it.
186 var lastStart = startLine.lastIndexOf(startString, from.ch);
187 var firstEnd = lastStart == -1 ? -1 : startLine.slice(0, from.ch).indexOf(endString, lastStart + startString.length);
188 if (lastStart != -1 && firstEnd != -1 && firstEnd + endString.length != from.ch) return false;
189 // Positions of the first endString after the end of the selection, and the last startString before it.
190 firstEnd = endLine.indexOf(endString, to.ch);
191 var almostLastStart = endLine.slice(to.ch).lastIndexOf(startString, firstEnd - to.ch);
192 lastStart = (firstEnd == -1 || almostLastStart == -1) ? -1 : to.ch + almostLastStart;
193 if (firstEnd != -1 && lastStart != -1 && lastStart != to.ch) return false;
194
195 self.operation(function() {
196 self.replaceRange("", Pos(end, close - (pad && endLine.slice(close - pad.length, close) == pad ? pad.length : 0)),
197 Pos(end, close + endString.length));
198 var openEnd = open + startString.length;
199 if (pad && startLine.slice(openEnd, openEnd + pad.length) == pad) openEnd += pad.length;
200 self.replaceRange("", Pos(start, open), Pos(start, openEnd));
201 if (lead) for (var i = start + 1; i <= end; ++i) {
202 var line = self.getLine(i), found = line.indexOf(lead);
203 if (found == -1 || nonWS.test(line.slice(0, found))) continue;
204 var foundEnd = found + lead.length;
205 if (pad && line.slice(foundEnd, foundEnd + pad.length) == pad) foundEnd += pad.length;
206 self.replaceRange("", Pos(i, found), Pos(i, foundEnd));
207 }
208 });
209 return true;
210 });
211 });
212