4

TL; DR-improved_markdown :some_fileカスタムレンダリングを行うようなものを使用しながら、通常どおりレイアウトをレンダリングするにはどうすればよいですか?


通常、SinatraでMarkdownをレンダリングするには、次のようにします。

markdown :some_file

ただし、Github READMEファイルで実行できるように、「フェンスで囲まれた」構文の強調表示を実行する機能を追加したいと思います。

```ruby
class Foo
  # etc
end
```

私はこれを部分的に機能させています。

まず、Redcarpetをインストールし、構文の強調表示にPygments.rbを使用するカスタムレンダリングクラスを追加しました。

# create a custom renderer that allows highlighting of code blocks
class HTMLwithPygments < Redcarpet::Render::HTML
  def block_code(code, language)
    Pygments.highlight(code, lexer: language)
  end
end

次に、次のようなルートで使用しました。

# Try to load any Markdown file specified in the URL
get '/*' do
  viewname = params[:splat].first

  if File.exist?("views/#{viewname}.md")

    # Uses my custom rendering class
    # The :fenced_code_blocks option means it will take, for example,
    # the word 'ruby' from ```ruby and pass that as the language
    # argument to my block_code method above  
    markdown_renderer = Redcarpet::Markdown.new(HTMLwithPygments, :fenced_code_blocks => true)

    file_contents = File.read("views/#{viewname}.md")
    markdown_renderer.render(file_contents)

  else
    "Nopers, I can't find it."
  end
end

これはほとんど機能します。マークダウンは、強調表示の目的で追加のマークアップを含むHTMLとしてレンダリングされます。

唯一の問題は、私のレイアウトを使用しないことです。結局のところ、私はファイルを読み取って、レンダリングされた文字列を返すだけです。通常のmarkdown :foo呼び出しでは、プロセスにTiltが含まれます。

それを機能させるには、カスタムのTiltテンプレートエンジンを作成する必要がありますか、それとももっと簡単な方法がありますか?

4

3 に答える 3

0

そのような仕事には、ザックのGlorify gem を使用できます。

于 2012-08-05T21:48:12.617 に答える
0

回避策

私は現在これをやっています:

if File.exist?("views/#{viewname}.md") 
  CustomMarkdown.render(File.read("views/#{viewname}.md"))

使用するもの:

module CustomMarkdown
  def self.render(markdown_string)
    content = renderer.render(markdown_string)
    layout.render { content }
  end
  def self.renderer
    @markdown_renderer ||= Redcarpet::Markdown.new(HTMLwithPygments, :fenced_code_blocks => true)
  end
  def self.layout
    # Yes, this is hardcoded; in my simple app, I always use this layout.
    Tilt['haml'].new do
      File.read("views/layout.haml")
    end
  end
end

これはまともに機能します。次のように、キーワードのないフェンスで囲まれたブロックに気付きました。

```
  code of unspecified type
```
# vs
```ruby
  explicitly ruby code
```

... Sinatra アプリがクラッシュします。発生したエラーを自分でキャッチできないため、これは Python レイヤーにエラーがあることを意味すると思います。

更新:クラッシュは で発生しますrackup config.ruが、Passenger を使用している場合は発生しません。

于 2012-08-02T20:43:03.043 に答える