# text-popup **Repository Path**: johnnylearns/text-popup ## Basic Information - **Project Name**: text-popup - **Description**: Show Text In Popup Modal Window - **Primary Language**: TypeScript - **License**: 0BSD - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-09-17 - **Last Updated**: 2026-09-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ![Text-Popup.png](https://wafer-1257318448.cos.ap-guangzhou.myqcloud.com/Text-Popup.png) # Text Popup 把笔记里**可放大的区块**单独放大到弹窗里阅读,交互与 Obsidian 内置的图片放大(lightbox)一致。 可放大的区块有八类:手写的**块级 HTML**、**围栏代码块**、**标注(Callout)**、**`$$` 数学块**、**图片**、**引用块(`> …`)**、**表格**、**Canvas 白板**。除手写 HTML 外都是原生内容、不需要任何额外标记;其中四类(代码块 / Callout / 数学块 / 图片)本身就有右上角的控制图标,本插件把放大图标加进那条图标里(位于 ``「编辑这个模块」的左侧;图片则在原生「放大」图标左侧),引用块没有原生控制图标,图标由本插件自己画在块的右上角,表格与 Canvas 的图标容器也由本插件自己建(Obsidian 不给它们控制图标)。 ## 用法 ### 手写的块级 HTML 在笔记中用块级 HTML 标签把想放大的内容包起来: ```html
这是要放大的第一行 这是要放大的第二行
``` 在**实时预览**中把鼠标移到这个块上,右上角会出现两个图标:左边是本插件的**放大图标**(双箭头),右边是 Obsidian 自带的「编辑这个模块」(``)。点击左边的放大图标,弹窗即显示该块内的文字。 - 用 `Esc`、点击弹窗外的遮罩、或点击弹窗右上角的关闭按钮都可以关闭。 - 弹窗**铺满整个 Obsidian 窗口**(与内置图片放大同一尺寸基准),适合演示笔记时把重点单独凸显出来。 - 弹窗**标题栏显示来源笔记名**,便于演示时溯源;笔记名固定使用主题文字色,不受设置里的「弹窗文字颜色」影响。同一个笔记里有多个可放大区块时,标题栏还会附带**「当前 / 总数」序号**(例如 `我的笔记 · 2 / 5`);只有一个时**不加序号**,与 1.0.2 的标题完全一致。 - 打开后可用 **`←` / `→` 在同一个笔记的全部可放大区块之间切换**(八类区块混在一起、按文档顺序),不用关掉弹窗再去找下一个图标。规则与 Obsidian 内置的图片放大(lightbox)一致:只用左右两个键;在最后一个按 `→` 环绕回第一个,在第一个按 `←` 环绕到最后一个;**空块**(点了不会弹窗的块)不参与切换。切换后正文会**回到顶部**,而已调整的**字号 / 缩放会保持**,方便连续阅读;`Alt`+点击的**视图缩放则会复位**(它的锚点属于上一块内容)。 - 弹窗底部有控制条,可临时调整**字号**与**缩放**,以及一键**恢复默认**。文字在窗口里自动居中;内容超出窗口时在弹窗内滚动。 - 弹窗里默认**按语法渲染块内的 HTML 与 Markdown**:``、``、``、`` 等标签按语义显示,块内的 `**粗体**`、`# 标题`、`- 列表`、`> 引用`、`| 表格 |`、`` `行内代码` `` 都会正常渲染;`[[笔记]]` 可点击跳转,`![[图片]]` 与 `![](图.png)` 能显示出图。 - 弹窗内的排版复用 Obsidian 阅读视图的样式(内容容器带 `markdown-rendered` 类),因此观感与阅读视图一致,标题、列表等会随字号 / 缩放等比放大。 - 按住 **`Alt`(macOS 上是 `Option`)点击正文**,会把内容**放大到 2 倍**,并把**点击处移到画布中间**(点击处离文档边缘太近、滚动范围不够时尽量居中)—— 与 reveal.js 的缩放插件同一手感;再按住 `Alt` 点一下即**还原**,并回到放大前看到的滚动位置。放大 / 还原都走一段 **500ms 的过渡**(缓动 + 逐帧插值),不是瞬间跳变:被点中的那处会**沿直线**滑到画布中心,中途再点一下就从当前状态接着走,不会跳一下重来。系统开了「减少动态效果」时过渡自动跳过,直接给结果。放大后(不放大时也能用:宽表格、宽图片放不下时同样管用)**按住空格拖拽**可平移画布,**焦点落在底部控制条按钮上也照常生效**。这两个手势只作用于正文区,不影响底部控制条,正文里的 `[[链接]]` 也不会因为 `Alt`+点击而跳转;图片同样吃这个放大(底部控制条的「字号 / 缩放」对图片则仍然无效)。控制条的「恢复默认」会把字号、缩放与视图缩放一起复原。代价是**空格不再激活控制条按钮**(`Enter` 照旧可以):弹窗打开时焦点本就由核心自动落在第一个按钮上,把空格留给平移是唯一能让手势稳定的做法。 - 按住 **`Ctrl`(macOS 上是 `Command`)滚动鼠标滚轮**(或触控板双指缩放)可**以指针处为锚**缩放视图,手感与 Obsidian 内置的**图片查看器**一致:倍数区间 **1× ~ 10×**,每格约 ±0.67(触控板更细,靠连续帧累加);缩放**瞬时生效**、没有过渡,连续滚动不会被反复打断;缩回 **1×** 即回到「一屏装下」的原位。**放大后不按修饰键直接滚轮就是平移**(内容变大了,弹窗本来就滚得动),按住空格拖拽也照旧可用。图片、Canvas、Excalidraw 嵌入都吃这个手势(它们与文字走同一套视图缩放)。放大期间正文拥有自己的**绘制边界**,缩回 1× 时不会残留上一帧的白边。 ### 代码块 / Callout / 数学块 这三类是 Obsidian 原生区块,**不需要任何额外标记**,按平时写法写出来就有放大图标: ````markdown ```typescript const answer = 42; ``` > [!NOTE] 标题 > Callout 的正文 $$ a+b = c $$ ```` 在**实时预览**中把鼠标移到它们上面,右上角就会出现本插件的放大图标。图标长在哪个位置取决于区块类型: - **Callout / 数学块** → 出现**两个**图标:左边是本插件的放大图标,右边是 Obsidian 自带的「编辑这个模块」(``)。 - **代码块** → 放大图标在右上角的**语言名 / 复制 chip 里**(也就是 ```` ```typescript ```` 那个 chip),是 chip 里的第二个图标;只有语言被 `mermaid` / `base` 这类处理器接管时,才会像上面那样出现在 `` 左侧(此时这块由处理器渲染成图 / 数据库视图,不再是普通代码块)。 弹窗里的显示效果与编辑器所见一致: - **代码块** → 带语法高亮与核心复制按钮的代码块; - **Callout** → 真正的 Callout(类型图标 + 标题 + 正文); - **数学块** → 排版好的公式(首次打开需要动态加载 MathJax,可能会多等一下)。 三类各自有开关(见下方「设置项」),关掉后该类的图标会立刻消失、也不再计入方向键的候选总数。 ### 引用块 Markdown 的引用块(`> …`)同样是原生内容,**不需要任何额外标记**: ```markdown > 君子曰:“大德不官,大道不器,大信不约,大时不齐。” > 三王之祭川也,皆先河而后海。 ``` 在**实时预览**中把鼠标移到引用块的任意一行上,块的**右上角**就会出现本插件的放大图标(与核心给代码块 / 图片的图标同一套胶囊皮肤、同一套定位,只是它由本插件自己画上去)。点它打开弹窗,正文是**带引用条的渲染结果**(`MarkdownRenderer` 渲染出的 `
`),不是字面的 `>`。 几条与写法有关的规则: - **整段算一条**:连续的 `>` 行(含引用里的标题、列表、围栏、嵌套 `> >`)合成一条候选,一个引用块只有一个图标。 - **只有 `> ` 的空引用行**(连在引用段尾部)不产候选、也不挂图标 —— 点开只会是一屏空白。它仍算进区间,只是不成条。 - **懒惰续行不算进区间**:`> a` 的下一行不写 `>` 时,Obsidian 仍把它画在引用条里,但本实现按 `>` 前缀断句(与 Callout 同一取舍),弹窗里会少显示那一行。 - **引用行里的图片**不单独成条,由外层引用块这一条覆盖(进去照样能看到图)—— 与「Callout 内的图片不单独成条」同一口径。 - **引用块里的围栏**(行首 `>` 后接三反引号)不另算代码块、也不挂代码块 chip 的图标,整段只有引用块那一个图标。 引用块有单独开关(见下方「设置项」的「放大引用块」),关掉后图标会立刻消失、也不再计入方向键的候选总数。 > 与另外六类的差别:其余几类的图标都插在**核心已经建好的**容器 / chip 里(表格那处的容器也是本插件自己建的,见下方「表格」),引用块连容器都没有 —— 它的图标由一个 CodeMirror 装饰器承载(实现细节见「实现要点」)。 ### 表格 Markdown 表格(`| a | b |` + 分隔行)同样是原生内容,**不需要任何额外标记**: ```markdown | 中文 | 词 | 例句 | | ---- | ---- | ---- | | 我的 | mine | The dog is mine. | ``` 在**实时预览**中把鼠标移到表格上,表格**右上角**就会出现本插件的放大图标(与核心给代码块 / 图片的图标同一套胶囊皮肤、同一套定位)。点它打开弹窗,正文是**真正的表格**(`MarkdownRenderer` 渲染出的 `
`,有表头与边框),单元格字号也跟随弹窗的「字号 / 缩放」。 表格的图标与另外几类有一处不同,值得单独说明: - **图标容器是本插件自己建的**。Obsidian 给表格 widget 建的容器(`.cm-table-widget`)里**没有** `.embed-actions` —— 核心的「编辑这个模块」图标只给嵌入笔记 / 代码块 / 数学块 / HTML 块建,不给表格建。所以本插件在表格本体(`.table-wrapper`)里自己建一个同形容器再插按钮:位置、尺寸、悬停皮肤全部复用核心那套,只是「悬停显形」这条要自己补(核心的显隐规则里显式写明了 `:not(.cm-table-widget, …)`)。 - **表格表头行必须顶格**(行首不能有空格):实时预览只给顶格的表头行建表格 widget。带前导空格的写法(含「`- item` + 空行 + 2 空格缩进的表」,那两行在编辑器里只是列表项里的普通文字)既不产候选、也没有图标,两边一致。 - **只在表格本体(而不是整个块容器)上定位**:表格 widget 的容器常被拉满整行宽,锚在它上面图标会飘到编辑区右缘、离表格很远;锚在表格本体右上角则始终贴着表格。 - **表格右上角那枚图标会盖住表头最后一格的右上角约 28×24 px**(未悬停时透明但占位)—— 与引用块图标那条限制同性质。它不重叠核心自己的「+ 列」按钮(在表格右缘**外侧**)与列拖拽手柄(在表头上方)。 - **表格改动会重建 DOM**:在单元格里改字是原地更新(图标不动),但**插入 / 删除行列**等结构化改动会让核心重建表格 DOM,图标先消失、随即被重扫补回(150 ms 防抖内)。 表格有单独开关(见下方「设置项」的「放大表格」),关掉后图标会立刻消失、也不再计入方向键的候选总数。 ### 图片 图片同样是 Obsidian 原生内容,**不需要任何额外标记**,按平时写法写出来就有放大图标: ```markdown ![说明文字](图片.png) ![[图片.png]] ``` 在**实时预览**中把鼠标移到图片上,右上角会出现**三个**图标,从左到右依次是: 1. **本插件的放大图标**(双箭头)—— 用本插件的弹窗显示这张图; 2. Obsidian 自带的**放大**(放大镜)—— 仍是 Obsidian 自己的图片查看器,本插件不碰它; 3. Obsidian 自带的**编辑这个模块**(``)。 两个放大图标是**兄弟节点**、各自独立:点原生那个走 Obsidian 的方式,点本插件那个走弹窗,互不干扰。本插件的图标插在原生「放大」的**左侧**,与 `.embed-actions` 里其它区块「本插件图标在最左」的排列保持一致。 弹窗里的图片**按 Obsidian 阅读视图的方式显示**(同样交给核心的 `MarkdownRenderer` 渲染),并计入方向键的候选总数 —— 可以像其它区块一样用 `←` / `→` 在「代码块 / Callout / 数学块 / HTML 块 / 图片 / 引用块 / 表格 / Canvas」之间连续翻。 弹窗里图片的**尺寸口径与 Obsidian 自带的图片放大(lightbox)一致**,两条都是一样的: - **按可用高度整体装下**:宽高双约束、等比缩放,一张图不会高过一屏、也不会在弹窗里出现滚动条;小图**不放大**(仍按自然尺寸居中)。唯一差别是核心会给图片四周留 8px 内边距、弹窗不留,所以同一张图在弹窗里会略大一点点。 - **忽略尺寸语法**:`![x](a.png)` 与 `![x|300](a.png)`、`![x|600x200](a.png)`、`![[a.png|200]]` 在弹窗里渲染结果完全相同(核心的图片放大也一样:它在源头就不带尺寸)。也就是说尺寸语法只在笔记里(编辑器 / 阅读视图)生效,弹窗里一律按原图比例显示。 - 这条口径的**粒度是「弹窗里出现的每一个 ``」**:Callout / 表格 / 引用块 / HTML 块**内部**的图同样按弹窗的可用高度收缩,不只是「单独一张图」的条目。 支持的写法与位置: | 写法 | 是否支持 | | --- | --- | | `![说明文字](图.png)`、`![说明文字\|120](图.png)` | ✅ 独立行、列表行(`- `)都支持 | | `![[图.png]]`、`![[图.png\|100]]`、`![[图.png\|图注]]` | ✅ 同上 | | `![x](https://…/a.png)` 外链图片 | ✅ 外链不看扩展名 | | **引用行**(`> ![x](p.png)`)里的图片 | ❌ 由外层**引用块**这一条覆盖(进去照样能看到图,见「引用块」);那个引用行上的图标是引用块的放大图标,不是图片的 | | `` 一类**行内 HTML 包裹**的图片 | ❌ 这类图片没有原生图标条,不单独成条 | | **行内代码**(`` `![x](p.png)` ``、`` `![[图.png]]` ``)里的图片 | ❌ 在实时预览里它只是一段文字(`span.cm-inline-code`),没有原生图标条,因此不单独成条 | | **Callout 内**的图片 | ❌ 由外层 Callout 这一条覆盖(进去照样能看到图) | | **表格单元格**里的图片 | ❌ 实测它们没有原生图标条,不单独成条 | | **缩进代码块里**的图片(顶格 4 空格、或相对所在列表项多出 4 列) | ❌ 实测没有原生图标条,不单独成条(列表项内的 4 空格是**正常嵌套**,照样支持 —— 见「已知限制 → 缩进怎么算」) | | **嵌入笔记**(`![[某笔记]]`)里的图片 | ❌ 候选集来自外层笔记文本,在那里点开也定位不到,因此不注入图标 | | `![[x.pdf]]` / `![[x.mp4]]` 等非图片嵌入 | ❌ 不在本次范围 | 图片有单独开关(见下方「设置项」的「放大图片」),关掉后图片上的图标会立刻消失、也不再计入方向键的候选总数。 ### Canvas 白板 `![[白板.canvas]]` 同样是原生内容,**不需要额外标记**:鼠标移到嵌入上,右上角会出现本插件的放大图标(Canvas 没有原生控制图标,那个容器由本插件自己建)。 弹窗里显示的是**只读快照**,而不是 Obsidian 给嵌入画的那张缩略图(核心的嵌入是一张 `svg.canvas-minimap`:只有轮廓、没有文字、没有交互,放大它等于放大一张缩略图)。快照按画布坐标 1:1 画出: - **文字节点**的 Markdown(节点里的 `**粗体**`、`[[链接]]`、`![[图片]]`、`$公式$` 都按笔记里的样子渲染)、**文件节点**(`![[文件]]`,笔记 / 图片都出)、**外链节点**(可点击)、**组**(背景色块 + 标题)、**连线**(按 `fromSide` / `toSide` 锚点,`toEnd` 为 `none` 时不画箭头),节点的颜色(`1`–`6` 或十六进制)与笔记里的画布一致; - **一屏装下**:快照整体等比缩到弹窗内容区里(**只缩不放**,小画布按原尺寸居中),放大仍然用弹窗既有那两条手势(`Ctrl`/`Command`+滚轮、`Alt`+点击)。因为画出来的是矢量 DOM,放大后文字依旧清晰;节点文字**固定 16px**、不跟随弹窗字号(节点盒的宽高来自画布 JSON,字号一变文字就会被裁掉);节点里的文字与核心画布**同一条口径** —— 内容不足节点高时**垂直居中**,内容多时**从上排**; - **缩小的笔记卡片也只出那一节**:卡片在画布里用「缩小至标题…」/「缩小至块…」后,弹窗里同样是那一节(`.base` 卡片的「固定视图…」、PDF 卡片的 `#page=N` 同理)—— 画布 JSON 里的 `subpath` 会拼进那条内嵌链接,交给核心同一套 embed 管线去切,本插件不自己解析 Markdown;subpath 解析不到(标题改名 / 块 id 被删)时退回整篇,与核心画布一致; - **完全没有写回路径**:快照只是本插件自建的 DOM,拖拽节点、双击文字都不会改动 `.canvas` 文件,也没有选中 / 编辑 / 缩放画布本体这些能力(见「已知限制 → Canvas 的边界」)。 关掉设置里的「放大 Canvas」后,笔记里的画布图标立刻消失、也不再计入方向键的候选总数(与表格那一条同法);关掉「渲染 HTML 与 Markdown」时,画布显示文件名而不是空白。 ### 命令与右键菜单:把普通 Markdown 转成可放大的块 不想手写 HTML 标签时,选中一段普通 Markdown 文本,用两个命令直接转换。**命令面板**与**编辑器右键菜单**里都有这两项(没有选区时命令不可用,右键菜单里也不出现): | 命令 | 作用 | | --- | --- | | `Popup Selected Text` | 把选中的 Markdown 包成一个块(单行选区用「单行文本包裹标签」,默认 `p`;含换行时用「多行文本包裹标签」,默认 `div`),实时预览里立刻出现放大图标 | | `Unpopup Selected Text` | 反向操作:去掉最外层标签,并把块内的 HTML 还原成 Markdown | `Popup Selected Text` 的**行内**转换规则: | 选区里的写法 | 转成 | | --- | --- | | `**粗体**` `__粗体__` | `粗体` | | `*斜体*` `_斜体_` | `斜体` | | `==高亮==` | `高亮` | | `~~删除线~~` | `删除线` | | `` `行内代码` `` | `行内代码` | | `[文字](https://…)` | `文字` | | `` `` | `https://…` / `a@b.com`(autolink;邮箱形态补 `mailto:`) | | 已经写好的 HTML 标签(如 ``) | 原样保留 | 链接只转**带 scheme 的绝对 URL**(`https:`、`mailto:`、`obsidian:` 等)—— 它在编辑器 / 阅读视图 / 导出里都是真正可点的 ``。**相对链接**(`[t](u)`、`[a](笔记.md)`、`[a](#标题)`)、**内链**(`[[笔记]]`)、**嵌入与图片**(`![[图片]]`、`![alt](src)`)、**带 `title` 或目标含括号的链接**、行内公式一律**留原文**:它们要么需要 Obsidian 解析(转成裸 `` 会指错、丢交互),要么按「宁可漏判,也不改脏」不转。 **列表**、**表格**与**标题**会被转成真正的块级元素(这三类留原文时都会出问题,见下面的「为什么要转」)。 先看**列表**(无序 / 有序 / 任务列表都认,缩进支持的嵌套层数不限): | 选区里的写法 | 转成 | | --- | --- | | `- a` `* a` `+ a` | `
  • a
` | | `1. a` `1) a` | `
  1. a
