0

構文の強調表示に CodeRay を使用していますが、この正規表現に問題があります。テキストは次のようになります。

<pre><code>:::ruby
def say_hello
  puts 'hello!'
end
</code></pre>

この部分::::rubyコードブロックがどの言語として解釈されるべきかを CodeRay に伝えます (ただし、オプションである必要があります)。だからここに私がこれまで持っているものがあります:

def coderay(text)
  text.gsub(/\<pre\>\<code\>(.+?)\<\/code\>\<\/pre\>/m) do
    CodeRay.scan($2, $3).div()
  end
end

$2フォーマットするコードが含まれています (どの言語でフォーマットするかを示す行を含む) が、最初の行を抽出して、2 番目のパラメーターとしてscan()渡すか、その言語行の場合は既定のパラメーターとして渡す必要があります。見つかりませんでした。これどうやってするの?

4

1 に答える 1

1

Ruby 1.9 では、名前付きグループを使用して:

default_lang=:ruby

def coderay(text)
  text.gsub(%r!<pre><code>(?::{3}(?<lang>\w+)\s+)?(?<code>.+?)</code></pre>!m) do
    if $~[:lang].nil?
      lang=default_lang
    else
      lang = $~[:lang].intern
    end
    CodeRay.scan($~[:code], lang).div()
  end
end

default_langのコンテキストに応じて、ローカル変数ではなくクラス変数またはオブジェクト変数になることもありますcoderay

同じですが、インライン式を使用してオプションの言語を処理します。

default_lang=:ruby

def coderay(text)
  text.gsub(%r!<pre><code>(?::{3}(?<lang>\w+)\s+)?(?<code>.+?)</code></pre>!m) do
    CodeRay.scan($~[:code], $~[:lang].nil? ? default_lang : $~[:lang].intern).div()
  end
end

2 番目のオプションは少し面倒なので、避けたほうがよいでしょう

一致しないオプション グループ内の名前付きグループは、Ruby では引き続きカウントされるため、最初に考えたのとは異なり、一致しない番号付きグループの処理は、一致しない名前付きグループと何ら変わりはありません。したがって、上記の名前付きグループ参照を位置参照に置き換えることができ、同じように機能するはずです。

default_lang=:ruby

def coderay(text)
  text.gsub(%r!<pre><code>(?::{3}(?<lang>\w+)\s+)?(?<code>.+?)</code></pre>!m) do
    CodeRay.scan($2, $1.nil? ? default_lang : $1.intern).div()
  end
end

def coderay(text)
  text.gsub(%r!<pre><code>(?::{3}(?<lang>\w+)\s+)?(?<code>.+?)</code></pre>!m) do
    if $1.nil?
      lang=default_lang
    else
      lang = $1.intern
    end
    CodeRay.scan($2, lang).div()
  end
end
于 2010-10-25T03:47:12.743 に答える