【问题标题】:Rendering Markdown from Pagedown not in an editor不在编辑器中从 Pagedown 渲染 Markdown
【发布时间】:2014-07-25 00:16:33
【问题描述】:

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

现在我需要获取该 markdown 并将其以 html 的形式呈现在网站上,而不是在编辑器中,就像正在阅读的 cmets 和博客文章一样。

我收集到 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} 变量包含用户在表单中提交的降价。但是,如果输入是多行,这会中断,这将是大部分时间。

我的下一个选择是在服务器端执行此操作,但这似乎很老套。我的服务器全是 Java,因为找不到用 Java 实现的 PageDown.Sanitizer,我只好从 Java 调用 javascript 库,这看起来很恶心。

我已经尝试在谷歌上搜索一种向客户端呈现 Markdown 的标准方法,但我一直在使用 Markdown 编辑器,我已经在使用它了。有没有标准的方法来做到这一点,无论是在客户端还是在服务器端(在 Java 中)?

我真的不知道自己在做什么,因此欢迎任何建议。

【问题讨论】:

  • 你问过 PageDown 的人他们是怎么做到的吗?另外,为什么你要渲染降价?您不应该将它按原样存储在服务器端,然后将其传输到客户端吗?如果你问的话,我敢打赌,有一种标准的方法可以在 PageDown 中呈现它。
  • 感谢您的回复。我认为 PageDown 足够流行(这是 StackOverflow 使用的),来到 StackOverflow 可能比尝试直接联系他们更快。我正在尝试在客户端将降价转换为 sanitized html。我将它按原样存储在服务器上。这部分已经完成,现在我正在尝试将其输出给客户端以供阅读(不是在编辑器中编写,只是阅读)。
  • "sanitized" 是什么意思?
  • @markspace Sanitized 意味着我将它传递给 Markdown.getSanitizingConverter() 实例,它只是删除了不在白名单上的任何 html 标签。它比这更复杂,因为它确实 not 剥离代码块内的 html 标记,这正是我所需要的。这使得使用 Java 解决方案变得困难,因为它们似乎都是全有或全无,而不是尊重代码块的选择性卫生。

标签: java javascript markdown pagedown


【解决方案1】:

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

我找到了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;
  }

当它找到一个白名单标签时,它会打印“true”。否则你应该把第一个'

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

祝你好运。

编辑:

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

我不知道 Open JDK 自带 JavaScript 引擎。我认为不会;它仍在进行中。

【讨论】:

  • 谢谢,我试试看。不过,我希望有一种更“标准”的方法,但我一直假设我只是遗漏了一些明显的东西。不过,恐怕这过于简单化了,因为 PageDown 卫生不会触及代码块内的 html 标记,而我认为您的代码会删除它们。这就是为什么我希望有一个标准的解决方案,而不是自己进行解析。
  • 另外,我绝对可以使用 ScriptEngine 类从 Java 调用 javascript。我实际上可以正常工作,但是在服务器上进行所有处理似乎很奇怪。如果这确实是要走的路,我会停止抱怨,就那样做吧,哈哈。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-05
  • 2021-11-10
  • 2023-04-10
  • 2016-07-28
相关资源
最近更新 更多