Files
MetonaEditor/CHANGELOG.md
T
thzxx 4d6767482e
CI / test-parser (push) Successful in 9m29s
CI / test-core (push) Successful in 9m36s
CI / test-rest (push) Successful in 9m29s
CI / e2e (push) Successful in 9m44s
CI / verify (18.x) (push) Successful in 9m50s
CI / verify (20.x) (push) Successful in 9m50s
CI / verify (24.x) (push) Successful in 9m45s
feat: v0.4.1 — Zen 专注模式宽度可配置 + 5 项修复 + 841 测试
2026-08-09 20:17:25 +08:00

17 KiB
Raw Blame History

Changelog

All notable changes to MetonaEditor will be documented in this file.

[0.4.1] - 2026-08-11

Added

  • zenMaxWidth 配置项: Zen 专注模式内容区宽度可配置(number 为 px / string 原样作为 CSS 值 / false 不限制),默认由硬编码 820px 提升至 960px,经 CSS 变量 --md-zen-max-width 实现实例级隔离。
  • 运行时 API: editor.setZenMaxWidth(width) / editor.getZenMaxWidth() 随时调整专注模式宽度。

Fixed

  • wordWrap: false 配置不生效: 构造函数此前将 _wordWrap 硬编码为 true,忽略配置项,导致初始仍自动换行;现读取配置并在构建时应用 white-space: pre
  • outline: true 启动时不显示大纲面板: 构造函数此前只注册滚动跟踪、未构建面板,须等首次输入才出现;现构造后自动构建,且 setMode() 切换回预览类模式时同步重建。
  • edit 模式初始行号不渲染: _render() 在 edit 模式直接返回导致 gutter 为空;现 edit 模式也维护行号装订线。
  • exportTool 卸载泄漏: unuse('exportTool') / destroy() 此前不清理挂载在实例上的 exportMarkdown / exportHTML / exportPDF 方法;现卸载时一并删除。
  • searchReplace 替换后字数统计过期: replaceOne / replaceAll 直接改值后未刷新状态栏统计;现调用 _updateWordCount()

Added

  • 回归测试 15 个(zenMaxWidth 默认/数字/字符串/false/运行时更新/启动应用、wordWrap: false 生效、outline 构造自动构建与模式切换重建、edit/preview 模式初始行号、exportTool 卸载清理),总数 826 → 841。

[0.4.0] - 2026-08-11

Added

  • Playwright 浏览器冒烟测试: e2e/ 目录(本地宿主页 + 真实 Chromium),22 项断言覆盖渲染 / 输入实时预览 / 工具栏命令 / 三模式切换 / 主题 / 搜索插件 / 状态栏 / 撤销 / 实例 API,并自动检测页面 console 错误。npm run test:e2e 一键运行,CI 新增 e2e job。
  • sideEffects: false: 便于消费方打包器 tree-shaking。

Fixed

  • 实例 locale 未作用于全部 UI 文案: 状态栏、工具栏 tooltip、右键菜单、大纲标题、插入链接/图片占位、模式切换播报此前混用全局 t;浏览器默认语言与实例 locale 不一致时显示错误语言。现 _i18nCtx 提前至 DOM 构建前创建,所有 UI 文案统一走实例 t()

Changed

  • MeEditor.destroy() 全面复位: 额外清理全局静态钩子(beforeCreate/afterCreate/beforeChange 等),并自动重建内部全局插件注入钩子,保证 destroy()MeEditor.use() 依旧可用。

Added

  • 回归测试 5 个(实例 locale 决定状态栏/按钮/右键菜单文案、destroy 钩子清理与重建、destroy 后全局插件仍可用),总数 821 → 826。

[0.3.1] - 2026-08-10

Performance

  • 高亮规则缓存: highlight() 不再每次调用重建正则规则表,按语言缓存(registerLanguage 覆盖时自动失效)。
  • 统计增量计算: getStats() / _updateWordCount() / _renderGutter() 基于共同前缀/后缀的差异区间增量计算(含单词边界扩展保证一致),击键时不再对全文做 O(n) 正则。
  • 大纲线性构建: outline 树构建由递归 O(n²) 改为迭代栈 O(n),长文档无延迟。

