123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419 |
- 'use strict'
- function copyObj(obj, target, overwrite) {
- if (!target) {
- target = {}
- }
- for (var prop in obj) {
- if (obj.hasOwnProperty(prop) && (overwrite !== false || !target.hasOwnProperty(prop))) {
- target[prop] = obj[prop]
- }
- }
- return target
- }
- // Counts the column offset in a string, taking tabs into account.
- // Used mostly to find indentation.
- function countColumn(string, end, tabSize, startIndex, startValue) {
- if (end == null) {
- end = string.search(/[^\s\u00a0]/)
- if (end == -1) {
- end = string.length
- }
- }
- for (var i = startIndex || 0, n = startValue || 0; ; ) {
- var nextTab = string.indexOf('\t', i)
- if (nextTab < 0 || nextTab >= end) {
- return n + (end - i)
- }
- n += nextTab - i
- n += tabSize - (n % tabSize)
- i = nextTab + 1
- }
- }
- function nothing() {}
- function createObj(base, props) {
- var inst
- if (Object.create) {
- inst = Object.create(base)
- } else {
- nothing.prototype = base
- inst = new nothing()
- }
- if (props) {
- copyObj(props, inst)
- }
- return inst
- }
- // STRING STREAM
- // Fed to the mode parsers, provides helper functions to make
- // parsers more succinct.
- var StringStream = function (string, tabSize, lineOracle) {
- this.pos = this.start = 0
- this.string = string
- this.tabSize = tabSize || 8
- this.lastColumnPos = this.lastColumnValue = 0
- this.lineStart = 0
- this.lineOracle = lineOracle
- }
- StringStream.prototype.eol = function () {
- return this.pos >= this.string.length
- }
- StringStream.prototype.sol = function () {
- return this.pos == this.lineStart
- }
- StringStream.prototype.peek = function () {
- return this.string.charAt(this.pos) || undefined
- }
- StringStream.prototype.next = function () {
- if (this.pos < this.string.length) {
- return this.string.charAt(this.pos++)
- }
- }
- StringStream.prototype.eat = function (match) {
- var ch = this.string.charAt(this.pos)
- var ok
- if (typeof match == 'string') {
- ok = ch == match
- } else {
- ok = ch && (match.test ? match.test(ch) : match(ch))
- }
- if (ok) {
- ++this.pos
- return ch
- }
- }
- StringStream.prototype.eatWhile = function (match) {
- var start = this.pos
- while (this.eat(match)) {}
- return this.pos > start
- }
- StringStream.prototype.eatSpace = function () {
- var start = this.pos
- while (/[\s\u00a0]/.test(this.string.charAt(this.pos))) {
- ++this.pos
- }
- return this.pos > start
- }
- StringStream.prototype.skipToEnd = function () {
- this.pos = this.string.length
- }
- StringStream.prototype.skipTo = function (ch) {
- var found = this.string.indexOf(ch, this.pos)
- if (found > -1) {
- this.pos = found
- return true
- }
- }
- StringStream.prototype.backUp = function (n) {
- this.pos -= n
- }
- StringStream.prototype.column = function () {
- if (this.lastColumnPos < this.start) {
- this.lastColumnValue = countColumn(this.string, this.start, this.tabSize, this.lastColumnPos, this.lastColumnValue)
- this.lastColumnPos = this.start
- }
- return this.lastColumnValue - (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0)
- }
- StringStream.prototype.indentation = function () {
- return countColumn(this.string, null, this.tabSize) - (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0)
- }
- StringStream.prototype.match = function (pattern, consume, caseInsensitive) {
- if (typeof pattern == 'string') {
- var cased = function (str) {
- return caseInsensitive ? str.toLowerCase() : str
- }
- var substr = this.string.substr(this.pos, pattern.length)
- if (cased(substr) == cased(pattern)) {
- if (consume !== false) {
- this.pos += pattern.length
- }
- return true
- }
- } else {
- var match = this.string.slice(this.pos).match(pattern)
- if (match && match.index > 0) {
- return null
- }
- if (match && consume !== false) {
- this.pos += match[0].length
- }
- return match
- }
- }
- StringStream.prototype.current = function () {
- return this.string.slice(this.start, this.pos)
- }
- StringStream.prototype.hideFirstChars = function (n, inner) {
- this.lineStart += n
- try {
- return inner()
- } finally {
- this.lineStart -= n
- }
- }
- StringStream.prototype.lookAhead = function (n) {
- var oracle = this.lineOracle
- return oracle && oracle.lookAhead(n)
- }
- StringStream.prototype.baseToken = function () {
- var oracle = this.lineOracle
- return oracle && oracle.baseToken(this.pos)
- }
- // Known modes, by name and by MIME
- var modes = {},
- mimeModes = {}
- // Extra arguments are stored as the mode's dependencies, which is
- // used by (legacy) mechanisms like loadmode.js to automatically
- // load a mode. (Preferred mechanism is the require/define calls.)
- function defineMode(name, mode) {
- if (arguments.length > 2) {
- mode.dependencies = Array.prototype.slice.call(arguments, 2)
- }
- modes[name] = mode
- }
- function defineMIME(mime, spec) {
- mimeModes[mime] = spec
- }
- // Given a MIME type, a {name, ...options} config object, or a name
- // string, return a mode config object.
- function resolveMode(spec) {
- if (typeof spec == 'string' && mimeModes.hasOwnProperty(spec)) {
- spec = mimeModes[spec]
- } else if (spec && typeof spec.name == 'string' && mimeModes.hasOwnProperty(spec.name)) {
- var found = mimeModes[spec.name]
- if (typeof found == 'string') {
- found = { name: found }
- }
- spec = createObj(found, spec)
- spec.name = found.name
- } else if (typeof spec == 'string' && /^[\w\-]+\/[\w\-]+\+xml$/.test(spec)) {
- return resolveMode('application/xml')
- } else if (typeof spec == 'string' && /^[\w\-]+\/[\w\-]+\+json$/.test(spec)) {
- return resolveMode('application/json')
- }
- if (typeof spec == 'string') {
- return { name: spec }
- } else {
- return spec || { name: 'null' }
- }
- }
- // Given a mode spec (anything that resolveMode accepts), find and
- // initialize an actual mode object.
- function getMode(options, spec) {
- spec = resolveMode(spec)
- var mfactory = modes[spec.name]
- if (!mfactory) {
- return getMode(options, 'text/plain')
- }
- var modeObj = mfactory(options, spec)
- if (modeExtensions.hasOwnProperty(spec.name)) {
- var exts = modeExtensions[spec.name]
- for (var prop in exts) {
- if (!exts.hasOwnProperty(prop)) {
- continue
- }
- if (modeObj.hasOwnProperty(prop)) {
- modeObj['_' + prop] = modeObj[prop]
- }
- modeObj[prop] = exts[prop]
- }
- }
- modeObj.name = spec.name
- if (spec.helperType) {
- modeObj.helperType = spec.helperType
- }
- if (spec.modeProps) {
- for (var prop$1 in spec.modeProps) {
- modeObj[prop$1] = spec.modeProps[prop$1]
- }
- }
- return modeObj
- }
- // This can be used to attach properties to mode objects from
- // outside the actual mode definition.
- var modeExtensions = {}
- function extendMode(mode, properties) {
- var exts = modeExtensions.hasOwnProperty(mode) ? modeExtensions[mode] : (modeExtensions[mode] = {})
- copyObj(properties, exts)
- }
- function copyState(mode, state) {
- if (state === true) {
- return state
- }
- if (mode.copyState) {
- return mode.copyState(state)
- }
- var nstate = {}
- for (var n in state) {
- var val = state[n]
- if (val instanceof Array) {
- val = val.concat([])
- }
- nstate[n] = val
- }
- return nstate
- }
- // Given a mode and a state (for that mode), find the inner mode and
- // state at the position that the state refers to.
- function innerMode(mode, state) {
- var info
- while (mode.innerMode) {
- info = mode.innerMode(state)
- if (!info || info.mode == mode) {
- break
- }
- state = info.state
- mode = info.mode
- }
- return info || { mode: mode, state: state }
- }
- function startState(mode, a1, a2) {
- return mode.startState ? mode.startState(a1, a2) : true
- }
- var modeMethods = {
- __proto__: null,
- modes: modes,
- mimeModes: mimeModes,
- defineMode: defineMode,
- defineMIME: defineMIME,
- resolveMode: resolveMode,
- getMode: getMode,
- modeExtensions: modeExtensions,
- extendMode: extendMode,
- copyState: copyState,
- innerMode: innerMode,
- startState: startState,
- }
- // Copy StringStream and mode methods into exports (CodeMirror) object.
- exports.StringStream = StringStream
- exports.countColumn = countColumn
- for (var exported in modeMethods) {
- exports[exported] = modeMethods[exported]
- }
- // Shim library CodeMirror with the minimal CodeMirror defined above.
- require.cache[require.resolve('../../lib/codemirror')] = require.cache[require.resolve('./runmode.node')]
- require.cache[require.resolve('../../addon/runmode/runmode')] = require.cache[require.resolve('./runmode.node')]
- // Minimal default mode.
- exports.defineMode('null', function () {
- return {
- token: function (stream) {
- return stream.skipToEnd()
- },
- }
- })
- exports.defineMIME('text/plain', 'null')
- exports.registerHelper = exports.registerGlobalHelper = Math.min
- exports.splitLines = function (string) {
- return string.split(/\r?\n|\r/)
- }
- exports.defaults = { indentUnit: 2 }
- // 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) {
- CodeMirror.runMode = function (string, modespec, callback, options) {
- var mode = CodeMirror.getMode(CodeMirror.defaults, modespec)
- var tabSize = (options && options.tabSize) || CodeMirror.defaults.tabSize
- // Create a tokenizing callback function if passed-in callback is a DOM element.
- if (callback.appendChild) {
- var ie = /MSIE \d/.test(navigator.userAgent)
- var ie_lt9 = ie && (document.documentMode == null || document.documentMode < 9)
- var node = callback,
- col = 0
- node.innerHTML = ''
- callback = function (text, style) {
- if (text == '\n') {
- // Emitting LF or CRLF on IE8 or earlier results in an incorrect display.
- // Emitting a carriage return makes everything ok.
- node.appendChild(document.createTextNode(ie_lt9 ? '\r' : text))
- col = 0
- return
- }
- var content = ''
- // replace tabs
- for (var pos = 0; ; ) {
- var idx = text.indexOf('\t', pos)
- if (idx == -1) {
- content += text.slice(pos)
- col += text.length - pos
- break
- } else {
- col += idx - pos
- content += text.slice(pos, idx)
- var size = tabSize - (col % tabSize)
- col += size
- for (var i = 0; i < size; ++i) {
- content += ' '
- }
- pos = idx + 1
- }
- }
- // Create a node with token style and append it to the callback DOM element.
- if (style) {
- var sp = node.appendChild(document.createElement('span'))
- sp.className = 'cm-' + style.replace(/ +/g, ' cm-')
- sp.appendChild(document.createTextNode(content))
- } else {
- node.appendChild(document.createTextNode(content))
- }
- }
- }
- var lines = CodeMirror.splitLines(string),
- state = (options && options.state) || CodeMirror.startState(mode)
- for (var i = 0, e = lines.length; i < e; ++i) {
- if (i) {
- callback('\n')
- }
- var stream = new CodeMirror.StringStream(lines[i], null, {
- lookAhead: function (n) {
- return lines[i + n]
- },
- baseToken: function () {},
- })
- if (!stream.string && mode.blankLine) {
- mode.blankLine(state)
- }
- while (!stream.eol()) {
- var style = mode.token(stream, state)
- callback(stream.current(), style, i, stream.start, state, mode)
- stream.start = stream.pos
- }
- }
- }
- })
|