`;首项编号不是 1 时带 `start`,例如 `3. a` → `
    ` | | `- [ ] a` `- [x] b` | `
      `,每个任务项是 `
    • ` + ``,勾选项多一个 `checked` | | 缩进更深的 ` - b` | 嵌套的 `
        ` / `
          `(反向还原时每层补 2 空格缩进) | | 项里的 `**粗体**`、`==高亮==`、`` `代码` `` | 走**同一套**行内转换,上面那张表照旧适用 | 再看**表格**(GFM 表格;表头行 + 分隔行 + 数据行): | 选区里的写法 | 转成 | | --- | --- | | `\| a \| b \|` + `\| - \| - \|` | `
ab
` | | 再有数据行 `\| 1 \| 2 \|` | 追加 `12` | | `\| :--- \| ---: \| :---: \|` | 该列带 `align="left"` / `align="right"` / `align="center"`(表头与数据行的单元格都带) | | 格里的 `**粗体**`、`` `代码` `` | 走**同一套**行内转换,上面那张表照旧适用 | | 格里的 `\|`(反斜杠 + 竖线) | 转成字面竖线(表格不会被自己格内的竖线切断) | 判定与 Obsidian 保持一致(少转一格也不多转一格): - **表格必须「起一个块」**:表头行前面得是空行(或选区开头)。`text` 紧邻表头时不成表格,只是一段带竖线的普通文字 —— 反向还原时会自动补上这个空行,所以往返稳定。 - **表头行与分隔行都必须含 `|`**:`a` + `---`、以及 `| a |` + `---` 都会被 Obsidian 渲染成 **Setext 标题**(阅读视图里是 `h2`,不是表格)。单列表格要写 `| a |` + `| - |`。 - **列数取分隔行**:表头行与数据行按它截断 / 补空,所以「表头 2 格 + 分隔行 1 格」是一张单列表格。 - **首尾竖线可省、横线数量不限**:`a | b` + `--- | ---`、`| a | b |` + `| - | - |` 都是表格。 - **数据行的终止条件**:空行、缩进 ≥4 空格、不含 `|` 的行、列表行、`>` 引用行、`#` 标题行。表格**后面**不需要空行(下一行直接是独立段落)。两个分隔行不会「开第二张表」,表中间长得像分隔行的那一行只是普通数据行。 - **表格先于列表判定**:`- a | b` + `--- | ---` 是表格(与 Markdown 的块规则顺序一致)。 最后看**标题**(ATX 标题,1–6 个 `#`): | 选区里的写法 | 转成 | | --- | --- | | `## 标题` | `