Changed

  • 拖放图片大小限制: 拖入 >500KB 的图片时 toast 警告且不插入,与 imagePaste 插件行为一致。
  • scrollToLine 真实行高: 使用 getComputedStyle().lineHeight 替代硬编码 22px。
  • undo/redo 光标恢复: 撤销/重做后光标位置 clamp 恢复(不越界)。
  • selectionChange / cursorMove 与浮动工具栏解耦: 事件现无条件触发(floatingToolbar: false 时仍可用)。
  • unregisterShortcut 大小写归一: 注册 Ctrl+B 可用 ctrl+b 注销。
  • toast 动画接入 ANIMATIONS: animation 参数真正应用 enter/leave 变换与时长缓动(slide/fade/scale/bounce/flip/rotate/zoom)。
  • 实例主题订阅随销毁断开: getThemeContext() 新增 dispose()destroy() 时自动断开外部跟随的 MutationObserver / 轮询订阅。

Added

  • 回归测试 20 个(高亮缓存失效 / 增量统计一致性与边界 / outline 树结构配对与长文档 / undo 光标 / selectionChange 解耦 / 快捷键归一 / toast 动画 / 拖放限大小 / 主题 dispose),总数 801 → 821。

[0.3.0] - 2026-08-10

Fixed

  • 脚注 XSS 属性注入: 脚注引用的 fnId[^id] 中的 id)此前未转义直接拼入 href / id 属性,[^a" onclick="x] 可注入事件属性;现经属性级转义,行内引用与脚注区渲染均覆盖。
  • 全局插件静默失效: MeEditor.use('searchReplace' | 'shortcutHelp' | 'imagePaste') 此前在 beforeCreate 钩子安装,但此时 DOM 尚未构建、editor.textarea 不存在,三个依赖 textarea 的插件静默跳过;现改为 afterCreate 注入,DOM 就绪后再安装。
  • 引用链接跨文档串数据: 行内渲染缓存仅以文本为 key,不同文档中相同文本 + 不同 [ref]: url 定义会命中彼此缓存返回错误链接;现缓存 key 附加 refs 指纹(parseMarkdown 预计算,renderTokens 直接调用时兜底)。
  • underline 预览不可见: Ctrl+U 生成的 <u> 此前被解析器转义为字面量 &lt;u&gt;;现解析器白名单透传裸 <u> / </u>(无属性,带属性的 <u onclick=...> 仍被转义,无注入面),代码块 / 行内代码内不受影响。
  • getStatus().locale 与实例不一致: 此前返回全局 locale,实例 setLocale 后状态不跟随;现返回实例 locale,渲染 env 的 locale 字段同步改为实例级。
  • replaceAll 替换串 $ 语义陷阱: replaceAll 的替换文本现按字面处理($ 无特殊含义);replaceAllRegex 保留正则捕获组语义($1)不变。

Changed

  • use() 同名防重: 同名插件重复安装时 warn 并跳过(unuse 后可重新安装),消除全局插件与 config.plugins 重复安装问题。

Added

  • 回归测试 19 个(脚注注入 / 全局插件 / 缓存指纹 / underline / getStatus locale / replaceAll $ / use 防重),总数 782 → 801。

[0.2.5] - 2026-08-09

Fixed

  • npm 发布配置: module / exports.import 不再指向 TS 源码,产物改用标准 .mjs / .cjs 扩展名(此前 "type": "module" 导致 Node 将 .js 产物按 ESM 解析,require() 拿不到任何导出)。
  • XSS 属性注入: 链接/图片的 href/src/alt/title 及代码块 language-* 类与标题属性现经属性级转义(escapeHTML 在浏览器环境不转义双引号,此前的属性拼接存在注入面)。
  • 本地存储串扰: 分隔条比例键改为 metona-editor-divider-${id},多实例互不覆盖。

Added

  • maxLength 生效: 之前仅有类型与默认值,现绑定 textarea maxlength 并对 setValue / insert / replaceAll / replaceAllRegex 截断。
  • zenMode 初始状态: 配置 zenMode: true 启动即进入专注模式(此前仅 toggleZen() 可进入)。
  • 搜索面板大小写 / 全字匹配: matchCase / wholeWord 翻译键此前存在但未实现,现补齐 UI 开关与匹配逻辑(普通与正则模式均支持,中文全字边界感知)。
  • 内置轻量语法高亮: 新模块 src/highlight.ts,零依赖 tokenizer13 种语言,MeEditor.highlight 即插即用,输出 me-hl-* 类。
  • exportPDF: exportTool 新增 editor.exportPDF()(隐藏 iframe + window.print)。
  • imagePaste 尺寸限制: editor.use('imagePaste', { maxSizeKB: 500 }),超限 toast 警告。
  • 性能基准: npm run benchparseMarkdown 1MB ≈ 51mshighlight 200 函数 ≈ 1.2ms)。

