我在项目中使用wmd降价编辑器并提出了一个问题:
当我发布包含markdown文本区域的表单时,它(如预期的那样)将html发布到服务器。但是,说服务器端验证失败了,我需要发回用户来编辑他们的条目,无论如何只用markdown而不是html重新填充textarea?因为我已经设置了,服务器只能访问帖子数据(以html的形式),所以我似乎无法想到这样做的方法。有任何想法吗?优选地,基于非JavaScript的解决方案。
更新:我找到了一个名为markdownify的html to markdown转换器。我想这可能是向用户显示降价的最佳解决方案......欢迎任何更好的选择!
更新2:我在SO上发现了this帖子,我猜有一个选项可以将数据作为markdown而不是html发送到服务器。简单地将数据存储为数据库中的降价是否有任何缺点?将它显示回用户(编辑器之外)怎么样?也许最好将两个版本(html和markdown)发布到服务器......
已解决:我可以使用php markdown将降价转换为html服务器端。
答案 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);
}