diff --git a/_server/editor.js b/_server/editor.js index b675d7ff..d1b9e5dd 100644 --- a/_server/editor.js +++ b/_server/editor.js @@ -90,6 +90,7 @@ editor.prototype.init = function (callback) { editor.file = editor_file; editor_mode = editor_mode(editor); editor.mode = editor_mode; + editor_table_wrapper(editor); core.resetGame(core.firstData.hero, null, core.firstData.floorId, core.initStatus.maps); core.changeFloor(core.status.floorId, null, core.firstData.hero.loc, null, function () { afterCoreReset(); diff --git a/_server/editor_mode.js b/_server/editor_mode.js index c70b8a57..ac428c07 100644 --- a/_server/editor_mode.js +++ b/_server/editor_mode.js @@ -38,305 +38,6 @@ editor_mode = function (editor) { if (Boolean(callback)) callback(); } -///////////////////////////////////////////////////////////////////////////// - /** - * 把来自数据文件的obj和来自*comment.js的commentObj组装成表格 - * commentObj在无视['_data']的意义下与obj同形 - * 即: commentObj['_data']['a']['_data']['b'] 与 obj['a']['b'] 是对应的 - * 在此意义下, 两者的结构是一致的 - * 在commentObj没有被定义的obj的分支, 会取defaultcobj作为默认值 - * 因此在深度优先遍历时,维护 - * field="['a']['b']" - * cfield="['_data']['a']['_data']['b']" - * vobj=obj['a']['b'] - * cobj=commentObj['_data']['a']['_data']['b'] - * cobj - * cobj = Object.assign({}, defaultcobj, pcobj['_data'][ii]) - * 每一项若未定义,就从defaultcobj中取 - * 当其是函数不是具体值时,把args = {field: field, cfield: cfield, vobj: vobj, cobj: cobj}代入算出该值 - * 得到的叶节点的结构如下 - * tr>td[title=field] - * >td[title=comment,cobj=cobj:json] - * >td>div>input[value=thiseval] - * 返回结果 - * 返回一个对象, 假设被命名为tableinfo - * 在把一个 table 的 innerHTML 赋值为 tableinfo.HTML 后 - * 再调 tableinfo.listen(tableinfo.guids) 进行绑定事件 - * @param {Object} obj - * @param {Object} commentObj - * @returns {{"HTML":String,"guids":String[],"listen":Function}} - */ - editor_mode.prototype.objToTable_ = function (obj, commentObj) { - // 表格抬头 - var outstr = ["\n条目注释值\n"]; - var guids = []; - var defaultcobj = { - // 默认是文本域 - _type: 'textarea', - _data: '', - _string: function (args) {//object~[field,cfield,vobj,cobj] - var thiseval = args.vobj; - return (typeof(thiseval) === typeof('')) && thiseval[0] === '"'; - }, - // 默认情况下 非对象和数组的视为叶节点 - _leaf: function (args) {//object~[field,cfield,vobj,cobj] - var thiseval = args.vobj; - if (thiseval == null || thiseval == undefined) return true;//null,undefined - if (typeof(thiseval) === typeof('')) return true;//字符串 - if (Object.keys(thiseval).length === 0) return true;//数字,true,false,空数组,空对象 - return false; - }, - } - /** - * 深度优先遍历, p*即为父节点的四个属性 - * @param {String} pfield - * @param {String} pcfield - * @param {Object} pvobj - * @param {Object} pcobj - */ - var recursionParse = function (pfield, pcfield, pvobj, pcobj) { - var keysForTableOrder={}; - var voidMark={}; - // 1. 按照pcobj排序生成 - if (pcobj && pcobj['_data']){ - for (var ii in pcobj['_data']) keysForTableOrder[ii]=voidMark; - } - // 2. 对每个pvobj且不在pcobj的,再添加到最后 - keysForTableOrder=Object.assign(keysForTableOrder,pvobj) - for (var ii in keysForTableOrder) { - // 3. 对于pcobj有但是pvobj中没有的, 弹出提示, (正常情况下editor_file会补全成null) - // 事实上能执行到这一步工程没崩掉打不开,就继续吧.. - if(keysForTableOrder[ii]===voidMark){ - if(typeof id_815975ad_ee6f_4684_aac7_397b7e392702==="undefined"){ - alert('comment和data不匹配,请在群 HTML5造塔技术交流群 959329661 内反馈') - console.error('comment和data不匹配,请在群 HTML5造塔技术交流群 959329661 内反馈') - id_815975ad_ee6f_4684_aac7_397b7e392702=1; - } - pvobj[ii]=null; - } - var field = pfield + "['" + ii + "']"; - var cfield = pcfield + "['_data']['" + ii + "']"; - var vobj = pvobj[ii]; - var cobj = null; - if (pcobj && pcobj['_data'] && pcobj['_data'][ii]) { - // cobj存在时直接取 - cobj = Object.assign({}, defaultcobj, pcobj['_data'][ii]); - } else { - // 当其函数时代入参数算出cobj, 不存在时只取defaultcobj - if (pcobj && (pcobj['_data'] instanceof Function)) cobj = Object.assign({}, defaultcobj, pcobj['_data'](ii)); - else cobj = Object.assign({}, defaultcobj); - } - var args = {field: field, cfield: cfield, vobj: vobj, cobj: cobj} - // 当cobj的参数为函数时,代入args算出值 - for (var key in cobj) { - if (key === '_data') continue; - if (cobj[key] instanceof Function) cobj[key] = cobj[key](args); - } - // 标记为_hide的属性不展示 - if (cobj._hide)continue; - if (!cobj._leaf) { - // 不是叶节点时, 插入展开的标记并继续遍历, 此处可以改成按钮用来添加新项或折叠等 - outstr.push(["--------", field, "\n"].join('')); - recursionParse(field, cfield, vobj, cobj); - } else { - // 是叶节点时, 调objToTr_渲染 - var leafnode = editor_mode.objToTr_(obj, commentObj, field, cfield, vobj, cobj); - outstr.push(leafnode[0]); - guids.push(leafnode[1]); - } - } - } - // 开始遍历 - recursionParse("", "", obj, commentObj); - var checkRange = function (cobj, thiseval) { - if (cobj._range) { - return eval(cobj._range); - } - if (cobj._select) { - return cobj._select.values.indexOf(thiseval)!==-1; - } - if (cobj._bool) { - return [true,false].indexOf(thiseval)!==-1; - } - return true; - } - var listen = function (guids) { - // 每个叶节点的事件绑定 - guids.forEach(function (guid) { - // tr>td[title=field] - // >td[title=comment,cobj=cobj:json] - // >td>div>input[value=thiseval] - var thisTr = document.getElementById(guid); - var input = thisTr.children[2].children[0].children[0]; - var field = thisTr.children[0].getAttribute('title'); - var cobj = JSON.parse(thisTr.children[1].getAttribute('cobj')); - var modeNode = thisTr.parentNode; - while (!editor_mode._ids.hasOwnProperty(modeNode.getAttribute('id'))) { - modeNode = modeNode.parentNode; - } - input.onchange = function () { - editor_mode.onmode(editor_mode._ids[modeNode.getAttribute('id')]); - var thiseval = null; - if (input.checked != null) input.value = input.checked; - try { - thiseval = JSON.parse(input.value); - } catch (ee) { - printe(field + ' : ' + ee); - throw ee; - } - if (checkRange(cobj, thiseval)) { - editor_mode.addAction(['change', field, thiseval]); - editor_mode.onmode('save');//自动保存 删掉此行的话点保存按钮才会保存 - } else { - printe(field + ' : 输入的值不合要求,请鼠标放置在注释上查看说明'); - } - } - // 双击表格时 - // 正常编辑: 尝试用事件编辑器或多行文本编辑器打开 - // 添加: 在该项的同一级创建一个内容为null新的项, 刷新后生效并可以继续编辑 - // 删除: 删除该项, 刷新后生效 - // 在点击按钮 添加/删除 后,下一次双击将被视为 添加/删除 - var dblclickfunc=function () { - if(editor_mode.doubleClickMode==='change'){ - if (cobj._type === 'event') editor_blockly.import(guid, {type: cobj._event}); - if (cobj._type === 'textarea') editor_multi.import(guid, {lint: cobj._lint, string: cobj._string}); - } - if(editor_mode.doubleClickMode==='add'){ - editor_mode.doubleClickMode='change'; - addfunc() - } - if(editor_mode.doubleClickMode==='delete'){ - editor_mode.doubleClickMode='change'; - deletefunc() - } - } - input.ondblclick = dblclickfunc - var doubleClickCheck=[0]; - thisTr.onclick = function(){ - var newClick = new Date().getTime(); - var lastClick = doubleClickCheck.shift(); - doubleClickCheck.push(newClick); - if(newClick-lastClick<500){ - dblclickfunc() - } - } - var deletefunc=function(){ - editor_mode.onmode(editor_mode._ids[modeNode.getAttribute('id')]); - if (checkRange(cobj, null)) { - editor_mode.addAction(['delete', field, undefined]); - editor_mode.onmode('save');//自动保存 删掉此行的话点保存按钮才会保存 - } else { - printe(field + ' : 该值不允许为null,无法删除'); - } - } - var addfunc=function(){ - editor_mode.onmode(editor_mode._ids[modeNode.getAttribute('id')]); - - var mode = document.getElementById('editModeSelect').value; - - // 1.输入id - var newid=prompt('请输入新项的ID(仅公共事件支持中文ID)'); - if (newid == null || newid.length==0) { - return; - } - - // 检查commentEvents - if (mode !== 'commonevent') { - // 2.检查id是否符合规范或与已有id重复 - if (!/^[a-zA-Z0-9_]+$/.test(newid)){ - printe('id不符合规范, 请使用大小写字母数字下划线来构成'); - return; - } - } - - var conflict=true; - var basefield=field.replace(/\[[^\[]*\]$/,''); - if (basefield==="['main']"){ - printe("全塔属性 ~ ['main'] 不允许添加新值"); - return; - } - try { - var baseobj=eval('obj'+basefield); - conflict=newid in baseobj; - } catch (ee) { - // 理论上这里不会发生错误 - printe(ee); - throw ee; - } - if (conflict){ - printe('id已存在, 请直接修改该项的值'); - return; - } - // 3.添加 - editor_mode.addAction(['add',basefield+"['"+newid+"']",null]); - editor_mode.onmode('save');//自动保存 删掉此行的话点保存按钮才会保存 - } - }); - } - return {"HTML": outstr.join(''), "guids": guids, "listen": listen}; - } - - /** - * 返回叶节点形如 - * tr>td[title=field] - * >td[title=comment,cobj=cobj:json] - * >td>div>input[value=thiseval] - * 参数意义在 objToTable_ 中已解释 - * @param {Object} obj - * @param {Object} commentObj - * @param {String} field - * @param {String} cfield - * @param {Object} vobj - * @param {Object} cobj - */ - editor_mode.prototype.objToTr_ = function (obj, commentObj, field, cfield, vobj, cobj) { - var guid = editor.guid(); - var thiseval = vobj; - var comment = String(cobj._data); - - var charlength = 10; - // "['a']['b']" => "b" - var shortField = field.split("']").slice(-2)[0].split("['").slice(-1)[0]; - // 把长度超过 charlength 的字符改成 固定长度+...的形式 - shortField = (shortField.length < charlength ? shortField : shortField.slice(0, charlength) + '...'); - - // 完整的内容转义后供悬停查看 - var commentHTMLescape = editor.HTMLescape(comment); - // 把长度超过 charlength 的字符改成 固定长度+...的形式 - var shortCommentHTMLescape = (comment.length < charlength ? commentHTMLescape : editor.HTMLescape(comment.slice(0, charlength)) + '...'); - - var cobjstr = Object.assign({}, cobj); - delete cobjstr._data; - // 把cobj塞到第二个td的[cobj]中, 方便绑定事件时取 - cobjstr = editor.HTMLescape(JSON.stringify(cobjstr)); - - var outstr = ['', shortField, '', - '', shortCommentHTMLescape, '', - '
', editor_mode.objToTd_(obj, commentObj, field, cfield, vobj, cobj), '
\n', - ]; - return [outstr.join(''), guid]; - } - - editor_mode.prototype.objToTd_ = function (obj, commentObj, field, cfield, vobj, cobj) { - var thiseval = vobj; - if (cobj._select) { - var values = cobj._select.values; - var outstr = [''); - return outstr.join(''); - } else if (cobj._input) { - return ["\n"].join(''); - } else if (cobj._bool) { - return ["\n"].join(''); - } else { - var num = 0;//editor_mode.indent(field); - return ["\n'].join(''); - } - } - editor_mode.prototype.indent = function (field) { var num = '\t'; if (field.indexOf("['main']") === 0) return 0; @@ -429,7 +130,7 @@ editor_mode = function (editor) { //console.log(objs_) }); //只查询不修改时,内部实现不是异步的,所以可以这么写 - var tableinfo = editor_mode.objToTable_(objs[0], objs[1]); + var tableinfo = editor.table.objToTable(objs[0], objs[1]); document.getElementById('table_3d846fc4_7644_44d1_aa04_433d266a73df').innerHTML = tableinfo.HTML; tableinfo.listen(tableinfo.guids); editor.drawPosSelection(); @@ -472,7 +173,7 @@ editor_mode = function (editor) { }); } //只查询不修改时,内部实现不是异步的,所以可以这么写 - var tableinfo = editor_mode.objToTable_(objs[0], objs[1]); + var tableinfo = editor.table.objToTable(objs[0], objs[1]); document.getElementById('table_a3f03d4c_55b8_4ef6_b362_b345783acd72').innerHTML = tableinfo.HTML; tableinfo.listen(tableinfo.guids); @@ -486,7 +187,7 @@ editor_mode = function (editor) { //console.log(objs_) }); //只查询不修改时,内部实现不是异步的,所以可以这么写 - var tableinfo = editor_mode.objToTable_(objs[0], objs[1]); + var tableinfo = editor.table.objToTable(objs[0], objs[1]); document.getElementById('table_4a3b1b09_b2fb_4bdf_b9ab_9f4cdac14c74').innerHTML = tableinfo.HTML; tableinfo.listen(tableinfo.guids); if (Boolean(callback)) callback(); @@ -499,7 +200,7 @@ editor_mode = function (editor) { //console.log(objs_) }); //只查询不修改时,内部实现不是异步的,所以可以这么写 - var tableinfo = editor_mode.objToTable_(objs[0], objs[1]); + var tableinfo = editor.table.objToTable(objs[0], objs[1]); document.getElementById('table_b6a03e4c_5968_4633_ac40_0dfdd2c9cde5').innerHTML = tableinfo.HTML; tableinfo.listen(tableinfo.guids); if (Boolean(callback)) callback(); @@ -512,7 +213,7 @@ editor_mode = function (editor) { //console.log(objs_) }); //只查询不修改时,内部实现不是异步的,所以可以这么写 - var tableinfo = editor_mode.objToTable_(objs[0], objs[1]); + var tableinfo = editor.table.objToTable(objs[0], objs[1]); document.getElementById('table_e260a2be_5690_476a_b04e_dacddede78b3').innerHTML = tableinfo.HTML; tableinfo.listen(tableinfo.guids); if (Boolean(callback)) callback(); @@ -525,7 +226,7 @@ editor_mode = function (editor) { //console.log(objs_) }); //只查询不修改时,内部实现不是异步的,所以可以这么写 - var tableinfo = editor_mode.objToTable_(objs[0], objs[1]); + var tableinfo = editor.table.objToTable(objs[0], objs[1]); document.getElementById('table_b7bf0124_99fd_4af8_ae2f_0017f04a7c7d').innerHTML = tableinfo.HTML; tableinfo.listen(tableinfo.guids); if (Boolean(callback)) callback(); @@ -538,7 +239,7 @@ editor_mode = function (editor) { //console.log(objs_) }); //只查询不修改时,内部实现不是异步的,所以可以这么写 - var tableinfo = editor_mode.objToTable_(objs[0], objs[1]); + var tableinfo = editor.table.objToTable(objs[0], objs[1]); document.getElementById('table_e2c034ec_47c6_48ae_8db8_4f8f32fea2d6').innerHTML = tableinfo.HTML; tableinfo.listen(tableinfo.guids); if (Boolean(callback)) callback(); diff --git a/_server/editor_table.js b/_server/editor_table.js index 2756363c..32b5aa3d 100644 --- a/_server/editor_table.js +++ b/_server/editor_table.js @@ -96,7 +96,7 @@ editor_table_wrapper = function (editor) { * @param {Object} commentObj * @returns {{"HTML":String,"guids":String[],"listen":Function}} */ - editor_table.prototype.objToTable_ = function (obj, commentObj) { + editor_table.prototype.objToTable = function (obj, commentObj) { // 表格抬头 var outstr = [editor.table.title()]; var guids = []; @@ -154,7 +154,7 @@ editor_table_wrapper = function (editor) { recursionParse(field, cfield, vobj, cobj); } else { // 是叶节点时, 调objToTr_渲染 - var leafnode = editor_table.objToTr_(obj, commentObj, field, cfield, vobj, cobj); + var leafnode = editor.table.objToTr(obj, commentObj, field, cfield, vobj, cobj); outstr.push(leafnode[0]); guids.push(leafnode[1]); } @@ -175,7 +175,7 @@ editor_table_wrapper = function (editor) { * tr>td[title=field] * >td[title=comment,cobj=cobj:json] * >td>div>input[value=thiseval] - * 参数意义在 objToTable_ 中已解释 + * 参数意义在 objToTable 中已解释 * @param {Object} obj * @param {Object} commentObj * @param {String} field @@ -183,7 +183,7 @@ editor_table_wrapper = function (editor) { * @param {Object} vobj * @param {Object} cobj */ - editor_table.prototype.objToTr_ = function (obj, commentObj, field, cfield, vobj, cobj) { + editor_table.prototype.objToTr = function (obj, commentObj, field, cfield, vobj, cobj) { var guid = editor.guid(); var thiseval = vobj; var comment = String(cobj._data); @@ -204,12 +204,12 @@ editor_table_wrapper = function (editor) { // 把cobj塞到第二个td的[cobj]中, 方便绑定事件时取 cobjstr = editor.HTMLescape(JSON.stringify(cobjstr)); - var tdstr = editor_mode.objToTd_(obj, commentObj, field, cfield, vobj, cobj) + var tdstr = editor.table.objToTd(obj, commentObj, field, cfield, vobj, cobj) var outstr = editor.table.tr(guid, field, shortField, commentHTMLescape, cobjstr, shortCommentHTMLescape, tdstr) return [outstr, guid]; } - editor_table.prototype.objToTd_ = function (obj, commentObj, field, cfield, vobj, cobj) { + editor_table.prototype.objToTd = function (obj, commentObj, field, cfield, vobj, cobj) { var thiseval = vobj; if (cobj._select) { var values = cobj._select.values; diff --git a/editor-mobile.html b/editor-mobile.html index 67c58418..6e516541 100644 --- a/editor-mobile.html +++ b/editor-mobile.html @@ -527,6 +527,7 @@ if (location.protocol.indexOf("http")!=0) { + diff --git a/editor.html b/editor.html index 391c4745..1367f96d 100644 --- a/editor.html +++ b/editor.html @@ -510,6 +510,7 @@ if (location.protocol.indexOf("http")!=0) { +