Changed

  • core.ts 拆分: 命令、浮动工具栏、右键菜单、大纲 4 组方法拆至独立模块(commands.ts / floating-toolbar.ts / context-menu.ts / outline.ts),core 从 1162 行降至 865 行,API 完全兼容。
  • 插件状态类型收紧: 6 个预设插件的实例状态改用 Symbol 键存储(EditorLike 接口 + pluginState 助手),消灭 (editor as any).__xxx 魔法属性。
  • eslint type-aware: 启用 parserOptions.projectconsistent-type-imports / no-unnecessary-type-assertion 规则,0 errors。
  • CI 并行化: 测试拆分为 parser / core / rest 三个并行 job,另设跨 Node 18/20/24 的 verify jobtypecheck + lint + build)。
  • docs.html / README 补齐: 光标选区 API、浮动工具栏、replaceAll、新事件、内置高亮文档。
  • 版本同步 0.2.4 → 0.2.5,测试 725 → 768。

[0.2.4] - 2026-07-25

Changed

  • Search panel redesigned: Dark-themed glass-morphism design with SVG icons, smooth animation, improved spacing and focus states.
  • README & site install instructions: Complete npm/CDN/ESM/CJS/Browser import examples added.

Fixed

  • CI hang: Removed setInterval polling in floating toolbar; now uses pure event-driven selection detection.
  • Floating toolbar positioning: Corrected coordinate system (viewport→pane-local) for accurate placement near selected text.
  • Floating toolbar toggle button: Now properly disables/enables via toggleFloatingToolbar() API.

[0.2.3] - 2026-07-25

Added

  • German (de) locale: Complete translations for all 60+ UI keys.
  • Floating format toolbar: Auto-shows bold/italic/code/link/strikethrough buttons above text selection.
  • Cursor/selection APIs: getSelectedText(), getCursorPosition(), setCursorPosition(), scrollToLine(), selectLine(), selectAll().
  • Content manipulation APIs: replaceAll(), replaceAllRegex(), lineCount(), getLine().
  • New events: selectionChange and cursorMove emitted for cursor/selection tracking.
  • floatingToolbar config option: Enable/disable floating toolbar (default true).

Changed

  • floatingToolbar added to DEFAULTS and EditorOptions type.
  • 6 locales now: zh-CN, en-US, ja, ko, fr, de.

Fixed

  • onLinkClick type fix: Removed as any cast; properly typed in EditorOptions and DEFAULTS.
  • Version consistency: All files synced to 0.2.3.

[0.2.2] - 2026-07-25

