slim 3.0.0 → 3.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1a7b030e5d1e59697c83e105cd3fabced713e020
4
- data.tar.gz: da7d8ed9b48d1e8a014334395b076d36160ed5cd
3
+ metadata.gz: eeabe6b2a2349dba5997fc11b9f8308b8c059b64
4
+ data.tar.gz: bf7ecd8073af2e89a0ee3cf413ac8db8bdf2392f
5
5
  SHA512:
6
- metadata.gz: c82fb688b72606a09154716304290a05ee4f44d98e868d6a13c194f84a2061e612b9012b7cc262de14410c5db1ec0a1de549503f0b92d78aee66f43fac485406
7
- data.tar.gz: a253b0c4833acdba6452540810784770227ed1dcad883d4f499f8a1e6c4329edf80cb4f9c98402075a5bd3ff7d097a82b509ad30789ef047d69decd4f014d3f7
6
+ metadata.gz: e84616653fbc224fbff5e4ce111a38d38afaa75a20a70f6f7c0428e65a225ca23228a4b0bf9c26d01784b3ee919d476cd369aaffdfe602d13a2cc2c8aa04cb1e
7
+ data.tar.gz: 122cfa59ce81ad34e11d67b9988768b69fa7a9cdb18bacd02a0a4d1f722631b7cfa5a22985dcde14c743fa99cb8726dda8a8a8b9d264c47066d55b8eb3fef289
data/.travis.yml CHANGED
@@ -22,6 +22,7 @@ env:
22
22
  - "TASK=test:rails RAILS=3.2.21 TILT=1.3.4"
23
23
  - "TASK=test:rails RAILS=4.0.12"
24
24
  - "TASK=test:rails RAILS=4.1.8"
25
+ - "TASK=test:rails RAILS=4.2.0"
25
26
  - "TASK=test:sinatra SINATRA=master"
26
27
  - "TASK=test:sinatra SINATRA=1.3.6"
27
28
  - "TASK=test:sinatra SINATRA=1.4.5"
