# EnhancedMarkdown v3.9.1

Typecho 增强版 Markdown 解析器插件，基于 **Parsedown + ParsedownExtra** 解析引擎。

完全替换系统默认 HyperDown 解析器，从根本上解决语法支持不足和显示故障问题。

## 支持语法

### 标准 Markdown
- 标题（# H1 ~ ###### H6）、加粗、斜体、链接、图片
- 代码（行内 \`code\` 和代码块）、列表、引用、分割线

### GFM 扩展
- **表格**：完整支持 GFM 表格语法（对齐、合并）
- **删除线**：`~~删除线~~` → ~~删除线~~
- **任务列表**：`- [x]` 已完成 / `- [ ]` 未完成

### Markdown Extra 扩展
- **脚注**：`[^1]` + `[^1]: 说明文字`
- **定义列表**：`术语\n: 定义`
- **缩写词**：`*[HTML]: Hyper Text Markup Language`

### 自定义扩展
| 语法 | 效果 | 说明 |
|------|------|------|
| `^text^` | <sup>text</sup> | 上标 |
| `~text~` | <sub>text</sub> | 下标（单个波浪线） |
| `==text==` | <mark>text</mark> | 高亮标记 |
| `[toc]` | 自动生成目录 | TOC 目录树 |
| `![alt](url =WxH)` | 带尺寸图片 | 支持宽高设定 |
| `:::type\n内容\n:::` | 容器/提示块 | 见下方说明 |

### 数学公式（KaTeX）

使用 KaTeX 前端渲染，支持行内和块级 LaTeX 公式：

```markdown
行内公式：$E = mc^2$

块级公式：
$$
\sum_{i=1}^{n} x_i^2
$$
```

### 代码语法高亮（Prism.js）

使用 Prism.js 前端渲染，自动为围栏代码块添加语法着色，支持 200+ 编程语言：

````markdown
```php
<?php
echo "Hello, World!";
```
````

> 内置全部语言支持，按需加载：仅当代码块存在时才加载 Prism.js 资源，无代码块的页面零开销。

### Mermaid 图表

使用 Mermaid.js 前端渲染，支持流程图、时序图、甘特图等：

````
```mermaid
graph TD
    A[开始] --> B{判断}
    B -->|是| C[执行]
    B -->|否| D[结束]
```
````

> **交互功能**：图表渲染完成后，可在图表框内使用鼠标滚轮自由缩放、拖拽平移查看细节，右上角常驻还原按钮（🔄 图标）可一键回到初始视角。移动端支持单指拖拽和双指捏合缩放。

### 容器/提示块类型
```
:::tip 提示标题
提示内容
:::
```
支持类型：`tip` `info` `warning` `danger` `note` `success` `details` `quote`

## 安装

1. 将 `EnhancedMarkdown` 文件夹上传至 `usr/plugins/` 目录
2. 登录 Typecho 后台 → 插件管理 → 启用 **EnhancedMarkdown**
3. 在插件设置中按需开关各项功能

## 文件结构

```
EnhancedMarkdown/
├── Plugin.php          # 插件主入口（Hook注册、配置、CSS/JS注入）
├── Parser.php          # 增强解析器（基于 Parsedown 扩展）
├── Parsedown.php       # Parsedown 核心引擎
├── ParsedownExtra.php  # Parsedown Extra 扩展
├── katex/              # KaTeX 数学公式渲染库
│   ├── katex.min.js
│   ├── katex.min.css
│   ├── auto-render.min.js
│   └── fonts/          # KaTeX 字体文件（仅 WOFF2 格式）
├── mermaid.min.js      # Mermaid 图表渲染库
├── prism/              # Prism.js 代码语法高亮库
│   ├── prism.js        # 核心 + 全部语言支持
│   └── prism.css       # 主题样式
└── README.md           # 说明文档
```

## 配置项

所有功能均可通过后台插件设置独立开关：
- TOC 目录支持
- 标题锚点 ID 格式（Slug 格式 / 数字格式，仅在 TOC 启用时生效）
- 任务列表支持
- 上标语法 ^text^
- 下标语法 ~text~
- 高亮标记 ==text==
- 容器/提示块 :::type
- 图片尺寸 ![alt](url =WxH)
- 数学公式 $...$ 和 $$...$$（KaTeX）
- KaTeX 资源来源（插件本地文件 / CDN 网址，可自定义 CDN 基础路径）
- Mermaid 图表 ```mermaid
- Mermaid 资源来源（插件本地文件 / CDN 网址，可自定义 CDN 基础路径）
- 代码语法高亮（Prism.js，支持 200+ 编程语言）