标题

` | | `# H` … `###### H` | `

H

` … `
H
`(按 `#` 的个数分级) | | `## T ##` / `## T ###` | `

T

`(尾部闭合串去掉) | | `#⇥T` / `# T` | `

T

`(标记后的分隔空白归一) | | `#` / `###` | `

` / `

`(空标题合法) | | 标题文字里的 `**粗体**`、`` `代码` `` | 走**同一套**行内转换,上面那张表照旧适用 | | 标题行下面的正文行 | 照常转换,**落在标题元素外面**(`

标题


正文`) | 判定与 Obsidian 保持一致(少转一格也不多转一格): - **缩进 0–3 个空格**:` # T`、` ### T` 是标题;缩进 4 个空格或含 Tab 是缩进代码块,不转。 - **`#` 后面必须是空白或行尾**:`#nospace` 不是标题;7 个 `#`(`####### x`)也不是标题;`\# x`(反斜杠转义)同样不转。 - **尾部闭合串**必须是「空白 + 纯 `#`」:`# T #` 转成 `T`,而 `# T #extra` 是标题「T #extra」、`# T#` 是「T#」、`# T \#` 是「T \#」(那个 `#` 被转义,不算闭合串)。 - **标题先于表格判定**:`# x | y` + `| - | - |` 里第一行是**标题**(核心的实测结论),不是表格。 - **表格可以紧跟在标题后面**:`## T` 的下一行直接写表头行(无空行)照常成表格 —— 标题不会「懒惰续行」把表头行吃掉。这是相对 1.0.9 及之前**放宽的一条表格前置条件**,其余前置条件(段落 / 列表行 / 引用行后面不成表格)不变。 - **列表项里、引用行里的标题不处理**:`- # T` 里的 `#` 保持字面(列表项内容按行内走,是既有边界);`> #### T` 留给原文(弹窗里 `>` 会被序列化成 `>`,本来就不会变成引用)。 - **Setext 标题(`S` + `===` / `---`)本次不转**:往返必然变形,且 `===` / `---` 与分隔线、表格分隔行共享字符。`S` + `===` 在弹窗里落在一个段落里(`===` 是字面文本),所以「不转」的代价只是形态没升级、内容不会被吞。 为什么要转:Obsidian 的**编辑器**不解析 HTML 块里的 Markdown,`**粗体**` 在块里会原样显示成星号。`[[笔记]]`、`![[图片]]`、`$公式$`、**相对链接**(`[文字](链接)` 这类没有 scheme 的目标)与 `> ` **引用**有意不转:留原文时弹窗里反而能点、能出图、能渲染(编辑器里则仍显示符号)。**带 scheme 的绝对 URL 链接**(`[文字](https://…)`、``)是唯一例外:它转成真 `
` 后在编辑器 / 阅读视图 / 导出里都一致可点,留原文反而只有弹窗里才可点。 **列表、表格与标题是三类例外**,因为「行首 + 换行」这些条件是它们成立的前提,而生成结果把正文压成了一行 —— 留原文就会出问题(编辑器里不解析、弹窗里也认不出): - `- a
- b` 不会变成列表; - `| a |
| - |` 不会变成表格(弹窗的判据是「表头行的**下一行**是分隔行」,被压成一行后这个条件不再成立); - `## T
正文` 会**把后文变成标题**:`##` 的作用范围是「到本行结束」,而 `
` 只是行内元素、不结束标题 —— 弹窗里于是只剩一个 `

