1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- // 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) {
- 'use strict'
- CodeMirror.registerGlobalHelper(
- 'fold',
- 'comment',
- function (mode) {
- return mode.blockCommentStart && mode.blockCommentEnd
- },
- function (cm, start) {
- var mode = cm.getModeAt(start),
- startToken = mode.blockCommentStart,
- endToken = mode.blockCommentEnd
- if (!startToken || !endToken) return
- var line = start.line,
- lineText = cm.getLine(line)
- var startCh
- for (var at = start.ch, pass = 0; ; ) {
- var found = at <= 0 ? -1 : lineText.lastIndexOf(startToken, at - 1)
- if (found == -1) {
- if (pass == 1) return
- pass = 1
- at = lineText.length
- continue
- }
- if (pass == 1 && found < start.ch) return
- if (
- /comment/.test(cm.getTokenTypeAt(CodeMirror.Pos(line, found + 1))) &&
- (found == 0 || lineText.slice(found - endToken.length, found) == endToken || !/comment/.test(cm.getTokenTypeAt(CodeMirror.Pos(line, found))))
- ) {
- startCh = found + startToken.length
- break
- }
- at = found - 1
- }
- var depth = 1,
- lastLine = cm.lastLine(),
- end,
- endCh
- outer: for (var i = line; i <= lastLine; ++i) {
- var text = cm.getLine(i),
- pos = i == line ? startCh : 0
- for (;;) {
- var nextOpen = text.indexOf(startToken, pos),
- nextClose = text.indexOf(endToken, pos)
- if (nextOpen < 0) nextOpen = text.length
- if (nextClose < 0) nextClose = text.length
- pos = Math.min(nextOpen, nextClose)
- if (pos == text.length) break
- if (pos == nextOpen) ++depth
- else if (!--depth) {
- end = i
- endCh = pos
- break outer
- }
- ++pos
- }
- }
- if (end == null || (line == end && endCh == startCh)) return
- return { from: CodeMirror.Pos(line, startCh), to: CodeMirror.Pos(end, endCh) }
- }
- )
- })
|