mirror of
				https://github.com/sinatra/sinatra
				synced 2023-03-27 23:18:01 -04:00 
			
		
		
		
	add support for stylus templates, fixes #553
This commit is contained in:
		
							parent
							
								
									f328c3dab1
								
							
						
					
					
						commit
						1d48a759b6
					
				
					 7 changed files with 129 additions and 0 deletions
				
			
		
							
								
								
									
										2
									
								
								CHANGES
									
										
									
									
									
								
							
							
						
						
									
										2
									
								
								CHANGES
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -6,6 +6,8 @@
 | 
			
		|||
 | 
			
		||||
 * Add support for Wlang templates. (Bernard Lambeau)
 | 
			
		||||
 | 
			
		||||
 * Add support for Stylus templates. (Juan David Pastas, Konstantin Haase)
 | 
			
		||||
 | 
			
		||||
 * You can now pass a block to ERb, Haml, Slim, Liquid and Wlang templates,
 | 
			
		||||
   which will be used when calling `yield` in the template. (Alexey Muranov)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										1
									
								
								Gemfile
									
										
									
									
									
								
							
							
						
						
									
										1
									
								
								Gemfile
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -44,6 +44,7 @@ gem 'radius'
 | 
			
		|||
gem 'rabl' unless RUBY_ENGINE =~ /jruby|maglev/
 | 
			
		||||
gem 'wlang', '>= 2.0.1' unless RUBY_ENGINE =~ /jruby|rbx/
 | 
			
		||||
gem 'liquid' unless RUBY_ENGINE == 'rbx' and RUBY_VERSION > '1.9'
 | 
			
		||||
gem 'stylus'
 | 
			
		||||
 | 
			
		||||