`,标题文字里被塞进了整段后文(`data-heading` 属性里就能看到 `
` 与后文)。 所以这三类必须转成真正的 HTML 元素。其余「留原文还能在弹窗里渲染」的写法(图片、公式、引用,以及**相对链接 / 内链**)一概不动 —— **绝对 URL 链接**是后加的唯一例外(HTML 块在编辑器 / 阅读视图 / 导出里都要自足,转成真 `
` 才四处一致可点)。注意标题与引用这两类过去在文档里被放在一起(都算「块级 Markdown,有意不转」),现在**只有引用留原文** —— 标题独占一行时留原文确实能渲染,但多行选区里它后面必然还跟着内容。 外层标签按选区**有没有换行**分流:单行选区用「单行文本包裹标签」(默认 `p`),含换行时用「多行文本包裹标签」(默认 `div`);正文含块级元素(列表 / 标题)时一律按多行处理(原因见下): ```html

只有一行

``` ```html
第一行
第二行

第二行之后是一个空行
``` 列表元素同样压在正文那一行里,块内依然没有空行: ```html
文字
  • 第一项
  • 第二项

文字
``` 表格也一样压在正文那一行里(表格必须「起一个块」,前面的 `text` 与它之间用两个 `
` 表达那个空行): ```html
文字

第一列第二列
一二
``` 标题也压在正文那一行里,**后文留在标题元素外面**(这是这个功能要解决的问题:`##` 留在原文里会连后文一起吃掉): ```html

标题


正文
``` 选区**只有一行**、但正文里含块级元素时(例如只选中 `- a` 或 `## 标题` 这一行),也会改用「多行文本包裹标签」:`