Added

  • French (fr) locale: Complete translations for all 60+ UI keys.
  • Outline scroll tracking: Active heading auto-highlights in outline panel as you scroll.
  • Table auto-format: exec('formatTable') aligns column widths in Markdown tables.
  • Code block title: ```js title=hello.js renders a styled title bar above code blocks.
  • Escaped pipe in tables: \| in table cells no longer splits columns.
  • Custom block token fallback render: Unknown token types now render as <div class="me-block-{type}"> instead of empty string.
  • Gutter incremental update: Line number gutter uses DOM diff instead of full innerHTML replacement.
  • 694 tests (up from 684).

Changed

  • All 6 plugins now use closure-based state — searchReplace, imagePaste, shortcutHelp, fileSystem, autoSave refactored for thread safety.
  • shortcutHelp plugin is now i18n-aware — shortcut descriptions follow the active locale.
  • Context menu labels (Cut/Copy/Paste/Select All) are now i18n-translated across all 5 locales.
  • Warm theme now includes progressBg and closeHoverBg for completeness.
  • Fenced code block regex improved to capture optional info string attributes.

Fixed

  • Plugin this context pollution eliminated for all 6 preset plugins.
  • Context menu labels no longer hardcoded to English.
  • Warm theme missing CSS variable fields restored.

[0.2.1] - 2026-07-25

Added

  • Reference link/image resolution: Full support for [text][ref] and ![alt][ref] syntax with [ref]: url definitions.
  • Right-click context menu: Built-in undo/redo/cut/copy/paste/selectAll with custom item support.
  • RTL (Right-to-Left) CSS support: Full RTL layout for Arabic, Hebrew, Persian and other RTL languages.
  • Japanese (ja) and Korean (ko) locales: Complete translations for all 60+ UI keys.
  • Divider position persistence: Split-view divider ratio saved to localStorage and restored on reload.
  • Regex search support: Toggle regex mode in search panel with .* button.
  • Export HTML with embedded CSS: exportHTML now includes minimal CSS styles for standalone viewing.
  • beforeChange / afterChange lifecycle hooks: Instance and global hooks that fire around content changes.
  • copyAsMarkdown() / copyAsHTML() APIs: Copy editor content to clipboard as Markdown or rich HTML.
  • New test suites: tests/index.test.ts (global API) and tests/styles.test.ts (CSS injection).
  • 684 tests (up from 610), 9 test suites (up from 7).

Changed

  • autoSave plugin refactored: Uses closure-based state per instance instead of this context, preventing state conflicts when the same plugin object is shared across multiple editors.
  • Plugin install() now receives options as second argument for cleaner API.
  • RTL locale detection improved: Now detects RTL by language prefix (e.g., ar-SA → RTL).

Fixed

  • Reference link syntax [text][ref] now correctly resolves to links instead of raw text.
  • Reference image syntax ![alt][ref] no longer produces empty src="".
  • autoSave plugin state isolation when used across multiple editor instances.
  • Footnote definitions no longer incorrectly consumed by reference definition parser.

[0.2.0] - 2026-07-23

Added

  • TypeScript full rewrite: All 12 source modules in TypeScript strict mode with complete type exports.
  • Parser 99% line coverage: Self-built Markdown parser with 14 block-level handlers.
  • parseTokens / renderTokens API: Separate tokenization and rendering for transform pipelines.
  • registerBlockHandler: Extensible block syntax via handler registration.
  • 610 tests: Comprehensive test coverage across 7 suites.
  • Triple emphasis ***text***: Bold+italic combined formatting.
  • Link text inline formatting: Bold, italic, and code within link text.
  • Backslash escape: \*, \_, \\ for literal punctuation.
  • Tab-indented code blocks: Tab or 4-space indented code.

Changed

  • Plugin system v2: Topological sort dependency management, 6 preset plugins.
  • Theme system overhaul: CSS variable-based, instance isolation, external theme following.
  • i18n overhaul: Instance-level locale isolation, plural rules, remote loading.

[0.1.15] - 2026-07-21

Added

  • Parser short and medium-term improvements.
  • Triple emphasis syntax ***bold italic***.
  • Link text inline formatting support.
  • Backslash escape sequences.
  • parseTokens / renderTokens separation API.

[0.1.14] - 2026-07-20

Added

  • Syntax highlighting feature (reverted in 0.1.15).
  • Mermaid.js CDN support in demo page.

[0.1.7] - 2026-07-19

Added

  • Line number gutter with active line highlighting.
  • Smart Enter (list/quote continuation).
  • Bracket auto-close with selection wrapping.
  • Outline panel.

[0.1.6] - 2026-07-18

Added

  • topologicalSort for plugin dependency resolution.
  • validateConfig for plugin configuration validation.
  • editor.unuse() to uninstall plugins.
  • editor.registerShortcut() / unregisterShortcut().
  • editor.toast() notification API.

[0.1.5] - 2026-07-17

Added

  • Instance-level theme context (createInstanceTheme).
  • followExternalTheme / adoptFromParent for external theme following.
  • exportCSSVars / getCSSVariable for theme inspection.
  • applyThemeToElement for scoped theme application.

[0.1.4] - 2026-07-16

Added

  • Setext headings (underlined H1/H2).
  • Nested lists (3+ levels).
  • Indented code blocks (4 spaces / tab).
  • HTML comment passthrough.
  • Entity reference protection.
  • Hard line breaks (2 trailing spaces).
  • Link titles with single quotes.
  • LaTeX math formulas ($inline$ / $$block$$).
  • Footnotes [^id].
  • Definition lists (Term\n: definition).
  • Backtick exact matching (`).
  • Enhanced emoji set (150+).

[0.1.3] - 2026-07-15

Fixed

  • exec custom action support via _customActions.
  • refresh() method for forced re-render.
  • Focus/blur event parameter fixes.

[0.1.2] - 2026-07-14

Added

  • Highlight marker ==text==.
  • Superscript x^2^ and subscript H~2~O.
  • Emoji shortcodes :smile: (100+ emojis).
  • Table column alignment (:---:, ---:).
  • Read-only mode with readOnly config and setReadOnly().

[0.1.0] - 2026-07-10

Added

  • Initial release.
  • Markdown editor with edit/split/preview modes.
  • Self-built parser (CommonMark + GFM).
  • Plugin system with autoSave, exportTool, searchReplace.
  • Theme system (light/dark/auto).
  • i18n (zh-CN/en-US).
  • Toolbar, shortcuts, history stack.