test / bt-source /panel /BTPanel /static /editor /ext-emmet.js
GGSheng's picture
feat: deploy Gemma 4 to hf space
08c964e verified
ace.define(
'ace/snippets',
[
'require',
'exports',
'module',
'ace/lib/oop',
'ace/lib/event_emitter',
'ace/lib/lang',
'ace/range',
'ace/range_list',
'ace/keyboard/hash_handler',
'ace/tokenizer',
'ace/clipboard',
'ace/lib/dom',
'ace/editor',
],
function (e, t, n) {
'use strict'
function h(e) {
var t = new Date().toLocaleString('en-us', e)
return t.length == 1 ? '0' + t : t
}
var r = e('./lib/oop'),
i = e('./lib/event_emitter').EventEmitter,
s = e('./lib/lang'),
o = e('./range').Range,
u = e('./range_list').RangeList,
a = e('./keyboard/hash_handler').HashHandler,
f = e('./tokenizer').Tokenizer,
l = e('./clipboard'),
c = {
CURRENT_WORD: function (e) {
return e.session.getTextRange(e.session.getWordRange())
},
SELECTION: function (e, t, n) {
var r = e.session.getTextRange()
return n ? r.replace(/\n\r?([ \t]*\S)/g, '\n' + n + '$1') : r
},
CURRENT_LINE: function (e) {
return e.session.getLine(e.getCursorPosition().row)
},
PREV_LINE: function (e) {
return e.session.getLine(e.getCursorPosition().row - 1)
},
LINE_INDEX: function (e) {
return e.getCursorPosition().row
},
LINE_NUMBER: function (e) {
return e.getCursorPosition().row + 1
},
SOFT_TABS: function (e) {
return e.session.getUseSoftTabs() ? 'YES' : 'NO'
},
TAB_SIZE: function (e) {
return e.session.getTabSize()
},
CLIPBOARD: function (e) {
return l.getText && l.getText()
},
FILENAME: function (e) {
return /[^/\\]*$/.exec(this.FILEPATH(e))[0]
},
FILENAME_BASE: function (e) {
return /[^/\\]*$/.exec(this.FILEPATH(e))[0].replace(/\.[^.]*$/, '')
},
DIRECTORY: function (e) {
return this.FILEPATH(e).replace(/[^/\\]*$/, '')
},
FILEPATH: function (e) {
return '/not implemented.txt'
},
WORKSPACE_NAME: function () {
return 'Unknown'
},
FULLNAME: function () {
return 'Unknown'
},
BLOCK_COMMENT_START: function (e) {
var t = e.session.$mode || {}
return (t.blockComment && t.blockComment.start) || ''
},
BLOCK_COMMENT_END: function (e) {
var t = e.session.$mode || {}
return (t.blockComment && t.blockComment.end) || ''
},
LINE_COMMENT: function (e) {
var t = e.session.$mode || {}
return t.lineCommentStart || ''
},
CURRENT_YEAR: h.bind(null, { year: 'numeric' }),
CURRENT_YEAR_SHORT: h.bind(null, { year: '2-digit' }),
CURRENT_MONTH: h.bind(null, { month: 'numeric' }),
CURRENT_MONTH_NAME: h.bind(null, { month: 'long' }),
CURRENT_MONTH_NAME_SHORT: h.bind(null, { month: 'short' }),
CURRENT_DATE: h.bind(null, { day: '2-digit' }),
CURRENT_DAY_NAME: h.bind(null, { weekday: 'long' }),
CURRENT_DAY_NAME_SHORT: h.bind(null, { weekday: 'short' }),
CURRENT_HOUR: h.bind(null, { hour: '2-digit', hour12: !1 }),
CURRENT_MINUTE: h.bind(null, { minute: '2-digit' }),
CURRENT_SECOND: h.bind(null, { second: '2-digit' }),
}
c.SELECTED_TEXT = c.SELECTION
var p = function () {
;(this.snippetMap = {}), (this.snippetNameMap = {})
}
;(function () {
r.implement(this, i),
(this.getTokenizer = function () {
return p.$tokenizer || this.createTokenizer()
}),
(this.createTokenizer = function () {
function e(e) {
return (
(e = e.substr(1)), /^\d+$/.test(e) ? [{ tabstopId: parseInt(e, 10) }] : [{ text: e }]
)
}
function t(e) {
return '(?:[^\\\\' + e + ']|\\\\.)'
}
var n = {
regex: '/(' + t('/') + '+)/',
onMatch: function (e, t, n) {
var r = n[0]
return (r.fmtString = !0), (r.guard = e.slice(1, -1)), (r.flag = ''), ''
},
next: 'formatString',
}
return (
(p.$tokenizer = new f({
start: [
{
regex: /\\./,
onMatch: function (e, t, n) {
var r = e[1]
return r == '}' && n.length ? (e = r) : '`$\\'.indexOf(r) != -1 && (e = r), [e]
},
},
{
regex: /}/,
onMatch: function (e, t, n) {
return [n.length ? n.shift() : e]
},
},
{ regex: /\$(?:\d+|\w+)/, onMatch: e },
{
regex: /\$\{[\dA-Z_a-z]+/,
onMatch: function (t, n, r) {
var i = e(t.substr(1))
return r.unshift(i[0]), i
},
next: 'snippetVar',
},
{ regex: /\n/, token: 'newline', merge: !1 },
],
snippetVar: [
{
regex: '\\|' + t('\\|') + '*\\|',
onMatch: function (e, t, n) {
var r = e
.slice(1, -1)
.replace(/\\[,|\\]|,/g, function (e) {
return e.length == 2 ? e[1] : '\0'
})
.split('\0')
.map(function (e) {
return { value: e }
})
return (n[0].choices = r), [r[0]]
},
next: 'start',
},
n,
{ regex: '([^:}\\\\]|\\\\.)*:?', token: '', next: 'start' },
],
formatString: [
{
regex: /:/,
onMatch: function (e, t, n) {
return n.length && n[0].expectElse
? ((n[0].expectElse = !1), (n[0].ifEnd = { elseEnd: n[0] }), [n[0].ifEnd])
: ':'
},
},
{
regex: /\\./,
onMatch: function (e, t, n) {
var r = e[1]
return (
r == '}' && n.length
? (e = r)
: '`$\\'.indexOf(r) != -1
? (e = r)
: r == 'n'
? (e = '\n')
: r == 't'
? (e = ' ')
: 'ulULE'.indexOf(r) != -1 && (e = { changeCase: r, local: r > 'a' }),
[e]
)
},
},
{
regex: '/\\w*}',
onMatch: function (e, t, n) {
var r = n.shift()
return (
r && (r.flag = e.slice(1, -1)),
(this.next = r && r.tabstopId ? 'start' : ''),
[r || e]
)
},
next: 'start',
},
{
regex: /\$(?:\d+|\w+)/,
onMatch: function (e, t, n) {
return [{ text: e.slice(1) }]
},
},
{
regex: /\${\w+/,
onMatch: function (e, t, n) {
var r = { text: e.slice(2) }
return n.unshift(r), [r]
},
next: 'formatStringVar',
},
{ regex: /\n/, token: 'newline', merge: !1 },
{
regex: /}/,
onMatch: function (e, t, n) {
var r = n.shift()
return (this.next = r && r.tabstopId ? 'start' : ''), [r || e]
},
next: 'start',
},
],
formatStringVar: [
{
regex: /:\/\w+}/,
onMatch: function (e, t, n) {
var r = n[0]
return (r.formatFunction = e.slice(2, -1)), [n.shift()]
},
next: 'formatString',
},
n,
{
regex: /:[\?\-+]?/,
onMatch: function (e, t, n) {
e[1] == '+' && (n[0].ifEnd = n[0]), e[1] == '?' && (n[0].expectElse = !0)
},
next: 'formatString',
},
{ regex: '([^:}\\\\]|\\\\.)*:?', token: '', next: 'formatString' },
],
})),
p.$tokenizer
)
}),
(this.tokenizeTmSnippet = function (e, t) {
return this.getTokenizer()
.getLineTokens(e, t)
.tokens.map(function (e) {
return e.value || e
})
}),
(this.getVariableValue = function (e, t, n) {
if (/^\d+$/.test(t)) return (this.variables.__ || {})[t] || ''
if (/^[A-Z]\d+$/.test(t)) return (this.variables[t[0] + '__'] || {})[t.substr(1)] || ''
t = t.replace(/^TM_/, '')
if (!this.variables.hasOwnProperty(t)) return ''
var r = this.variables[t]
return typeof r == 'function' && (r = this.variables[t](e, t, n)), r == null ? '' : r
}),
(this.variables = c),
(this.tmStrFormat = function (e, t, n) {
if (!t.fmt) return e
var r = t.flag || '',
i = t.guard
i = new RegExp(i, r.replace(/[^gim]/g, ''))
var s = typeof t.fmt == 'string' ? this.tokenizeTmSnippet(t.fmt, 'formatString') : t.fmt,
o = this,
u = e.replace(i, function () {
var e = o.variables.__
o.variables.__ = [].slice.call(arguments)
var t = o.resolveVariables(s, n),
r = 'E'
for (var i = 0; i < t.length; i++) {
var u = t[i]
if (typeof u == 'object') {
t[i] = ''
if (u.changeCase && u.local) {
var a = t[i + 1]
a &&
typeof a == 'string' &&
(u.changeCase == 'u'
? (t[i] = a[0].toUpperCase())
: (t[i] = a[0].toLowerCase()),
(t[i + 1] = a.substr(1)))
} else u.changeCase && (r = u.changeCase)
} else r == 'U' ? (t[i] = u.toUpperCase()) : r == 'L' && (t[i] = u.toLowerCase())
}
return (o.variables.__ = e), t.join('')
})
return u
}),
(this.tmFormatFunction = function (e, t, n) {
return t.formatFunction == 'upcase'
? e.toUpperCase()
: t.formatFunction == 'downcase'
? e.toLowerCase()
: e
}),
(this.resolveVariables = function (e, t) {
function f(t) {
var n = e.indexOf(t, s + 1)
n != -1 && (s = n)
}
var n = [],
r = '',
i = !0
for (var s = 0; s < e.length; s++) {
var o = e[s]
if (typeof o == 'string') {
n.push(o),
o == '\n'
? ((i = !0), (r = ''))
: i && ((r = /^\t*/.exec(o)[0]), (i = /\S/.test(o)))
continue
}
if (!o) continue
i = !1
if (o.fmtString) {
var u = e.indexOf(o, s + 1)
u == -1 && (u = e.length), (o.fmt = e.slice(s + 1, u)), (s = u)
}
if (o.text) {
var a = this.getVariableValue(t, o.text, r) + ''
o.fmtString && (a = this.tmStrFormat(a, o, t)),
o.formatFunction && (a = this.tmFormatFunction(a, o, t)),
a && !o.ifEnd ? (n.push(a), f(o)) : !a && o.ifEnd && f(o.ifEnd)
} else
o.elseEnd
? f(o.elseEnd)
: o.tabstopId != null
? n.push(o)
: o.changeCase != null && n.push(o)
}
return n
}),
(this.insertSnippetForSelection = function (e, t) {
function f(e) {
var t = []
for (var n = 0; n < e.length; n++) {
var r = e[n]
if (typeof r == 'object') {
if (a[r.tabstopId]) continue
var i = e.lastIndexOf(r, n - 1)
r = t[i] || { tabstopId: r.tabstopId }
}
t[n] = r
}
return t
}
var n = e.getCursorPosition(),
r = e.session.getLine(n.row),
i = e.session.getTabString(),
s = r.match(/^\s*/)[0]
n.column < s.length && (s = s.slice(0, n.column)), (t = t.replace(/\r/g, ''))
var o = this.tokenizeTmSnippet(t)
;(o = this.resolveVariables(o, e)),
(o = o.map(function (e) {
return e == '\n' ? e + s : typeof e == 'string' ? e.replace(/\t/g, i) : e
}))
var u = []
o.forEach(function (e, t) {
if (typeof e != 'object') return
var n = e.tabstopId,
r = u[n]
r || ((r = u[n] = []), (r.index = n), (r.value = ''), (r.parents = {}))
if (r.indexOf(e) !== -1) return
e.choices && !r.choices && (r.choices = e.choices), r.push(e)
var i = o.indexOf(e, t + 1)
if (i === -1) return
var s = o.slice(t + 1, i),
a = s.some(function (e) {
return typeof e == 'object'
})
a && !r.value
? (r.value = s)
: s.length && (!r.value || typeof r.value != 'string') && (r.value = s.join(''))
}),
u.forEach(function (e) {
e.length = 0
})
var a = {}
for (var l = 0; l < o.length; l++) {
var c = o[l]
if (typeof c != 'object') continue
var h = c.tabstopId,
p = u[h],
v = o.indexOf(c, l + 1)
if (a[h]) {
a[h] === c &&
(delete a[h],
Object.keys(a).forEach(function (e) {
p.parents[e] = !0
}))
continue
}
a[h] = c
var m = p.value
typeof m != 'string' ? (m = f(m)) : c.fmt && (m = this.tmStrFormat(m, c, e)),
o.splice.apply(o, [l + 1, Math.max(0, v - l)].concat(m, c)),
p.indexOf(c) === -1 && p.push(c)
}
var g = 0,
y = 0,
b = ''
o.forEach(function (e) {
if (typeof e == 'string') {
var t = e.split('\n')
t.length > 1 ? ((y = t[t.length - 1].length), (g += t.length - 1)) : (y += e.length),
(b += e)
} else
e && (e.start ? (e.end = { row: g, column: y }) : (e.start = { row: g, column: y }))
})
var w = e.getSelectionRange(),
E = e.session.replace(w, b),
S = new d(e),
x = e.inVirtualSelectionMode && e.selection.index
S.addTabstops(u, w.start, E, x)
}),
(this.insertSnippet = function (e, t) {
var n = this
if (e.inVirtualSelectionMode) return n.insertSnippetForSelection(e, t)
e.forEachSelection(
function () {
n.insertSnippetForSelection(e, t)
},
null,
{ keepOrder: !0 }
),
e.tabstopManager && e.tabstopManager.tabNext()
}),
(this.$getScope = function (e) {
var t = e.session.$mode.$id || ''
t = t.split('/').pop()
if (t === 'html' || t === 'php') {
t === 'php' && !e.session.$mode.inlinePhp && (t = 'html')
var n = e.getCursorPosition(),
r = e.session.getState(n.row)
typeof r == 'object' && (r = r[0]),
r.substring &&
(r.substring(0, 3) == 'js-'
? (t = 'javascript')
: r.substring(0, 4) == 'css-'
? (t = 'css')
: r.substring(0, 4) == 'php-' && (t = 'php'))
}
return t
}),
(this.getActiveScopes = function (e) {
var t = this.$getScope(e),
n = [t],
r = this.snippetMap
return r[t] && r[t].includeScopes && n.push.apply(n, r[t].includeScopes), n.push('_'), n
}),
(this.expandWithTab = function (e, t) {
var n = this,
r = e.forEachSelection(
function () {
return n.expandSnippetForSelection(e, t)
},
null,
{ keepOrder: !0 }
)
return r && e.tabstopManager && e.tabstopManager.tabNext(), r
}),
(this.expandSnippetForSelection = function (e, t) {
var n = e.getCursorPosition(),
r = e.session.getLine(n.row),
i = r.substring(0, n.column),
s = r.substr(n.column),
o = this.snippetMap,
u
return (
this.getActiveScopes(e).some(function (e) {
var t = o[e]
return t && (u = this.findMatchingSnippet(t, i, s)), !!u
}, this),
u
? t && t.dryRun
? !0
: (e.session.doc.removeInLine(
n.row,
n.column - u.replaceBefore.length,
n.column + u.replaceAfter.length
),
(this.variables.M__ = u.matchBefore),
(this.variables.T__ = u.matchAfter),
this.insertSnippetForSelection(e, u.content),
(this.variables.M__ = this.variables.T__ = null),
!0)
: !1
)
}),
(this.findMatchingSnippet = function (e, t, n) {
for (var r = e.length; r--; ) {
var i = e[r]
if (i.startRe && !i.startRe.test(t)) continue
if (i.endRe && !i.endRe.test(n)) continue
if (!i.startRe && !i.endRe) continue
return (
(i.matchBefore = i.startRe ? i.startRe.exec(t) : ['']),
(i.matchAfter = i.endRe ? i.endRe.exec(n) : ['']),
(i.replaceBefore = i.triggerRe ? i.triggerRe.exec(t)[0] : ''),
(i.replaceAfter = i.endTriggerRe ? i.endTriggerRe.exec(n)[0] : ''),
i
)
}
}),
(this.snippetMap = {}),
(this.snippetNameMap = {}),
(this.register = function (e, t) {
function o(e) {
return e && !/^\^?\(.*\)\$?$|^\\b$/.test(e) && (e = '(?:' + e + ')'), e || ''
}
function u(e, t, n) {
return (
(e = o(e)),
(t = o(t)),
n
? ((e = t + e), e && e[e.length - 1] != '$' && (e += '$'))
: ((e += t), e && e[0] != '^' && (e = '^' + e)),
new RegExp(e)
)
}
function a(e) {
e.scope || (e.scope = t || '_'), (t = e.scope), n[t] || ((n[t] = []), (r[t] = {}))
var o = r[t]
if (e.name) {
var a = o[e.name]
a && i.unregister(a), (o[e.name] = e)
}
n[t].push(e),
e.prefix && (e.tabTrigger = e.prefix),
!e.content &&
e.body &&
(e.content = Array.isArray(e.body) ? e.body.join('\n') : e.body),
e.tabTrigger &&
!e.trigger &&
(!e.guard && /^\w/.test(e.tabTrigger) && (e.guard = '\\b'),
(e.trigger = s.escapeRegExp(e.tabTrigger)))
if (!e.trigger && !e.guard && !e.endTrigger && !e.endGuard) return
;(e.startRe = u(e.trigger, e.guard, !0)),
(e.triggerRe = new RegExp(e.trigger)),
(e.endRe = u(e.endTrigger, e.endGuard, !0)),
(e.endTriggerRe = new RegExp(e.endTrigger))
}
var n = this.snippetMap,
r = this.snippetNameMap,
i = this
e || (e = []),
Array.isArray(e)
? e.forEach(a)
: Object.keys(e).forEach(function (t) {
a(e[t])
}),
this._signal('registerSnippets', { scope: t })
}),
(this.unregister = function (e, t) {
function i(e) {
var i = r[e.scope || t]
if (i && i[e.name]) {
delete i[e.name]
var s = n[e.scope || t],
o = s && s.indexOf(e)
o >= 0 && s.splice(o, 1)
}
}
var n = this.snippetMap,
r = this.snippetNameMap
e.content ? i(e) : Array.isArray(e) && e.forEach(i)
}),
(this.parseSnippetFile = function (e) {
e = e.replace(/\r/g, '')
var t = [],
n = {},
r = /^#.*|^({[\s\S]*})\s*$|^(\S+) (.*)$|^((?:\n*\t.*)+)/gm,
i
while ((i = r.exec(e))) {
if (i[1])
try {
;(n = JSON.parse(i[1])), t.push(n)
} catch (s) {}
if (i[4]) (n.content = i[4].replace(/^\t/gm, '')), t.push(n), (n = {})
else {
var o = i[2],
u = i[3]
if (o == 'regex') {
var a = /\/((?:[^\/\\]|\\.)*)|$/g
;(n.guard = a.exec(u)[1]),
(n.trigger = a.exec(u)[1]),
(n.endTrigger = a.exec(u)[1]),
(n.endGuard = a.exec(u)[1])
} else
o == 'snippet'
? ((n.tabTrigger = u.match(/^\S*/)[0]), n.name || (n.name = u))
: o && (n[o] = u)
}
}
return t
}),
(this.getSnippetByName = function (e, t) {
var n = this.snippetNameMap,
r
return (
this.getActiveScopes(t).some(function (t) {
var i = n[t]
return i && (r = i[e]), !!r
}, this),
r
)
})
}).call(p.prototype)
var d = function (e) {
if (e.tabstopManager) return e.tabstopManager
;(e.tabstopManager = this),
(this.$onChange = this.onChange.bind(this)),
(this.$onChangeSelection = s.delayedCall(this.onChangeSelection.bind(this)).schedule),
(this.$onChangeSession = this.onChangeSession.bind(this)),
(this.$onAfterExec = this.onAfterExec.bind(this)),
this.attach(e)
}
;(function () {
;(this.attach = function (e) {
;(this.index = 0),
(this.ranges = []),
(this.tabstops = []),
(this.$openTabstops = null),
(this.selectedTabstop = null),
(this.editor = e),
this.editor.on('change', this.$onChange),
this.editor.on('changeSelection', this.$onChangeSelection),
this.editor.on('changeSession', this.$onChangeSession),
this.editor.commands.on('afterExec', this.$onAfterExec),
this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler)
}),
(this.detach = function () {
this.tabstops.forEach(this.removeTabstopMarkers, this),
(this.ranges = null),
(this.tabstops = null),
(this.selectedTabstop = null),
this.editor.removeListener('change', this.$onChange),
this.editor.removeListener('changeSelection', this.$onChangeSelection),
this.editor.removeListener('changeSession', this.$onChangeSession),
this.editor.commands.removeListener('afterExec', this.$onAfterExec),
this.editor.keyBinding.removeKeyboardHandler(this.keyboardHandler),
(this.editor.tabstopManager = null),
(this.editor = null)
}),
(this.onChange = function (e) {
var t = e.action[0] == 'r',
n = this.selectedTabstop || {},
r = n.parents || {},
i = (this.tabstops || []).slice()
for (var s = 0; s < i.length; s++) {
var o = i[s],
u = o == n || r[o.index]
o.rangeList.$bias = u ? 0 : 1
if (e.action == 'remove' && o !== n) {
var a = o.parents && o.parents[n.index],
f = o.rangeList.pointIndex(e.start, a)
f = f < 0 ? -f - 1 : f + 1
var l = o.rangeList.pointIndex(e.end, a)
l = l < 0 ? -l - 1 : l - 1
var c = o.rangeList.ranges.slice(f, l)
for (var h = 0; h < c.length; h++) this.removeRange(c[h])
}
o.rangeList.$onChange(e)
}
var p = this.editor.session
!this.$inChange && t && p.getLength() == 1 && !p.getValue() && this.detach()
}),
(this.updateLinkedFields = function () {
var e = this.selectedTabstop
if (!e || !e.hasLinkedRanges || !e.firstNonLinked) return
this.$inChange = !0
var n = this.editor.session,
r = n.getTextRange(e.firstNonLinked)
for (var i = 0; i < e.length; i++) {
var s = e[i]
if (!s.linked) continue
var o = s.original,
u = t.snippetManager.tmStrFormat(r, o, this.editor)
n.replace(s, u)
}
this.$inChange = !1
}),
(this.onAfterExec = function (e) {
e.command && !e.command.readOnly && this.updateLinkedFields()
}),
(this.onChangeSelection = function () {
if (!this.editor) return
var e = this.editor.selection.lead,
t = this.editor.selection.anchor,
n = this.editor.selection.isEmpty()
for (var r = 0; r < this.ranges.length; r++) {
if (this.ranges[r].linked) continue
var i = this.ranges[r].contains(e.row, e.column),
s = n || this.ranges[r].contains(t.row, t.column)
if (i && s) return
}
this.detach()
}),
(this.onChangeSession = function () {
this.detach()
}),
(this.tabNext = function (e) {
var t = this.tabstops.length,
n = this.index + (e || 1)
;(n = Math.min(Math.max(n, 1), t)),
n == t && (n = 0),
this.selectTabstop(n),
n === 0 && this.detach()
}),
(this.selectTabstop = function (e) {
this.$openTabstops = null
var t = this.tabstops[this.index]
t && this.addTabstopMarkers(t), (this.index = e), (t = this.tabstops[this.index])
if (!t || !t.length) return
this.selectedTabstop = t
var n = t.firstNonLinked || t
t.choices && (n.cursor = n.start)
if (!this.editor.inVirtualSelectionMode) {
var r = this.editor.multiSelect
r.toSingleRange(n)
for (var i = 0; i < t.length; i++) {
if (t.hasLinkedRanges && t[i].linked) continue
r.addRange(t[i].clone(), !0)
}
} else this.editor.selection.fromOrientedRange(n)
this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler),
this.selectedTabstop &&
this.selectedTabstop.choices &&
this.editor.execCommand('startAutocomplete', {
matches: this.selectedTabstop.choices,
})
}),
(this.addTabstops = function (e, t, n) {
var r = this.useLink || !this.editor.getOption('enableMultiselect')
this.$openTabstops || (this.$openTabstops = [])
if (!e[0]) {
var i = o.fromPoints(n, n)
m(i.start, t), m(i.end, t), (e[0] = [i]), (e[0].index = 0)
}
var s = this.index,
a = [s + 1, 0],
f = this.ranges
e.forEach(function (e, n) {
var i = this.$openTabstops[n] || e
for (var s = 0; s < e.length; s++) {
var l = e[s],
c = o.fromPoints(l.start, l.end || l.start)
v(c.start, t),
v(c.end, t),
(c.original = l),
(c.tabstop = i),
f.push(c),
i != e ? i.unshift(c) : (i[s] = c),
l.fmtString || (i.firstNonLinked && r)
? ((c.linked = !0), (i.hasLinkedRanges = !0))
: i.firstNonLinked || (i.firstNonLinked = c)
}
i.firstNonLinked || (i.hasLinkedRanges = !1),
i === e && (a.push(i), (this.$openTabstops[n] = i)),
this.addTabstopMarkers(i),
(i.rangeList = i.rangeList || new u()),
(i.rangeList.$bias = 0),
i.rangeList.addList(i)
}, this),
a.length > 2 &&
(this.tabstops.length && a.push(a.splice(2, 1)[0]),
this.tabstops.splice.apply(this.tabstops, a))
}),
(this.addTabstopMarkers = function (e) {
var t = this.editor.session
e.forEach(function (e) {
e.markerId || (e.markerId = t.addMarker(e, 'ace_snippet-marker', 'text'))
})
}),
(this.removeTabstopMarkers = function (e) {
var t = this.editor.session
e.forEach(function (e) {
t.removeMarker(e.markerId), (e.markerId = null)
})
}),
(this.removeRange = function (e) {
var t = e.tabstop.indexOf(e)
t != -1 && e.tabstop.splice(t, 1),
(t = this.ranges.indexOf(e)),
t != -1 && this.ranges.splice(t, 1),
(t = e.tabstop.rangeList.ranges.indexOf(e)),
t != -1 && e.tabstop.splice(t, 1),
this.editor.session.removeMarker(e.markerId),
e.tabstop.length ||
((t = this.tabstops.indexOf(e.tabstop)),
t != -1 && this.tabstops.splice(t, 1),
this.tabstops.length || this.detach())
}),
(this.keyboardHandler = new a()),
this.keyboardHandler.bindKeys({
Tab: function (e) {
if (t.snippetManager && t.snippetManager.expandWithTab(e)) return
e.tabstopManager.tabNext(1), e.renderer.scrollCursorIntoView()
},
'Shift-Tab': function (e) {
e.tabstopManager.tabNext(-1), e.renderer.scrollCursorIntoView()
},
Esc: function (e) {
e.tabstopManager.detach()
},
})
}).call(d.prototype)
var v = function (e, t) {
e.row == 0 && (e.column += t.column), (e.row += t.row)
},
m = function (e, t) {
e.row == t.row && (e.column -= t.column), (e.row -= t.row)
}
e('./lib/dom').importCssString(
'.ace_snippet-marker { -moz-box-sizing: border-box; box-sizing: border-box; background: rgba(194, 193, 208, 0.09); border: 1px dotted rgba(211, 208, 235, 0.62); position: absolute;}'
),
(t.snippetManager = new p())
var g = e('./editor').Editor
;(function () {
;(this.insertSnippet = function (e, n) {
return t.snippetManager.insertSnippet(this, e, n)
}),
(this.expandSnippet = function (e) {
return t.snippetManager.expandWithTab(this, e)
})
}).call(g.prototype)
}
),
ace.define(
'ace/ext/emmet',
[
'require',
'exports',
'module',
'ace/keyboard/hash_handler',
'ace/editor',
'ace/snippets',
'ace/range',
'ace/config',
'resources',
'resources',
'tabStops',
'resources',
'utils',
'actions',
],
function (e, t, n) {
'use strict'
function l() {}
var r = e('../keyboard/hash_handler').HashHandler,
i = e('../editor').Editor,
s = e('../snippets').snippetManager,
o = e('../range').Range,
u = e('../config'),
a,
f
l.prototype = {
setupContext: function (e) {
;(this.ace = e), (this.indentation = e.session.getTabString()), a || (a = window.emmet)
var t = a.resources || a.require('resources')
t.setVariable('indentation', this.indentation),
(this.$syntax = null),
(this.$syntax = this.getSyntax())
},
getSelectionRange: function () {
var e = this.ace.getSelectionRange(),
t = this.ace.session.doc
return { start: t.positionToIndex(e.start), end: t.positionToIndex(e.end) }
},
createSelection: function (e, t) {
var n = this.ace.session.doc
this.ace.selection.setRange({ start: n.indexToPosition(e), end: n.indexToPosition(t) })
},
getCurrentLineRange: function () {
var e = this.ace,
t = e.getCursorPosition().row,
n = e.session.getLine(t).length,
r = e.session.doc.positionToIndex({ row: t, column: 0 })
return { start: r, end: r + n }
},
getCaretPos: function () {
var e = this.ace.getCursorPosition()
return this.ace.session.doc.positionToIndex(e)
},
setCaretPos: function (e) {
var t = this.ace.session.doc.indexToPosition(e)
this.ace.selection.moveToPosition(t)
},
getCurrentLine: function () {
var e = this.ace.getCursorPosition().row
return this.ace.session.getLine(e)
},
replaceContent: function (e, t, n, r) {
n == null && (n = t == null ? this.getContent().length : t), t == null && (t = 0)
var i = this.ace,
u = i.session.doc,
a = o.fromPoints(u.indexToPosition(t), u.indexToPosition(n))
i.session.remove(a),
(a.end = a.start),
(e = this.$updateTabstops(e)),
s.insertSnippet(i, e)
},
getContent: function () {
return this.ace.getValue()
},
getSyntax: function () {
if (this.$syntax) return this.$syntax
var e = this.ace.session.$modeId.split('/').pop()
if (e == 'html' || e == 'php') {
var t = this.ace.getCursorPosition(),
n = this.ace.session.getState(t.row)
typeof n != 'string' && (n = n[0]),
n && ((n = n.split('-')), n.length > 1 ? (e = n[0]) : e == 'php' && (e = 'html'))
}
return e
},
getProfileName: function () {
var e = a.resources || a.require('resources')
switch (this.getSyntax()) {
case 'css':
return 'css'
case 'xml':
case 'xsl':
return 'xml'
case 'html':
var t = e.getVariable('profile')
return (
t ||
(t =
this.ace.session
.getLines(0, 2)
.join('')
.search(/<!DOCTYPE[^>]+XHTML/i) != -1
? 'xhtml'
: 'html'),
t
)
default:
var n = this.ace.session.$mode
return (n.emmetConfig && n.emmetConfig.profile) || 'xhtml'
}
},
prompt: function (e) {
return prompt(e)
},
getSelection: function () {
return this.ace.session.getTextRange()
},
getFilePath: function () {
return ''
},
$updateTabstops: function (e) {
var t = 1e3,
n = 0,
r = null,
i = a.tabStops || a.require('tabStops'),
s = a.resources || a.require('resources'),
o = s.getVocabulary('user'),
u = {
tabstop: function (e) {
var s = parseInt(e.group, 10),
o = s === 0
o ? (s = ++n) : (s += t)
var a = e.placeholder
a && (a = i.processText(a, u))
var f = '${' + s + (a ? ':' + a : '') + '}'
return o && (r = [e.start, f]), f
},
escape: function (e) {
return e == '$' ? '\\$' : e == '\\' ? '\\\\' : e
},
}
e = i.processText(e, u)
if (o.variables.insert_final_tabstop && !/\$\{0\}$/.test(e)) e += '${0}'
else if (r) {
var f = a.utils ? a.utils.common : a.require('utils')
e = f.replaceSubstring(e, '${0}', r[0], r[1])
}
return e
},
}
var c = {
expand_abbreviation: { mac: 'ctrl+alt+e', win: 'alt+e' },
match_pair_outward: { mac: 'ctrl+d', win: 'ctrl+,' },
match_pair_inward: { mac: 'ctrl+j', win: 'ctrl+shift+0' },
matching_pair: { mac: 'ctrl+alt+j', win: 'alt+j' },
next_edit_point: 'alt+right',
prev_edit_point: 'alt+left',
toggle_comment: { mac: 'command+/', win: 'ctrl+/' },
split_join_tag: { mac: "shift+command+'", win: 'shift+ctrl+`' },
remove_tag: { mac: "command+'", win: 'shift+ctrl+;' },
evaluate_math_expression: { mac: 'shift+command+y', win: 'shift+ctrl+y' },
increment_number_by_1: 'ctrl+up',
decrement_number_by_1: 'ctrl+down',
increment_number_by_01: 'alt+up',
decrement_number_by_01: 'alt+down',
increment_number_by_10: { mac: 'alt+command+up', win: 'shift+alt+up' },
decrement_number_by_10: { mac: 'alt+command+down', win: 'shift+alt+down' },
select_next_item: { mac: 'shift+command+.', win: 'shift+ctrl+.' },
select_previous_item: { mac: 'shift+command+,', win: 'shift+ctrl+,' },
reflect_css_value: { mac: 'shift+command+r', win: 'shift+ctrl+r' },
encode_decode_data_url: { mac: 'shift+ctrl+d', win: "ctrl+'" },
expand_abbreviation_with_tab: 'Tab',
wrap_with_abbreviation: { mac: 'shift+ctrl+a', win: 'shift+ctrl+a' },
},
h = new l()
;(t.commands = new r()),
(t.runEmmetCommand = function v(e) {
if (this.action == 'expand_abbreviation_with_tab') {
if (!e.selection.isEmpty()) return !1
var n = e.selection.lead,
r = e.session.getTokenAt(n.row, n.column)
if (r && /\btag\b/.test(r.type)) return !1
}
try {
h.setupContext(e)
var i = a.actions || a.require('actions')
if (this.action == 'wrap_with_abbreviation')
return setTimeout(function () {
i.run('wrap_with_abbreviation', h)
}, 0)
var s = i.run(this.action, h)
} catch (o) {
if (!a) {
var f = t.load(v.bind(this, e))
return this.action == 'expand_abbreviation_with_tab' ? !1 : f
}
e._signal('changeStatus', typeof o == 'string' ? o : o.message), u.warn(o), (s = !1)
}
return s
})
for (var p in c)
t.commands.addCommand({
name: 'emmet:' + p,
action: p,
bindKey: c[p],
exec: t.runEmmetCommand,
multiSelectAction: 'forEach',
})
;(t.updateCommands = function (e, n) {
n
? e.keyBinding.addKeyboardHandler(t.commands)
: e.keyBinding.removeKeyboardHandler(t.commands)
}),
(t.isSupportedMode = function (e) {
if (!e) return !1
if (e.emmetConfig) return !0
var t = e.$id || e
return /css|less|scss|sass|stylus|html|php|twig|ejs|handlebars/.test(t)
}),
(t.isAvailable = function (e, n) {
if (/(evaluate_math_expression|expand_abbreviation)$/.test(n)) return !0
var r = e.session.$mode,
i = t.isSupportedMode(r)
if (i && r.$modes)
try {
h.setupContext(e), /js|php/.test(h.getSyntax()) && (i = !1)
} catch (s) {}
return i
})
var d = function (e, n) {
var r = n
if (!r) return
var i = t.isSupportedMode(r.session.$mode)
e.enableEmmet === !1 && (i = !1), i && t.load(), t.updateCommands(r, i)
}
;(t.load = function (e) {
return typeof f != 'string'
? (u.warn('script for emmet-core is not loaded'), !1)
: (u.loadModule(f, function () {
;(f = null), e && e()
}),
!0)
}),
(t.AceEmmetEditor = l),
u.defineOptions(i.prototype, 'editor', {
enableEmmet: {
set: function (e) {
this[e ? 'on' : 'removeListener']('changeMode', d), d({ enableEmmet: !!e }, this)
},
value: !0,
},
}),
(t.setCore = function (e) {
typeof e == 'string' ? (f = e) : (a = e)
})
}
)
;(function () {
ace.require(['ace/ext/emmet'], function (m) {
if (typeof module == 'object' && typeof exports == 'object' && module) {
module.exports = m
}
})
})()