data/CHANGES CHANGED
@@ -1,3 +1,8 @@
1
+ 3.0.1
2
+
3
+ * Allow more special characters in html attribute names (See https://html.spec.whatwg.org/multipage/syntax.html#attributes-2), #567
4
+ * Fix: Code attributes mutate their argument (#571)
5
+
1
6
  3.0.0
2
7
 
3
8
  * Drop 1.8.7 support
data/README.jp.md CHANGED
@@ -199,14 +199,14 @@ body
199
199
 
200
200
  行末がカンマ `,` で終わる場合 (例 関数呼び出し) には行末にバックスラッシュを追加する必要はありません。行末スペースを追加するために修飾子の `>` や `<` もサポートします。
201
201
 
202
- * `=>` は末尾のスペースを伴った出力をします。 末尾のスペースが追加されることを除いて, 単一の等合 (`=`) と同じです。古い構文の `='` も同様にサポートされます。
202
+ * `=>` は末尾のスペースを伴った出力をします。 末尾のスペースが追加されることを除いて, 単一の等合 (`=`) と同じです。
203
203
  * `=<` は先頭のスペースを伴った出力をします。先頭のスペースが追加されることを除いて, 単一の等号 (`=`) と同じです。
204
204
 
205
205
  ### HTML エスケープを伴わない出力 `==`
206
206
 
207
207
  単一のイコール (`=`) と同じですが, `escape_html` メソッドを経由しません。 末尾や先頭のスペースを追加するための修飾子 `>` と `<` はサポートされています。
208
208
 
209
- * `==>` は HTML エスケープを行わず末尾のスペースを伴った出力をします。末尾のスペースが追加されることを除いて, 二重等号 (`==`) と同じです。 古い構文の `=='` もサポートされます。
209
+ * `==>` は HTML エスケープを行わず末尾のスペースを伴った出力をします。末尾のスペースが追加されることを除いて, 二重等号 (`==`) と同じです。
210
210
  * `==<` は HTML エスケープを行わず先頭のスペースを伴った出力をします。先頭のスペースが追加されることを除いて, 二重等号 (`==`) と同じです。
211
211
 
212
212
  ### コードコメント `/`
@@ -870,10 +870,7 @@ Slim を設定する方法はコンパイル機構に少し依存します。(Ra
870
870
  ### デフォルトオプション
871
871
 
872
872
  ~~~ ruby
873
- # デバック用に html をきれいにインデントし属性をソートしない (Ruby 1.8)
874
- Slim::Engine.set_options pretty: true. sort_attrs: false
875
-
876
- # デバック用に html をきれいにインデントし属性をソートしない (Ruby 1.9)
873
+ # デバック用に html をきれいにインデントし属性をソートしない
877
874
  Slim::Engine.set_options pretty: true, sort_attrs: false
878
875
  ~~~
879
876
 
@@ -944,7 +941,7 @@ end
944
941
  | シンボル | :js_wrapper | nil | :comment, :cdata や :both で JavaScript をラップします。:guess を指定することで :format オプションに基いて設定することもできます |
945
942
  | 真偽値 | :pretty | false | 綺麗な html インデント <b>(遅くなります!)</b> |
946
943
  | 文字列 | :indent | ' ' | インデントに使用される文字列 |
947
- | 真偽値 | :streaming | false (Rails では true) | ストリーミング出力の有効化 |
944
+ | 真偽値 | :streaming | false (Rails では true, 無効化するにはストリーミングを参照) | ストリーミング出力の有効化, 体感的なパフォーマンスの向上 |
948
945
  | Class | :generator | Temple::Generators::ArrayBuffer/ RailsOutputBuffer | Temple コードジェネレータ (デフォルトのジェネレータは配列バッファを生成します) |
949
946
  | 文字列 | :buffer | '_buf' (Rails では '@output_buffer') | バッファに使用される変数 |
950
947
 
@@ -1015,12 +1012,17 @@ html
1015
1012
  ### Rails
1016
1013
 
1017
1014
  Rails のジェネレータは [slim-rails](https://github.com/slim-template/slim-rails) によって提供されます。
1018
- slim-rails は Rails で Slim を使用する場合に必須ではありません。Slim をインストールし Gemfile に `gem 'slim'` を追加するだけです。
1015
+ slim-rails は Rails で Slim を使用する場合に必須ではありません。Slim をインストールし Gemfile に `gem 'slim-rails'` を追加するだけです。
1019
1016
  後は .slim 拡張子を使えば Rails で使用できます。
1020
1017
 
1021
- #### Streaming
1018
+ #### ストリーミング
1019
+
1020
+ HTTP ストリーミングは Rails がそれをサポートしているバージョンであればデフォルトで有効化されています。しかし, ストリーミングが体感的なパフォーマンスを改善していることを知る必要があります。
1021
+ レンダリング時間は増加するでしょう。ストリーミングを無効化したい場合の設定です:
1022
1022
 
1023
- HTTP ストリーミングは Rails がそれをサポートしているバージョンであればデフォルトで有効化されています。
1023
+ ~~~ ruby
1024
+ Slim::RailsTemplate.set_options streaming: false
1025
+ ~~~
1024
1026
 
1025
1027
  ## ツール
1026
1028
 
@@ -1113,7 +1115,7 @@ Travis-CI は継続的インテグレーションテストに利用されてい
1113
1115
 
1114
1116
  Slim はすべての主要な Ruby 実装で動作します:
1115
1117
 
1116
- * Ruby 1.8.7, 1.9.3, 2.0.0 および 2.1.0
1118
+ * Ruby 1.9.3, 2.0.0 および 2.1.0
1117
1119
  * Ruby EE
1118
1120
  * JRuby 1.9 mode
1119
1121
  * Rubinius 2.0
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Slim
2
2
 
3
- [![Gem Version](https://badge.fury.io/rb/slim.png)](http://rubygems.org/gems/slim) [![Build Status](https://secure.travis-ci.org/slim-template/slim.png?branch=master)](http://travis-ci.org/slim-template/slim) [![Dependency Status](https://gemnasium.com/slim-template/slim.png?travis)](https://gemnasium.com/slim-template/slim) [![Code Climate](https://codeclimate.com/github/slim-template/slim.png)](https://codeclimate.com/github/slim-template/slim) [![Gittip donate button](http://img.shields.io/gittip/bevry.png)](https://www.gittip.com/min4d/ "Donate weekly to this project using Gittip")
3
+ [![Gem Version](https://img.shields.io/gem/v/slim.svg)](http://rubygems.org/gems/slim) [![Build Status](https://img.shields.io/travis/slim-template/slim.svg?branch=master)](http://travis-ci.org/slim-template/slim) [![Dependency Status](https://img.shields.io/gemnasium/slim-template/slim.svg?travis)](https://gemnasium.com/slim-template/slim) [![Code Climate](https://img.shields.io/codeclimate/github/slim-template/slim.svg)](https://codeclimate.com/github/slim-template/slim) [![Gittip donate button](https://img.shields.io/gratipay/bevry.svg)](https://www.gittip.com/min4d/ "Donate weekly to this project using Gittip")
4
4
  [![Flattr donate button](https://raw.github.com/balupton/flattr-buttons/master/badge-89x18.gif)](https://flattr.com/submit/auto?user_id=min4d&url=http%3A%2F%2Fslim-lang.org%2F "Donate monthly to this project using Flattr")
5
5
 
6
6
  Slim is a template language whose goal is to reduce the view syntax to the essential parts without becoming cryptic. It started as an exercise to see how much could be removed from a standard html template (<, >, closing tags, etc...). As more people took an interest in Slim, the functionality grew and so did the flexibility of the syntax.
@@ -1148,7 +1148,7 @@ Slim is released under the [MIT license](http://www.opensource.org/licenses/MIT)
1148
1148
 
1149
1149
  If you want to support this project please visit the Gittip and Flattr pages.
1150
1150
 
1151
- [![Gittip donate button](http://img.shields.io/gittip/bevry.png)](https://www.gittip.com/min4d/ "Donate weekly to this project using Gittip")
1151
+ [![Gittip donate button](https://img.shields.io/gratipay/bevry.svg)](https://www.gittip.com/min4d/ "Donate weekly to this project using Gittip")
1152
1152
  [![Flattr donate button](https://raw.github.com/balupton/flattr-buttons/master/badge-89x18.gif)](https://flattr.com/submit/auto?user_id=min4d&url=http%3A%2F%2Fslim-lang.org%2F "Donate monthly to this project using Flattr")
1153
1153
 
1154
1154
  Currently the donations will be used to cover the hosting costs (domain name etc).
@@ -54,7 +54,7 @@ module Slim
54
54
  [:code, "#{tmp} = #{code}"],
55
55
  [:if, "Array === #{tmp}",
56
56
  [:multi,
57
- [:code, "#{tmp}.flatten!"],
57
+ [:code, "#{tmp} = #{tmp}.flatten"],
58
58
  [:code, "#{tmp}.map!(&:to_s)"],
59
59
  [:code, "#{tmp}.reject!(&:empty?)"],
60
60
  [:escape, escape, [:dynamic, "#{tmp}.join(#{delimiter.inspect})"]]],
@@ -18,9 +18,9 @@ module Slim
18
18
  # Escaped interpolation
19
19
  block << [:static, '#{']
20
20
  string = $'
21
- when /\A#\{/
21
+ when /\A#\{((?>[^{}]|(\{(?>[^{}]|\g<1>)*\}))*)\}/
22
22
  # Interpolation
23
- string, code = parse_expression($')
23
+ string, code = $', $1
24
24
  escape = code !~ /\A\{.*\}\Z/
25
25
  block << [:slim, :output, escape, escape ? code : code[1..-2], [:multi]]
26
26
  when /\A([#\\]?[^#\\]*([#\\][^\\#\{][^#\\]*)*)/
@@ -31,23 +31,5 @@ module Slim
31
31
  end until string.empty?
32
32
  block
33
33
  end
34
-
35
- protected
36
-
37
- def parse_expression(string)
38
- count, i = 1, 0
39
- while i < string.size && count != 0
40
- if string[i] == ?{
41
- count += 1
42
- elsif string[i] == ?}
43
- count -= 1
44
- end
45
- i += 1
46
- end
47
-
48
- raise(Temple::FilterError, "Text interpolation: Expected closing }") if count != 0
49
-
50
- return string[i..-1], string[0, i-1]
51
- end
52
34
  end
53
35
  end
data/lib/slim/parser.rb CHANGED
@@ -72,8 +72,10 @@ module Slim
72
72
  @code_attr_delims_re = /\A[#{keys}]/
73
73
  keys = Regexp.escape @attr_list_delims.keys.join
74
74
  @attr_list_delims_re = /\A\s*([#{keys}])/
75
- # Access available engine keys to allow nicer one-line syntax
76
75
  @embedded_re = /\A(#{Regexp.union(Embedded.engines.keys.map(&:to_s))}):(\s*)/
76
+ @attr_name = "\\A\\s*([^\0\"'><\/=\s#{(@attr_list_delims.flatten + @code_attr_delims.flatten).map {|x| Regexp.escape(x) }.join}]+)"
77
+ @quoted_attr_re = /#{@attr_name}\s*=(=?)\s*("|')/
78
+ @code_attr_re = /#{@attr_name}\s*=(=?)\s*/
77
79
  end
78
80
 
79
81
  # Compile string to Temple expression
@@ -92,10 +94,6 @@ module Slim
92
94
 
93
95
  protected
94
96
 
95
- ATTR_NAME = '\\A\\s*(\p{Word}(?:\p{Word}|:|-)*)'
96
- QUOTED_ATTR_RE = /#{ATTR_NAME}\s*=(=?)\s*("|')/
97
- CODE_ATTR_RE = /#{ATTR_NAME}\s*=(=?)\s*/
98
-
99
97
  def reset(lines = nil, stacks = nil)
100
98
  # Since you can indent however you like in Slim, we need to keep a list
101
99
  # of how deeply indented you are. For instance, in a template like this:
@@ -235,7 +233,7 @@ module Slim
235
233
  when @embedded_re
236
234
  # Embedded template detected. It is treated as block.
237
235
  @stacks.last << [:slim, :embedded, $1, parse_text_block($', @orig_line.size - $'.size + $2.size)]
238
- when /\Adoctype\s+/
236
+ when /\Adoctype\b/
239
237
  # Found doctype declaration
240
238
  @stacks.last << [:html, :doctype, $'.strip]
241
239
  when @tag_re
@@ -398,7 +396,7 @@ module Slim
398
396
  end
399
397
 
400
398
  if delimiter
401
- boolean_attr_re = /#{ATTR_NAME}(?=(\s|#{Regexp.escape delimiter}|\Z))/
399
+ boolean_attr_re = /#{@attr_name}(?=(\s|#{Regexp.escape delimiter}|\Z))/
402
400
  end_re = /\A\s*#{Regexp.escape delimiter}/
403
401
  end
404
402
 
@@ -408,12 +406,12 @@ module Slim
408
406
  # Splat attribute
409
407
  @line = $'
410
408
  attributes << [:slim, :splat, parse_ruby_code(delimiter)]
411
- when QUOTED_ATTR_RE
409
+ when @quoted_attr_re
412
410
  # Value is quoted (static)
413
411
  @line = $'
414
412
  attributes << [:html, :attr, $1,
415
413
  [:escape, $2.empty?, [:slim, :interpolate, parse_quoted_attribute($3)]]]
416
- when CODE_ATTR_RE
414
+ when @code_attr_re
417
415
  # Value is ruby code
418
416
  @line = $'
419
417
  name = $1
@@ -492,9 +490,7 @@ module Slim
492
490
  end
493
491
  end
494
492
 
495
- syntax_error!("Expected closing brace }") if count != 0
496
493
  @line.slice!(0)
497
-
498
494
  value
499
495
  end
500
496
 
data/lib/slim/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  module Slim
2
2
  # Slim version string
3
3
  # @api public
4
- VERSION = '3.0.0'
4
+ VERSION = '3.0.1'
5
5
  end
@@ -162,6 +162,14 @@ p id=(1 + 1)*5 Test it
162
162
  assert_html '<p id="10">Test it</p>', source
163
163
  end
164
164
 
165
+ def test_code_attribute_does_not_modify_argument
166
+ template = 'span class=attribute'
167
+ model = OpenStruct.new(attribute: [:a, :b, [:c, :d]])
168
+ output = Slim::Template.new { template }.render(model)
169
+ assert_equal('<span class="a b c d"></span>', output)
170
+ assert_equal([:a, :b, [:c, :d]], model.attribute)
171
+ end
172
+
165
173
  def test_number_type_interpolation
166
174
  source = %q{
167
175
  p = output_number
@@ -256,4 +256,13 @@ p(id="marvin" class=nil nonempty=("".to_s) data-info="Illudium Q-36")= output_nu
256
256
 
257
257
  assert_html '<p data-info="Illudium Q-36" id="marvin" nonempty="">1337</p>', source
258
258
  end
259
+
260
+ def test_weird_attribute
261
+ source = %q{
262
+ p
263
+ img(src='img.png' whatsthis?!)
264
+ img src='img.png' whatsthis?!="wtf"
265
+ }
266
+ assert_html '<p><img src="img.png" whatsthis?!="" /><img src="img.png" whatsthis?!="wtf" /></p>', source
267
+ end
259
268
  end
@@ -77,15 +77,6 @@ p
77
77
  assert_syntax_error "Expected closing delimiter ]\n (__TEMPLATE__), Line 3, Column 28\n img src=[hash[1] + hash[2]\n ^\n", source
78
78
  end
79
79
 
80
- def test_expected_attribute
81
- source = %q{
82
- p
83
- img(src='img.png' whatsthis?!)
84
- }
85
-
86
- assert_syntax_error "Expected attribute\n (__TEMPLATE__), Line 3, Column 20\n img(src='img.png' whatsthis?!)\n ^\n", source
87
- end
88
-
89
80
  def test_invalid_empty_attribute
90
81
  source = %q{
91
82
  p
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: slim
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.0
4
+ version: 3.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel Mendler
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2014-12-07 00:00:00.000000000 Z
13
+ date: 2014-12-22 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: temple
@@ -201,4 +201,3 @@ signing_key:
201
201
  specification_version: 4
202
202
  summary: Slim is a template language.
203
203
  test_files: []
204
- has_rdoc: