Merge branch 'mediawiki-support' of https://github.com/somu/sinatra

Conflicts:
	Gemfile
This commit is contained in:
Konstantin Haase 2014-02-21 10:31:57 +01:00
commit baae681420
6 changed files with 147 additions and 0 deletions

View File

@ -52,6 +52,7 @@ if RUBY_ENGINE == "ruby" and RUBY_VERSION > '1.9.2'
gem 'kramdown'
gem 'maruku'
gem 'creole'
gem 'wikicloth'
gem 'markaby'
gem 'radius'
gem 'liquid'

View File

@ -57,6 +57,7 @@ pick up if available.
* [RABL Templates](#rabl-templates)
* [Slim Templates](#slim-templates)
* [Creole Templates](#creole-templates)
* [MediaWiki Templates](#mediawiki-templates)
* [CoffeeScript Templates](#coffeescript-templates)
* [Stylus Templates](#stylus-templates)
* [Yajl Templates](#yajl-templates)
@ -897,6 +898,41 @@ Since you cannot call Ruby from Creole, you cannot use layouts written in
Creole. However, it is possible to use another rendering engine for the
template than for the layout by passing the `:layout_engine` option.
#### MediaWiki Templates
<table>
<tr>
<td>Dependency</td>
<td><a href="https://github.com/nricciar/wikicloth" title="WikiCloth">WikiCloth</a></td>
</tr>
<tr>
<td>File Extension</td>
<td><tt>.mediawiki</tt> and <tt>.mw</tt></td>
</tr>
<tr>
<td>Example</td>
<td><tt>mediawiki :wiki, :layout_engine => :erb</tt></td>
</tr>
</table>
It is not possible to call methods from MediaWiki markup, nor to pass locals to it.
You therefore will usually use it in combination with another rendering engine:
``` ruby
erb :overview, :locals => { :text => mediawiki(:introduction) }
```
Note that you may also call the `mediawiki` method from within other templates:
``` ruby
%h1 Hello From Haml!
%p= mediawiki(:greetings)
```
Since you cannot call Ruby from MediaWiki, you cannot use layouts written in
MediaWiki. However, it is possible to use another rendering engine for the
template than for the layout by passing the `:layout_engine` option.
#### CoffeeScript Templates
<table>

View File

@ -820,6 +820,43 @@ erb :overview, :locals => { :text => creole(:introduction) }
один шаблонизатор для отображения шаблона, а другой для лэйаута с помощью
опции `:layout_engine`.
#### MediaWiki шаблоны
<table>
<tr>
<td>Зависимости</td>
<td><a href="https://github.com/nricciar/wikicloth" title="WikiCloth">WikiCloth</a></td>
</tr>
<tr>
<td>Расширения файлов</td>
<td><tt>.mediawiki</tt> и <tt>.mw</tt></td>
</tr>
<tr>
<td>Пример</td>
<td><tt>mediawiki :wiki, :layout_engine => :erb</tt></td>
</tr>
</table>
В разметке MediaWiki невозможно вызывать методы или передавать локальные переменные.
Следовательно, вам, скорее всего, придется использовать этот шаблон совместно
с другим шаблонизатором:
```ruby
erb :overview, :locals => { :text => mediawiki(:introduction) }
```
Заметьте, что вы можете вызывать метод `mediawiki` из других шаблонов:
```ruby
%h1 Hello From Haml!
%p= mediawiki(:greetings)
```
Вы не можете вызывать Ruby из MediaWiki, соответственно, вы не можете
использовать лэйауты на MediaWiki. Тем не менее, есть возможность использовать
один шаблонизатор для отображения шаблона, а другой для лэйаута с помощью
опции `:layout_engine`.
#### CoffeeScript шаблоны
<table>

View File

@ -741,6 +741,10 @@ module Sinatra
render :creole, template, options, locals
end
def mediawiki(template, options = {}, locals = {})
render :mediawiki, template, options, locals
end
def wlang(template, options = {}, locals = {}, &block)
render(:wlang, template, options, locals, &block)
end

68
test/mediawiki_test.rb Normal file
View File

@ -0,0 +1,68 @@
require File.expand_path('../helper', __FILE__)
begin
require 'wikicloth'
class MediaWikiTest < Test::Unit::TestCase
def mediawiki_app(&block)
mock_app do
set :views, File.dirname(__FILE__) + '/views'
get('/', &block)
end
get '/'
end
it 'supports both .mw and .mediawiki extensions' do
assert_equal Tilt[:mw], Tilt[:mediawiki]
end
it 'renders inline mediawiki strings' do
mediawiki_app { mediawiki "''Hiya''" }
assert ok?
assert_include body, '<i>Hiya</i>'
end
it 'renders .mediawiki files in views path' do
mediawiki_app { mediawiki :hello }
assert ok?
assert_include body, "<i>Hello from MediaWiki</i>"
end
it 'raises error if template not found' do
mock_app { get('/') { mediawiki :no_such_template } }
assert_raise(Errno::ENOENT) { get('/') }
end
it 'renders with inline layouts' do
mock_app do
layout { 'THIS. IS. #{yield.upcase}!' }
get('/') { mediawiki 'Sparta', :layout_engine => :str }
end
get '/'
assert ok?
assert_like 'THIS. IS. <P>SPARTA</P>!', body
end
it 'renders with file layouts' do
mediawiki_app do
mediawiki 'Hello World', :layout => :layout2, :layout_engine => :erb
end
assert ok?
assert_body "ERB Layout!\n<p>Hello World</p>"
end
it 'can be used in a nested fashion for partials and whatnot' do
mock_app do
template(:inner) { "hi" }
template(:outer) { "<outer><%= mediawiki :inner %></outer>" }
get('/') { erb :outer }
end
get '/'
assert ok?
assert_like '<outer><p>hi</p></outer>', body
end
end
rescue LoadError
warn "#{$!.to_s}: skipping mediawiki tests"
end

View File

@ -0,0 +1 @@
''Hello from MediaWiki''