slim 0.7.0 → 0.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Gemfile.lock +3 -6
 - data/README.md +32 -56
 - data/Rakefile +2 -2
 - data/benchmarks/run.rb +49 -16
 - data/lib/slim.rb +0 -8
 - data/lib/slim/compiler.rb +17 -26
 - data/lib/slim/embedded_engine.rb +18 -11
 - data/lib/slim/end_inserter.rb +10 -11
 - data/lib/slim/engine.rb +8 -3
 - data/lib/slim/filter.rb +8 -37
 - data/lib/slim/parser.rb +27 -25
 - data/lib/slim/template.rb +2 -31
 - data/lib/slim/version.rb +1 -1
 - data/slim.gemspec +1 -2
 - data/test/helper.rb +35 -8
 - data/test/slim/test_code_blocks.rb +37 -2
 - data/test/slim/test_code_escaping.rb +2 -2
 - data/test/slim/test_code_evaluation.rb +31 -9
 - data/test/slim/test_code_output.rb +9 -1
 - data/test/slim/test_code_structure.rb +23 -13
 - data/test/slim/test_html_structure.rb +32 -8
 - data/test/slim/test_parser_errors.rb +2 -2
 - data/test/slim/test_ruby_errors.rb +28 -0
 - metadata +25 -42
 - data/lib/slim/helpers.rb +0 -81
 - data/test/slim/test_code_helpers.rb +0 -30
 
    
        data/Gemfile.lock
    CHANGED
    
    | 
         @@ -2,8 +2,7 @@ PATH 
     | 
|
| 
       2 
2 
     | 
    
         
             
              remote: .
         
     | 
| 
       3 
3 
     | 
    
         
             
              specs:
         
     | 
| 
       4 
4 
     | 
    
         
             
                slim (0.7.0)
         
     | 
| 
       5 
     | 
    
         
            -
                   
     | 
| 
       6 
     | 
    
         
            -
                  temple (~> 0.1.3)
         
     | 
| 
      
 5 
     | 
    
         
            +
                  temple (~> 0.1.4)
         
     | 
| 
       7 
6 
     | 
    
         
             
                  tilt (~> 1.1)
         
     | 
| 
       8 
7 
     | 
    
         | 
| 
       9 
8 
     | 
    
         
             
            GEM
         
     | 
| 
         @@ -12,14 +11,13 @@ GEM 
     | 
|
| 
       12 
11 
     | 
    
         
             
                abstract (1.0.0)
         
     | 
| 
       13 
12 
     | 
    
         
             
                erubis (2.6.6)
         
     | 
| 
       14 
13 
     | 
    
         
             
                  abstract (>= 1.0.0)
         
     | 
| 
       15 
     | 
    
         
            -
                escape_utils (0.1.9)
         
     | 
| 
       16 
14 
     | 
    
         
             
                haml (3.0.22)
         
     | 
| 
       17 
15 
     | 
    
         
             
                liquid (2.2.2)
         
     | 
| 
       18 
16 
     | 
    
         
             
                minitest (1.7.2)
         
     | 
| 
       19 
17 
     | 
    
         
             
                rake (0.8.7)
         
     | 
| 
       20 
18 
     | 
    
         
             
                rcov (0.9.9)
         
     | 
| 
       21 
19 
     | 
    
         
             
                rdiscount (1.6.5)
         
     | 