if RUBY_ENGINE == 'jruby'
 | 
			
		||||
  gem 'nokogiri', '!= 1.5.0'
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -537,6 +537,12 @@ Dependencias::             {coffee-script}[https://github.com/josh/ruby-coffee-s
 | 
			
		|||
Extensiones de Archivo::   <tt>.coffee</tt>
 | 
			
		||||
Ejemplo::                  <tt>coffee :index</tt>
 | 
			
		||||
 | 
			
		||||
=== Plantillas Stylus
 | 
			
		||||
 | 
			
		||||
Dependencias::             {ruby-stylus}[https://github.com/lucasmazza/ruby-stylus]
 | 
			
		||||
Extensiones de Archivo::   <tt>.styl</tt>
 | 
			
		||||
Ejemplo::                  <tt>stylus :index</tt>
 | 
			
		||||
 | 
			
		||||
=== Plantillas Yajl
 | 
			
		||||
 | 
			
		||||
Dependencias::             {yajl-ruby}[https://github.com/brianmario/yajl-ruby]
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										24
									
								
								README.md
									
										
									
									
									
								
							
							
						
						
									
										24
									
								
								README.md
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -821,6 +821,30 @@ template than for the layout by passing the `:layout_engine` option.
 | 
			
		|||
  </tr>
 | 
			
		||||
</table>
 | 
			
		||||
 | 
			
		||||
#### Stylus Templates
 | 
			
		||||
 | 
			
		||||
<table>
 | 
			
		||||
  <tr>
 | 
			
		||||
    <td>Dependency</td>
 | 
			
		||||
    <td>
 | 
			
		||||
      <a href="https://github.com/lucasmazza/ruby-stylus" title="Ruby Stylus">
 | 
			
		||||
        Stylus
 | 
			
		||||
      </a> and a
 | 
			
		||||
      <a href="https://github.com/sstephenson/execjs/blob/master/README.md#readme" title="ExecJS">
 | 
			
		||||
        way to execute javascript
 | 
			
		||||
      </a>
 | 
			
		||||
    </td>
 | 
			
		||||
  </tr>
 | 
			
		||||
  <tr>
 | 
			
		||||
    <td>File Extension</td>
 | 
			
		||||
    <td><tt>.styl</tt></td>
 | 
			
		||||
  </tr>
 | 
			
		||||
  <tr>
 | 
			
		||||
    <td>Example</td>
 | 
			
		||||
    <td><tt>stylus :index</tt></td>
 | 
			
		||||
  </tr>
 | 
			
		||||
</table>
 | 
			
		||||
 | 
			
		||||
#### Yajl Templates
 | 
			
		||||
 | 
			
		||||
<table>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -660,6 +660,11 @@ module Sinatra
 | 
			
		|||
      render :less, template, options, locals
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    def stylus(template, options={}, locals={})
 | 
			
		||||
      options.merge! :layout => false, :default_content_type => :css
 | 
			
		||||
      render :styl, template, options, locals
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    def builder(template = nil, options = {}, locals = {}, &block)
 | 
			
		||||
      options[:default_content_type] = :xml
 | 
			
		||||
      render_ruby(:builder, template, options, locals, &block)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										89
									
								
								test/stylus_test.rb
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										89
									
								
								test/stylus_test.rb
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,89 @@
 | 
			
		|||
require File.expand_path('../helper', __FILE__)
 | 
			
		||||
 | 
			
		||||
begin
 | 
			
		||||
  require 'stylus'
 | 
			
		||||
 | 
			
		||||
  begin
 | 
			
		||||
    Stylus.compile '1'
 | 
			
		||||
  rescue RuntimeError
 | 
			
		||||
    raise LoadError, 'unable to find Stylus compiler'
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  class StylusTest < Test::Unit::TestCase
 | 
			
		||||
    def stylus_app(options = {}, &block)
 | 
			
		||||
      mock_app do
 | 
			
		||||
        set :views, File.dirname(__FILE__) + '/views'
 | 
			
		||||
        set(options)
 | 
			
		||||
        get('/', &block)
 | 
			
		||||
      end
 | 
			
		||||
      get '/'
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    it 'renders inline Stylus strings' do
 | 
			
		||||
      stylus_app { stylus "a\n margin auto\n" }
 | 
			
		||||
      assert ok?
 | 
			
		||||
      assert body.include?("a {\n  margin: auto;\n}\n")
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    it 'defaults content type to css' do
 | 
			
		||||
      stylus_app { stylus :hello }
 | 
			
		||||
      assert ok?
 | 
			
		||||
      assert_equal "text/css;charset=utf-8", response['Content-Type']
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    it 'defaults allows setting content type per route' do
 | 
			
		||||
      stylus_app do
 | 
			
		||||
        content_type :html
 | 
			
		||||
        stylus :hello
 | 
			
		||||
      end
 | 
			
		||||
      assert ok?
 | 
			
		||||
      assert_equal "text/html;charset=utf-8", response['Content-Type']
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    it 'defaults allows setting content type globally' do
 | 
			
		||||
      stylus_app(:styl => { :content_type => 'html' }) do
 | 
			
		||||
        stylus :hello
 | 
			
		||||
      end
 | 
			
		||||
      assert ok?
 | 
			
		||||
      assert_equal "text/html;charset=utf-8", response['Content-Type']
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    it 'renders .styl files in views path' do
 | 
			
		||||
      stylus_app { stylus :hello }
 | 
			
		||||
      assert ok?
 | 
			
		||||
      assert_include body, "a {\n  margin: auto;\n}\n"
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    it 'ignores the layout option' do
 | 
			
		||||
      stylus_app { stylus :hello, :layout => :layout2 }
 | 
			
		||||
      assert ok?
 | 
			
		||||
      assert_include body, "a {\n  margin: auto;\n}\n"
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    it "raises error if template not found" do
 | 
			
		||||
      mock_app {
 | 
			
		||||
        get('/') { stylus :no_such_template }
 | 
			
		||||
      }
 | 
			
		||||
      assert_raise(Errno::ENOENT) { get('/') }
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    it "passes stylus options to the stylus engine" do
 | 
			
		||||
      stylus_app { stylus :hello, :no_wrap => true }
 | 
			
		||||
      assert ok?
 | 
			
		||||
      assert_body "a {\n  margin: auto;\n}\n"
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    it "passes default stylus options to the stylus engine" do
 | 
			
		||||
      mock_app do
 | 
			
		||||
        set :stylus, :no_wrap => true # default stylus style is :nested
 | 
			
		||||
        get('/') { stylus :hello }
 | 
			
		||||
      end
 | 
			
		||||
      get '/'
 | 
			
		||||
      assert ok?
 | 
			
		||||
      assert_body "a {\n  margin: auto;\n}\n"
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
rescue LoadError
 | 
			
		||||
  warn "#{$!.to_s}: skipping stylus tests"
 | 
			
		||||
end
 | 
			
		||||
							
								
								
									
										2
									
								
								test/views/hello.styl
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								test/views/hello.styl
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,2 @@
 | 
			
		|||
a
 | 
			
		||||
  margin auto
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue