如何防止 Kramdown 被 C++ 包含混淆?

How do I prevent Kramdown from getting confused by a C++ include?

我写了这个插件:

module Jekyll
    module Tags
        class Prism < Liquid::Block
            def initialize(tag_name, text, tokens)
                @arg = text.strip
                super
            end

            def render(context)
                output = super(context)
                "<pre><code class=\"language-#{@arg}\">#{output}</code></pre>"
            end
        end
    end
end 

Liquid::Template.register_tag('prism', Jekyll::Tags::Prism)

我是这样使用的:

{% prism cpp %}
#include <iostream>

// Hello World
int main()
{
    cout << "hello world" << endl;
    int a = 10;
}
{% endprism %}

现在,问题是,我在我的网站上主要使用 C++ 代码。当我现在用 Jekyll 生成这个 markdown 时,{% endprism %} 之后的所有文本仍然会在 <pre> 标签内,因为 Kramdown 会被 <iostream> 混淆如果我转义它,(\<iostream\>),然后我的插件按预期工作,但我的 Javascript 荧光笔变得混乱。

如何在不启用 Jekyll 荧光笔的情况下解决这种情况?

我认为您正在尝试使用 GitHub Flavored Markdown 中使用的防护代码块。

你为什么不使用 Jekyll code highlighting works pefectly out of the box for cpp ? A base css for highlight is available here

尝试:

{% highlight cpp %}
#include <iostream>

// Hello World
int main()
{
    cout << "hello world" << endl;
    int a = 10;
}
{% endhighlight %}

CGI 模块中有一个函数允许转义 HTML,就像从 PHP 转义 htmlspecialchars 一样。我将 liquid 插件更改为此并且它有效:

require 'cgi'

module Jekyll
    module Tags     
        class Prism < Liquid::Block
            def initialize(tag_name, text, tokens)
                @arg = text.strip
                super
            end

            def render(context)
                output = super(context)
                output = CGI.escapeHTML(output);
                "<pre><code class=\"language-#{@arg}\">#{output}</code></pre>"
            end
        end
    end
end 

Liquid::Template.register_tag('prism', Jekyll::Tags::Prism)

它将所有 <> 转义为 html 特殊字符。因此 Kramdown 不会混淆并且 prism.js 仍然能够正确地突出显示代码。