Redcarpet 语法高亮

Posted

技术标签:

【中文标题】Redcarpet 语法高亮【英文标题】:Redcarpet Syntax Highlighting 【发布时间】:2014-05-21 14:20:16 【问题描述】:

我正在尝试使用 Redcarpet 进行语法突出显示

我的appliaction_helper.rb

module ApplicationHelper

  def markdown(text)
    render_options = 
        # will remove from the output html tags inputted by user
        filter_html:     true,
        # will insert <br /> tags in paragraphs where are newlines
        hard_wrap:       true,
        # hash for extra link options, for example 'nofollow'
        link_attributes:  rel: 'nofollow' ,
        # Prettify
        prettify:        true
    
    renderer = Redcarpet::Render::HTML.new(render_options)

    extensions = 
        #will parse links without need of enclosing them
        autolink:           true,
        # blocks delimited with 3 ` or ~ will be considered as code block.
        # No need to indent.  You can provide language name too.
        # ```ruby
        # block of code
        # ```
        fenced_code_blocks: true,
        # will ignore standard require for empty lines surrounding HTML blocks
        lax_spacing:        true,
        # will not generate emphasis inside of words, for example no_emph_no
        no_intra_emphasis:  true,
        # will parse strikethrough from ~~, for example: ~~bad~~
        strikethrough:      true,
        # will parse superscript after ^, you can wrap superscript in ()
        superscript:        true
        # will require a space after # in defining headers
        # space_after_headers: true
    
    Redcarpet::Markdown.new(renderer, extensions).render(text).html_safe
  end

end

虽然输出显示在代码块中(红地毯):

我找不到Syntax Highlighting

我刚进入 Redcarpet,有人知道解决方案吗?

【问题讨论】:

我会建议你在客户端对代码进行着色。这要容易得多。 它们是你知道的任何宝石或教程吗? 我使用highlight.js。这很简单。 【参考方案1】:

好的,我找到了 -> Markdown and code syntax highlighting in Ruby on Rails (using RedCarpet and CodeRay) 非常有效(连同 Coderay 的一些自定义 css)。

宝石文件:

gem 'redcarpet', github: 'vmg/redcarpet'
gem 'coderay'

Application_helper.rb

class CodeRayify < Redcarpet::Render::HTML
  def block_code(code, language)
    CodeRay.scan(code, language).div
  end
end

def markdown(text)
  coderayified = CodeRayify.new(:filter_html => true, 
                                :hard_wrap => true)
  options = 
    :fenced_code_blocks => true,
    :no_intra_emphasis => true,
    :autolink => true,
    :strikethrough => true,
    :lax_html_blocks => true,
    :superscript => true
  
  markdown_to_html = Redcarpet::Markdown.new(coderayified, options)
  markdown_to_html.render(text).html_safe
end

【讨论】:

def block_code(code, language) language ||= :plaintext CodeRay.scan(code, language).div end【参考方案2】:

这是使用Rouge 的快速方法:

require 'redcarpet'
require 'rouge'
require 'rouge/plugins/redcarpet'

class HTML < Redcarpet::Render::HTML
  include Rouge::Plugins::Redcarpet # yep, that's it.
end

当然,这要求 rouge 在您的 Gemfile 中。

【讨论】:

【参考方案3】:

我认为Redcarpet 做不到。在我的项目中,我关注了关于 Redcarpet 的 Railscasts 插曲,该插曲还解决了语法高亮问题。它使用Pygments 和Albino。

ASCIIcast 版本的链接是here。

【讨论】:

确实,Redcarpet 只是一个 Markdown 解析器。不多也不少。 我关注了 Railscast(非常更新)。基本上我不能用 redcarpet 实现 Pygments/Albino。 你必须先用pip install Pygments安装pygments。如果你的机器上没有 python,你应该先下载 python,因为 pip 是 python 的包管理器。 如果您在服务器上同时安装了 Ruby 和 Python,那么可以。 那就用Coderay吧!它使用起来非常简单,并且不依赖 Python。

以上是关于Redcarpet 语法高亮的主要内容,如果未能解决你的问题,请参考以下文章

一个C#语法高亮插件

有没有人遇到过在 iterm2 下 vim 语法高亮的问题

EditPlus语法高亮

VIM语法高亮在保存文件后消失是怎么回事?

设法使UltraEdit支持python语法高亮

vue - 自定义块 - 语法高亮