Javascript 匹配销钉&x2B;JSoup输出到PageDown输出
我试图在客户端和服务器端解析和清理标记Javascript 匹配销钉&x2B;JSoup输出到PageDown输出,javascript,java,jsoup,markdown,pagedown,Javascript,Java,Jsoup,Markdown,Pagedown,我试图在客户端和服务器端解析和清理标记 在客户端,我使用它作为标记编辑器。这正是StackOverflow使用的,它附带了一个漂亮的预览框。此预览框显示经过消毒的html,因此它会删除标签之类的内容 在服务器端,我使用和来解析和清理标记 然而,我发现这两种情况的输出并不相同。例如: 输入标记:如何处理标记? PageDown输出:如何处理标记? PegDown/JSoup输出: <p>how are </p>tags treated? <p></p&
- 在客户端,我使用它作为标记编辑器。这正是StackOverflow使用的,它附带了一个漂亮的预览框。此预览框显示经过消毒的html,因此它会删除标签之类的内容
- 在服务器端,我使用和来解析和清理标记
如何处理标记?
PageDown输出:如何处理标记?
PegDown/JSoup输出:
<p>how are </p>tags treated?
<p></p>
如何处理标签?
我不会对JSoup做任何花哨的事。这是我的密码:
public class Main {
public static void main(String... args){
PegDownProcessor pdp = new PegDownProcessor();
String markdown = "how are <div>tags</div> treated?";
String html = pdp.markdownToHtml(markdown);
Whitelist whitelist = Whitelist.relaxed().removeTags("div");
html = Jsoup.clean(html, whitelist);
System.out.println(html);
System.out.println("Done.");
}
}
公共类主{
公共静态void main(字符串…参数){
PegDownProcessor pdp=新的PegDownProcessor();
String markdown=“如何处理标记?”;
字符串html=pdp.markdowntothtml(markdown);
白名单白名单=白名单.relaxed().removeTags(“div”);
html=Jsoup.clean(html,白名单);
System.out.println(html);
System.out.println(“完成”);
}
}
我理解为什么会发生这种情况,两个不同的系统产生两种不同的输出,我并不感到惊讶我的问题是:如何设置JSoup,使其只删除
标记,而不添加额外的
标记
我的最终目标是让服务器端解析/清理生成与客户端解析/清理相当相似的结果。如果有更好的方法,我愿意接受建议。我真的不在乎这两者的输出是否完全相同,但是像额外的
标记这样的东西会被用户注意到,所以我试图消除这一主要区别
附加问题:是否有PageDown可以输出的html标记和属性列表
编辑:我也尝试过使用,但我得到了非常相似的结果:
标记被删除,但
标记以上述方式“固定”,这导致了与PageDown的消毒剂不同的html
如何设置JSoup,使其只删除标记而不添加额外的标记
HTML5规范拒绝在p
元素中使用div
元素。
Jsoup尊重这些规范,这就是为什么在最终的html字符串中有两个p
元素的原因
为了更好地理解为什么会发生这种情况,让我们看看Jsoup#clean
如何分三步工作:
标记在打开div
之前关闭。第二个p
也在同一步骤中获得其开始标记。由于Jsoup不知道这一段的合法内容从何处开始,它将第二段的内容限制在严格的范围内(即无)
步骤1和2中的操作将创建一个满足HTML5规范的新HTML代码。在步骤3中,现在可以删除div
我的最终目标是让服务器端解析/清理生成与客户端解析/清理相当相似的结果
为了避免出现类似于此处的其他情况,您应该在客户端和服务器端使用相同的系统。由于Pagedown是用Javascript编写的,所以可以尝试在服务器端Javascript引擎中运行它
举几个例子:
- Nashorn(内置Java 8)
- 犀牛
- V8
如何处理标记?
,但是如果我将标记包装在
标记中,则输出只是如何处理标记?
而没有任何html标记。对于真实世界的数据来说,这将是更糟糕的,它比一行长得多。@KevinWorkman我想你会一次又一次地发现两个系统输出出现分歧的边缘情况。有关详细信息,请参阅我的更新……是的,我理解它为什么要关闭
标记。我正在寻找一种方法来禁用该功能,或者至少重新安排清理步骤,以便在树生效之前删除
。有趣的是,服务器端JavaScript方法正是我第一次尝试的方法。不过,我刚开始工作。这似乎奏效了。现在我只需要找出我的服务器上需要哪些本地人+现在,如果没有其他人来,那么我将标记为正确,并授予你奖金。
ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
engine.eval(new FileReader("script.js"));
Invocable invocable = (Invocable) engine;
Object result = invocable.invokeFunction("myFunction", "fooValue");
System.out.println(result);
System.out.println(result.getClass());
function myFunction(foo) {
// ...
}