从Pagedown渲染Markdown不在编辑器中

时间:2014-07-25 00:16:34

标签: java javascript markdown pagedown

我正在使用PageDown来允许我的网站用户添加评论,博客文章等。我在服务器端使用Java(Spring是具体的),我可以存储输出数据库中的PageDown编辑器就好了。

现在我需要将该标记下载并在网站上以html格式呈现,而不是在编辑器中,就像正在阅读的评论和博客文章一样。

我认为PageDown转换器有一个makeHtml()函数,你可以通过html在客户端调用它。我已经进行了一些测试:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>PageDown Test</title>

<link rel="stylesheet" type="text/css" href="PageDown/demo.css" />

<script type="text/javascript" src="PageDown/Markdown.Converter.js"></script>
<script type="text/javascript" src="PageDown/Markdown.Sanitizer.js"></script>
<script type="text/javascript" src="PageDown/Markdown.Editor.js"></script>
<script type="text/javascript">var converter = Markdown.getSanitizingConverter();</script>
</head>

<body>
    <h1>PageDown Test</h1>
    <script type="text/javascript">document.write(converter.makeHtml('${input}'));</script>
</body>
</html>

$ {input}变量包含用户在表单中提交的markdown。但是,如果输入是多行,则会中断,这将是大多数情况。

我的下一个选择是在服务器端执行此操作,但这似乎是hackish。我的服务器都是Java,因为我找不到用Java实现的PageDown.Sanitizer,所以我必须从Java调用javascript库,这看起来很糟糕。

我已经尝试使用谷歌搜索标准方式向客户端渲染markdown,但我一直只是获得降价编辑器,我已经开始工作了。有没有一种标准的方法可以在客户端或服务器端(用Java)?

我真的不知道自己在做什么,所以感谢任何建议。

1 个答案:

答案 0 :(得分:0)

在我不知道发生了什么事情时发表评论的道歉,但似乎没有其他人有过这样的事情,所以这是一个想法。

我找到了source to the sanitizer you mentioned,它只是一个允许标记白名单的正则表达式。其他一切都被拒绝了,这看起来非常聪明。

// (tags that can be opened/closed) | (tags that stand alone)
var basic_tag_whitelist = /^(<\/?(b|blockquote|code|del|dd|dl|dt|em|h1|h2|h3|i|kbd|li|ol|p|pre|s|sup|sub|strong|strike|ul)>|<(br|hr)\s?\/?>)$/i;
// <a href="url..." optional title>|</a>
var a_white = /^(<a\shref="((https?|ftp):\/\/|\/)[-A-Za-z0-9+&@#\/%?=~_|!:,.;\(\)]+"(\stitle="[^"<>]+")?\s?>|<\/a>)$/i;

// <img src="url..." optional width  optional height  optional alt  optional title
var img_white = /^(<img\ssrc="(https?:\/\/|\/)[-A-Za-z0-9+&@#\/%?=~_|!:,.;\(\)]+"(\swidth="\d{1,3}")?(\sheight="\d{1,3}")?(\salt="[^"<>]*")?(\stitle="[^"<>]*")?\s?\/?>)$/i;

我不认为将这些转换为Java正则表达式太难了。这是第一个正则表达式字符串。

  Pattern white = Pattern.compile( "^(<\\/?(b|blockquote|code|del|dd|dl|dt|em|h1|h2|h3|i|kbd|li|ol|p|pre|s|sup|sub|strong|strike|ul)>|<(br|hr)\\s?\\/?>)$" );

  String test = "foo<p>bar";
  Matcher matcher = white.matcher(test);
  for(int i = 0;;) {
     int start = test.indexOf("<",i);
     if( start < 0 ) break;
     int end = test.indexOf( ">", start );
     if( end < 0 ) break;
     matcher.region(start, end+1);
     System.out.println(test.subSequence(start, end) );
     System.out.println( matcher.matches() );
     i = end;
  }

这打印&#34; true&#34;当它找到一个白色列出的标签。否则你应该破坏第一个&#39;&lt;&#39;成为&#39;&amp; LT;&#39; (我无法输入HTML文字。我想我在PageDown中发现了一个错误:-))或者你喜欢的任何内容。

是否在入站(post)路径或出站(get)路径上执行此操作取决于您,但后者可能更灵活,因为它使您能够将白名单调整为用户权限或稍后对白名单的更改。

祝你好运。

编辑:

想要添加:您可以从Java内部运行JavaScript。 Oracle JDK具有Nashorn JavaScript engine built in。你可能不得不做一些绑定工作,所以你可以来回传递变量。

我不知道Open JDK附带了一个JavaScript引擎。我不认为这样做;它还在进行中。