新手问题 代码高亮 以及每一行都有一个行号

AlexKie · 2017年07月01日 · 最后由 dfzy5566 回复于 2017年07月01日 · 2962 次阅读

我想在我的 rails app 里面展示一段代码,因此找了一次插件,比如 hightlight,coderay,syntaxhighter, prettify 等等,然后结合 redcarpet 使用。在实现代码高亮的这个问题上都没有问题, 但是现在的问题是我想为这些代码添加行号,而上面说的几个插件在展示行号的是将行号和代码内容进行了左右分区,也就是说,所有的代码都是在一个一个的里面,代码的那一块没有区分行的标志,

我找到几个是 html 代码是这样的

<div class="code">
    <div class="linenum">
        <span>1</span>
         ......   #  这一块都是行号
        <span>n</span>
    </div>
    <div class="highlight">
        <span>def</span> 
        ......    #这里是   所有的代码按照语言进行高亮
        <span>end</span>
    </div>
</div>

但是我想要的是这样的的几个都是这样的

<div class="code">
    <div id="linenum_1">
        <a href="#linenum_1">1</a> #这里显示行号
        <div class='highlight'>
            <span>def </span>
            .....              #这里指展示这一行的代码
            <span>end</span>
        </div>
    </div>

    .....

    <div id="linenum_n">
        <a href="#linenum_n">n</a> #这里显示行号
        <div class='highlight'>
            <span>def </span>
            .....              #这里指展示这一行的代码
            <span>end</span>
        </div>
    </div>
</div>

然后我看到了 rouge 这个插件,看到他的 readme 里面这样写

Rouge::Formatters::HTMLLinewise.new(formatter, class_format: 'line-%i') This formatter will split your code into lines, each contained in its own div. The class_format option will be used to add a class name to the div, given the line number.

那么这个 formatter 应该如何构造呢? 谢谢大家了

如果想代码和行号在一起,你可以把代码用换行符号切分成若干个数组,然后加上行号再组合在一下

codes = "<span>def<span><span>name</span><br/><span>..."
codes_with_numbers = codes.split('<br/>').map_with_index{|loc, index| "#{index+1}  #{loc}" }.join('<br/>')

我的 ShowCode 中,有类似的逻辑: https://github.com/cenxky/show_code/blob/master/lib/show_code/code.rb#L58

当然你也可以使用 JS 来添加,只需要在每行前面

prepend(<span> + lineNumber + </span>’) 

因为 rails 还不熟悉 只会一些基础的用法,请问你这个逻辑应该在哪里写呢

AlexKie 回复

Ruby 的代码 建议写在 helper 中,定义一个方法,在 view 中调用。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号