slim 1.3.2 → 1.3.3
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/.yardopts +3 -2
- data/CHANGES +12 -0
- data/README.md +56 -10
- data/Rakefile +7 -1
- data/lib/slim.rb +1 -1
- data/lib/slim/code_attributes.rb +67 -0
- data/lib/slim/engine.rb +2 -1
- data/lib/slim/parser.rb +27 -9
- data/lib/slim/splat_attributes.rb +21 -20
- data/lib/slim/version.rb +1 -1
- data/slim.gemspec +1 -3
- data/test/core/test_encoding.rb +6 -0
- data/test/core/test_html_attributes.rb +21 -5
- data/test/core/test_html_structure.rb +0 -16
- data/test/core/test_pretty.rb +2 -2
- data/test/literate/TESTS.md +830 -0
- data/test/literate/helper.rb +15 -0
- data/test/literate/run.rb +96 -0
- metadata +66 -27
- data/lib/slim/boolean_attributes.rb +0 -67
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'slim'
|
2
|
+
require 'slim/logic_less'
|
3
|
+
require 'slim/translator'
|
4
|
+
require 'slim/grammar'
|
5
|
+
require 'minitest/autorun'
|
6
|
+
|
7
|
+
Slim::Engine.after Slim::Parser, Temple::Filters::Validator, :grammar => Slim::Grammar
|
8
|
+
Slim::Engine.before :Pretty, Temple::Filters::Validator
|
9
|
+
Slim::Engine.set_default_options :tr => false, :logic_less => false
|
10
|
+
|
11
|
+
module Helper
|
12
|
+
def render(source, options = {}, &block)
|
13
|
+
Slim::Template.new(options) { source }.render(self, &block)
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,96 @@
|
|
1
|
+
require 'temple'
|
2
|
+
|
3
|
+
class LiterateTest < Temple::Engine
|
4
|
+
class Parser < Temple::Parser
|
5
|
+
def call(lines)
|
6
|
+
stack = [[:multi]]
|
7
|
+
until lines.empty?
|
8
|
+
case lines.shift
|
9
|
+
when /\A(#+)\s*(.*)\Z/
|
10
|
+
stack.pop(stack.size - $1.size)
|
11
|
+
block = [:multi]
|
12
|
+
stack.last << [:section, $2, block]
|
13
|
+
stack << block
|
14
|
+
when /\A~{3,}\s*(\w+)\s*\Z/
|
15
|
+
lang = $1
|
16
|
+
code = []
|
17
|
+
until lines.empty?
|
18
|
+
case lines.shift
|
19
|
+
when /\A~{3,}\s*\Z/
|
20
|
+
break
|
21
|
+
when /\A.*\Z/
|
22
|
+
code << $&
|
23
|
+
end
|
24
|
+
end
|
25
|
+
stack.last << [lang.to_sym, code.join("\n")]
|
26
|
+
when /\A\s*\Z/
|
27
|
+
when /\A\s*(.*?)\s*Z/
|
28
|
+
stack.last << [:comment, $1]
|
29
|
+
end
|
30
|
+
end
|
31
|
+
stack.first
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
class Compiler < Temple::Filter
|
36
|
+
def call(exp)
|
37
|
+
@opts, @in_testcase, @level = {}, false, 0
|
38
|
+
"require 'helper'\n\n" << compile(exp)
|
39
|
+
end
|
40
|
+
|
41
|
+
def on_section(title, body)
|
42
|
+
old_opts = @opts.dup
|
43
|
+
@level += 1
|
44
|
+
raise Temple::FilterError, 'New section between slim and html block' if @in_testcase
|
45
|
+
result = "describe #{title.inspect} do\n "
|
46
|
+
result << "include Helper\n " if @level == 1
|
47
|
+
result << compile(body).gsub("\n", "\n ") << "\nend\n"
|
48
|
+
ensure
|
49
|
+
@opts = old_opts
|
50
|
+
@level -= 1
|
51
|
+
end
|
52
|
+
|
53
|
+
def on_multi(*exps)
|
54
|
+
exps.map {|exp| compile(exp) }.join("\n")
|
55
|
+
end
|
56
|
+
|
57
|
+
def on_comment(text)
|
58
|
+
"#{@in_testcase ? ' ' : ''}# #{text}"
|
59
|
+
end
|
60
|
+
|
61
|
+
def on_slim(code)
|
62
|
+
raise Temple::FilterError, 'Slim block must be followed by html block' if @in_testcase
|
63
|
+
@in_testcase = true
|
64
|
+
"it 'should render' do\n slim = #{code.inspect}"
|
65
|
+
end
|
66
|
+
|
67
|
+
def on_html(code)
|
68
|
+
raise Temple::FilterError, 'Html block must be preceded by slim block' unless @in_testcase
|
69
|
+
@in_testcase = false
|
70
|
+
result = " html = #{code.inspect}\n"
|
71
|
+
if @opts.empty?
|
72
|
+
result << " render(slim).must_equal html\nend\n"
|
73
|
+
else
|
74
|
+
result << " options = #{@opts.inspect}\n render(slim, options).must_equal html\nend\n"
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def on_options(code)
|
79
|
+
raise Temple::FilterError, 'Options set inside test case' if @in_testcase
|
80
|
+
@opts.update(eval("{#{code}}"))
|
81
|
+
"# #{code.gsub("\n", "\n# ")}"
|
82
|
+
end
|
83
|
+
|
84
|
+
def on(*exp)
|
85
|
+
raise Temple::InvalidExpression, exp
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
use Parser
|
90
|
+
use Compiler
|
91
|
+
use(:Evaluator) {|code| eval(code) }
|
92
|
+
end
|
93
|
+
|
94
|
+
Dir.glob(File.join(File.dirname(__FILE__), '*.md')) do |file|
|
95
|
+
LiterateTest.new.call(File.readlines(file))
|
96
|
+
end
|
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: 1.3.
|
4
|
+
version: 1.3.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -11,22 +11,27 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date: 2012-
|
14
|
+
date: 2012-10-16 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: temple
|
18
|
-
requirement:
|
18
|
+
requirement: !ruby/object:Gem::Requirement
|
19
19
|
none: false
|
20
20
|
requirements:
|
21
21
|
- - ~>
|
22
22
|
- !ruby/object:Gem::Version
|
23
|
-
version: 0.5.
|
23
|
+
version: 0.5.5
|
24
24
|
type: :runtime
|
25
25
|
prerelease: false
|
26
|
-
version_requirements:
|
26
|
+
version_requirements: !ruby/object:Gem::Requirement
|
27
|
+
none: false
|
28
|
+
requirements:
|
29
|
+
- - ~>
|
30
|
+
- !ruby/object:Gem::Version
|
31
|
+
version: 0.5.5
|
27
32
|
- !ruby/object:Gem::Dependency
|
28
33
|
name: tilt
|
29
|
-
requirement:
|
34
|
+
requirement: !ruby/object:Gem::Requirement
|
30
35
|
none: false
|
31
36
|
requirements:
|
32
37
|
- - ~>
|
@@ -34,10 +39,15 @@ dependencies:
|
|
34
39
|
version: 1.3.3
|
35
40
|
type: :runtime
|
36
41
|
prerelease: false
|
37
|
-
version_requirements:
|
42
|
+
version_requirements: !ruby/object:Gem::Requirement
|
43
|
+
none: false
|
44
|
+
requirements:
|
45
|
+
- - ~>
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 1.3.3
|
38
48
|
- !ruby/object:Gem::Dependency
|
39
49
|
name: rake
|
40
|
-
requirement:
|
50
|
+
requirement: !ruby/object:Gem::Requirement
|
41
51
|
none: false
|
42
52
|
requirements:
|
43
53
|
- - ! '>='
|
@@ -45,10 +55,15 @@ dependencies:
|
|
45
55
|
version: 0.8.7
|
46
56
|
type: :development
|
47
57
|
prerelease: false
|
48
|
-
version_requirements:
|
58
|
+
version_requirements: !ruby/object:Gem::Requirement
|
59
|
+
none: false
|
60
|
+
requirements:
|
61
|
+
- - ! '>='
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: 0.8.7
|
49
64
|
- !ruby/object:Gem::Dependency
|
50
65
|
name: sass
|
51
|
-
requirement:
|
66
|
+
requirement: !ruby/object:Gem::Requirement
|
52
67
|
none: false
|
53
68
|
requirements:
|
54
69
|
- - ! '>='
|
@@ -56,10 +71,15 @@ dependencies:
|
|
56
71
|
version: 3.1.0
|
57
72
|
type: :development
|
58
73
|
prerelease: false
|
59
|
-
version_requirements:
|
74
|
+
version_requirements: !ruby/object:Gem::Requirement
|
75
|
+
none: false
|
76
|
+
requirements:
|
77
|
+
- - ! '>='
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
version: 3.1.0
|
60
80
|
- !ruby/object:Gem::Dependency
|
61
81
|
name: minitest
|
62
|
-
requirement:
|
82
|
+
requirement: !ruby/object:Gem::Requirement
|
63
83
|
none: false
|
64
84
|
requirements:
|
65
85
|
- - ! '>='
|
@@ -67,10 +87,15 @@ dependencies:
|
|
67
87
|
version: '0'
|
68
88
|
type: :development
|
69
89
|
prerelease: false
|
70
|
-
version_requirements:
|
90
|
+
version_requirements: !ruby/object:Gem::Requirement
|
91
|
+
none: false
|
92
|
+
requirements:
|
93
|
+
- - ! '>='
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: '0'
|
71
96
|
- !ruby/object:Gem::Dependency
|
72
97
|
name: kramdown
|
73
|
-
requirement:
|
98
|
+
requirement: !ruby/object:Gem::Requirement
|
74
99
|
none: false
|
75
100
|
requirements:
|
76
101
|
- - ! '>='
|
@@ -78,10 +103,15 @@ dependencies:
|
|
78
103
|
version: '0'
|
79
104
|
type: :development
|
80
105
|
prerelease: false
|
81
|
-
version_requirements:
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
none: false
|
108
|
+
requirements:
|
109
|
+
- - ! '>='
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
version: '0'
|
82
112
|
- !ruby/object:Gem::Dependency
|
83
113
|
name: creole
|
84
|
-
requirement:
|
114
|
+
requirement: !ruby/object:Gem::Requirement
|
85
115
|
none: false
|
86
116
|
requirements:
|
87
117
|
- - ! '>='
|
@@ -89,10 +119,15 @@ dependencies:
|
|
89
119
|
version: '0'
|
90
120
|
type: :development
|
91
121
|
prerelease: false
|
92
|
-
version_requirements:
|
122
|
+
version_requirements: !ruby/object:Gem::Requirement
|
123
|
+
none: false
|
124
|
+
requirements:
|
125
|
+
- - ! '>='
|
126
|
+
- !ruby/object:Gem::Version
|
127
|
+
version: '0'
|
93
128
|
- !ruby/object:Gem::Dependency
|
94
129
|
name: builder
|
95
|
-
requirement:
|
130
|
+
requirement: !ruby/object:Gem::Requirement
|
96
131
|
none: false
|
97
132
|
requirements:
|
98
133
|
- - ! '>='
|
@@ -100,7 +135,12 @@ dependencies:
|
|
100
135
|
version: '0'
|
101
136
|
type: :development
|
102
137
|
prerelease: false
|
103
|
-
version_requirements:
|
138
|
+
version_requirements: !ruby/object:Gem::Requirement
|
139
|
+
none: false
|
140
|
+
requirements:
|
141
|
+
- - ! '>='
|
142
|
+
- !ruby/object:Gem::Version
|
143
|
+
version: '0'
|
104
144
|
description: Slim is a template language whose goal is reduce the syntax to the essential
|
105
145
|
parts without becoming cryptic.
|
106
146
|
email:
|
@@ -110,10 +150,7 @@ email:
|
|
110
150
|
executables:
|
111
151
|
- slimrb
|
112
152
|
extensions: []
|
113
|
-
extra_rdoc_files:
|
114
|
-
- README.md
|
115
|
-
- LICENSE
|
116
|
-
- CHANGES
|
153
|
+
extra_rdoc_files: []
|
117
154
|
files:
|
118
155
|
- .gemtest
|
119
156
|
- .gitignore
|
@@ -134,7 +171,7 @@ files:
|
|
134
171
|
- benchmarks/view.slim
|
135
172
|
- bin/slimrb
|
136
173
|
- lib/slim.rb
|
137
|
-
- lib/slim/
|
174
|
+
- lib/slim/code_attributes.rb
|
138
175
|
- lib/slim/command.rb
|
139
176
|
- lib/slim/control_structures.rb
|
140
177
|
- lib/slim/embedded_engine.rb
|
@@ -169,6 +206,9 @@ files:
|
|
169
206
|
- test/core/test_slim_template.rb
|
170
207
|
- test/core/test_text_interpolation.rb
|
171
208
|
- test/core/test_thread_options.rb
|
209
|
+
- test/literate/TESTS.md
|
210
|
+
- test/literate/helper.rb
|
211
|
+
- test/literate/run.rb
|
172
212
|
- test/logic_less/test_logic_less.rb
|
173
213
|
- test/logic_less/test_wrapper.rb
|
174
214
|
- test/rails/Rakefile
|
@@ -215,8 +255,7 @@ files:
|
|
215
255
|
homepage: http://slim-lang.com/
|
216
256
|
licenses: []
|
217
257
|
post_install_message:
|
218
|
-
rdoc_options:
|
219
|
-
- --charset=UTF-8
|
258
|
+
rdoc_options: []
|
220
259
|
require_paths:
|
221
260
|
- lib
|
222
261
|
required_ruby_version: !ruby/object:Gem::Requirement
|
@@ -233,7 +272,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
233
272
|
version: '0'
|
234
273
|
requirements: []
|
235
274
|
rubyforge_project: slim
|
236
|
-
rubygems_version: 1.8.
|
275
|
+
rubygems_version: 1.8.24
|
237
276
|
signing_key:
|
238
277
|
specification_version: 3
|
239
278
|
summary: Slim is a template language.
|
@@ -1,67 +0,0 @@
|
|
1
|
-
module Slim
|
2
|
-
# @api private
|
3
|
-
class BooleanAttributes < Filter
|
4
|
-
define_options :attr_delimiter
|
5
|
-
|
6
|
-
# Handle attributes expression `[:html, :attrs, *attrs]`
|
7
|
-
#
|
8
|
-
# @param [Array] attrs Array of temple expressions
|
9
|
-
# @return [Array] Compiled temple expression
|
10
|
-
def on_html_attrs(*attrs)
|
11
|
-
[:multi, *attrs.map {|a| compile(a) }]
|
12
|
-
end
|
13
|
-
|
14
|
-
# Handle attribute expression `[:slim, :attr, escape, code]`
|
15
|
-
#
|
16
|
-
# @param [Boolean] escape Escape html
|
17
|
-
# @param [String] code Ruby code
|
18
|
-
# @return [Array] Compiled temple expression
|
19
|
-
def on_html_attr(name, value)
|
20
|
-
unless value[0] == :slim && value[1] == :attrvalue
|
21
|
-
@attr = name
|
22
|
-
return super
|
23
|
-
end
|
24
|
-
|
25
|
-
escape, code = value[2], value[3]
|
26
|
-
case code
|
27
|
-
when 'true'
|
28
|
-
[:html, :attr, name, [:static, name]]
|
29
|
-
when 'false', 'nil'
|
30
|
-
[:multi]
|
31
|
-
else
|
32
|
-
tmp = unique_name
|
33
|
-
conds = [:case, tmp,
|
34
|
-
['true', [:html, :attr, name, [:static, name]]],
|
35
|
-
['false, nil', [:multi]]]
|
36
|
-
if delimiter = options[:attr_delimiter][name]
|
37
|
-
conds << ['Array',
|
38
|
-
[:multi,
|
39
|
-
[:code, "#{tmp} = #{tmp}.flatten.compact.join(#{delimiter.inspect})"],
|
40
|
-
[:if, "!#{tmp}.empty?",
|
41
|
-
[:html, :attr, name, [:escape, escape, [:dynamic, tmp]]]]]]
|
42
|
-
end
|
43
|
-
conds << [:else, [:html, :attr, name, [:escape, escape, [:dynamic, tmp]]]]
|
44
|
-
[:multi, [:code, "#{tmp} = (#{code})"], conds]
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
# Handle attribute expression `[:slim, :attrvalue, escape, code]`
|
49
|
-
#
|
50
|
-
# @param [Boolean] escape Escape html
|
51
|
-
# @param [String] code Ruby code
|
52
|
-
# @return [Array] Compiled temple expression
|
53
|
-
def on_slim_attrvalue(escape, code)
|
54
|
-
tmp = unique_name
|
55
|
-
[:multi,
|
56
|
-
[:code, "#{tmp} = #{code}"],
|
57
|
-
[:escape, escape,
|
58
|
-
[:dynamic,
|
59
|
-
if delimiter = options[:attr_delimiter][@attr]
|
60
|
-
"Array === #{tmp} ? #{tmp}.flatten.compact.join(#{delimiter.inspect}) : #{tmp}"
|
61
|
-
else
|
62
|
-
tmp
|
63
|
-
end
|
64
|
-
]]]
|
65
|
-
end
|
66
|
-
end
|
67
|
-
end
|