diff --git a/Gemfile b/Gemfile index 9424fef7..ca5a0d9e 100644 --- a/Gemfile +++ b/Gemfile @@ -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' diff --git a/README.md b/README.md index e836844b..3b1ac762 100644 --- a/README.md +++ b/README.md @@ -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 + + + + + + + + + + + + + + +
DependencyWikiCloth
File Extension.mediawiki and .mw
Examplemediawiki :wiki, :layout_engine => :erb
+ +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 diff --git a/README.ru.md b/README.ru.md index 34377f5b..4672a469 100644 --- a/README.ru.md +++ b/README.ru.md @@ -820,6 +820,43 @@ erb :overview, :locals => { :text => creole(:introduction) } один шаблонизатор для отображения шаблона, а другой для лэйаута с помощью опции `:layout_engine`. +#### MediaWiki шаблоны + +
+ + + + + + + + + + + + +
ЗависимостиWikiCloth
Расширения файлов.mediawiki и .mw
Примерmediawiki :wiki, :layout_engine => :erb
+ +В разметке MediaWiki невозможно вызывать методы или передавать локальные переменные. +Следовательно, вам, скорее всего, придется использовать этот шаблон совместно +с другим шаблонизатором: + +```ruby +erb :overview, :locals => { :text => mediawiki(:introduction) } +``` + +Заметьте, что вы можете вызывать метод `mediawiki` из других шаблонов: + +```ruby +%h1 Hello From Haml! +%p= mediawiki(:greetings) +``` + +Вы не можете вызывать Ruby из MediaWiki, соответственно, вы не можете +использовать лэйауты на MediaWiki. Тем не менее, есть возможность использовать +один шаблонизатор для отображения шаблона, а другой для лэйаута с помощью +опции `:layout_engine`. + #### CoffeeScript шаблоны diff --git a/lib/sinatra/base.rb b/lib/sinatra/base.rb index d4b0f68d..b419f4fc 100644 --- a/lib/sinatra/base.rb +++ b/lib/sinatra/base.rb @@ -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 diff --git a/test/mediawiki_test.rb b/test/mediawiki_test.rb new file mode 100644 index 00000000..051f3892 --- /dev/null +++ b/test/mediawiki_test.rb @@ -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, 'Hiya' + end + + it 'renders .mediawiki files in views path' do + mediawiki_app { mediawiki :hello } + assert ok? + assert_include body, "Hello from MediaWiki" + 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.

SPARTA

!', 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

Hello World

" + end + + it 'can be used in a nested fashion for partials and whatnot' do + mock_app do + template(:inner) { "hi" } + template(:outer) { "<%= mediawiki :inner %>" } + get('/') { erb :outer } + end + + get '/' + assert ok? + assert_like '

hi

', body + end + end +rescue LoadError + warn "#{$!.to_s}: skipping mediawiki tests" +end diff --git a/test/views/hello.mediawiki b/test/views/hello.mediawiki new file mode 100644 index 00000000..55e65133 --- /dev/null +++ b/test/views/hello.mediawiki @@ -0,0 +1 @@ +''Hello from MediaWiki''