123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- // CodeMirror, copyright (c) by Marijn Haverbeke and others
- // Distributed under an MIT license: https://codemirror.net/LICENSE
- ;(function (mod) {
- if (typeof exports == 'object' && typeof module == 'object')
- // CommonJS
- mod(require('../../lib/codemirror'))
- else if (typeof define == 'function' && define.amd)
- // AMD
- define(['../../lib/codemirror'], mod)
- // Plain browser env
- else mod(CodeMirror)
- })(function (CodeMirror) {
- var nonspace = /\S/g
- var repeat =
- String.prototype.repeat ||
- function (n) {
- return Array(n + 1).join(this)
- }
- function continueComment(cm) {
- if (cm.getOption('disableInput')) return CodeMirror.Pass
- var ranges = cm.listSelections(),
- mode,
- inserts = []
- for (var i = 0; i < ranges.length; i++) {
- var pos = ranges[i].head
- if (!/\bcomment\b/.test(cm.getTokenTypeAt(pos))) return CodeMirror.Pass
- var modeHere = cm.getModeAt(pos)
- if (!mode) mode = modeHere
- else if (mode != modeHere) return CodeMirror.Pass
- var insert = null,
- line,
- found
- var blockStart = mode.blockCommentStart,
- lineCmt = mode.lineComment
- if (blockStart && mode.blockCommentContinue) {
- line = cm.getLine(pos.line)
- var end = line.lastIndexOf(mode.blockCommentEnd, pos.ch - mode.blockCommentEnd.length)
- // 1. if this block comment ended
- // 2. if this is actually inside a line comment
- if (
- (end != -1 && end == pos.ch - mode.blockCommentEnd.length) ||
- (lineCmt && (found = line.lastIndexOf(lineCmt, pos.ch - 1)) > -1 && /\bcomment\b/.test(cm.getTokenTypeAt({ line: pos.line, ch: found + 1 })))
- ) {
- // ...then don't continue it
- } else if (pos.ch >= blockStart.length && (found = line.lastIndexOf(blockStart, pos.ch - blockStart.length)) > -1 && found > end) {
- // reuse the existing leading spaces/tabs/mixed
- // or build the correct indent using CM's tab/indent options
- if (nonspaceAfter(0, line) >= found) {
- insert = line.slice(0, found)
- } else {
- var tabSize = cm.options.tabSize,
- numTabs
- found = CodeMirror.countColumn(line, found, tabSize)
- insert = !cm.options.indentWithTabs ? repeat.call(' ', found) : repeat.call('\t', (numTabs = Math.floor(found / tabSize))) + repeat.call(' ', found - tabSize * numTabs)
- }
- } else if ((found = line.indexOf(mode.blockCommentContinue)) > -1 && found <= pos.ch && found <= nonspaceAfter(0, line)) {
- insert = line.slice(0, found)
- }
- if (insert != null) insert += mode.blockCommentContinue
- }
- if (insert == null && lineCmt && continueLineCommentEnabled(cm)) {
- if (line == null) line = cm.getLine(pos.line)
- found = line.indexOf(lineCmt)
- // cursor at pos 0, line comment also at pos 0 => shift it down, don't continue
- if (!pos.ch && !found) insert = ''
- // continue only if the line starts with an optional space + line comment
- else if (found > -1 && nonspaceAfter(0, line) >= found) {
- // don't continue if there's only space(s) after cursor or the end of the line
- insert = nonspaceAfter(pos.ch, line) > -1
- // but always continue if the next line starts with a line comment too
- if (!insert) {
- var next = cm.getLine(pos.line + 1) || '',
- nextFound = next.indexOf(lineCmt)
- insert = (nextFound > -1 && nonspaceAfter(0, next) >= nextFound) || null
- }
- if (insert) {
- insert = line.slice(0, found) + lineCmt + line.slice(found + lineCmt.length).match(/^\s*/)[0]
- }
- }
- }
- if (insert == null) return CodeMirror.Pass
- inserts[i] = '\n' + insert
- }
- cm.operation(function () {
- for (var i = ranges.length - 1; i >= 0; i--) cm.replaceRange(inserts[i], ranges[i].from(), ranges[i].to(), '+insert')
- })
- }
- function nonspaceAfter(ch, str) {
- nonspace.lastIndex = ch
- var m = nonspace.exec(str)
- return m ? m.index : -1
- }
- function continueLineCommentEnabled(cm) {
- var opt = cm.getOption('continueComments')
- if (opt && typeof opt == 'object') return opt.continueLineComment !== false
- return true
- }
- CodeMirror.defineOption('continueComments', null, function (cm, val, prev) {
- if (prev && prev != CodeMirror.Init) cm.removeKeyMap('continueComment')
- if (val) {
- var key = 'Enter'
- if (typeof val == 'string') key = val
- else if (typeof val == 'object' && val.key) key = val.key
- var map = { name: 'continueComment' }
- map[key] = continueComment
- cm.addKeyMap(map)
- }
- })
- })
|