123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159 |
- // 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'
- function doFold(cm, pos, options, force) {
- if (options && options.call) {
- var finder = options
- options = null
- } else {
- var finder = getOption(cm, options, 'rangeFinder')
- }
- if (typeof pos == 'number') pos = CodeMirror.Pos(pos, 0)
- var minSize = getOption(cm, options, 'minFoldSize')
- function getRange(allowFolded) {
- var range = finder(cm, pos)
- if (!range || range.to.line - range.from.line < minSize) return null
- if (force === 'fold') return range
- var marks = cm.findMarksAt(range.from)
- for (var i = 0; i < marks.length; ++i) {
- if (marks[i].__isFold) {
- if (!allowFolded) return null
- range.cleared = true
- marks[i].clear()
- }
- }
- return range
- }
- var range = getRange(true)
- if (getOption(cm, options, 'scanUp'))
- while (!range && pos.line > cm.firstLine()) {
- pos = CodeMirror.Pos(pos.line - 1, 0)
- range = getRange(false)
- }
- if (!range || range.cleared || force === 'unfold') return
- var myWidget = makeWidget(cm, options, range)
- CodeMirror.on(myWidget, 'mousedown', function (e) {
- myRange.clear()
- CodeMirror.e_preventDefault(e)
- })
- var myRange = cm.markText(range.from, range.to, {
- replacedWith: myWidget,
- clearOnEnter: getOption(cm, options, 'clearOnEnter'),
- __isFold: true,
- })
- myRange.on('clear', function (from, to) {
- CodeMirror.signal(cm, 'unfold', cm, from, to)
- })
- CodeMirror.signal(cm, 'fold', cm, range.from, range.to)
- }
- function makeWidget(cm, options, range) {
- var widget = getOption(cm, options, 'widget')
- if (typeof widget == 'function') {
- widget = widget(range.from, range.to)
- }
- if (typeof widget == 'string') {
- var text = document.createTextNode(widget)
- widget = document.createElement('span')
- widget.appendChild(text)
- widget.className = 'CodeMirror-foldmarker'
- } else if (widget) {
- widget = widget.cloneNode(true)
- }
- return widget
- }
- // Clumsy backwards-compatible interface
- CodeMirror.newFoldFunction = function (rangeFinder, widget) {
- return function (cm, pos) {
- doFold(cm, pos, { rangeFinder: rangeFinder, widget: widget })
- }
- }
- // New-style interface
- CodeMirror.defineExtension('foldCode', function (pos, options, force) {
- doFold(this, pos, options, force)
- })
- CodeMirror.defineExtension('isFolded', function (pos) {
- var marks = this.findMarksAt(pos)
- for (var i = 0; i < marks.length; ++i) if (marks[i].__isFold) return true
- })
- CodeMirror.commands.toggleFold = function (cm) {
- cm.foldCode(cm.getCursor())
- }
- CodeMirror.commands.fold = function (cm) {
- cm.foldCode(cm.getCursor(), null, 'fold')
- }
- CodeMirror.commands.unfold = function (cm) {
- cm.foldCode(cm.getCursor(), { scanUp: false }, 'unfold')
- }
- CodeMirror.commands.foldAll = function (cm) {
- cm.operation(function () {
- for (var i = cm.firstLine(), e = cm.lastLine(); i <= e; i++) cm.foldCode(CodeMirror.Pos(i, 0), { scanUp: false }, 'fold')
- })
- }
- CodeMirror.commands.unfoldAll = function (cm) {
- cm.operation(function () {
- for (var i = cm.firstLine(), e = cm.lastLine(); i <= e; i++) cm.foldCode(CodeMirror.Pos(i, 0), { scanUp: false }, 'unfold')
- })
- }
- CodeMirror.registerHelper('fold', 'combine', function () {
- var funcs = Array.prototype.slice.call(arguments, 0)
- return function (cm, start) {
- for (var i = 0; i < funcs.length; ++i) {
- var found = funcs[i](cm, start)
- if (found) return found
- }
- }
- })
- CodeMirror.registerHelper('fold', 'auto', function (cm, start) {
- var helpers = cm.getHelpers(start, 'fold')
- for (var i = 0; i < helpers.length; i++) {
- var cur = helpers[i](cm, start)
- if (cur) return cur
- }
- })
- var defaultOptions = {
- rangeFinder: CodeMirror.fold.auto,
- widget: '\u2194',
- minFoldSize: 0,
- scanUp: false,
- clearOnEnter: true,
- }
- CodeMirror.defineOption('foldOptions', null)
- function getOption(cm, options, name) {
- if (options && options[name] !== undefined) return options[name]
- var editorOptions = cm.options.foldOptions
- if (editorOptions && editorOptions[name] !== undefined) return editorOptions[name]
- return defaultOptions[name]
- }
- CodeMirror.defineExtension('foldOption', function (options, name) {
- return getOption(this, options, name)
- })
- })
|