【问题标题】:Matching PegDown+JSoup Output to PageDown Output将 PegDown+JSoup 输出匹配到 PageDown 输出
【发布时间】:2016-07-05 12:32:24
【问题描述】:

我正在尝试在客户端和服务器端解析和清理 Markdown。

  • 在客户端,我使用PageDown 作为降价编辑器。这正是 StackOverflow 使用的,它带有一个漂亮的预览框。这个预览框显示了 sanitized html,因此它会删除诸如 <div> 标签之类的内容。

  • 在服务器端,我使用PegDown 和JSoup 来解析和清理markdown。

但是,我发现两者的输出不同的情况。例如:

输入markdown: how are <div>tags</div> treated?

PageDown 输出: <p>how are tags treated?</p>

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.");
    }
}

我理解为什么会发生这种情况,我对两个不同的系统产生两个不同的输出并不感到惊讶。 我的问题是:如何设置 JSoup 以便它简单地删除 &lt;div&gt; 标签而不是添加额外的 &lt;p&gt; 标签?

我的最终目标是让服务器端解析/清理生成与客户端解析/清理相当相似的结果。如果有更好的方法可以做到这一点,我愿意接受建议。我真的不在乎两者的输出是否完全相同,但是像额外的&lt;p&gt; 标签这样的东西会很容易被用户注意到,所以我试图消除这一主要区别。

附赠问题:是否有PageDown可以输出的html标签和属性列表?

编辑:我也尝试过使用the OWASP sanitizer,但我得到了非常相似的结果:&lt;div&gt; 标签被删除,但&lt;p&gt; 标签在上面是“固定的”方式,这会导致与 PageDown 的 sanitizer 不同的 html。

【问题讨论】:

    标签: javascript java jsoup markdown pagedown


    【解决方案1】:

    如何设置 JSoup 以便它简单地删除

    标签而不是添加额外的

    标签?

    HTML 5 规范拒绝在 p 元素内使用 div 元素。 Jsoup 遵循这些规范,这就是为什么最终的 html 字符串中有两个 p 元素。

    为了更好地理解为什么会发生这种情况,让我们看看Jsoup#clean 是如何分三个步骤工作的:

    1. 解析脏 html
    2. 调整生成的树以符合 HTML 5 规范
    3. 删除被拒绝的标签

    在第 2 步中,第一个 &lt;p&gt; 标记在打开 div 之前关闭。第二个p 在同一步骤中也得到了它的开始标签。由于 Jsoup 不知道该段的合法内容从哪里开始,因此它将第二段的内容限制为严格的数量(即什么都没有)。

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

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

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

    仅举几例:

    • Nashorn(内置 Java 8)
    • 犀牛
    • V8

    示例代码

    这是一个说明 Nashorn 用法的示例:

    Caller.java

    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());
    

    script.js

    function myFunction(foo) {
       // ...
    }
    

    另见

    【讨论】:

    • 这似乎对我不起作用。输出应该是&lt;p&gt;how are tags treated?&lt;/p&gt;,但如果我将markdown 包装在&lt;body&gt; 标签中,则输出只是how are tags treated?,没有任何html 标签。对于比单行长得多的实际数据,情况会更糟。
    • @KevinWorkman 我认为您会一次又一次地发现两个系统输出不同的边缘情况。有关详细信息,请参阅我的更新...
    • 是的,我明白为什么它关闭了&lt;p&gt; 标签。我正在寻找一种禁用该功能的方法,或者至少重新安排清理步骤,以便在树有效之前删除&lt;div&gt;。有趣的是,服务器端 JavaScript 方法正是我首先尝试的。 That doesn't work because of a known bug 虽然。
    • 刚刚让 V8 工作。这似乎可以解决问题。现在我只需要弄清楚我的服务器上需要哪些本地人。暂时 +1,如果没有其他人出现,我会标记为正确并奖励你。
    猜你喜欢
    • 2016-01-02
    • 2012-10-31
    • 2023-03-16
    • 2018-11-17
    • 1970-01-01
    • 1970-01-01
    • 2015-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多