## 更新日志

### v3.9.1 (2026-06-08)
- **修复**：图片尺寸语法 `![alt](url =WxH)` 在 URL 与 `=WxH` 之间存在空格时无法解析，整张图片不被渲染——重写 `inlineImage()` 方法为预处理模式，在调用父类解析前先从 `](...)` 括号内剥离 `=WxH` 参数，使父类能正常匹配标准 Markdown 图片语法，再在返回结果中注入 `width`/`height` 属性
- **影响范围**：仅修改 `Parser.php` 的 `inlineImage()` 方法，不影响无尺寸参数的普通图片，向后完全兼容

### v3.9.0 (2026-06-08)
- **新增**：Mermaid 图表框内缩放/平移交互功能——图表自适应渲染完成后，可在框内使用鼠标滚轮缩放（光标跟随，范围 0.05x~20x）、鼠标拖拽平移（1:1 跟随），移动端支持单指拖拽和双指捏合缩放
- **新增**：右上角还原按钮（SVG 循环箭头图标，常驻显示）——点击平滑过渡回初始视角，防止缩放/平移后"找不到图"
- **新增**：`.mermaid-zoom-wrapper` 缩放交互容器 CSS 样式（overflow:hidden 裁剪、cursor:grab 提示可拖拽）
- **新增**：`wrapMermaid()` / `initZoom()` JavaScript 函数，通过 MutationObserver 异步监听 Mermaid 渲染完成并动态包裹缩放容器，兼容本地模式和 CDN 模式
- **优化**：不影响无 Mermaid 图表的页面，缩放交互代码仅在 `$hasMermaid` 标志为 true 时加载
- **影响范围**：仅修改 `Plugin.php`，不修改 `Parser.php`，向后完全兼容

### v3.8.2 (2026-06-08)
- **修复**：代码语法高亮仅少数语言生效——`prism.js` 中 Autoloader 插件与内联打包的全部语言定义冲突，Autoloader 尝试从不存在的路径 AJAX 加载语言文件导致高亮失败。移除 Autoloader 插件，保留全部 300+ 种语言语法定义
- **影响范围**：仅替换 `prism/prism.js`，不修改其他文件，向后完全兼容

### v3.8.1 (2026-05-28)
- **修复**：PHP/HTML 代码块内 `<span class="token tag">` 被主题 `.tag` 类样式（用于标签云）污染，导致出现白色背景、圆角、间距异常的视觉故障——在 `prism.css` 中新增针对代码块内 `.token.tag` 的布局属性重置规则，使用 `!important` 覆盖主题样式泄漏
- **影响范围**：仅消除代码块内视觉污染，不影响复制功能、代码高亮颜色、主题标签云

### v3.8.0 (2026-05-27)
- **新增**：KaTeX 资源来源选择配置项，支持"插件本地文件"或"CDN 网址"两种加载方式，默认使用本地文件
- **新增**：Mermaid 资源来源选择配置项，支持"插件本地文件"或"CDN 网址"两种加载方式，默认使用本地文件
- **新增**：KaTeX CDN 基础路径配置项，用户只需输入到目录级别（如 `https://cdn.jsdelivr.net/npm/katex@0.17.0/dist/`），插件自动拼接文件名
- **新增**：Mermaid CDN 基础路径配置项，用户只需输入到目录级别（如 `https://cdn.jsdelivr.net/npm/mermaid@11.15.0/dist/`），插件自动拼接文件名
- **新增**：`getResourceUrl()` 私有静态方法，根据配置动态返回本地或 CDN 资源 URL，CDN 路径为空时自动回退本地文件
- **优化**：完全向后兼容，默认配置下行为与 v3.7.0 完全一致

