Skip to content

Releases: xykong/flux-markdown

v1.12.136

11 Feb 12:43

Choose a tag to compare

新增功能

双模式显示 (Preview/Source Toggle)

实现预览模式与源码模式的快速切换功能。

QuickLook 预览:

  • 右上角新增源码/预览切换按钮 (文档图标 ↔ 眼睛图标)
  • 源码模式使用 highlight.js 实现 Markdown 语法高亮
  • 显示原始 Markdown 源码,支持选择和复制
  • 快捷键 Cmd+Shift+M 快速切换模式
  • 切换模式时保持当前滚动位置

主应用:

  • 添加与 QuickLook 一致的浮动按钮组 (源码 + 主题切换)
  • View 菜单中新增 "Show Source/Show Preview" 选项
  • 支持键盘快捷键 Cmd+Shift+M 切换

用户体验优化:

  • 源码视图留白最小化 (外层 padding: 0px, 代码块 padding: 6px)
  • 表格内容 TOC 按钮下移 40px (top: 20px → 60px),避免与功能按钮重叠
  • 等宽字体显示源码,适配浅色/深色主题

技术实现:

  • 新增 ViewMode 枚举管理当前显示模式
  • 新增 window.renderSource() 函数渲染带语法高亮的源码
  • 新增 source-view.css 样式文件

安装方式

Homebrew (推荐)

brew update
brew upgrade markdown-preview-enhanced

手动安装

下载 DMG 文件,拖拽到 Applications 文件夹即可。

v1.11.130

11 Feb 10:24

Choose a tag to compare

Added

  • 链接导航 (Link Navigation): 为 Markdown 文档添加完整的链接跳转支持。
    • 主应用 (Main App):
      • 外部 URL 链接 (http/https) 在默认浏览器中打开
      • 相对路径链接 (`../file.md`, `./dir/file.md`) 正确解析并打开目标文件
      • 页内锚点链接 (`#section`) 平滑滚动定位
      • 支持所有文件类型 (`.md`, `.sql`, `.py`, `.json` 等)
    • QuickLook 预览 (Preview):
      • 由于 macOS 沙盒限制,所有链接点击时显示优雅的 toast 提示而非打扰用户的对话框
      • Toast 位置: 顶部居中
      • 自动关闭: 3 秒后淡出消失
      • 非阻塞: 用户可继续浏览文档
      • 防重复: 同时只显示一个 toast
      • 提示文案: "QuickLook 预览模式不支持链接跳转 / 请双击 .md 文件用主应用打开以使用完整功能"
    • 技术实现:
      • 端到端桥接: JavaScript 通过 `window.webkit.messageHandlers.linkClicked` 将链接信息传递给 Swift
      • 页内锚点: JavaScript 直接处理平滑滚动
      • 文件路径解析: 支持相对路径、绝对路径、`file://` 协议等多种格式
      • 日志增强: 所有链接点击操作记录到系统日志,便于调试

v1.10.127

09 Feb 16:29

Choose a tag to compare

Added

  • 滚动位置记忆: 自动记录每个 Markdown 文件的滚动位置,下次打开时自动恢复到上次查看的位置。
    • 支持记录最近 100 个文件的位置
    • 使用 LRU(最近最少使用)策略自动管理存储
    • 存储位置通过 App Group 在主 App 和 QuickLook 扩展间共享

v1.10.124

09 Feb 13:12

Choose a tag to compare

无待发布的变更

v1.10.119

09 Feb 03:51

Choose a tag to compare

[1.10.119] - 2026-02-09

