2015-05-10 34 views
1

我寫了這個插件:如何防止Kramdown被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生成這個降價時,{% endprism %}之後的所有文字仍然會在<pre>標記內,因爲Kramdown被<iostream>弄糊塗瞭如果我逃過它,(\<iostream\>),那麼我的插件按預期工作,但我的Javascript熒光筆是變得困惑。

如何在不啓用Jekyll熒光筆的情況下解決這種情況?

回答

0

有一個在CGI模塊的功能,允許逃離HTML很像從PHP的htmlspecialchars。我改變了液體插件這一點,它的工作原理:

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仍然能夠正確地突出顯示代碼。

Screenshot of highlighting

0

我認爲你試圖在GitHub Flavored Markdown中使用圍欄代碼塊。

爲什麼不使用Jekyll code highlighting作品開箱即用的cpp?爲突出一個底座CSS可here

嘗試:

{% highlight cpp %} 
#include <iostream> 

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

因爲我想使用prism.js。當jekyll解析這個時,kramdown不會感到困惑?它是一樣的,只是一個不同的降價標籤...突出而不是棱鏡。另外,學習插件的東西。 – DeleteMe