| 
       22 
     | 
    
         
            -
                temple (0.1. 
     | 
| 
      
 20 
     | 
    
         
            +
                temple (0.1.4)
         
     | 
| 
       23 
21 
     | 
    
         
             
                tilt (1.1)
         
     | 
| 
       24 
22 
     | 
    
         
             
                yard (0.6.1)
         
     | 
| 
       25 
23 
     | 
    
         | 
| 
         @@ -28,7 +26,6 @@ PLATFORMS 
     | 
|
| 
       28 
26 
     | 
    
         | 
| 
       29 
27 
     | 
    
         
             
            DEPENDENCIES
         
     | 
| 
       30 
28 
     | 
    
         
             
              erubis
         
     | 
| 
       31 
     | 
    
         
            -
              escape_utils (>= 0.1.9)
         
     | 
| 
       32 
29 
     | 
    
         
             
              haml
         
     | 
| 
       33 
30 
     | 
    
         
             
              liquid
         
     | 
| 
       34 
31 
     | 
    
         
             
              minitest
         
     | 
| 
         @@ -36,6 +33,6 @@ DEPENDENCIES 
     | 
|
| 
       36 
33 
     | 
    
         
             
              rcov
         
     | 
| 
       37 
34 
     | 
    
         
             
              rdiscount
         
     | 
| 
       38 
35 
     | 
    
         
             
              slim!
         
     | 
| 
       39 
     | 
    
         
            -
              temple (~> 0.1. 
     | 
| 
      
 36 
     | 
    
         
            +
              temple (~> 0.1.4)
         
     | 
| 
       40 
37 
     | 
    
         
             
              tilt (~> 1.1)
         
     | 
| 
       41 
38 
     | 
    
         
             
              yard
         
     | 
    
        data/README.md
    CHANGED
    
    | 
         @@ -5,7 +5,7 @@ Slim is a template language whose goal is to reduce the view syntax to the essen 
     | 
|
| 
       5 
5 
     | 
    
         | 
| 
       6 
6 
     | 
    
         
             
            ## What?
         
     | 
| 
       7 
7 
     | 
    
         | 
| 
       8 
     | 
    
         
            -
            Slim is a fast, lightweight templating engine with support for __Rails 3__. It has been tested on Ruby 1.9.2 and Ruby/REE 1.8.7. 
     | 
| 
      
 8 
     | 
    
         
            +
            Slim is a fast, lightweight templating engine with support for __Rails 3__. It has been tested on Ruby 1.9.2 and Ruby/REE 1.8.7.
         
     | 
| 
       9 
9 
     | 
    
         | 
| 
       10 
10 
     | 
    
         
             
            Slim's core syntax is guided by one thought: "What's the minimum required to make this work".
         
     | 
| 
       11 
11 
     | 
    
         | 
| 
         @@ -15,10 +15,11 @@ Slim uses [Temple](http://github.com/judofyr/temple) for parsing/compilation and 
     | 
|
| 
       15 
15 
     | 
    
         | 
| 
       16 
16 
     | 
    
         
             
            ## Why?
         
     | 
| 
       17 
17 
     | 
    
         | 
| 
       18 
     | 
    
         
            -
            Within the Rails community, _Erb_ and _Haml_ are without doubt the two most popular templating engines. However, _Erb_'s syntax is cumbersome and  
     | 
| 
      
 18 
     | 
    
         
            +
            Within the Rails community, _Erb_ and _Haml_ are without doubt the two most popular templating engines. However, _Erb_'s syntax is cumbersome and _Haml_'s performance isn't exactly the best.
         
     | 
| 
       19 
19 
     | 
    
         | 
| 
       20 
     | 
    
         
            -
            Slim was born to bring a minimalist syntax approach with speed. 
     | 
| 
      
 20 
     | 
    
         
            +
            Slim was born to bring a minimalist syntax approach with speed. If people chose not to use Slim, it would not be because of speed.
         
     | 
| 
       21 
21 
     | 
    
         | 
| 
      
 22 
     | 
    
         
            +
            ___Yes, Slim is speedy!___ Benchmarks are provided at the end of this README file. Alternatively, a benchmark rake task is provided so you could test it yourself (`rake bench`).
         
     | 
| 
       22 
23 
     | 
    
         | 
| 
       23 
24 
     | 
    
         
             
            ## How?
         
     | 
| 
       24 
25 
     | 
    
         | 
| 
         @@ -28,13 +29,9 @@ Install Slim as a gem: 
     | 
|
| 
       28 
29 
     | 
    
         | 
| 
       29 
30 
     | 
    
         
             
            Include Slim in your Gemfile:
         
     | 
| 
       30 
31 
     | 
    
         | 
| 
       31 
     | 
    
         
            -
                gem 'slim'
         
     | 
| 
      
 32 
     | 
    
         
            +
                gem 'slim', require: 'slim/rails'
         
     | 
| 
       32 
33 
     | 
    
         | 
| 
       33 
     | 
    
         
            -
             
     | 
| 
       34 
     | 
    
         
            -
             
     | 
| 
       35 
     | 
    
         
            -
                require 'slim/rails'
         
     | 
| 
       36 
     | 
    
         
            -
             
     | 
| 
       37 
     | 
    
         
            -
            That's it!
         
     | 
| 
      
 34 
     | 
    
         
            +
            That's it! Now, just use the .slim extension and you're good to go.
         
     | 
| 
       38 
35 
     | 
    
         | 
| 
       39 
36 
     | 
    
         
             
            If you want to use the Slim template directly, you can use the Tilt interface:
         
     | 
| 
       40 
37 
     | 
    
         | 
| 
         @@ -122,7 +119,7 @@ __Please note that all line indicators must be followed by a space__ 
     | 
|
| 
       122 
119 
     | 
    
         
             
            ### Things to know
         
     | 
| 
       123 
120 
     | 
    
         | 
| 
       124 
121 
     | 
    
         
             
            #### Standard Ruby syntax after `-` and `=`
         
     | 
| 
       125 
     | 
    
         
            -
              `end` is  
     | 
| 
      
 122 
     | 
    
         
            +
              `end` is forbidden behind `-`. Blocks are defined only by indentation.
         
     | 
| 
       126 
123 
     | 
    
         | 
| 
       127 
124 
     | 
    
         
             
            #### Can put content on same line or nest it.
         
     | 
| 
       128 
125 
     | 
    
         
             
              If you nest content (e.g. put it on the next line), start the line with a pipe (`|`) or a backtick (`` ` ``).
         
     | 
| 
         @@ -267,56 +264,29 @@ __Please note that all line indicators must be followed by a space__ 
     | 
|
| 
       267 
264 
     | 
    
         | 
| 
       268 
265 
     | 
    
         
             
                <body><p></p></body>
         
     | 
| 
       269 
266 
     | 
    
         | 
| 
       270 
     | 
    
         
            -
             
     | 
| 
       271 
267 
     | 
    
         
             
            ## Benchmarks
         
     | 
| 
       272 
268 
     | 
    
         | 
| 
       273 
269 
     | 
    
         
             
                # OS X 10.6 + Ruby 1.9.2
         
     | 
| 
       274 
270 
     | 
    
         | 
| 
       275 
     | 
    
         
            -
             
     | 
| 
       276 
     | 
    
         
            -
                erb 
     | 
| 
       277 
     | 
    
         
            -
                erubis 
     | 
| 
       278 
     | 
    
         
            -
                fast erubis 
     | 
| 
       279 
     | 
    
         
            -
                slim 
     | 
| 
       280 
     | 
    
         
            -
                haml 
     | 
| 
       281 
     | 
    
         
            -
                haml ugly 
     | 
| 
       282 
     | 
    
         
            -
                erb ( 
     | 
| 
       283 
     | 
    
         
            -
                erubis ( 
     | 
| 
       284 
     | 
    
         
            -
                fast erubis ( 
     | 
| 
       285 
     | 
    
         
            -
                slim ( 
     | 
| 
       286 
     | 
    
         
            -
                haml ( 
     | 
| 
       287 
     | 
    
         
            -
                haml ugly ( 
     | 
| 
       288 
     | 
    
         
            -
             
     | 
| 
       289 
     | 
    
         
            -
                 
     | 
| 
       290 
     | 
    
         
            -
             
     | 
| 
       291 
     | 
    
         
            -
             
     | 
| 
       292 
     | 
    
         
            -
                 
     | 
| 
       293 
     | 
    
         
            -
                 
     | 
| 
       294 
     | 
    
         
            -
                fast erubis            0.310000   0.000000   0.310000 (  0.309852)
         
     | 
| 
       295 
     | 
    
         
            -
                slim                   2.420000   0.020000   2.440000 (  2.470208)
         
     | 
| 
       296 
     | 
    
         
            -
                haml                   2.990000   0.020000   3.010000 (  3.040942)
         
     | 
| 
       297 
     | 
    
         
            -
                haml ugly              2.900000   0.020000   2.920000 (  3.101786)
         
     | 
| 
       298 
     | 
    
         
            -
                erb (cached)           0.080000   0.000000   0.080000 (  0.079252)
         
     | 
| 
       299 
     | 
    
         
            -
                erubis (cached)        0.070000   0.000000   0.070000 (  0.066370)
         
     | 
| 
       300 
     | 
    
         
            -
                fast erubis (cached)   0.060000   0.000000   0.060000 (  0.062001)
         
     | 
| 
       301 
     | 
    
         
            -
                slim (cached)          0.030000   0.000000   0.030000 (  0.023835)
         
     | 
| 
       302 
     | 
    
         
            -
                haml (cached)          0.270000   0.010000   0.280000 (  0.279409)
         
     | 
| 
       303 
     | 
    
         
            -
                haml ugly (cached)     0.210000   0.000000   0.210000 (  0.221059)
         
     | 
| 
       304 
     | 
    
         
            -
             
     | 
| 
       305 
     | 
    
         
            -
                # OSX 10.6 + JRuby 1.5.3
         
     | 
| 
       306 
     | 
    
         
            -
             
     | 
| 
       307 
     | 
    
         
            -
                                           user     system      total        real
         
     | 
| 
       308 
     | 
    
         
            -
                erb                    0.970000   0.000000   0.970000 (  0.970000)
         
     | 
| 
       309 
     | 
    
         
            -
                erubis                 0.672000   0.000000   0.672000 (  0.672000)
         
     | 
| 
       310 
     | 
    
         
            -
                fast erubis            0.624000   0.000000   0.624000 (  0.624000)
         
     | 
| 
       311 
     | 
    
         
            -
                slim                   2.694000   0.000000   2.694000 (  2.694000)
         
     | 
| 
       312 
     | 
    
         
            -
                haml                   3.368000   0.000000   3.368000 (  3.368000)
         
     | 
| 
       313 
     | 
    
         
            -
                haml ugly              3.462000   0.000000   3.462000 (  3.462000)
         
     | 
| 
       314 
     | 
    
         
            -
                erb (cached)           0.736000   0.000000   0.736000 (  0.736000)
         
     | 
| 
       315 
     | 
    
         
            -
                erubis (cached)        0.413000   0.000000   0.413000 (  0.413000)
         
     | 
| 
       316 
     | 
    
         
            -
                fast erubis (cached)   0.340000   0.000000   0.340000 (  0.340000)
         
     | 
| 
       317 
     | 
    
         
            -
                slim (cached)          0.069000   0.000000   0.069000 (  0.069000)
         
     | 
| 
       318 
     | 
    
         
            -
                haml (cached)          1.001000   0.000000   1.001000 (  1.001000)
         
     | 
| 
       319 
     | 
    
         
            -
                haml ugly (cached)     0.763000   0.000000   0.763000 (  0.763000)
         
     | 
| 
      
 271 
     | 
    
         
            +
                                             user     system      total        real
         
     | 
| 
      
 272 
     | 
    
         
            +
                erb                      2.200000   0.020000   2.220000 (  2.259262)
         
     | 
| 
      
 273 
     | 
    
         
            +
                erubis                   1.870000   0.010000   1.880000 (  1.895547)
         
     | 
| 
      
 274 
     | 
    
         
            +
                fast erubis              1.870000   0.010000   1.880000 (  1.887996)
         
     | 
| 
      
 275 
     | 
    
         
            +
                slim                    10.380000   0.080000  10.460000 ( 10.543296)
         
     | 
| 
      
 276 
     | 
    
         
            +
                haml                    16.250000   0.070000  16.320000 ( 16.376137)
         
     | 
| 
      
 277 
     | 
    
         
            +
                haml ugly               15.700000   0.080000  15.780000 ( 15.869233)
         
     | 
| 
      
 278 
     | 
    
         
            +
                erb (compiled)           0.820000   0.010000   0.830000 (  0.821538)
         
     | 
| 
      
 279 
     | 
    
         
            +
                erubis (compiled)        0.680000   0.000000   0.680000 (  0.680444)
         
     | 
| 
      
 280 
     | 
    
         
            +
                fast erubis (compiled)   0.600000   0.010000   0.610000 (  0.605370)
         
     | 
| 
      
 281 
     | 
    
         
            +
                slim (compiled)          0.180000   0.000000   0.180000 (  0.182536)
         
     | 
| 
      
 282 
     | 
    
         
            +
                haml (compiled)          1.800000   0.020000   1.820000 (  1.863224)
         
     | 
| 
      
 283 
     | 
    
         
            +
                haml ugly (compiled)     1.560000   0.020000   1.580000 (  1.602106)
         
     | 
| 
      
 284 
     | 
    
         
            +
                erb (cached)             0.120000   0.000000   0.120000 (  0.127988)
         
     | 
| 
      
 285 
     | 
    
         
            +
                erubis (cached)          0.110000   0.000000   0.110000 (  0.115064)
         
     | 
| 
      
 286 
     | 
    
         
            +
                fast erubis (cached)     0.120000   0.010000   0.130000 (  0.122645)
         
     | 
| 
      
 287 
     | 
    
         
            +
                slim (cached)            0.140000   0.000000   0.140000 (  0.134598)
         
     | 
| 
      
 288 
     | 
    
         
            +
                haml (cached)            0.660000   0.000000   0.660000 (  0.661025)
         
     | 
| 
      
 289 
     | 
    
         
            +
                haml ugly (cached)       0.590000   0.010000   0.600000 (  0.602522)
         
     | 
| 
       320 
290 
     | 
    
         | 
| 
       321 
291 
     | 
    
         
             
            ## Authors
         
     | 
| 
       322 
292 
     | 
    
         | 
| 
         @@ -327,3 +297,9 @@ __Please note that all line indicators must be followed by a space__ 
     | 
|
| 
       327 
297 
     | 
    
         
             
            ## Discuss
         
     | 
| 
       328 
298 
     | 
    
         | 
| 
       329 
299 
     | 
    
         
             
            [Google Group](http://groups.google.com/group/slim-template)
         
     | 
| 
      
 300 
     | 
    
         
            +
             
     | 
| 
      
 301 
     | 
    
         
            +
            ## Slim related projects
         
     | 
| 
      
 302 
     | 
    
         
            +
              
         
     | 
| 
      
 303 
     | 
    
         
            +
            * [Textmate bundle](http://github.com/fredwu/ruby-slim-textmate-bundle)
         
     | 
| 
      
 304 
     | 
    
         
            +
            * [Rails 3 Generators](http://github.com/leogalmeida/slim-rails)
         
     | 
| 
      
 305 
     | 
    
         
            +
            * [Slim for Clojure](http://github.com/chaslemley/slim.clj)
         
     | 
    
        data/Rakefile
    CHANGED
    
    | 
         @@ -7,8 +7,8 @@ end 
     | 
|
| 
       7 
7 
     | 
    
         
             
            require 'rake/testtask'
         
     | 
| 
       8 
8 
     | 
    
         | 
| 
       9 
9 
     | 
    
         
             
            desc 'Run Slim benchmarks! (Default :iterations is 1000)'
         
     | 
| 
       10 
     | 
    
         
            -
            task :bench, :iterations do |t, args|
         
     | 
| 
       11 
     | 
    
         
            -
              ruby("benchmarks/run.rb #{args[:iterations]}")
         
     | 
| 
      
 10 
     | 
    
         
            +
            task :bench, :iterations, :slow do |t, args|
         
     | 
| 
      
 11 
     | 
    
         
            +
              ruby("benchmarks/run.rb #{args[:slow]} #{args[:iterations]}")
         
     | 
| 
       12 
12 
     | 
    
         
             
            end
         
     | 
| 
       13 
13 
     | 
    
         | 
| 
       14 
14 
     | 
    
         
             
            Rake::TestTask.new(:test) do |t|
         
     | 
    
        data/benchmarks/run.rb
    CHANGED
    
    | 
         @@ -12,7 +12,7 @@ require 'erb' 
     | 
|
| 
       12 
12 
     | 
    
         
             
            require 'haml'
         
     | 
| 
       13 
13 
     | 
    
         | 
| 
       14 
14 
     | 
    
         
             
            class SlimBenchmarks
         
     | 
| 
       15 
     | 
    
         
            -
              def initialize(iterations)
         
     | 
| 
      
 15 
     | 
    
         
            +
              def initialize(slow, iterations)
         
     | 
| 
       16 
16 
     | 
    
         
             
                @iterations = (iterations || 1000).to_i
         
     | 
| 
       17 
17 
     | 
    
         
             
                @benches    = []
         
     | 
| 
       18 
18 
     | 
    
         | 
| 
         @@ -26,22 +26,41 @@ class SlimBenchmarks 
     | 
|
| 
       26 
26 
     | 
    
         
             
                erb         = ERB.new(tpl_erb)
         
     | 
| 
       27 
27 
     | 
    
         
             
                erubis      = Erubis::Eruby.new(tpl_erb)
         
     | 
| 
       28 
28 
     | 
    
         
             
                fast_erubis = Erubis::FastEruby.new(tpl_erb)
         
     | 
| 
       29 
     | 
    
         
            -
                haml        = Haml::Engine.new(tpl_haml)
         
     | 
| 
       30 
     | 
    
         
            -
                haml_ugly   = Haml::Engine.new(tpl_haml, :ugly => true)
         
     | 
| 
      
 29 
     | 
    
         
            +
                haml        = Haml::Engine.new(tpl_haml, :format => :html5)
         
     | 
| 
      
 30 
     | 
    
         
            +
                haml_ugly   = Haml::Engine.new(tpl_haml, :format => :html5, :ugly => true)
         
     | 
| 
       31 
31 
     | 
    
         
             
                slim        = Slim::Template.new { tpl_slim }
         
     | 
| 
       32 
32 
     | 
    
         | 
| 
       33 
     | 
    
         
            -
                 
     | 
| 
       34 
     | 
    
         
            -
                 
     | 
| 
       35 
     | 
    
         
            -
                 
     | 
| 
       36 
     | 
    
         
            -
             
     | 
| 
       37 
     | 
    
         
            -
             
     | 
| 
       38 
     | 
    
         
            -
             
     | 
| 
       39 
     | 
    
         
            -
             
     | 
| 
       40 
     | 
    
         
            -
                 
     | 
| 
       41 
     | 
    
         
            -
             
     | 
| 
       42 
     | 
    
         
            -
                 
     | 
| 
       43 
     | 
    
         
            -
             
     | 
| 
       44 
     | 
    
         
            -
             
     | 
| 
      
 33 
     | 
    
         
            +
                haml.def_method(view, :run_haml)
         
     | 
| 
      
 34 
     | 
    
         
            +
                haml_ugly.def_method(view, :run_haml_ugly)
         
     | 
| 
      
 35 
     | 
    
         
            +
                view.instance_eval %{
         
     | 
| 
      
 36 
     | 
    
         
            +
                  def run_erb; #{erb.src}; end
         
     | 
| 
      
 37 
     | 
    
         
            +
                  def run_erubis; #{erubis.src}; end
         
     | 
| 
      
 38 
     | 
    
         
            +
                  def run_fast_erubis; #{fast_erubis.src}; end
         
     | 
| 
      
 39 
     | 
    
         
            +
                  def run_slim; #{slim.precompiled_template}; end
         
     | 
| 
      
 40 
     | 
    
         
            +
                }
         
     | 
| 
      
 41 
     | 
    
         
            +
             
     | 
| 
      
 42 
     | 
    
         
            +
                if slow
         
     | 
| 
      
 43 
     | 
    
         
            +
                  bench('erb (1)')         { ERB.new(tpl_erb).result(eview) }
         
     | 
| 
      
 44 
     | 
    
         
            +
                  bench('erubis (1)')      { Erubis::Eruby.new(tpl_erb).result(eview) }
         
     | 
| 
      
 45 
     | 
    
         
            +
                  bench('fast erubis (1)') { Erubis::Eruby.new(tpl_erb).result(eview) }
         
     | 
| 
      
 46 
     | 
    
         
            +
                  bench('slim (1)')        { Slim::Template.new { tpl_slim }.render(view) }
         
     | 
| 
      
 47 
     | 
    
         
            +
                  bench('haml (1)')        { Haml::Engine.new(tpl_haml, :format => :html5).render(view) }
         
     | 
| 
      
 48 
     | 
    
         
            +
                  bench('haml ugly (1)')   { Haml::Engine.new(tpl_haml, :format => :html5, :ugly => true).render(view) }
         
     | 
| 
      
 49 
     | 
    
         
            +
                end
         
     | 
| 
      
 50 
     | 
    
         
            +
             
     | 
| 
      
 51 
     | 
    
         
            +
                bench('erb (2)')         { erb.result(eview) }
         
     | 
| 
      
 52 
     | 
    
         
            +
                bench('erubis (2)')      { erubis.result(eview) }
         
     | 
| 
      
 53 
     | 
    
         
            +
                bench('fast (2)')        { fast_erubis.result(eview) }
         
     | 
| 
      
 54 
     | 
    
         
            +
                bench('slim (2)')        { slim.render(view) }
         
     | 
| 
      
 55 
     | 
    
         
            +
                bench('haml (2)')        { haml.render(view) }
         
     | 
| 
      
 56 
     | 
    
         
            +
                bench('haml (2)')        { haml_ugly.render(view) }
         
     | 
| 
      
 57 
     | 
    
         
            +
             
     | 
| 
      
 58 
     | 
    
         
            +
                bench('erb (3)')         { view.run_erb }
         
     | 
| 
      
 59 
     | 
    
         
            +
                bench('erubis (3)')      { view.run_erubis }
         
     | 
| 
      
 60 
     | 
    
         
            +
                bench('fast erubis (3)') { view.run_fast_erubis }
         
     | 
| 
      
 61 
     | 
    
         
            +
                bench('slim (3)')        { view.run_slim }
         
     | 
| 
      
 62 
     | 
    
         
            +
                bench('haml (3)')        { view.run_haml }
         
     | 
| 
      
 63 
     | 
    
         
            +
                bench('haml ugly (3)')   { view.run_haml_ugly }
         
     | 
| 
       45 
64 
     | 
    
         
             
              end
         
     | 
| 
       46 
65 
     | 
    
         | 
| 
       47 
66 
     | 
    
         
             
              def run
         
     | 
| 
         @@ -53,6 +72,20 @@ class SlimBenchmarks 
     | 
|
| 
       53 
72 
     | 
    
         
             
                    end
         
     | 
| 
       54 
73 
     | 
    
         
             
                  end
         
     | 
| 
       55 
74 
     | 
    
         
             
                end
         
     | 
| 
      
 75 
     | 
    
         
            +
                puts "
         
     | 
| 
      
 76 
     | 
    
         
            +
            1. Uncached benchmark. Template is parsed every time.
         
     | 
| 
      
 77 
     | 
    
         
            +
               Activate this benchmark with slow=1.
         
     | 
| 
      
 78 
     | 
    
         
            +
             
     | 
| 
      
 79 
     | 
    
         
            +
            2. Cached benchmark. Template is parsed before the benchmark.
         
     | 
| 
      
 80 
     | 
    
         
            +
               The ruby code generated by the template engine might be evaluated every time.
         
     | 
| 
      
 81 
     | 
    
         
            +
               This benchmark uses the standard API of the template engine.
         
     | 
| 
      
 82 
     | 
    
         
            +
             
     | 
| 
      
 83 
     | 
    
         
            +
            3. Compiled benchmark. Template is parsed before the benchmark and
         
     | 
| 
      
 84 
     | 
    
         
            +
               generated ruby code is compiled into a method.
         
     | 
| 
      
 85 
     | 
    
         
            +
               This is the fastest evaluation strategy because it benchmarks
         
     | 
| 
      
 86 
     | 
    
         
            +
               pure execution speed of the generated ruby code.
         
     | 
| 
      
 87 
     | 
    
         
            +
             
     | 
| 
      
 88 
     | 
    
         
            +
            "
         
     | 
| 
       56 
89 
     | 
    
         
             
              end
         
     | 
| 
       57 
90 
     | 
    
         | 
| 
       58 
91 
     | 
    
         
             
              def bench(name, &block)
         
     | 
| 
         @@ -60,4 +93,4 @@ class SlimBenchmarks 
     | 
|
| 
       60 
93 
     | 
    
         
             
              end
         
     | 
| 
       61 
94 
     | 
    
         
             
            end
         
     | 
| 
       62 
95 
     | 
    
         | 
| 
       63 
     | 
    
         
            -
            SlimBenchmarks.new(ARGV[0]).run
         
     | 
| 
      
 96 
     | 
    
         
            +
            SlimBenchmarks.new(ARGV[0], ARGV[1]).run
         
     | 
    
        data/lib/slim.rb
    CHANGED
    
    | 
         @@ -1,9 +1,6 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            # encoding: utf-8
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
       3 
3 
     | 
    
         
             
            require 'temple'
         
     | 
| 
       4 
     | 
    
         
            -
            require 'tilt'
         
     | 
| 
       5 
     | 
    
         
            -
             
     | 
| 
       6 
     | 
    
         
            -
            require 'slim/helpers'
         
     | 
| 
       7 
4 
     | 
    
         
             
            require 'slim/parser'
         
     | 
| 
       8 
5 
     | 
    
         
             
            require 'slim/filter'
         
     | 
| 
       9 
6 
     | 
    
         
             
            require 'slim/end_inserter'
         
     | 
| 
         @@ -13,11 +10,6 @@ require 'slim/engine' 
     | 
|
| 
       13 
10 
     | 
    
         
             
            require 'slim/template'
         
     | 
| 
       14 
11 
     | 
    
         
             
            require 'slim/version'
         
     | 
| 
       15 
12 
     | 
    
         | 
| 
       16 
     | 
    
         
            -
            begin
         
     | 
| 
       17 
     | 
    
         
            -
              require 'escape_utils'
         
     | 
| 
       18 
     | 
    
         
            -
            rescue LoadError
         
     | 
| 
       19 
     | 
    
         
            -
            end
         
     | 
| 
       20 
     | 
    
         
            -
             
     | 
| 
       21 
13 
     | 
    
         
             
            module Slim
         
     | 
| 
       22 
14 
     | 
    
         
             
              def self.version
         
     | 
| 
       23 
15 
     | 
    
         
             
                VERSION
         
     | 
    
        data/lib/slim/compiler.rb
    CHANGED
    
    | 
         @@ -6,7 +6,7 @@ module Slim 
     | 
|
| 
       6 
6 
     | 
    
         
             
                #
         
     | 
| 
       7 
7 
     | 
    
         
             
                # @param [String] string Static text
         
     | 
| 
       8 
8 
     | 
    
         
             
                # @return [Array] Compiled temple expression
         
     | 
| 
       9 
     | 
    
         
            -
                def  
     | 
| 
      
 9 
     | 
    
         
            +
                def on_slim_text(string)
         
     | 
| 
       10 
10 
     | 
    
         
             
                  # Interpolate variables in text (#{variable}).
         
     | 
| 
       11 
11 
     | 
    
         
             
                  # Split the text into multiple dynamic and static parts.
         
     | 
| 
       12 
12 
     | 
    
         
             
                  block = [:multi]
         
     | 
| 
         @@ -17,7 +17,7 @@ module Slim 
     | 
|
| 
       17 
17 
     | 
    
         
             
                      block << [:static, $1]
         
     | 
| 
       18 
18 
     | 
    
         
             
                    when /^\#\{([^\}]*)\}/
         
     | 
| 
       19 
19 
     | 
    
         
             
                      # Interpolation
         
     | 
| 
       20 
     | 
    
         
            -
                      block << [:dynamic,  
     | 
| 
      
 20 
     | 
    
         
            +
                      block << [:escape, :dynamic, $1]
         
     | 
| 
       21 
21 
     | 
    
         
             
                    when /^([^\#]+|\#)/
         
     | 
| 
       22 
22 
     | 
    
         
             
                      # Static text
         
     | 
| 
       23 
23 
     | 
    
         
             
                      block << [:static, $&]
         
     | 
| 
         @@ -32,10 +32,10 @@ module Slim 
     | 
|
| 
       32 
32 
     | 
    
         
             
                # @param [String] ruby code
         
     | 
| 
       33 
33 
     | 
    
         
             
                # @param [Array] content Temple expression
         
     | 
| 
       34 
34 
     | 
    
         
             
                # @return [Array] Compiled temple expression
         
     | 
| 
       35 
     | 
    
         
            -
                def  
     | 
| 
      
 35 
     | 
    
         
            +
                def on_slim_control(code, content)
         
     | 
| 
       36 
36 
     | 
    
         
             
                  [:multi,
         
     | 
| 
       37 
37 
     | 
    
         
             
                    [:block, code],
         
     | 
| 
       38 
     | 
    
         
            -
                    compile(content)]
         
     | 
| 
      
 38 
     | 
    
         
            +
                    compile!(content)]
         
     | 
| 
       39 
39 
     | 
    
         
             
                end
         
     | 
| 
       40 
40 
     | 
    
         | 
| 
       41 
41 
     | 
    
         
             
                # Handle output expression `[:slim, :output, escape, code, content]`
         
     | 
| 
         @@ -44,11 +44,11 @@ module Slim 
     | 
|
| 
       44 
44 
     | 
    
         
             
                # @param [String] code Ruby code
         
     | 
| 
       45 
45 
     | 
    
         
             
                # @param [Array] content Temple expression
         
     | 
| 
       46 
46 
     | 
    
         
             
                # @return [Array] Compiled temple expression
         
     | 
| 
       47 
     | 
    
         
            -
                def  
     | 
| 
      
 47 
     | 
    
         
            +
                def on_slim_output(escape, code, content)
         
     | 
| 
       48 
48 
     | 
    
         
             
                  if empty_exp?(content)
         
     | 
| 
       49 
     | 
    
         
            -
                    [:multi, [:dynamic,  
     | 
| 
      
 49 
     | 
    
         
            +
                    [:multi, escape ? [:escape, :dynamic, code] : [:dynamic, code], content]
         
     | 
| 
       50 
50 
     | 
    
         
             
                  else
         
     | 
| 
       51 
     | 
    
         
            -
                     
     | 
| 
      
 51 
     | 
    
         
            +
                    on_slim_output_block(escape, code, content)
         
     | 
| 
       52 
52 
     | 
    
         
             
                  end
         
     | 
| 
       53 
53 
     | 
    
         
             
                end
         
     | 
| 
       54 
54 
     | 
    
         | 
| 
         @@ -59,7 +59,7 @@ module Slim 
     | 
|
| 
       59 
59 
     | 
    
         
             
                # @param [String] code Ruby code
         
     | 
| 
       60 
60 
     | 
    
         
             
                # @param [Array] content Temple expression
         
     | 
| 
       61 
61 
     | 
    
         
             
                # @return [Array] Compiled temple expression
         
     | 
| 
       62 
     | 
    
         
            -
                def  
     | 
| 
      
 62 
     | 
    
         
            +
                def on_slim_output_block(escape, code, content)
         
     | 
| 
       63 
63 
     | 
    
         
             
                  tmp1, tmp2 = tmp_var, tmp_var
         
     | 
| 
       64 
64 
     | 
    
         | 
| 
       65 
65 
     | 
    
         
             
                  [:multi,
         
     | 
| 
         @@ -72,7 +72,7 @@ module Slim 
     | 
|
| 
       72 
72 
     | 
    
         
             
                    # that `yield` will not output the content to the current buffer,
         
     | 
| 
       73 
73 
     | 
    
         
             
                    # but rather return the output.
         
     | 
| 
       74 
74 
     | 
    
         
             
                    [:capture, tmp2,
         
     | 
| 
       75 
     | 
    
         
            -
                     compile(content)],
         
     | 
| 
      
 75 
     | 
    
         
            +
                     compile!(content)],
         
     | 
| 
       76 
76 
     | 
    
         | 
| 
       77 
77 
     | 
    
         
             
                    # Make sure that `yield` returns the output.
         
     | 
| 
       78 
78 
     | 
    
         
             
                    [:block, tmp2],
         
     | 
| 
         @@ -81,14 +81,14 @@ module Slim 
     | 
|
| 
       81 
81 
     | 
    
         
             
                    [:block, 'end'],
         
     | 
| 
       82 
82 
     | 
    
         | 
| 
       83 
83 
     | 
    
         
             
                    # Output the content.
         
     | 
| 
       84 
     | 
    
         
            -
                     
     | 
| 
      
 84 
     | 
    
         
            +
                    on_slim_output(escape, tmp1, [:multi])]
         
     | 
| 
       85 
85 
     | 
    
         
             
                end
         
     | 
| 
       86 
86 
     | 
    
         | 
| 
       87 
87 
     | 
    
         
             
                # Handle directive expression `[:slim, :directive, type]`
         
     | 
| 
       88 
88 
     | 
    
         
             
                #
         
     | 
| 
       89 
89 
     | 
    
         
             
                # @param [String] type Directive type
         
     | 
| 
       90 
90 
     | 
    
         
             
                # @return [Array] Compiled temple expression
         
     | 
| 
       91 
     | 
    
         
            -
                def  
     | 
| 
      
 91 
     | 
    
         
            +
                def on_slim_directive(type)
         
     | 
| 
       92 
92 
     | 
    
         
             
                  if type =~ /^doctype/
         
     | 
| 
       93 
93 
     | 
    
         
             
                    [:html, :doctype, $'.strip]
         
     | 
| 
       94 
94 
     | 
    
         
             
                  end
         
     | 
| 
         @@ -100,29 +100,20 @@ module Slim 
     | 
|
| 
       100 
100 
     | 
    
         
             
                # @param [Array] attrs Attributes
         
     | 
| 
       101 
101 
     | 
    
         
             
                # @param [Array] content Temple expression
         
     | 
| 
       102 
102 
     | 
    
         
             
                # @return [Array] Compiled temple expression
         
     | 
| 
       103 
     | 
    
         
            -
                def  
     | 
| 
       104 
     | 
    
         
            -
                  attrs = attrs.inject([:html, : 
     | 
| 
      
 103 
     | 
    
         
            +
                def on_slim_tag(name, attrs, closed, content)
         
     | 
| 
      
 104 
     | 
    
         
            +
                  attrs = attrs.inject([:html, :staticattrs]) do |m, (key, dynamic, value)|
         
     | 
| 
       105 
105 
     | 
    
         
             
                    value = if dynamic
         
     | 
| 
       106 
     | 
    
         
            -
                              [:dynamic,  
     | 
| 
      
 106 
     | 
    
         
            +
                              [:escape, :dynamic, value]
         
     | 
| 
       107 
107 
     | 
    
         
             
                            else
         
     | 
| 
       108 
     | 
    
         
            -
                               
     | 
| 
      
 108 
     | 
    
         
            +
                              on_slim_text(value)
         
     | 
| 
       109 
109 
     | 
    
         
             
                            end
         
     | 
| 
       110 
     | 
    
         
            -
                    m << [ 
     | 
| 
      
 110 
     | 
    
         
            +
                    m << [key.to_s, value]
         
     | 
| 
       111 
111 
     | 
    
         
             
                  end
         
     | 
| 
       112 
     | 
    
         
            -
             
     | 
| 
       113 
     | 
    
         
            -
                  [:html, :tag, name, attrs, compile(content)]
         
     | 
| 
      
 112 
     | 
    
         
            +
                  [:html, :tag, name, attrs, closed, compile!(content)]
         
     | 
| 
       114 
113 
     | 
    
         
             
                end
         
     | 
| 
       115 
114 
     | 
    
         | 
| 
       116 
115 
     | 
    
         
             
                private
         
     | 
| 
       117 
116 
     | 
    
         | 
| 
       118 
     | 
    
         
            -
                # Generate code to escape html
         
     | 
| 
       119 
     | 
    
         
            -
                #
         
     | 
| 
       120 
     | 
    
         
            -
                # @param [String] param Ruby code
         
     | 
| 
       121 
     | 
    
         
            -
                # @return [String] Ruby code
         
     | 
| 
       122 
     | 
    
         
            -
                def escape_code(param)
         
     | 
| 
       123 
     | 
    
         
            -
                  "Slim::Helpers.escape_html#{@options[:use_html_safe] ? '_safe' : ''}((#{param}))"
         
     | 
| 
       124 
     | 
    
         
            -
                end
         
     | 
| 
       125 
     | 
    
         
            -
             
     | 
| 
       126 
117 
     | 
    
         
             
                # Generate unique temporary variable name
         
     | 
| 
       127 
118 
     | 
    
         
             
                #
         
     | 
| 
       128 
119 
     | 
    
         
             
                # @return [String] Variable name
         
     | 
    
        data/lib/slim/embedded_engine.rb
    CHANGED
    
    | 
         @@ -14,8 +14,8 @@ module Slim 
     | 
|
| 
       14 
14 
     | 
    
         
             
                  engine.dup
         
     | 
| 
       15 
15 
     | 
    
         
             
                end
         
     | 
| 
       16 
16 
     | 
    
         | 
| 
       17 
     | 
    
         
            -
                def  
     | 
| 
       18 
     | 
    
         
            -
                  EmbeddedEngine[engine]. 
     | 
| 
      
 17 
     | 
    
         
            +
                def on_slim_embedded(engine, *body)
         
     | 
| 
      
 18 
     | 
    
         
            +
                  EmbeddedEngine[engine].on_slim_embedded(engine, *body)
         
     | 
| 
       19 
19 
     | 
    
         
             
                end
         
     | 
| 
       20 
20 
     | 
    
         | 
| 
       21 
21 
     | 
    
         
             
                def collect_text(body)
         
     | 
| 
         @@ -33,18 +33,18 @@ module Slim 
     | 
|
| 
       33 
33 
     | 
    
         
             
                  # Code to collect local variables
         
     | 
| 
       34 
34 
     | 
    
         
             
                  COLLECT_LOCALS = %q{eval('{' + local_variables.select {|v| v[0] != ?_ }.map {|v| ":#{v}=>#{v}" }.join(',') + '}')}
         
     | 
| 
       35 
35 
     | 
    
         | 
| 
       36 
     | 
    
         
            -
                  def  
     | 
| 
      
 36 
     | 
    
         
            +
                  def on_slim_embedded(engine, *body)
         
     | 
| 
       37 
37 
     | 
    
         
             
                    text = collect_text(body)
         
     | 
| 
       38 
38 
     | 
    
         
             
                    engine = Tilt[engine]
         
     | 
| 
       39 
     | 
    
         
            -
                    if  
     | 
| 
      
 39 
     | 
    
         
            +
                    if options[:precompiled]
         
     | 
| 
       40 
40 
     | 
    
         
             
                      # Wrap precompiled code in proc, local variables from out the proc are accessible
         
     | 
| 
       41 
41 
     | 
    
         
             
                      # WARNING: This is a bit of a hack. Tilt::Engine#precompiled is protected
         
     | 
| 
       42 
42 
     | 
    
         
             
                      precompiled = engine.new { text }.send(:precompiled, {}).first
         
     | 
| 
       43 
43 
     | 
    
         
             
                      [:dynamic, "proc { #{precompiled} }.call"]
         
     | 
| 
       44 
     | 
    
         
            -
                    elsif  
     | 
| 
      
 44 
     | 
    
         
            +
                    elsif options[:dynamic]
         
     | 
| 
       45 
45 
     | 
    
         
             
                      # Fully dynamic evaluation of the template during runtime (Slow and uncached)
         
     | 
| 
       46 
46 
     | 
    
         
             
                      [:dynamic, "#{engine.name}.new { #{text.inspect} }.render(self, #{COLLECT_LOCALS})"]
         
     | 
| 
       47 
     | 
    
         
            -
                    elsif  
     | 
| 
      
 47 
     | 
    
         
            +
                    elsif options[:interpolate]
         
     | 
| 
       48 
48 
     | 
    
         
             
                      # Static template with interpolated ruby code
         
     | 
| 
       49 
49 
     | 
    
         
             
                      [:slim, :text, engine.new { text }.render]
         
     | 
| 
       50 
50 
     | 
    
         
             
                    else
         
     | 
| 
         @@ -54,15 +54,22 @@ module Slim 
     | 
|
| 
       54 
54 
     | 
    
         
             
                  end
         
     | 
| 
       55 
55 
     | 
    
         
             
                end
         
     | 
| 
       56 
56 
     | 
    
         | 
| 
      
 57 
     | 
    
         
            +
                class ERBEngine < EmbeddedEngine
         
     | 
| 
      
 58 
     | 
    
         
            +
                  def on_slim_embedded(engine, *body)
         
     | 
| 
      
 59 
     | 
    
         
            +
                    text = collect_text(body)
         
     | 
| 
      
 60 
     | 
    
         
            +
                    Temple::ERB::Parser.new(:auto_escape => true).compile(text)
         
     | 
| 
      
 61 
     | 
    
         
            +
                  end
         
     | 
| 
      
 62 
     | 
    
         
            +
                end
         
     | 
| 
      
 63 
     | 
    
         
            +
             
     | 
| 
       57 
64 
     | 
    
         
             
                class TagEngine < EmbeddedEngine
         
     | 
| 
       58 
     | 
    
         
            -
                  def  
     | 
| 
       59 
     | 
    
         
            -
                    content =  
     | 
| 
       60 
     | 
    
         
            -
                    [:slim, :tag,  
     | 
| 
      
 65 
     | 
    
         
            +
                  def on_slim_embedded(engine, *body)
         
     | 
| 
      
 66 
     | 
    
         
            +
                    content = options[:engine] ? options[:engine].new.on_slim_embedded(engine, *body) : [:multi, *body]
         
     | 
| 
      
 67 
     | 
    
         
            +
                    [:slim, :tag, options[:tag], options[:attributes].map {|k, v| [k, false, v] }, false, content]
         
     | 
| 
       61 
68 
     | 
    
         
             
                  end
         
     | 
| 
       62 
69 
     | 
    
         
             
                end
         
     | 
| 
       63 
70 
     | 
    
         | 
| 
       64 
71 
     | 
    
         
             
                class RubyEngine < EmbeddedEngine
         
     | 
| 
       65 
     | 
    
         
            -
                  def  
     | 
| 
      
 72 
     | 
    
         
            +
                  def on_slim_embedded(engine, *body)
         
     | 
| 
       66 
73 
     | 
    
         
             
                    [:block, collect_text(body)]
         
     | 
| 
       67 
74 
     | 
    
         
             
                  end
         
     | 
| 
       68 
75 
     | 
    
         
             
                end
         
     | 
| 
         @@ -79,7 +86,7 @@ module Slim 
     | 
|
| 
       79 
86 
     | 
    
         
             
                register :less, TagEngine, :tag => 'style', :attributes => { :type => 'text/css' }, :engine => TiltEngine
         
     | 
| 
       80 
87 
     | 
    
         | 
| 
       81 
88 
     | 
    
         
             
                # These engines are precompiled, code is embedded
         
     | 
| 
       82 
     | 
    
         
            -
                register :erb,  
     | 
| 
      
 89 
     | 
    
         
            +
                register :erb, ERBEngine
         
     | 
| 
       83 
90 
     | 
    
         
             
                register :haml, TiltEngine, :precompiled => true
         
     | 
| 
       84 
91 
     | 
    
         
             
                register :nokogiri, TiltEngine, :precompiled => true
         
     | 
| 
       85 
92 
     | 
    
         
             
                register :builder, TiltEngine, :precompiled => true
         
     |