我怎样才能让Sinatra将Markdown作为HTML以及源代码作为纯文本提供?

时间:2011-03-30 14:25:03

标签: ruby sinatra markdown

我正在使用Sinatra和Heroku建立一个简单的“笔记”网站。我使用Markdown编写笔记,并使用rdiscount gem将它们转换为Sinatra中的HTML。因此,对/ foo的请求将提供模板/views/foo.md,转换为HTML

我还希望能够将Markdown源作为纯文本文件提供。所以/ foo / source(或类似的东西)会将/views/foo.md作为纯文本提供服务。

我尝试过使用ERB,但最终想要提供/views/foo.erb。

这是我目前的应用:

require 'sinatra'
require 'rdiscount'

set :markdown, :layout_engine => :erb

get '/' do
  markdown :index
end

get '/:topic' do
  markdown params[:topic].to_sym
end

3 个答案:

答案 0 :(得分:3)

简短回答:使用File.read来吸收文件的内容,然后用它做你想做的事:

get '/topic/:topic'
    markdown File.read(params[:topic] + ".md")
end

答案很长:Sinatra可能会因点和冒号以及文件类型而变得愚蠢,因此您可能不得不重新控制参数。以下(工作!)Sinatra应用程序可能有助于演示。

require 'rubygems'
require 'sinatra'

get '/' do  
  markdown <<-MARKDOWN
# Markdown in Sinatra
* [markdown](/notes)
* [plain text](/notes.txt)
* [pre html](/notes.html)
  MARKDOWN
end

def source
  parts = params[:base].split('.')
  name = parts.first
  ext = parts.last
  filename = name  + ".md"
  source = File.read(filename)
  puts "filename=" + filename.inspect
  puts "source=" + source.inspect
  source
end

get '/:base.txt' do
  source
end

get '/:base.html' do
  "<pre>#{source}</pre>"
end

get '/:base' do
  markdown source
end

答案 1 :(得分:0)

通过稍微搜索,我设法使用send_file:

get '/:topic/source' do
  send_file File.dirname(__FILE__) + "/views/#{params[:topic]}.md", :type => :text
end

但是我想相信那里有一个更优雅的解决方案,所以现在暂时保持这个问题。

答案 2 :(得分:-1)

您可以尝试使用str模板:

get '/:topic/source' do
  str params[:topic].to_sym
end

唯一需要考虑的是,它会尝试插入值,就像使用字符串一样 - 换句话说,它会尝试用#{foo}替换foo.to_s。这可能是也可能不合适。

免责声明:我不确定它是否有效,我不得不通过查看Tilt的源代码推断出这一功能,而我还没有对其进行测试。

编辑:我担心这不起作用。可以像这样定义str方法:

helpers do
  def str(*args) render(:str, *args) end
end

Tilt引擎尝试查找名为'foo.str'的视图,而不是使用'foo.md'。我也尝试将'md'注册为StringTemplate的有效扩展,但它不起作用(我将markdown呈现为字符串,或者我有与以前相同的错误。

对不起。