WMD降价编辑器 - HTML到Markdown转换

时间:2009-07-28 20:53:01

标签: php javascript markdown wmd

我在项目中使用wmd降价编辑器并提出了一个问题:

当我发布包含markdown文本区域的表单时,它(如预期的那样)将html发布到服务器。但是,说服务器端验证失败了,我需要发回用户来编辑他们的条目,无论如何只用markdown而不是html重新填充textarea?因为我已经设置了,服务器只能访问帖子数据(以html的形式),所以我似乎无法想到这样做的方法。有任何想法吗?优选地,基于非JavaScript的解决方案。

更新:我找到了一个名为markdownify的html to markdown转换器。我想这可能是向用户显示降价的最佳解决方案......欢迎任何更好的选择!

更新2:我在SO上发现了this帖子,我猜有一个选项可以将数据作为markdown而不是html发送到服务器。简单地将数据存储为数据库中的降价是否有任何缺点?将它显示回用户(编辑器之外)怎么样?也许最好将两个版本(html和markdown)发布到服务器......

已解决:我可以使用php markdown将降价转换为html服务器端。

4 个答案:

答案 0 :(得分:4)

我建议您只需将文本发送并存储为Markdown。这似乎是你已经解决的问题。 IMO,将文本存储为Markdown会更好,因为您可以安全地删除所有HTML标记而不必担心格式化丢失 - 这会使您的代码更安全,因为使用XSS攻击会更难(尽管它可能仍然可能 - 我只是说这部分将是saf er )。

答案 1 :(得分:2)

需要考虑的一件事是WMD似乎与某些服务器端Markdown实现有某些不同的边缘情况。我肯定在这里的预览中看到了一些在提交后出现不同的怪癖(我相信有一个这样的案例试图逃避被反叛者包围的反击)。通过线路发送转换后的预览,您可以确保预览准确。

我不是说应该做出决定,但这是需要考虑的事情。

答案 2 :(得分:0)

尝试Pandoc。它比Markdownify更全面,更可靠。

答案 3 :(得分:0)

您看到的HTML只是一个预览,因此将其存储在数据库中并不是一个好主意,因为当您尝试编辑时会遇到问题。存储两个版本(markdown和HTML)也不是一个好主意,因为HTML只是一种解释,你将遇到编辑和保持两个版本同步的相同问题。

所以最好的办法是将markdown存储在db中,然后在显示之前将其转换为服务器端。

您可以使用PHP Markdown来实现此目的。然而,这并不是你在javascript方面看到的100%完美转换,可能需要一些调整。

Stack Exchange network正在使用的版本是一个C#实现,你应该有一个python实现,你用你的wmd版本下载了。

我调整的一件事就是渲染新线条的方式所以我在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);
}