14

たくさんのチュートリアルが浮かんでいますが、それらは不完全であるか、完全に最新ではないか、完全に機能していないようです。

これが私がやったことです。

Gemfile:

gem 'rouge'
gem 'redcarpet'

次に、次を作成しましたconfig/initializer/rouge.rb

require 'rouge/plugins/redcarpet'

次に、というファイルを作成しましたapp/assets/stylesheets/rouge.css.erb

<%= Rouge::Themes::Github.render(:scope => '.highlight') %>

次に、app/helpers/application_helper.rbにこれを追加しました:

module ApplicationHelper
  class HTML < Redcarpet::Render::HTML
    include Rouge::Plugins::Redcarpet

    def block_code(code, language)
      Rouge.highlight(code, language || 'text', 'html')
    end
  end

  def markdown(text)
    render_options = {
      filter_html: true,
      hard_wrap: true,
      link_attributes: { rel: 'nofollow' }
    }
    renderer = HTML.new(render_options)

    extensions = {
      autolink: true,
      fenced_code_blocks: true,
      lax_spacing: true,
      no_intra_emphasis: true,
      strikethrough: true,
      superscript: true
    }
    Redcarpet::Markdown.new(renderer, extensions).render(text).html_safe
  end
end

それから私の中show.html.erbで、私はこれをしました:

<%= markdown(@question.body) %>

しかし、それは文字通りうまくいきません。ruby次のようなコード スニペットが出力されます。

フォーマットされていないルビーのスニペット

このコード スニペットを Github のようにフォーマットするにはどうすればよいですか? または、最初のステップでさえフォーマットするだけで、フォーマットを微調整するにはどうすればよいですか?

ページのソースにスタイルシートが含まれていないので、どのスタイルを調整すればよいかわかりません。

編集 1

または、私がこれを行うときでも:

            <div class="highlight">
              <%= @question.test_suite %>
            </div>

次のようにレンダリングされます。

別のルビースニペット

編集 2

BoraMa の提案を試みたところ、次のような出力が得られました。

ここに画像の説明を入力

編集 3

BoraMa の回答を次のように変更しました。

私のblock_code方法では、次のようにハイライトを呼び出します。

Rouge.highlight(code, 'ruby', 'html')

次に、私の見解では、これを行います:

<%= raw rouge_markdown(<<-'EOF'
                def rouge_me
                  puts "this is a #{'test'} for rouge"
                end
                EOF
                ) %>

次に、これが生成されます:

ここに画像の説明を入力

スクリーンショットの下部にあるコード スニペットを参照していることに注意してください。

ただし、上部のテキストは次のように生成されます。

          <pre class="highlight ruby">
            <%= rouge_markdown(@question.body) %>
          </pre>

そして、スクリーンショットに示すようにレンダリングされます。

編集 4

を削除すると<div class="highlight">、次のように表示されます。

ここに画像の説明を入力

別名....何もレンダリングされていません。

ビューに追加rawすると...別名<%= raw rouge_markdown(@question.body) %>

ビューはこれをレンダリングします:

ここに画像の説明を入力

編集 5

@questionさまざまなオブジェクトのコンテンツは次のとおりです。

