1197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch// CodeMirror, copyright (c) by Marijn Haverbeke and others 2197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch// Distributed under an MIT license: http://codemirror.net/LICENSE 3197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 4aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch(function(mod) { 5aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch if (typeof exports == "object" && typeof module == "object") // CommonJS 6aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch mod(require("../../lib/codemirror")); 7aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch else if (typeof define == "function" && define.amd) // AMD 8aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch define(["../../lib/codemirror"], mod); 9aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch else // Plain browser env 10aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch mod(CodeMirror); 11aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch})(function(CodeMirror) { 125267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) "use strict"; 135267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 145267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) var noOptions = {}; 155267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) var nonWS = /[^\s\u00a0]/; 165267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) var Pos = CodeMirror.Pos; 175267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 185267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) function firstNonWS(str) { 195267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) var found = str.search(nonWS); 205267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) return found == -1 ? 0 : found; 215267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) } 225267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 235267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) CodeMirror.commands.toggleComment = function(cm) { 24aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch var minLine = Infinity, ranges = cm.listSelections(), mode = null; 25aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch for (var i = ranges.length - 1; i >= 0; i--) { 26aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch var from = ranges[i].from(), to = ranges[i].to(); 27aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch if (from.line >= minLine) continue; 28aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch if (to.line >= minLine) to = Pos(minLine, 0); 29aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch minLine = from.line; 30aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch if (mode == null) { 31aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch if (cm.uncomment(from, to)) mode = "un"; 32aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch else { cm.lineComment(from, to); mode = "line"; } 33aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch } else if (mode == "un") { 34aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch cm.uncomment(from, to); 35aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch } else { 36aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch cm.lineComment(from, to); 37aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch } 38aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch } 395267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) }; 405267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 415267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) CodeMirror.defineExtension("lineComment", function(from, to, options) { 425267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if (!options) options = noOptions; 43a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) var self = this, mode = self.getModeAt(from); 445267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) var commentString = options.lineComment || mode.lineComment; 455267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if (!commentString) { 465267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if (options.blockCommentStart || mode.blockCommentStart) { 475267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) options.fullLines = true; 485267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) self.blockComment(from, to, options); 495267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) } 505267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) return; 515267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) } 525267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) var firstLine = self.getLine(from.line); 535267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if (firstLine == null) return; 545267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) var end = Math.min(to.ch != 0 || to.line == from.line ? to.line + 1 : to.line, self.lastLine() + 1); 555267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) var pad = options.padding == null ? " " : options.padding; 56a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) var blankLines = options.commentBlankLines || from.line == to.line; 575267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 585267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) self.operation(function() { 595267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if (options.indent) { 605267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) var baseString = firstLine.slice(0, firstNonWS(firstLine)); 615267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) for (var i = from.line; i < end; ++i) { 625267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) var line = self.getLine(i), cut = baseString.length; 635267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if (!blankLines && !nonWS.test(line)) continue; 645267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if (line.slice(0, cut) != baseString) cut = firstNonWS(line); 655267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) self.replaceRange(baseString + commentString + pad, Pos(i, 0), Pos(i, cut)); 665267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) } 675267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) } else { 685267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) for (var i = from.line; i < end; ++i) { 695267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if (blankLines || nonWS.test(self.getLine(i))) 705267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) self.replaceRange(commentString + pad, Pos(i, 0)); 715267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) } 725267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) } 735267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) }); 745267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) }); 755267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 765267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) CodeMirror.defineExtension("blockComment", function(from, to, options) { 775267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if (!options) options = noOptions; 78a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) var self = this, mode = self.getModeAt(from); 795267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) var startString = options.blockCommentStart || mode.blockCommentStart; 805267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) var endString = options.blockCommentEnd || mode.blockCommentEnd; 815267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if (!startString || !endString) { 825267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if ((options.lineComment || mode.lineComment) && options.fullLines != false) 835267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) self.lineComment(from, to, options); 845267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) return; 855267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) } 865267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 875267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) var end = Math.min(to.line, self.lastLine()); 885267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if (end != from.line && to.ch == 0 && nonWS.test(self.getLine(end))) --end; 895267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 905267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) var pad = options.padding == null ? " " : options.padding; 915267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if (from.line > end) return; 925267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 935267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) self.operation(function() { 945267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if (options.fullLines != false) { 955267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) var lastLineHasText = nonWS.test(self.getLine(end)); 965267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) self.replaceRange(pad + endString, Pos(end)); 975267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) self.replaceRange(startString + pad, Pos(from.line, 0)); 985267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) var lead = options.blockCommentLead || mode.blockCommentLead; 995267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if (lead != null) for (var i = from.line + 1; i <= end; ++i) 1005267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if (i != end || lastLineHasText) 1015267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) self.replaceRange(lead + pad, Pos(i, 0)); 1025267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) } else { 1035267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) self.replaceRange(endString, to); 1045267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) self.replaceRange(startString, from); 1055267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) } 1065267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) }); 1075267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) }); 1085267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 1095267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) CodeMirror.defineExtension("uncomment", function(from, to, options) { 1105267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if (!options) options = noOptions; 111a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) var self = this, mode = self.getModeAt(from); 1125267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) var end = Math.min(to.line, self.lastLine()), start = Math.min(from.line, end); 1135267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 1145267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) // Try finding line comments 1155267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) var lineString = options.lineComment || mode.lineComment, lines = []; 116a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) var pad = options.padding == null ? " " : options.padding, didSomething; 117a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) lineComment: { 118a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) if (!lineString) break lineComment; 1195267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) for (var i = start; i <= end; ++i) { 1205267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) var line = self.getLine(i); 1215267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) var found = line.indexOf(lineString); 122aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch if (found > -1 && !/comment/.test(self.getTokenTypeAt(Pos(i, found + 1)))) found = -1; 1235267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if (found == -1 && (i != end || i == start) && nonWS.test(line)) break lineComment; 124aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch if (found > -1 && nonWS.test(line.slice(0, found))) break lineComment; 1255267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) lines.push(line); 1265267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) } 1275267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) self.operation(function() { 1285267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) for (var i = start; i <= end; ++i) { 1295267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) var line = lines[i - start]; 1305267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) var pos = line.indexOf(lineString), endPos = pos + lineString.length; 1315267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if (pos < 0) continue; 1325267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if (line.slice(endPos, endPos + pad.length) == pad) endPos += pad.length; 133a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) didSomething = true; 1345267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) self.replaceRange("", Pos(i, pos), Pos(i, endPos)); 1355267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) } 1365267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) }); 137a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) if (didSomething) return true; 1385267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) } 1395267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 1405267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) // Try block comments 1415267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) var startString = options.blockCommentStart || mode.blockCommentStart; 1425267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) var endString = options.blockCommentEnd || mode.blockCommentEnd; 1435267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if (!startString || !endString) return false; 1445267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) var lead = options.blockCommentLead || mode.blockCommentLead; 1455267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) var startLine = self.getLine(start), endLine = end == start ? startLine : self.getLine(end); 1465267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) var open = startLine.indexOf(startString), close = endLine.lastIndexOf(endString); 1475267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if (close == -1 && start != end) { 1485267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) endLine = self.getLine(--end); 1495267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) close = endLine.lastIndexOf(endString); 1505267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) } 151aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch if (open == -1 || close == -1 || 152aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch !/comment/.test(self.getTokenTypeAt(Pos(start, open + 1))) || 153aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch !/comment/.test(self.getTokenTypeAt(Pos(end, close + 1)))) 154aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch return false; 1555267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 156197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // Avoid killing block comments completely outside the selection. 157197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // Positions of the last startString before the start of the selection, and the first endString after it. 158197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch var lastStart = startLine.lastIndexOf(startString, from.ch); 159197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch var firstEnd = lastStart == -1 ? -1 : startLine.slice(0, from.ch).indexOf(endString, lastStart + startString.length); 1607242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (lastStart != -1 && firstEnd != -1 && firstEnd + endString.length != from.ch) return false; 161197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // Positions of the first endString after the end of the selection, and the last startString before it. 162197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch firstEnd = endLine.indexOf(endString, to.ch); 163197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch var almostLastStart = endLine.slice(to.ch).lastIndexOf(startString, firstEnd - to.ch); 164197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch lastStart = (firstEnd == -1 || almostLastStart == -1) ? -1 : to.ch + almostLastStart; 1657242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (firstEnd != -1 && lastStart != -1 && lastStart != to.ch) return false; 166197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 1675267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) self.operation(function() { 1685267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) self.replaceRange("", Pos(end, close - (pad && endLine.slice(close - pad.length, close) == pad ? pad.length : 0)), 1695267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) Pos(end, close + endString.length)); 1705267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) var openEnd = open + startString.length; 1715267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if (pad && startLine.slice(openEnd, openEnd + pad.length) == pad) openEnd += pad.length; 1725267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) self.replaceRange("", Pos(start, open), Pos(start, openEnd)); 1735267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if (lead) for (var i = start + 1; i <= end; ++i) { 1745267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) var line = self.getLine(i), found = line.indexOf(lead); 1755267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if (found == -1 || nonWS.test(line.slice(0, found))) continue; 1765267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) var foundEnd = found + lead.length; 1775267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if (pad && line.slice(foundEnd, foundEnd + pad.length) == pad) foundEnd += pad.length; 1785267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) self.replaceRange("", Pos(i, found), Pos(i, foundEnd)); 1795267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) } 1805267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) }); 1815267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) return true; 1825267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) }); 183aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch}); 184