/* menu - code */ import $ from '../../util/dom-core.js' import { getRandom, replaceHtmlSymbol } from '../../util/util.js' import Panel from '../panel.js' import { UA } from '../../util/util.js' // 构造函数 function Code(editor) { this.editor = editor this.$elem = $( `
` ) this.type = 'panel' // 当前是否 active 状态 this._active = false } // 原型 Code.prototype = { constructor: Code, onClick: function (e) { const editor = this.editor const $startElem = editor.selection.getSelectionStartElem() const $endElem = editor.selection.getSelectionEndElem() const isSeleEmpty = editor.selection.isSelectionEmpty() const selectionText = editor.selection.getSelectionText() let $code if (!$startElem.equal($endElem)) { // 跨元素选择,不做处理 editor.selection.restoreSelection() return } if (!isSeleEmpty) { // 选取不是空,用 包裹即可
$code = $(`${selectionText}
`)
editor.cmd.do('insertElem', $code)
editor.selection.createRangeByElem($code, false)
editor.selection.restoreSelection()
return
}
// 选取是空,且没有夸元素选择,则插入
if (this._active) {
// 选中状态,将编辑内容
this._createPanel($startElem.html())
} else {
// 未选中状态,将创建内容
this._createPanel()
}
},
_createPanel: function (value) {
// value - 要编辑的内容
value = value || ''
const type = !value ? 'new' : 'edit'
const textId = getRandom('texxt')
const btnId = getRandom('btn')
const panel = new Panel(this, {
width: 500,
// 一个 Panel 包含多个 tab
tabs: [
{
// 标题
title: '插入代码',
// 模板
tpl: `
`,
// 事件绑定
events: [
// 插入代码
{
selector: '#' + btnId,
type: 'click',
fn: () => {
const $text = $('#' + textId)
let text = $text.val() || $text.html()
text = replaceHtmlSymbol(text)
if (type === 'new') {
// 新插入
this._insertCode(text)
} else {
// 编辑更新
this._updateCode(text)
}
// 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭
return true
}
}
]
} // first tab end
] // tabs end
}) // new Panel end
// 显示 panel
panel.show()
// 记录属性
this.panel = panel
},
// 插入代码
_insertCode: function (value) {
const editor = this.editor
editor.cmd.do('insertHTML', `${value}
`)
},
// 更新代码
_updateCode: function (value) {
const editor = this.editor
const $selectionELem = editor.selection.getSelectionContainerElem()
if (!$selectionELem) {
return
}
$selectionELem.html(value)
editor.selection.restoreSelection()
},
// 试图改变 active 状态
tryChangeActive: function (e) {
const editor = this.editor
const $elem = this.$elem
const $selectionELem = editor.selection.getSelectionContainerElem()
if (!$selectionELem) {
return
}
const $parentElem = $selectionELem.parent()
if ($selectionELem.getNodeName() === 'CODE' && $parentElem.getNodeName() === 'PRE') {
this._active = true
$elem.addClass('w-e-active')
} else {
this._active = false
$elem.removeClass('w-e-active')
}
}
}
export default Code