[1] pry(#<#<Class:0x007fc041b97ce8>>)> @question.body
=> "5.times do\r\n   puts \"Herro Rerl!\"\r\nend"
[1] pry(#<#<Class:0x007fc041b97ce8>>)> @question.body
=> "puts \"Hello World version 9\"\r\nputs \"This comes after version 8.\"\r\nputs \"This comes after version 7.\"\r\nputs \"This comes after version 6.\"\r\nputs \"This comes after version 5.\"\r\nputs \"This comes after version 4.\"\r\nputs \"This comes after version 3.\"\r\nputs \"This comes after version 2.\"\r\nputs \"This definitely comes after version 1.\""

[1] pry(#<#<Class:0x007fc041b97ce8>>)> @question.body
=> "def convert_relation(invited_gender, relation)\r\n case invited_gender\r\n \twhen \"male\"\r\n  \tcase relation\r\n      when \"daughter\", \"son\" then \"dad\"\r\n      when \"mom\", \"dad\" then \"son\"\r\n      when \"grandfather\", \"grandmother\" then \"grandson\"\r\n      when \"sister\", \"brother\" then \"brother\"\r\n      when \"wife\" then \"husband\"\r\n      when \"husband\" then \"husband\"\r\n    end\r\n  when \"female\"\r\n  \tcase relation\r\n      when \"daughter\", \"son\" then \"mom\"\r\n      when \"mom\", \"dad\" then \"daughter\"\r\n      when \"grandfather\", \"grandmother\" then \"granddaughter\"\r\n      when \"sister\", \"brother\" then \"sister\"\r\n      when \"wife\" then \"wife\"\r\n      when \"husband\" then \"wife\"\r\n    end\r\n  end\r\nend\r\n\r\nputs convert_relation(\"male\", \"wife\")"
4

1 に答える 1

14

元の質問では、強調表示された質問でマークダウンが使用されることが (試みられた解決策で) 示されていましたが、そうではないことが判明しました。したがって、この回答は 2 つの異なるセクションに分割されます。1 つはマークダウンなしの純粋なコードを強調するためのもので、もう 1 つはコードを含むマークダウン テキストのためのものです。

A) 純粋なコードを強調したい (Markdown を含まない)

この場合、READMEによると、Rouge でコードをハイライトするために必要なのは lexerformatterだけです。強調表示されたテキストは Web ページに表示されるため、 HTML フォーマッターが必要です。字句解析器の場合、コードが使用されている言語を事前に知っておく必要があります (または、ソース コード自体から推測することもできますが、小さなコード スニペットの場合はあまり信頼できないようです)。

強調表示のための単純なヘルパー メソッドを作成できます。

module RougeHelper
  def rouge(text, language)
    formatter = Rouge::Formatters::HTML.new(css_class: 'highlight')
    lexer = Rouge::Lexer.find(language)
    formatter.format(lexer.lex(text))
  end
end

次に、テンプレートで、強調表示するテキストと言語を指定してこのヘルパーを呼び出すだけです。

<%= raw rouge("def rouge_me\n  puts 'hey!'\nend", "ruby") %>

どちらがレンダリングされますか:

rougeRouge がサポートするすべての言語と、ヘルパーに渡す必要がある対応する名前のリストを取得するには、次のコードを使用できます。このコードは、Rouge からすべての定義済みレクサーを取得し、それらのタグ(つまり、Rouge がそれらを認識する名前)を表示します。

Rouge::Lexer.all.map(&:tag).sort
# => ["actionscript", "apache", "apiblueprint", "applescript", ..., "xml", "yaml"]

選択ボックスで選択する言語をユーザーに表示するときに、このリストを使用できます (おそらく使用する必要があります)。各レクサーには、人間が読める名前とそれぞれの簡単な説明を与えるメソッドが定義されていることに注意してtitleくださいdesc。この情報を使用して、ユーザーに表示することもできます。

: イニシャライザ、カスタム HTML クラス、および rouge ヘルパー コールのラップを取り除く必要がありdivます (これらはすべて、最初の試行で使用したものです)。上記のコード以外に必要なのは、Web ページに既に正しく含まれている CSS ルールだけです。

B) 強調表示されたテキストは、コード ブロックを含むマークダウン テキストです。

それを機能させるためのあなたの試みからのいくつかの変更:

  1. requireイニシャライザは必要ありません。削除できると思います(ただし、ヘルパーで後ですべてのファイルを削除したくない場合は、そのままにしておくことができると思います)。

  2. ヘルパー クラスからメソッドを削除しblock_codeます。マークダウン プラグインを含めることで、同じことが既に行われています。

  3. <div class="highlight">テンプレートからラッパー div を削除し、ヘルパーのみを使用します。Rouge は独自のラッパーを「ハイライト」クラスに追加し、別の div がそれを混乱させているようです。

次のヘルパー コードを試してください。ところで、コードをApplicationHelper別のものに移動しましたRougeHelper(ただし、これは必須の変更ではありません)。

module RougeHelper
  require 'redcarpet'
  require 'rouge'
  require 'rouge/plugins/redcarpet'

  class HTML < Redcarpet::Render::HTML
    include Rouge::Plugins::Redcarpet
  end

  def rouge_markdown(text)
    render_options = {
        filter_html: true,
        hard_wrap: true,
        link_attributes: { rel: 'nofollow' }
    }
    renderer = HTML.new(render_options)

    extensions = {
        autolink: true,
        fenced_code_blocks: true,
        lax_spacing: true,
        no_intra_emphasis: true,
        strikethrough: true,
        superscript: true
    }
    markdown = Redcarpet::Markdown.new(renderer, extensions)
    markdown.render(text)
  end
end

次に、テンプレートで、テスト Ruby コードを強調表示しようとしました。

<%= raw rouge_markdown(<<-'EOF'
```ruby
def rouge_me
  puts "this is a #{'test'} for rouge"
end
```
EOF
) %>

言語を手動で指定する必要があったことに注意してください。これにより、スペース インデントの代わりに 3 つのバッククォートを使用してコードを区切ることができました。ここでコード言語の自動検出が機能しなかった理由はわかりません。おそらく、コードが短すぎるためです。

最後に、これは私のためにうまく色をレンダリングしました:

于 2016-06-09T09:09:54.110 に答える