WMD markdown 编辑器 - HTML 到 Markdown 的转换
Posted
技术标签:
【中文标题】WMD markdown 编辑器 - HTML 到 Markdown 的转换【英文标题】:WMD markdown editor - HTML to Markdown conversion 【发布时间】:2010-11-14 20:43:55 【问题描述】:我在一个项目中使用wmd markdown 编辑器,有一个问题:
当我发布包含降价文本区域的表单时,它(如预期的那样)将 html 发布到服务器。但是,说服务器端验证失败,我需要将用户发送回去编辑他们的条目,是否有办法只用降价而不是 html 重新填充文本区域?由于我已经设置好了,服务器只能访问帖子数据(以 html 的形式),所以我似乎想不出一种方法来做到这一点。有任何想法吗?最好是基于非 javascript 的解决方案。
更新:我找到了一个名为 markdownify 的 html 到 markdown 转换器。我想这可能是向用户显示降价的最佳解决方案......欢迎任何更好的选择!
更新 2: 我在 SO 上找到了 this 帖子,我猜有一个选项可以将数据作为 markdown 而不是 html 发送到服务器。简单地将数据作为降价存储在数据库中是否有任何缺点?将它显示给用户(在编辑器之外)怎么样?也许最好将两个版本(html和markdown)都发布到服务器......
已解决:我可以简单地使用php markdown 将markdown 转换为html 服务器端。
【问题讨论】:
【参考方案1】:我建议您只需将文本发送并存储为 Markdown。这似乎是你已经解决的问题。 IMO,将文本存储为 Markdown 会更好,因为您可以安全地删除所有 HTML 标记而不必担心格式丢失 - 这使您的代码更安全,因为使用 XSS 攻击将更加困难(尽管它可能仍然是可能的) - 我只是说这部分会更安全er)。
【讨论】:
如果文本中包含 HTML 示例,剥离所有 HTML 标记是否会导致问题? 或许可以,但接下来只需要确保不要从代码块中剥离任何标签。 只需对它进行 HTML 编码。我不认为任何降价字符都是保留的 html。 @MattDotson:块引用 (> some text
) 是冲突的,链接 URL 也可能被尖括号包围 (<http://example.com>
)。将输入清理与 Markdown 处理分开可能更安全/更明智。
还应该注意的是,根据the official documentation,代码块内容将由符合标准的解析器自动进行HTML编码。【参考方案2】:
需要考虑的一点是,WMD 似乎与某些服务器端 Markdown 实现有某些不同的边缘情况。我确实在这里的预览中看到了一些在提交后出现不同的怪癖(我相信一个这样的案例是试图逃避被反引号包围的反引号)。通过网络发送转换后的预览,您可以确保预览准确无误。
我并不是说你应该做出决定,但这是需要考虑的事情。
【讨论】:
【参考方案3】:试用 Pandoc。它比 Markdownify 更全面、更可靠。
【讨论】:
【参考方案4】:您看到的 HTML 只是一个预览,因此将其存储在数据库中并不是一个好主意,因为您在尝试编辑时会遇到问题。存储两个版本(markdown 和 HTML)也不是一个好主意,因为 HTML 只是一种解释,您在编辑和保持两个版本同步时会遇到同样的问题。
所以最好的办法是将markdown存储在数据库中,然后在显示之前将其转换为服务器端。
您可以为此目的使用PHP Markdown。然而,这并不是您在 javascript 端看到的 100% 完美转换,可能需要一些调整。
Stack Exchange network 使用的版本是 C# 实现,应该有你下载的带有 wmd 版本的 python 实现。
我调整的一件事是新行的呈现方式,所以我在 markdown.php 中进行了更改,以从我拥有的版本的第 626 行开始将一些新行转换为 <br>
:
var $span_gamut = array(
#
# These are all the transformations that occur *within* block-level
# tags like paragraphs, headers, and list items.
#
# Process character escapes, code spans, and inline HTML
# in one shot.
"parseSpan" => -30,
# Process anchor and image tags. Images must come first,
# because ![foo][f] looks like an anchor.
"doImages" => 10,
"doAnchors" => 20,
# Make links out of things like `<http://example.com/>`
# Must come after doAnchors, because you can use < and >
# delimiters in inline links like [this](<url>).
"doAutoLinks" => 30,
"encodeAmpsAndAngles" => 40,
"doItalicsAndBold" => 50,
"doHardBreaks" => 60,
"doNewLines" => 70,
);
function runSpanGamut($text)
#
# Run span gamut tranformations.
#
foreach ($this->span_gamut as $method => $priority)
$text = $this->$method($text);
return $text;
function doNewLines($text)
return nl2br($text);
【讨论】:
以上是关于WMD markdown 编辑器 - HTML 到 Markdown 的转换的主要内容,如果未能解决你的问题,请参考以下文章
如何让 WMD-Editor 将 Markdown 发布到服务器而不是 HTML?
WMD - 如何获取生成的\Markdown HTML 代码