Как я могу заставить Sinatra предоставлять Markdown в виде HTML, а также исходный код в виде простого текста? - PullRequest
2 голосов
/ 30 марта 2011

Я создаю простой сайт "заметок" с использованием Sinatra и Heroku.Я пишу свои заметки, используя Markdown, и использую гем rdiscount, чтобы преобразовать их в HTML в Sinatra.Таким образом, запрос на / 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 ]

3 голосов
/ 28 сентября 2011

Краткий ответ: используйте File.read, чтобы высосать содержимое файла, затем сделайте с ним все, что вы хотите:

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

Длинный ответ: Sinatra может стать глупым с точками, двоеточиями и типами файлов, так что вам, возможно, придется вырвать контроль над параметром.Следующее (работающее!) Приложение Sinatra может помочь продемонстрировать.

<code>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}
"end get" /: base "do markdown source end
0 голосов
/ 30 марта 2011

Вы можете попробовать использовать шаблон 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, но оно не сработало (я либо отобразил уценку в виде строки, либо у меня возникла та же ошибка, что и раньше.

К сожалению.

0 голосов
/ 30 марта 2011

Немного больше поиска мне удалось заставить его работать, используя send_file:

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

Но я хотел бы верить, что есть более элегантное решение, поэтому пока оставим вопрос открытым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...