首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在编辑器中呈现Pagedown中的Markdown

在编辑器中呈现Pagedown中的Markdown
EN

Stack Overflow用户
提问于 2014-07-25 08:16:34
回答 1查看 619关注 0票数 0

我使用PageDown在服务器端(具体地说是Spring),我可以将PageDown编辑器的输出存储在数据库中。

现在,我需要将该标记作为html呈现在站点上,而不是在编辑器中,就像正在阅读的评论和博客帖子一样。

我猜想PageDown转换器有一个makeHtml()函数,您可以通过html在客户端调用该函数。我做了一个小测试:

代码语言:javascript
复制
<%@ 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}变量包含用户在表单中提交的降价。但是,如果输入是多行,这会中断,这将是大多数时间。

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

我试着用谷歌搜索一种标准的方法来将markdown呈现给客户端,但我一直只得到markdown编辑器,我已经在使用它了。在客户端或服务器端(用Java),有没有一种标准的方法来做到这一点?

我真的不知道我在做什么,所以任何建议都是非常感谢的。

EN

回答 1

Stack Overflow用户

发布于 2014-07-25 10:02:29

很抱歉在我不知道发生了什么的时候发表评论,但似乎还没有其他人尝试过,所以这里有一个想法。

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

代码语言:javascript
复制
// (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 regex并不太难。下面是我使用第一个正则表达式字符串的go。

代码语言:javascript
复制
  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;
  }

当它找到一个白名单标签时,它会打印"true“。否则你应该把第一个'<‘改成'& lt ;’(我不能输入HTML文字。我想我在PageDown中发现了一个bug :-))或者你喜欢的任何东西。

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

祝好运。

编辑:

我想补充一点:你可以在Java内部运行JavaScript。Oracle JDK具有Nashorn JavaScript engine built in。您可能需要对绑定做一些工作,以便来回传递变量。

我不知道Open JDK有没有JavaScript引擎。我不认为它是;它仍在进行中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24946092

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档