Fixed

  • WKWebView 进程泄漏: 修复 QuickLook 扩展中 WKWebView 进程累积导致严重内存占用问题。
    • 问题表现: 预览多个 Markdown 文件时,会累积创建 30+ 个 "Web Content" 进程,每个进程占用 60-80MB,总内存占用达 2GB+。
    • 根本原因:
      1. 缺少 WKProcessPool 共享机制
      2. 自定义 URL scheme handler (local-resource://) 阻止了进程共享(WebKit 安全设计)
      3. WKWebView 没有被正确清理,导致 retain cycle 无法打破
    • 解决方案:
      1. 添加共享的 WKProcessPool 用于所有 WKWebView 实例
      2. 移除不必要的 local-resource:// 自定义 scheme handler(图片已通过 data URL 传递)
      3. viewWillDisappeardeinit 中添加完整的 WKWebView 清理逻辑:
        • stopLoading() 停止所有加载
        • 移除 navigationDelegatemessageHandler 引用,打破 retain cycle
        • 清理手势识别器
        • 从视图层级移除并释放引用
    • 修复效果:
      • Web Content 进程数量从 30+ 降低到 1-2 个
      • 总内存占用从 2GB+ 降低到 100-200MB
      • 进程和内存占用保持稳定,不再累积
    • 影响范围:
      • QuickLook 扩展 (PreviewViewController.swift)
      • 主应用 (MarkdownWebView.swift) - 为一致性也添加了共享 process pool

[1.9.118] - 2026-02-09

Fixed

v1.8.114

05 Feb 04:55

Choose a tag to compare

Added

  • 页内搜索功能: 为主应用添加完整的页内搜索功能。
    • 功能特性:
      • ✅ 浏览器风格的搜索工具栏 (Cmd+F 触发)
      • ✅ 实时高亮所有匹配项 (黄色背景)
      • ✅ 当前匹配项特殊高亮 (橙色背景)
      • ✅ 匹配计数显示 (如 "3/15")
      • ✅ 上一个/下一个匹配导航
      • ✅ 三种搜索模式:
        • 普通搜索 (默认)
        • 大小写敏感匹配 (Aa 选项)
        • 全字匹配 (ab 选项)
        • 正则表达式搜索 (.* 选项)
      • ✅ 正则表达式错误提示
    • 触发方式:
      • Cmd+F 键盘快捷键
      • View 菜单 → "查找..." / "Find..."
      • 右键菜单 → "查找..." / "Find..."
    • 国际化支持:
      • 英文: "Find..."
      • 简体中文: "查找..."
    • 主题支持: 自动适配亮色/深色模式
    • 注意: QuickLook 预览模式暂不支持搜索功能

Fixed

  • Swift 编译警告: 修复 startAccessingSecurityScopedResource() 返回值未使用的警告

v1.7.112

04 Feb 14:20

Choose a tag to compare

Fixed

  • APP 模式图片显示: 修复双击打开 APP 时本地图片无法显示的问题。

    • 根本原因: 主 APP 缺少图片收集逻辑,且 macOS App Sandbox 限制了文件访问权限
    • 解决方案:
      1. MarkdownWebView.swift 中添加 collectImageData() 方法(与 QuickLook Extension 保持一致)
      2. executeRender() 中调用图片收集并转换为 base64 data URLs
      3. 临时禁用 App Sandbox 以允许读取 Markdown 文件同目录下的图片
    • 支持特性:
      • ✅ 相对路径图片 (./image.png, ../image.png)
      • ✅ 绝对路径图片 (/path/to/image.png)
      • file:// 协议图片
      • ✅ 多种图片格式 (PNG, JPEG, GIF, SVG, WebP, ICO, BMP)
      • ✅ 图片带标题 (![alt](url "title"))
      • ✅ 特殊字符路径 (URL 编码自动处理)
  • Base64 图片显示: ✅ 完全修复 Base64 内嵌图片(data:image/...)无法显示的问题。

    • 根本原因分析:
      1. WKWebView 在沙盒环境中阻止 data: URLs
      2. markdown-it 的 URL 验证拒绝 data:image/svg+xml 等复杂 MIME 类型(核心问题)
    • 解决方案:
      1. loadFileURL 改为 loadHTMLString(允许更灵活的内容加载)
      2. 添加 allowUniversalAccessFromFileURLs 配置到 WKWebViewConfiguration
      3. 关键修复 A: 覆盖 md.validateLink 方法,允许所有 data: URLs 通过 markdown-it 验证
      4. 关键修复 B: 将 Base64 data URLs 转换为 Blob URLs(绕过 WKWebView 的 data: scheme 限制)
    • 验证结果:
      • ✅ Markdown 语法 ![](data:image/png;base64,...) - 完全正常
      • ✅ Markdown 语法 ![](data:image/svg+xml;base64,...) - 完全正常
      • ✅ HTML 标签 <img src="data:image/..."> - 完全正常
      • ✅ 支持所有格式:PNG、JPEG、SVG、GIF、WebP
    • 改进 TypeScript 图片渲染逻辑,明确区分三种图片类型:Base64 内嵌、本地文件、网络 URL
    • 添加全面的单元测试覆盖所有图片类型(26 个测试全部通过)
    • 增强日志输出,显示每个图片的处理过程,便于调试
  • 图片显示: 修复多种图片路径无法显示的问题。

    • 修复绝对文件系统路径(/path/to/image)不显示的问题
    • 修复上级目录相对路径(../image.png)不显示的问题
    • 修复图片带标题(![alt](url "title"))不显示的问题
    • 修复特殊字符路径(image%20(1).png)不显示的问题
    • 修复空格路径(test images/test image.png)不显示的问题
    • 实现方式:Swift 端收集所有图片并转换为 base64 data URL,TypeScript 端使用 base64 替换原始路径
  • 自动更新: 修复安装新版本时报错 "An error occurred while running the updater" 的问题。

    • 使用正确的 Sparkle XPC 服务名称:$(PRODUCT_BUNDLE_IDENTIFIER)-spks$(PRODUCT_BUNDLE_IDENTIFIER)-spki
    • 之前使用的服务名 com.xykong.Markdown.Installer 不符合 Sparkle 规范,导致更新器无法正常运行。

v1.6.102

03 Feb 18:03

Choose a tag to compare

Fixed

  • 自动更新: 修复了一系列更新相关的问题:
    • 实现密钥迁移支持,允许从旧版本平滑更新,添加 SUPublicEDKeyChain 数组同时包含新旧两个公钥
    • 修复签名验证错误 "improperly signed",更新公钥以匹配新生成的 EdDSA 密钥对并重新签名所有更新包
    • 修复安装时报错 "An error occurred while running the updater",使用正确的 Sparkle XPC 服务名称
    • 修复安装时报错 "An error occurred while launching the installer",添加必要的沙盒权限并启用 SUEnableInstallerLauncherService
    • 修复手动检查更新无响应的问题,使用 SPUStandardUpdaterController 替代手动组装的方式

v1.5.87

03 Feb 14:59

Choose a tag to compare

Added

  • 自动更新 (Auto Update): 实现混合更新策略,同时支持 Homebrew 和 DMG 安装用户。
    • Homebrew 用户: 每周自动检查 GitHub API,发现新版本时提示运行 brew upgrade,一键复制更新命令。
    • DMG 用户: 集成 Sparkle 2.8.1 框架,每天自动检查更新,支持 EdDSA 签名验证,自动下载安装。
    • 智能检测: 自动识别安装方式(Homebrew Caskroom vs 手动 DMG),应用对应的更新策略。
    • 安全验证: 使用 EdDSA 签名确保更新来源可信,私钥存储在 .sparkle-keys/(已加入 .gitignore)。
    • 自动化发布: make release 命令现在自动生成 Sparkle 签名、更新 appcast.xml、更新 Homebrew Cask。
    • 新增脚本: generate-sparkle-keys.sh(密钥生成)、generate-appcast.sh(appcast 生成)。
    • 新增文档: docs/AUTO_UPDATE.md 完整使用指南。

Changed

  • 项目结构 (Project Structure): 重组项目目录结构,提升可维护性。
    • 将所有文档整理到 docs/ 目录:docs/features/(功能文档)、docs/testing/(测试文档)。
    • 将所有测试文件整理到 tests/ 目录:tests/fixtures/(测试样本)、tests/scripts/(测试脚本)。
    • 合并相关文档:将 ZOOM_FEATURE.mdZOOM_STATUS.mdQUICK_START_ZOOM.md 合并为 docs/features/ZOOM.md
    • 更新所有文件引用路径,确保文档和脚本中的路径正确。
    • 根目录现在只保留核心项目文件(README、Makefile、配置文件等)。

Added

  • 预览 (Preview): 实现实时文件监控和自动刷新功能。
    • 使用 DispatchSource 监控文件系统事件(写入、删除、重命名)。
    • 当文件被外部编辑器修改时,预览自动更新内容,无需手动关闭并重新打开。
    • 保留滚动位置和缩放级别,提供流畅的用户体验。
    • 正确的生命周期管理,确保资源清理和内存安全。

v1.4.81

14 Jan 12:51

Choose a tag to compare

Added

  • 预览 (Preview): 添加缩放功能。
    • 支持键盘快捷键:Cmd + (放大), Cmd - (缩小), Cmd 0 (重置)。
    • 支持触控板/鼠标滚轮缩放:按住 Cmd 键并滚动。
    • 支持双指拉伸缩放:使用触控板双指拉伸手势进行缩放。
    • 缩放范围:0.5x - 3.0x。
    • 自动保存缩放级别,下次打开时恢复。
  • 安装 (Installation): 实现完全自动化的安装过程。
    • install.sh 脚本现在自动设置应用为 .md 文件的默认处理程序。
    • 自动移除隔离属性 (xattr -cr)。
    • 自动启动应用完成 QuickLook 扩展注册。
    • 支持 make install debug 命令安装调试版本。
    • 使用 duti(如果可用)或 LaunchServices API 设置文件关联。
    • 添加 install, dmg, release, delete-release 伪目标。
    • 增强 app 目标,添加构建日志和指定 arm64 架构。
    • 支持自动检测和构建调试/发布配置。

Changed

  • 文档 (Documentation): 更新安装说明,移除需要用户手动设置默认应用的步骤。
    • 强调安装过程已完全自动化。
    • 添加 make install debug 命令说明。