2014-11-06 46 views
4

幫助程序功能可以接收它們yield來呈現該塊的塊。有時候我想讓這個塊用過濾器來指定。例如:幫助程序中的HAML過濾器

= doc_page title: 'FAQ' do 
    :markdown 
    # Welcome to the *FAQ* 

這不是乾的,因爲我們一直在寫doc_page和markdown在一起。我可以讓輔助方法接受一個塊並通過HAML過濾器傳遞它。喜歡的東西:

= doc_page title: 'FAQ' do 
    # Welcome to the *FAQ* 

在這個幻想,doc_page是一個輔助方法,做一些設置的東西,然後再通過降價內容,節省了我們需要聲明:markdown無處不在,讓世界變得乾燥的地方。

+0

這個問題還不清楚。你在輔助者裏究竟想做什麼?將Haml塊渲染爲HTML? – Substantial 2014-11-09 10:38:40

+0

更新了問題。我試圖做一個幫助器輸出一個標題,然後通過markdown傳遞該塊,以節省每次在幫助器調用下放置單獨的':markdown'聲明。 – mahemoff 2014-11-09 14:53:17

+0

不重要,但是:爲什麼要通過標題?爲什麼不用'markdown'文本本身呢?它可能看起來更完整。另外,將降價文本放在單獨的「降價」文件中,然後讓幫助者加載它們,不是更好嗎?在我看來,這將更加優雅。另外,它可能更容易編輯,因爲它只是純粹的'markdown';編輯可能會更好地處理文件語法突出顯示。 – 2014-12-11 04:24:59

回答

4

目前在助手中不可能使用過濾器。另一種方法是使用redcarpet解析降價,然後將輸出傳遞給助手。

一個例子是:

= doc_page title: 'FAQ', :markdown do 
    ### my markdown 

= doc_page title: 'FAQ' do 
    normal html 

的doc_page的實施將是這樣的:

def doc_page(title, markup=:html) 

    content = yield 

    if markup == :markdown 
    markdown = Redcarpet::Markdown.new(Redcarpet::Render::HTML) 
    content = markdown.render(content) 
    end 

    content 
end 

這將解決你的問題,因爲你在幫助定義降價過濾器。你不需要額外的縮進級別。

2

你可以直接使用tilt(api haml用來渲染markdown)而不是通過haml。可能是這樣的(未測試)。

markdown_template = Tilt['md'].new { "# this is markdown code" } 
markdown_template.render 

你可以在Tilt docs找到一個類似的例子。 但是,這不是一個完整的實現。

2

我很害怕,但它是不可能的,因爲HAML是preprocessor,basicly這段代碼:

= doc_page title: 'FAQ' do 
    # Welcome to the *FAQ* 
    %a href="/" link 

將在運行時Ruby代碼轉換,如:

concat(doc_page title: 'FAQ' do 
    # Welcome to the *FAQ* 
    concat('<a href="/">link</a>') 
end)