【问题标题】:How can I get Sinatra to deliver Markdown as HTML as well as the source code as plain text?如何让 Sinatra 以 HTML 形式提供 Markdown 以及以纯文本形式提供源代码?
【发布时间】:2011-09-29 01:02:26
【问题描述】:

我正在使用 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

【问题讨论】:

  • 查看我的完整答案,而且,这一行可能会让您感到困惑:“set :markdown, :layout_engine => :erb”——“layout_engine”选项中的“layout”使用 Rails ' 将“布局”定义为“页面包装器”,如“在渲染markdown 模板时使用erb引擎进行布局”,我在任何地方都看不到任何布局。这就是你惹的祸吗?

标签: ruby sinatra markdown


【解决方案1】:

简答:使用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

【讨论】:

    【解决方案2】:

    通过更多搜索,我设法使用 send_file 让它工作:

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

    但我想相信有一个更优雅的解决方案,所以现在让这个问题悬而未决。

    【讨论】:

      【解决方案3】:

      您可以尝试使用str 模板:

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

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

      免责声明:我不确定它是否会起作用,我必须通过查看Tilt 的源代码来推断此功能,并且我还没有测试过。

      编辑:恐怕这行不通。可以像这样定义 str 方法:

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

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

      对不起。

      【讨论】:

      • 生成错误:#<:application:0x0000010104b508> 的未定义方法`str'。我猜我需要使用另一种语法。还在想办法。
      • 尝试了更多东西,并添加到我的答案中。但是,没有任何效果:/
      • 感谢您的浏览。现在我上面的回答就可以解决问题了。
      • 你想太多了。如果你想要的是原始文本,那么获取原始文本并发出它。 Sinatra 是 Ruby!
      猜你喜欢
      • 2016-11-20
      • 1970-01-01
      • 1970-01-01
      • 2016-03-03
      • 1970-01-01
      • 1970-01-01
      • 2014-07-04
      • 2016-08-09
      • 1970-01-01
      相关资源
      最近更新 更多