### v3.7.0 (2026-05-27)
- **重构**：代码块 CSS 从浅色主题替换为暗色主题（#1e1e1e 背景 + #2d2d2d 顶栏），所有代码块统一视觉风格
- **重构**：`Parser.php` `blockFencedCodeComplete()` — 所有非 Mermaid 代码块（无论有无标题）统一包裹为暗色主题容器，自动提取语言名并显示在顶栏
- **新增**：代码块顶栏（语言名 + 复制按钮 + 可选标题），替代原 Prism.js 工具栏
- **新增**：`copyCode()` JavaScript 函数，点击复制按钮提取代码内容写入剪贴板，显示"已复制"反馈
- **优化**：`prism/prism.css` 适配暗色主题容器结构，隐藏 Prism.js Toolbar（由自定义顶栏替代），保留全部 Token 颜色和子插件样式

### v3.6.1 (2026-05-27)
- **修复**：Prism.js 行号（Line Numbers）插件未生效——`<pre>` 元素缺少 `line-numbers` CSS 类，`Prism.util.isActive()` 返回 `false`，在 `parse()` 方法中增加正则注入
- **优化**：代码块右上角工具栏（语言名称/复制按钮）改为常驻显示（`opacity:1`），无需悬停代码块即可看到按钮
- **优化**：工具栏按钮默认无外边框，鼠标悬停时显示 `rgba(255,255,255,.3)` 外边框，交互更清晰

