9

我在一个项目上使用wmd markdown 编辑器并且有一个问题:

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

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

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

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

4

4 回答 4

4

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

于 2009-07-29T06:24:46.783 回答
2

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

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

于 2009-07-29T06:37:45.993 回答
0

试试 Pandoc。它比 Markdownify 更全面、更可靠。

于 2010-05-20T09:07:02.527 回答
0

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

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

为此,您可以使用PHP Markdown 。然而,这并不是您在 javascript 端看到的 100% 完美转换,可能需要一些调整。

Stack Exchange 网络使用的版本是 C# 实现,并且应该有一个 python 实现,您下载的 wmd 版本是您拥有的。

我调整的一件事是新行的呈现方式,所以我在 markdown.php 中更改了这一点,以将一些新行转换为<br>从我拥有的版本中的第 626 行开始:

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);
}
于 2011-05-09T11:50:09.700 回答