From 6fae294403be512a34d15e2ccac4555851bb1b83 Mon Sep 17 00:00:00 2001 From: UmbraCi Date: Fri, 12 Sep 2025 02:11:50 +0800 Subject: [PATCH 1/8] =?UTF-8?q?feat:=20=E7=AE=80=E5=8C=96=E5=A4=9A?= =?UTF-8?q?=E8=A1=8C=E7=BC=96=E8=BE=91=E5=8A=9F=E8=83=BD=E5=B9=B6=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E7=94=A8=E6=88=B7=E4=BD=93=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将复杂的三选项系统简化为单一的enable_multiline布尔开关 - 移除enable_rich_text和text_edit_mode选项,专注于核心的单行/多行编辑需求 - 优化编辑器文本处理逻辑,修复多行文本的编码/解码问题 - 简化示例页面按钮,从5个减少到2个核心功能按钮 - 添加动态节点重新渲染功能,切换模式时立即更新显示效果 - 改进HTML实体处理和浏览器兼容性(处理div元素插入等) - 保持向后兼容性的同时大幅简化API复杂度 - 更新构建配置和开发环境设置 --- .gitignore | 2 + example/2_features.js | 102 +- example/2_features_cn.html | 213 +- example/README_DEV.md | 213 + example/build-examples.js | 180 + package.json | 7 +- pnpm-lock.yaml | 7800 ++++++++++++++++------------------- src/jsmind.option.js | 2 + src/jsmind.util.js | 10 + src/jsmind.view_provider.js | 147 +- style/jsmind.css | 90 + 11 files changed, 4404 insertions(+), 4362 deletions(-) create mode 100644 example/README_DEV.md create mode 100644 example/build-examples.js diff --git a/.gitignore b/.gitignore index f8f575a9..0b414451 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,5 @@ es6/*.js.map types/generated/ .augment/ + +mind-map/* diff --git a/example/2_features.js b/example/2_features.js index e9cb463a..35fdb5ef 100644 --- a/example/2_features.js +++ b/example/2_features.js @@ -1,23 +1,29 @@ var _jm = null; function open_empty() { - var options = { - container: 'jsmind_container', - theme: 'greensea', - editable: true, - log_level: 'debug', - view: { - engine: 'canvas', - draggable: true, - enable_device_pixel_ratio: false, - }, - plugin: { - screenshot: { - background: '#ffffff', + // jsMind实例已在HTML中初始化,这里只需要确保存在 + if (!window._jm) { + var options = { + container: 'jsmind_container', + theme: 'greensea', + editable: true, + enable_multiline: true, // 默认关闭多行编辑以保持兼容性 + log_level: 'debug', + view: { + engine: 'canvas', + draggable: true, + enable_device_pixel_ratio: false, }, - }, - }; - _jm = new jsMind(options); - _jm.show(); + plugin: { + screenshot: { + background: '#ffffff', + }, + }, + }; + _jm = new jsMind(options); + _jm.show(); + } else { + _jm = window._jm; + } } function open_json() { @@ -459,4 +465,64 @@ function prompt_info(msg) { alert(msg); } -open_empty(); +// 多行编辑控制函数 +function toggle_multiline(btn) { + var current_multiline = _jm.options.enable_multiline; + + if (current_multiline) { + // 当前已启用多行,切换为禁用 + _jm.options.enable_multiline = false; + btn.innerHTML = '启用多行编辑'; + + // 重新渲染节点以应用新的渲染模式 + refresh_all_nodes(); + + prompt_info('已禁用多行编辑,当前为普通单行编辑模式(使用input元素)\n\n注意:新的编辑模式将在下次编辑节点时生效'); + } else { + // 当前未启用多行,切换为启用 + _jm.options.enable_multiline = true; + btn.innerHTML = '禁用多行编辑'; + + // 重新渲染节点以应用新的渲染模式 + refresh_all_nodes(); + + prompt_info('已启用多行编辑(使用contenteditable div,Ctrl+Enter完成编辑)\n\n注意:新的编辑模式将在下次编辑节点时生效'); + } +} + +// 刷新所有节点的显示以应用新的渲染模式 +function refresh_all_nodes() { + if (!_jm || !_jm.mind || !_jm.mind.nodes) { + return; + } + + // 遍历所有节点并重新渲染 + var nodes = _jm.mind.nodes; + for (var nodeid in nodes) { + var node = nodes[nodeid]; + if (node && node._data && node._data.view && node._data.view.element && node.topic) { + // 重新渲染节点内容 + _jm.view.render_node(node._data.view.element, node); + } + } + + // 重新计算布局和显示 + _jm.layout.layout(); + _jm.view.show(false); +} + +function show_current_mode() { + var is_multiline = _jm.options.enable_multiline; + + var mode_description = is_multiline + ? '多行编辑模式(contenteditable div,支持换行)' + : '普通编辑模式(input元素,单行文本)'; + + var status_msg = `当前文本编辑模式:${is_multiline ? '多行编辑' : '单行编辑'}\n` + + `模式描述:${mode_description}\n\n` + + `提示:双击节点即可体验当前编辑模式\n` + + `快捷键:多行模式下,Ctrl+Enter完成编辑`; + + prompt_info(status_msg); +} + diff --git a/example/2_features_cn.html b/example/2_features_cn.html index 8da28a92..5033cfcc 100644 --- a/example/2_features_cn.html +++ b/example/2_features_cn.html @@ -4,11 +4,23 @@ jsMind - + + +