### v3.6.0 (2026-05-27)
- **新增**：代码语法高亮功能（Prism.js），自动为 ` ```language ` 围栏代码块添加语法着色，支持 200+ 编程语言
- **新增**：插件设置新增「代码语法高亮（Prism.js）」配置项，默认启用
- **优化**：按需加载模式——仅当代码块存在时才加载 Prism.js CSS/JS 资源，无代码块的页面零开销
- **注意**：Prism.js 同时匹配 `lang-xxx` 和 `language-xxx` 前缀，与现有类名转换逻辑完全兼容

### v3.5.3 (2026-05-27)
- **修复**：PHP 8.2+ 环境下产生 `Deprecated: Creation of dynamic property` 弃用警告——`Parser.php` 构造函数中 `$this->BreaksEnabled`（大写 B）与父类 `Parsedown::$breaksEnabled`（小写 b）大小写不一致，改用父类官方 API `setBreaksEnabled(true)`
- **修复**：GFM 自动换行功能（单个换行符 → `<br>`）此前实际未生效（`breaksEnabled` 未被正确赋值）

### v3.5.2 (2026-05-27)
- **修复**：标题锚点 ID 使用不可预测的 `toc-N` 数字格式，主题 JS 无法构建有效锚点链接——新增 `generateSlug()` 方法生成可读 slug ID（如 `hello-world`、`安装步骤`），支持中文、去重
- **新增**：插件设置新增「标题锚点 ID 格式」配置项，支持 Slug 格式（推荐）和旧版数字格式（toc-N）切换，仅在 TOC 启用时生效
- **新增**：脚注样式（`.footnotes`、`.footnote-ref`、`.footnote-backref`），确保任何主题下脚注都有可读样式
- **兼容性**：与 Docusaurus 主题等第三方主题的 TOC、SmoothScroll、代码块功能兼容性修复

### v3.5.1 (2026-05-26)
- **修正**：纯 HTML 内容（`<div>` 内无 Markdown 语法）被错误包裹为 `<pre><code>` 转义输出——新增 `containsMarkdownSyntax()` 检测方法，纯 HTML 内容跳过 `text()` 递归调用，避免 HTML 实体编码异常
- **影响**：`<div style="...">文本</div><audio>...</audio>` 等 HTML 标签恢复正常渲染

### v3.5.0 (2026-05-26)
- **修正**：HTML 块级元素（`<center>`、`<details>`、`<div>` 等）内的 Markdown 语法不渲染——新增 `blockMarkupComplete()` 方法，对白名单标签自动解析内部 Markdown
- **修正**：代码块标题不显示——新增 `blockFencedCode()` 提取 `title="..."` 参数，`blockFencedCodeComplete()` 渲染标题栏
- **修正**：容器方括号标题语法不支持（`:::note[自定义标题]`）——扩展 `blockContainer()` 正则，兼容 Docusaurus Admonition 语法

### v3.4.2 (2026-05-26)
- **修正**：`:::type` 容器内容不显示——`blockContainerComplete()` 中 `text` 与 `rawHtml` 属性冲突，Parsedown 渲染时 `isset($Element['text'])` 优先于 `rawHtml`，导致容器 div 为空
- **修正**：容器语法（`:::info`）紧跟段落时被 ParsedownExtra 的 `blockDefinitionList` 错误拦截——将 Container 注册为 `:` 字符最高优先级处理器（`array_unshift`），确保三冒号语法优先匹配

### v3.4.1 (2026-05-26)
- **修正**：Mermaid 图表 `blockFencedCodeComplete()` 数组路径错误（`element.text` → `element.element`），导致 Mermaid 转换从未执行，图表始终显示为代码块
- **修正**：数学公式 `postprocessMath()` 输出缺少 KaTeX 定界符（`\[...\]` / `\(...\)`），导致 auto-render 无法识别公式内容，公式始终显示为纯文本
- **移除**：Mermaid div 元素的冗余 `text` 属性，避免与 `rawHtml` 冲突导致双重输出

### v3.4.0 (2026-05-26)
- **优化**：KaTeX 和 Mermaid 资源改为按需加载，仅当页面实际包含公式/图表时才加载对应库
- **优化**：KaTeX CSS 移至 `<head>` 中按需输出，避免公式闪烁（FOUC）
- **优化**：KaTeX 字体精简为 WOFF2 格式，字体体积从 1.2MB 减至 300KB
- **影响**：纯文字文章页面不再加载任何额外资源（优化前 ~4.5MB → 0KB）

### v3.3.0 (2026-05-26)
- **新增**：数学公式语法支持（`$...$` 行内 / `$$...$$` 块级），基于 KaTeX 前端渲染
- **新增**：Mermaid 图表语法支持（` ```mermaid ` 代码块），基于 Mermaid.js 前端渲染
- **新增**：footer hook 注入 KaTeX/Mermaid JS 脚本（按需加载）
- **新增**：数学公式预处理器/后处理器，保护公式内容不被 Markdown 解析干扰
- **新增**：Mermaid 代码块处理器，自动将 `language-mermaid` 转为 `<div class="mermaid">`
- **新增**：插件配置新增「数学公式」和「Mermaid 图表」开关

### v3.2.0 (2026-05-26)
- **修正**：`lang-` 前缀兼容正则扩展为 `[\w-]+`，支持含连字符的语言标识（如 objective-c）
- **修正**：统一 README 与 Plugin.php 版本号
- **改进**：所有增强语法基于 Parsedown 原生扩展机制，不再使用正则后处理
- **改进**：CSS 样式补充完善

### v3.0.0 (2026-05-26)
- **重大升级**：解析引擎从 HyperDown 切换为 Parsedown + ParsedownExtra
- **修复**：彻底解决占位符冲突导致的显示故障
- **新增**：完整 GFM 表格支持（对齐、合并）
- **新增**：脚注语法 [^1]
- **新增**：定义列表语法
- **新增**：缩写词语法 *[ABBR]: definition
- **改进**：所有增强语法基于 Parsedown 原生扩展机制，不再使用正则后处理
- **改进**：CSS 样式补充完善

### v2.0.0
- 初始版本，基于 HyperDown 扩展

## 许可证

BSD License
