如何防止 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 仍然能够正确地突出显示代码。
我写了这个插件:
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 仍然能够正确地突出显示代码。