2011-03-30 36 views
2

我建設使用西納特拉和Heroku的一個簡單的「筆記」的網站。我使用Markdown編寫筆記,並使用rdiscount gem將它們轉換爲Sinatra中的HTML。所以/ foo的請求會提供模板/views/foo.md,轉換爲HTML我如何才能讓Sinatra以純文本的形式將Markdown作爲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 
+0

查看我的完整答案,但是,這行可能會讓你感到困惑:「set:markdown,:layout_engine =>:erb」 - 「layout_engine」選項中的「佈局」使用Rails的定義「layout」作爲「頁面包裝器」,如「在渲染markdown *模板時使用* layouts *的erb引擎*」,並且我在任何地方都看不到任何佈局。那是什麼讓你搞砸了? – AlexChaffee 2011-09-28 17:54:29

回答

0

有了多一點的搜索,我設法得到它的工作使用由send_file:

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

但我願意相信有一個更好的解決方案那麼現在就讓問題開放吧。

-1

您可以嘗試使用str模板:

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

考慮的唯一的事情是,它會嘗試插值值像它會用繩子做的 - 換句話說,它」我會嘗試用foo.to_s代替#{foo}。這可能會或可能不是理想的。

聲明:我不確定它會工作,我不得不通過查看Tilt的源代碼來推測此功能,但我沒有對其進行測試。

編輯:恐怕不行。這是可能的這樣定義海峽方法:

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

的傾斜引擎試圖找到一個名爲「foo.str」,而不是使用「foo.md」視圖。我也試圖註冊「MD」作爲StringTemplate的一個有效的擴展,但它沒有工作(我要麼得到呈現爲字符串降價,或者我有同樣的錯誤了。

對不起。

+0

這會產生一個錯誤:未定義的方法'str'用於#。我猜想還有另一種我需要使用的語法。仍在試圖弄清楚。 – 2011-03-30 15:14:36

+0

嘗試了更多的東西,並添加到我的答案。然而,沒有任何工作:/ – kikito 2011-03-30 16:29:24

+0

謝謝你看看。現在我的回答就是這樣。 – 2011-03-30 17:55:31

3

簡短的回答:使用File.read在該文件的內容吮吸,然後做你想做的吧:

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

龍答:西納特拉可以得到一種具有點和冒號和文件類型的愚蠢,所以你可能要奪取參數的控制,下面的(工作!)西納特拉的應用程序可以幫助演示。

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 
相關問題