如何使用Jekyll和Pygments获取内嵌代码?

时间:2013-03-28 01:11:48

标签: syntax-highlighting jekyll css pygments

我正在使用Markdown with Liquid标签为Jekyll生成的网站标记一些代码,并希望包含一些内联(在段落中)并具有彩色语法(使用Pygments)的代码,但是它似乎不起作用。

标记

Lorem ipsum dolor {% highlight javascript %} var sit = "amet"; {% endhighlight %} consectetur adipiscing elit.

结果

<p>Lorem ipsum dolor <div class='highlight'><pre><code class='javascript'> <span class='kd'>var</span> <span class='nx'>sit</span> <span class='o'>=</span> <span class='s2'>&quot;amet&quot;</span><span class='p'>;</span></code></pre></div> consectetur adipiscing elit.</p>

我非常希望突出显示的文字不会包含在<div class='highlight'>中,或至少让它成为<span class='highlight'>

使用{% highlight javascript nowrap %}不起作用suggested elsewhere。 (也许这是我的设置问题 - 这是Ruby 2.0,Jekyll 0.12.1,pygments.rb 0.3.7?)

我想host this page on GitHub,这意味着我不能依赖插件。糟糕,对吧?

附录:行编号(即{% highlight javascript linenos %})似乎也不起作用。曼

4 个答案:

答案 0 :(得分:4)

最简单的方法是使用Github Flavored Markdown并使用默认的内联代码。

在您的_config.yml文件中,将您的降价更改为redcarpet。您现在已准备好使用GFM。

markdown: redcarpet

现在您可以关注所有GitHub Markdown了。要执行内联代码,请执行以下操作:

Here is some `inline code` in the middle of sencence

答案 1 :(得分:2)

您可以将CSS类添加到您在帖子中放置的任何对象。

如果您定义这样的CSS条目:

.inlined { display:inline; }

然后,您可以将此类添加到生成的<div>中:

Lorem ipsum dolor 
{% highlight javascript %}var sit="amet"; {% endhighlight %}{: .inlined } 
consectetur adipiscing elit.

这适用于所有类型的对象(表格,图像等)。我现在无法测试它,但我认为这将解决问题。

测试时,请查看输出HTML。然后,您会发现<div>现在已设置class=inlined属性。

答案 2 :(得分:0)

.highlight div有什么问题?它放在那里使语法高亮易于主题。 要将包装器更改为跨度,我的赌注是您必须更改Jekyll配置。

只有拥有多行代码段时才会显示行号。

答案 3 :(得分:0)

如果您包含以下两个功能(并调用它们):

var inlineElements = function() {
    var inlinedElements = document.getElementsByClassName('inlined');
    inlinedElements = Array.prototype.concat.apply([], inlinedElements); // copy
    for (var i = 0; i < inlinedElements.length; i++) {
        var div = inlinedElements[i];
        var span = document.createElement('span');
        span.innerHTML = div.children[0].innerHTML;
        var previous = div.previousElementSibling;
        var paragraph;
        if (previous.tagName.toLowerCase() === 'p') {
            paragraph = previous;
        } else {
            paragraph = document.createElement('p');
            div.parentNode.insertBefore(paragraph, div);
        }
        div.remove();
        paragraph.innerHTML += ' ' + span.innerHTML + ' ';
        paragraph.classList.add('highlight');
        paragraph.classList.add('inlined');
        if (div.classList.contains('connectNext')) {
            paragraph.classList.add('connectNext');
        }
    }
}

var connectElements = function() {
    while (true) {
        var connectNextElements = document.getElementsByClassName('connectNext');
        if (connectNextElements.length == 0) break;
        var prefix = connectNextElements[0];
        var next = prefix.nextElementSibling;
        prefix.innerHTML += ' ' + next.innerHTML;
        next.remove();
        if (!next.classList.contains('connectNext')) {
            prefix.classList.remove('connectNext');
        }
    }
}

inlineElements();
connectElements();

您可以在Markdown中使用.inline和.connectNext:

{% highlight objective-c %}
[[NSObject alloc] init];
{% endhighlight %} {: .inlined .connectNext }
vs.
{% highlight java %}
new Object();
{% endhighlight %} {: .inlined }

.connectNext将确保代码块后面的文字也在同一<p>中内联。