本文档解释了 Markdown Here 如何在取消渲染过程中将 HTML 转换回 Markdown。与仅将 Markdown 转换为 HTML 的标准 Markdown 处理器不同,Markdown Here 需要支持双向转换以提供其切换功能。有关从 Markdown 到 HTML 的初始渲染信息,请参阅Markdown 渲染管道。
在将 Markdown 渲染为 HTML 时,Markdown Here 不仅转换内容,还会保留原始 Markdown 源以供后续检索。这种方法确保在切换回 Markdown 时保持完美的保真度。
原始 Markdown 使用 Base64 进行编码,以防止在存储到 HTML 属性时出现任何丢失或更改。此编码由 Utils.utf8StringToBase64() 处理。
来源
当 Markdown 被渲染时,它会被包装在一个便于后续取消渲染的结构中
该包装器包含以下关键组件:
markdown-here-wrapper 的 div,它包含所有内容div,其中原始 Markdown 存储在其 title 属性中​),以确保其在电子邮件客户端中得以保留来源
当用户在已渲染内容上触发 Markdown 切换时,会发生以下过程:
此过程中的关键步骤包括:
来源
要取消渲染 Markdown,扩展程序必须首先识别用户光标是否位于已渲染的 Markdown 内容内部。这通过 findMarkdownHereWrapper 函数完成
isWrapperElem 函数通过检查以下内容来确定元素是否为 Markdown Here 包装器:
来源
findElemRawHolder 函数搜索包含原始 Markdown 的 div
此函数
MDH: 开头的元素来源
Markdown Here 监控已渲染内容的变化。如果用户修改了已渲染的 Markdown,然后尝试取消渲染,他们会收到警告。
此功能有助于防止意外丢失对已渲染内容所做的更改。
来源
会特别注意避免取消渲染引用的电子邮件回复中的 Markdown
hasParentElementOfTagName 函数检查包装器是否在 blockquote 内部findElemRawHolder 函数会跳过 blockquote 内部的元素这确保了在回复包含已渲染 Markdown 的电子邮件时,只有用户的新内容会受到切换的影响。
来源
虽然不是取消渲染过程的直接部分,但 Markdown Here 包含一个单独的 MdhHtmlToText 类,用于有限的 HTML 到文本转换。该类主要用于:
该类包含对以下方面的特殊处理:
来源
HTML 到 Markdown 的转换是 Markdown Here 整体切换机制的一部分
切换过程根据内容的当前状态决定是渲染还是取消渲染,从而为用户提供无缝的双向转换体验。
来源
Markdown Here 中的 HTML 到 Markdown 转换采用存储和检索方法,而不是试图从 HTML 中逆向工程 Markdown。通过在渲染过程中保留原始 Markdown,该扩展程序确保了在切换回 Markdown 时,即使是复杂的 Markdown 语法也能完美还原。这种方法在不同的电子邮件客户端和平台上提供了可靠的用户体验,同时避免了直接 HTML 到 Markdown 转换固有的挑战。