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
如何分三步工作:

  • 解析脏html
  • 调整结果树以符合HTML5规范
  • 删除被拒绝的标签
  • 在步骤2中,第一个
    标记在打开
    div
    之前关闭。第二个
    p
    也在同一步骤中获得其开始标记。由于Jsoup不知道这一段的合法内容从何处开始,它将第二段的内容限制在严格的范围内(即无)

    步骤1和2中的操作将创建一个满足HTML5规范的新HTML代码。在步骤3中,现在可以删除
    div

    我的最终目标是让服务器端解析/清理生成与客户端解析/清理相当相似的结果

    为了避免出现类似于此处的其他情况,您应该在客户端和服务器端使用相同的系统。由于Pagedown是用Javascript编写的,所以可以尝试在服务器端Javascript引擎中运行它

    举几个例子:

    • Nashorn(内置Java 8)
    • 犀牛
    • V8
    示例代码 下面是一个示例,演示了Nashorn的使用:

    Caller.java script.js 另见

    这似乎对我不起作用。输出应该是
    如何处理标记?

    ,但是如果我将标记包装在
    标记中,则输出只是
    如何处理标记?
    而没有任何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) {
       // ...
    }