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テンプレートエンジンを作成する必要がありますか、それとももっと簡単な方法がありますか?