slim 0.7.1 → 0.7.2
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile.lock +4 -4
- data/README.md +1 -3
- data/extra/slim.vim +30 -3
- data/extra/test.slim +9 -2
- data/lib/slim.rb +2 -0
- data/lib/slim/command.rb +14 -2
- data/lib/slim/compiler.rb +8 -43
- data/lib/slim/embedded_engine.rb +1 -1
- data/lib/slim/engine.rb +14 -7
- data/lib/slim/filter.rb +14 -1
- data/lib/slim/interpolation.rb +30 -0
- data/lib/slim/parser.rb +4 -4
- data/lib/slim/rails.rb +16 -5
- data/lib/slim/sections.rb +79 -0
- data/lib/slim/version.rb +1 -1
- data/slim.gemspec +2 -1
- data/test/helper.rb +1 -1
- data/test/slim/test_sections.rb +74 -0
- metadata +8 -5
data/Gemfile.lock
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
slim (0.7.
|
5
|
-
temple (~> 0.1.
|
4
|
+
slim (0.7.2)
|
5
|
+
temple (~> 0.1.5)
|
6
6
|
tilt (~> 1.1)
|
7
7
|
|
8
8
|
GEM
|
@@ -17,7 +17,7 @@ GEM
|
|
17
17
|
rake (0.8.7)
|
18
18
|
rcov (0.9.9)
|
19
19
|
rdiscount (1.6.5)
|
20
|
-
temple (0.1.
|
20
|
+
temple (0.1.5)
|
21
21
|
tilt (1.1)
|
22
22
|
yard (0.6.1)
|
23
23
|
|
@@ -33,6 +33,6 @@ DEPENDENCIES
|
|
33
33
|
rcov
|
34
34
|
rdiscount
|
35
35
|
slim!
|
36
|
-
temple (~> 0.1.
|
36
|
+
temple (~> 0.1.5)
|
37
37
|
tilt (~> 1.1)
|
38
38
|
yard
|
data/README.md
CHANGED
@@ -86,8 +86,6 @@ Here's a quick example to demonstrate what a Slim template looks like:
|
|
86
86
|
|
87
87
|
### Line indicators
|
88
88
|
|
89
|
-
__Please note that all line indicators must be followed by a space__
|
90
|
-
|
91
89
|
#### `|`
|
92
90
|
|
93
91
|
> The pipe tells Slim to just copy the line. It essentially escapes any processing.
|
@@ -148,7 +146,7 @@ __Please note that all line indicators must be followed by a space__
|
|
148
146
|
body
|
149
147
|
h1 id="headline" Welcome to my site.
|
150
148
|
|
151
|
-
Or nest it. __Note:__ Must use a pipe or a backtick
|
149
|
+
Or nest it. __Note:__ Must use a pipe or a backtick to escape processing
|
152
150
|
|
153
151
|
body
|
154
152
|
h1 id="headline"
|
data/extra/slim.vim
CHANGED
@@ -19,15 +19,42 @@ let b:ruby_no_expensive = 1
|
|
19
19
|
|
20
20
|
" Include Ruby syntax highlighting
|
21
21
|
syn include @slimRuby syntax/ruby.vim
|
22
|
+
unlet! b:current_syntax
|
23
|
+
" Include Haml syntax highlighting
|
24
|
+
syn include @slimHaml syntax/haml.vim
|
25
|
+
unlet! b:current_syntax
|
26
|
+
" Include Erb syntax highlighting
|
27
|
+
syn include @slimErb syntax/eruby.vim
|
28
|
+
unlet! b:current_syntax
|
22
29
|
|
23
30
|
" Include HTML
|
24
31
|
runtime! syntax/html.vim
|
25
32
|
unlet! b:current_syntax
|
26
33
|
|
27
|
-
|
34
|
+
setlocal iskeyword+=:
|
35
|
+
|
36
|
+
|
37
|
+
syn region slimHtml start="^\s*[^-=]\w" end="$" contains=htmlTagName,htmlArg,htmlString
|
38
|
+
syn region slimControl start="-" end="$" contains=@slimRuby keepend
|
39
|
+
|
40
|
+
syn match slimFilter /\s*\w\+:\s*/ contained
|
41
|
+
|
42
|
+
syn match slimCode /^\s*[-=#.].*/ contained
|
43
|
+
syn match slimComment /^\(\s\+\)[/].*\(\n\1\s.*\)*/
|
44
|
+
syn match slimText /^\(\s\+\)[`|'].*\(\n\1\s.*\)*/
|
45
|
+
|
46
|
+
syn match slimJs /^\(\s\+\)\<javascript:\>.*\(\n\1\s.*\)*/ contains=@htmlJavaScript,slimFilter
|
47
|
+
syn match slimHaml /^\(\s\+\)\<haml:\>.*\(\n\1\s.*\)*/ contains=@slimHaml,slimFilter
|
48
|
+
syn match slimHaml /^\(\s\+\)\<erb:\>.*\(\n\1\s.*\)*/ contains=@slimErb,slimFilter
|
49
|
+
|
50
|
+
|
51
|
+
"syn match slimFilter /\s*\<javascript:\>\s*/
|
52
|
+
|
28
53
|
|
29
|
-
|
30
|
-
syntax region slimOutput start=".*=\s" end="$" contains=@slimRuby keepend
|
54
|
+
"contained containedin=slimJs
|
31
55
|
|
56
|
+
hi def link slimText String
|
57
|
+
hi def link slimComment Comment
|
58
|
+
hi def link slimFilter Special
|
32
59
|
|
33
60
|
let b:current_syntax = "slim"
|
data/extra/test.slim
CHANGED
@@ -9,15 +9,21 @@ html
|
|
9
9
|
alert('Hello World');
|
10
10
|
});
|
11
11
|
|
12
|
+
haml:
|
13
|
+
#someid.someclass{:this => 'test'} Content in haml
|
14
|
+
|
15
|
+
erb:
|
16
|
+
<%= some_method(@request) %>
|
17
|
+
|
12
18
|
body
|
13
19
|
/ comment block
|
14
20
|
with multiple lines
|
15
|
-
|
21
|
+
This is another line
|
16
22
|
h1 = @page_title
|
17
23
|
p#notice.message
|
18
24
|
| Welcome to the the syntax test.
|
19
25
|
This file is to excercise the various markup.
|
20
|
-
|
26
|
+
This is another line
|
21
27
|
- unless @users.empty?
|
22
28
|
table
|
23
29
|
- for user in users do
|
@@ -26,6 +32,7 @@ html
|
|
26
32
|
- else
|
27
33
|
p There are no users.
|
28
34
|
|
35
|
+
/ Single comment line
|
29
36
|
#content Hello #{@user.name}! Welcome to the test page!
|
30
37
|
Try out Slim!
|
31
38
|
|
data/lib/slim.rb
CHANGED
data/lib/slim/command.rb
CHANGED
@@ -40,6 +40,14 @@ module Slim
|
|
40
40
|
@options[:compile] = true
|
41
41
|
end
|
42
42
|
|
43
|
+
opts.on('-S', '--sections', :NONE, 'Logic-less sections mode') do
|
44
|
+
@options[:sections] = true
|
45
|
+
end
|
46
|
+
|
47
|
+
opts.on('-p', '--pretty', :NONE, 'Produce pretty html') do
|
48
|
+
@options[:pretty] = true
|
49
|
+
end
|
50
|
+
|
43
51
|
opts.on_tail('-h', '--help', 'Show this message') do
|
44
52
|
puts opts
|
45
53
|
exit
|
@@ -71,9 +79,13 @@ module Slim
|
|
71
79
|
end
|
72
80
|
|
73
81
|
if @options[:compile]
|
74
|
-
@options[:output].puts(Slim::Engine.new(:file => @options[:file]
|
82
|
+
@options[:output].puts(Slim::Engine.new(:file => @options[:file],
|
83
|
+
:pretty => @options[:pretty],
|
84
|
+
:sections => @options[:sections]).compile(@options[:input].read))
|
75
85
|
else
|
76
|
-
@options[:output].puts(Slim::Template.new(@options[:file]
|
86
|
+
@options[:output].puts(Slim::Template.new(@options[:file],
|
87
|
+
:pretty => @options[:pretty],
|
88
|
+
:sections => @options[:sections]) { @options[:input].read }.render)
|
77
89
|
end
|
78
90
|
end
|
79
91
|
end
|
data/lib/slim/compiler.rb
CHANGED
@@ -2,31 +2,6 @@ module Slim
|
|
2
2
|
# Compiles Slim expressions into Temple::HTML expressions.
|
3
3
|
# @api private
|
4
4
|
class Compiler < Filter
|
5
|
-
# Handle text expression `[:slim, :text, string]`
|
6
|
-
#
|
7
|
-
# @param [String] string Static text
|
8
|
-
# @return [Array] Compiled temple expression
|
9
|
-
def on_slim_text(string)
|
10
|
-
# Interpolate variables in text (#{variable}).
|
11
|
-
# Split the text into multiple dynamic and static parts.
|
12
|
-
block = [:multi]
|
13
|
-
until string.empty?
|
14
|
-
case string
|
15
|
-
when /^\\(\#\{[^\}]*\})/
|
16
|
-
# Escaped interpolation
|
17
|
-
block << [:static, $1]
|
18
|
-
when /^\#\{([^\}]*)\}/
|
19
|
-
# Interpolation
|
20
|
-
block << [:escape, :dynamic, $1]
|
21
|
-
when /^([^\#]+|\#)/
|
22
|
-
# Static text
|
23
|
-
block << [:static, $&]
|
24
|
-
end
|
25
|
-
string = $'
|
26
|
-
end
|
27
|
-
block
|
28
|
-
end
|
29
|
-
|
30
5
|
# Handle control expression `[:slim, :control, code, content]`
|
31
6
|
#
|
32
7
|
# @param [String] ruby code
|
@@ -60,7 +35,7 @@ module Slim
|
|
60
35
|
# @param [Array] content Temple expression
|
61
36
|
# @return [Array] Compiled temple expression
|
62
37
|
def on_slim_output_block(escape, code, content)
|
63
|
-
tmp1, tmp2 = tmp_var, tmp_var
|
38
|
+
tmp1, tmp2 = tmp_var('capture'), tmp_var('capture')
|
64
39
|
|
65
40
|
[:multi,
|
66
41
|
# Capture the result of the code in a variable. We can't do
|
@@ -94,32 +69,22 @@ module Slim
|
|
94
69
|
end
|
95
70
|
end
|
96
71
|
|
97
|
-
# Handle tag expression `[:slim, :tag, name, attrs, content]`
|
72
|
+
# Handle tag expression `[:slim, :tag, name, attrs, closed, content]`
|
98
73
|
#
|
99
74
|
# @param [String] name Tag name
|
100
75
|
# @param [Array] attrs Attributes
|
101
76
|
# @param [Array] content Temple expression
|
102
77
|
# @return [Array] Compiled temple expression
|
103
78
|
def on_slim_tag(name, attrs, closed, content)
|
104
|
-
|
105
|
-
value = if dynamic
|
106
|
-
[:escape, :dynamic, value]
|
107
|
-
else
|
108
|
-
on_slim_text(value)
|
109
|
-
end
|
110
|
-
m << [key.to_s, value]
|
111
|
-
end
|
112
|
-
[:html, :tag, name, attrs, closed, compile!(content)]
|
79
|
+
[:html, :tag, name, compile!(attrs), closed, compile!(content)]
|
113
80
|
end
|
114
81
|
|
115
|
-
|
116
|
-
|
117
|
-
# Generate unique temporary variable name
|
82
|
+
# Handle tag attributes expression `[:slim, :attrs, *attrs]`
|
118
83
|
#
|
119
|
-
# @
|
120
|
-
|
121
|
-
|
122
|
-
|
84
|
+
# @param [Array] attrs Attributes
|
85
|
+
# @return [Array] Compiled temple expression
|
86
|
+
def on_slim_attrs(*attrs)
|
87
|
+
[:html, :staticattrs, *attrs.map {|k, v| [k.to_s, compile!(v)] }]
|
123
88
|
end
|
124
89
|
end
|
125
90
|
end
|
data/lib/slim/embedded_engine.rb
CHANGED
@@ -64,7 +64,7 @@ module Slim
|
|
64
64
|
class TagEngine < EmbeddedEngine
|
65
65
|
def on_slim_embedded(engine, *body)
|
66
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,
|
67
|
+
[:slim, :tag, options[:tag], [:slim, :attrs, *options[:attributes].map {|k, v| [k, [:static, v]] }], false, content]
|
68
68
|
end
|
69
69
|
end
|
70
70
|
|
data/lib/slim/engine.rb
CHANGED
@@ -2,17 +2,24 @@ module Slim
|
|
2
2
|
# Slim engine which transforms slim code to executable ruby code
|
3
3
|
# @api public
|
4
4
|
class Engine < Temple::Engine
|
5
|
+
# Allow users to set default options, particularly useful in Rails' environment files.
|
6
|
+
# For instance, in config/environments/development.rb you probably want:
|
7
|
+
# # Indent html for pretty debugging
|
8
|
+
# Slim::Engine.set_default_options :pretty => true
|
9
|
+
#
|
10
|
+
set_default_options :pretty => false,
|
11
|
+
:attr_wrapper => '"',
|
12
|
+
:format => :html5,
|
13
|
+
:id_delimiter => nil
|
14
|
+
|
5
15
|
use Slim::Parser, :file
|
6
|
-
filter :Debugger, :debug, :prefix => 'before end insertion'
|
7
|
-
use Slim::EndInserter
|
8
|
-
filter :Debugger, :debug, :prefix => 'after end insertion'
|
9
16
|
use Slim::EmbeddedEngine
|
17
|
+
use Slim::Interpolation
|
18
|
+
use Slim::Sections, :sections, :dictionary, :dictionary_access
|
19
|
+
use Slim::EndInserter
|
10
20
|
use Slim::Compiler
|
11
|
-
filter :Debugger, :debug, :prefix => 'after compilation'
|
12
21
|
filter :EscapeHTML, :use_html_safe
|
13
|
-
use Temple::HTML::Pretty, :format, :attr_wrapper, :id_delimiter, :
|
14
|
-
:pretty => false, :attr_wrapper => '"', :format => :html5, :id_delimiter => nil
|
15
|
-
filter :Debugger, :debug, :prefix => 'after html'
|
22
|
+
use Temple::HTML::Pretty, :format, :attr_wrapper, :id_delimiter, :pretty
|
16
23
|
filter :MultiFlattener
|
17
24
|
filter :StaticMerger
|
18
25
|
filter :DynamicInliner
|
data/lib/slim/filter.rb
CHANGED
@@ -2,6 +2,7 @@ module Slim
|
|
2
2
|
# Base class for Temple filters used in Slim
|
3
3
|
# @api private
|
4
4
|
class Filter < Temple::Filter
|
5
|
+
# Dispatch on_slim_*
|
5
6
|
temple_dispatch :slim
|
6
7
|
|
7
8
|
def on_slim_control(code, content)
|
@@ -13,7 +14,19 @@ module Slim
|
|
13
14
|
end
|
14
15
|
|
15
16
|
def on_slim_tag(name, attrs, closed, content)
|
16
|
-
[:slim, :tag, name, attrs, closed, compile!(content)]
|
17
|
+
[:slim, :tag, name, compile!(attrs), closed, compile!(content)]
|
18
|
+
end
|
19
|
+
|
20
|
+
def on_slim_attrs(*attrs)
|
21
|
+
[:slim, :attrs, *attrs.map {|k, v| [k, compile!(v)] }]
|
22
|
+
end
|
23
|
+
|
24
|
+
# Generate unique temporary variable name
|
25
|
+
#
|
26
|
+
# @return [String] Variable name
|
27
|
+
def tmp_var(prefix)
|
28
|
+
@tmp_var ||= 0
|
29
|
+
"_slim#{prefix}#{@tmp_var += 1}"
|
17
30
|
end
|
18
31
|
end
|
19
32
|
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Slim
|
2
|
+
# Perform interpolation of #{var_name}
|
3
|
+
# @api private
|
4
|
+
class Interpolation < Filter
|
5
|
+
# Handle text expression `[:slim, :text, string]`
|
6
|
+
#
|
7
|
+
# @param [String] string Static text
|
8
|
+
# @return [Array] Compiled temple expression
|
9
|
+
def on_slim_text(string)
|
10
|
+
# Interpolate variables in text (#{variable}).
|
11
|
+
# Split the text into multiple dynamic and static parts.
|
12
|
+
block = [:multi]
|
13
|
+
until string.empty?
|
14
|
+
case string
|
15
|
+
when /^\\(\#\{[^\}]*\})/
|
16
|
+
# Escaped interpolation
|
17
|
+
block << [:static, $1]
|
18
|
+
when /^\#\{([^\}]*)\}/
|
19
|
+
# Interpolation
|
20
|
+
block << [:slim, :output, true, $1, [:multi]]
|
21
|
+
when /^([^\#]+|\#)/
|
22
|
+
# Static text
|
23
|
+
block << [:static, $&]
|
24
|
+
end
|
25
|
+
string = $'
|
26
|
+
end
|
27
|
+
block
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
data/lib/slim/parser.rb
CHANGED
@@ -259,11 +259,11 @@ module Slim
|
|
259
259
|
# Now we'll have to find all the attributes. We'll store these in an
|
260
260
|
# nested array: [[name, value], [name2, value2]]. The value is a piece
|
261
261
|
# of Ruby code.
|
262
|
-
attributes = []
|
262
|
+
attributes = [:slim, :attrs]
|
263
263
|
|
264
264
|
# Find any literal class/id attributes
|
265
265
|
while line =~ CLASS_ID_REGEX
|
266
|
-
attributes << [ATTR_SHORTHAND[$1],
|
266
|
+
attributes << [ATTR_SHORTHAND[$1], [:static, $2]]
|
267
267
|
line = $'
|
268
268
|
end
|
269
269
|
|
@@ -282,11 +282,11 @@ module Slim
|
|
282
282
|
if line =~ QUOTED_VALUE_REGEX
|
283
283
|
# Value is quoted (static)
|
284
284
|
line = $'
|
285
|
-
attributes << [key,
|
285
|
+
attributes << [key, [:slim, :text, $1[1..-2]]]
|
286
286
|
else
|
287
287
|
# Value is ruby code
|
288
288
|
line, value = parse_ruby_attribute(orig_line, line, lineno, delimiter)
|
289
|
-
attributes << [key, true, value]
|
289
|
+
attributes << [key, [:slim, :output, true, value, [:multi]]]
|
290
290
|
end
|
291
291
|
end
|
292
292
|
|
data/lib/slim/rails.rb
CHANGED
@@ -2,12 +2,23 @@ require 'slim'
|
|
2
2
|
|
3
3
|
module ActionView
|
4
4
|
module TemplateHandlers
|
5
|
-
|
6
|
-
class SlimHandler < TemplateHandler
|
7
|
-
include Compilable
|
5
|
+
raise "Slim supports only Rails 3.x and greater, your Rails version is #{Rails::VERSION::STRING}" if Rails::VERSION::MAJOR < 3
|
8
6
|
|
9
|
-
|
10
|
-
|
7
|
+
if Rails::VERSION::MAJOR == 3 && Rails::VERSION::MINOR < 1
|
8
|
+
# Slim handler for Rails 3.0
|
9
|
+
class SlimHandler < TemplateHandler
|
10
|
+
include Compilable
|
11
|
+
|
12
|
+
def compile(template)
|
13
|
+
Slim::Engine.new.compile(template.source)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
else
|
17
|
+
# Slim handler for Rails 3.1 and greater
|
18
|
+
class SlimHandler
|
19
|
+
def call(template)
|
20
|
+
Slim::Engine.new.compile(template.source)
|
21
|
+
end
|
11
22
|
end
|
12
23
|
end
|
13
24
|
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
module Slim
|
2
|
+
# Handle logic-less mode
|
3
|
+
# This filter can be activated with the option "sections"
|
4
|
+
# @api private
|
5
|
+
class Sections < Filter
|
6
|
+
set_default_options :dictionary => 'self',
|
7
|
+
:sections => false,
|
8
|
+
:dictionary_access => :symbol # :symbol, :string
|
9
|
+
|
10
|
+
def initialize(opts = {})
|
11
|
+
super
|
12
|
+
unless [:string, :symbol].include?(@options[:dictionary_access])
|
13
|
+
raise "Invalid dictionary access #{@options[:dictionary_access].inspect}"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def compile(exp)
|
18
|
+
if options[:sections]
|
19
|
+
# Store the dictionary in the _slimdict variable
|
20
|
+
[:multi,
|
21
|
+
[:block, "_slimdict = #{@options[:dictionary]}"],
|
22
|
+
super]
|
23
|
+
else
|
24
|
+
exp
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
# Interpret control blocks as sections or inverted sections
|
29
|
+
def on_slim_control(name, content)
|
30
|
+
if name =~ /^!\s*(.*)/
|
31
|
+
on_slim_inverted_section($1, content)
|
32
|
+
else
|
33
|
+
on_slim_section(name, content)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def on_slim_inverted_section(name, content)
|
38
|
+
tmp = tmp_var('section')
|
39
|
+
[:multi,
|
40
|
+
[:block, "#{tmp} = #{access name}"],
|
41
|
+
[:block, "if !#{tmp} || #{tmp}.respond_to?(:empty) && #{tmp}.empty?"],
|
42
|
+
compile!(content),
|
43
|
+
[:block, 'end']]
|
44
|
+
end
|
45
|
+
|
46
|
+
def on_slim_section(name, content)
|
47
|
+
content = compile!(content)
|
48
|
+
tmp1, tmp2 = tmp_var('dict'), tmp_var('dict')
|
49
|
+
|
50
|
+
[:multi,
|
51
|
+
[:block, "if #{tmp1} = #{access name}"],
|
52
|
+
[:block, "if #{tmp1} == true"],
|
53
|
+
content,
|
54
|
+
[:block, 'else'],
|
55
|
+
[:block, "#{tmp1} = [#{tmp1}] if #{tmp1}.respond_to?(:has_key?) || !#{tmp1}.respond_to?(:map)"],
|
56
|
+
[:block, "#{tmp2} = _slimdict"],
|
57
|
+
[:block, "#{tmp1}.each do |_slimdict|"],
|
58
|
+
content,
|
59
|
+
[:block, 'end'],
|
60
|
+
[:block, "_slimdict = #{tmp2}"],
|
61
|
+
[:block, 'end'],
|
62
|
+
[:block, 'end']]
|
63
|
+
end
|
64
|
+
|
65
|
+
def on_slim_output(escape, name, content)
|
66
|
+
raise 'Output statements with content are forbidden in sections mode' if !empty_exp?(content)
|
67
|
+
[:slim, :output, escape, access(name), content]
|
68
|
+
end
|
69
|
+
|
70
|
+
def access(name)
|
71
|
+
case options[:dictionary_access]
|
72
|
+
when :symbol
|
73
|
+
"_slimdict[#{name.to_sym.inspect}]"
|
74
|
+
when :string
|
75
|
+
"_slimdict[#{name.to_s.inspect}]"
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
data/lib/slim/version.rb
CHANGED
data/slim.gemspec
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
2
|
require File.dirname(__FILE__) + "/lib/slim/version"
|
3
|
+
require "date"
|
3
4
|
|
4
5
|
Gem::Specification.new do |s|
|
5
6
|
s.name = "slim"
|
@@ -20,7 +21,7 @@ Gem::Specification.new do |s|
|
|
20
21
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
21
22
|
s.require_paths = ["lib"]
|
22
23
|
|
23
|
-
s.add_runtime_dependency(%q<temple>, ["~> 0.1.
|
24
|
+
s.add_runtime_dependency(%q<temple>, ["~> 0.1.5"])
|
24
25
|
s.add_runtime_dependency(%q<tilt>, ["~> 1.1"])
|
25
26
|
s.add_development_dependency(%q<rake>, [">= 0.8.7"])
|
26
27
|
s.add_development_dependency(%q<haml>, [">= 0"])
|
data/test/helper.rb
CHANGED
@@ -20,7 +20,7 @@ class TestSlim < MiniTest::Unit::TestCase
|
|
20
20
|
end
|
21
21
|
|
22
22
|
def render(source, options = {}, &block)
|
23
|
-
Slim::Template.new(options[:file], options) { source }.render(@env, &block)
|
23
|
+
Slim::Template.new(options[:file], options) { source }.render(options[:scope] || @env, &block)
|
24
24
|
end
|
25
25
|
|
26
26
|
def assert_html(expected, source, options = {}, &block)
|
@@ -0,0 +1,74 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class TestSlimLogicLess < TestSlim
|
4
|
+
def test_sections
|
5
|
+
source = %q{
|
6
|
+
p
|
7
|
+
- person
|
8
|
+
.name = name
|
9
|
+
}
|
10
|
+
|
11
|
+
hash = {
|
12
|
+
:person => [
|
13
|
+
{ :name => 'Joe', },
|
14
|
+
{ :name => 'Jack', }
|
15
|
+
]
|
16
|
+
}
|
17
|
+
|
18
|
+
assert_html '<p><div class="name">Joe</div><div class="name">Jack</div></p>', source, :scope => hash, :sections => true
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_sections_string_access
|
22
|
+
source = %q{
|
23
|
+
p
|
24
|
+
- person
|
25
|
+
.name = name
|
26
|
+
}
|
27
|
+
|
28
|
+
hash = {
|
29
|
+
'person' => [
|
30
|
+
{ 'name' => 'Joe', },
|
31
|
+
{ 'name' => 'Jack', }
|
32
|
+
]
|
33
|
+
}
|
34
|
+
|
35
|
+
assert_html '<p><div class="name">Joe</div><div class="name">Jack</div></p>', source, :scope => hash, :sections => true, :dictionary_access => :string
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_flag_section
|
39
|
+
source = %q{
|
40
|
+
p
|
41
|
+
- show_person
|
42
|
+
- person
|
43
|
+
.name = name
|
44
|
+
- show_person
|
45
|
+
| shown
|
46
|
+
}
|
47
|
+
|
48
|
+
hash = {
|
49
|
+
:show_person => true,
|
50
|
+
:person => [
|
51
|
+
{ :name => 'Joe', },
|
52
|
+
{ :name => 'Jack', }
|
53
|
+
]
|
54
|
+
}
|
55
|
+
|
56
|
+
assert_html '<p><div class="name">Joe</div><div class="name">Jack</div>shown</p>', source, :scope => hash, :sections => true
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_inverted_section
|
60
|
+
source = %q{
|
61
|
+
p
|
62
|
+
- person
|
63
|
+
.name = name
|
64
|
+
-! person
|
65
|
+
| No person
|
66
|
+
- !person
|
67
|
+
| No person 2
|
68
|
+
}
|
69
|
+
|
70
|
+
hash = {}
|
71
|
+
|
72
|
+
assert_html '<p>No person No person 2</p>', source, :scope => hash, :sections => true
|
73
|
+
end
|
74
|
+
end
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 7
|
8
|
-
-
|
9
|
-
version: 0.7.
|
8
|
+
- 2
|
9
|
+
version: 0.7.2
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Andrew Stone
|
@@ -16,7 +16,7 @@ autorequire:
|
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
18
|
|
19
|
-
date: 2010-11-
|
19
|
+
date: 2010-11-09 00:00:00 -05:00
|
20
20
|
default_executable:
|
21
21
|
dependencies:
|
22
22
|
- !ruby/object:Gem::Dependency
|
@@ -30,8 +30,8 @@ dependencies:
|
|
30
30
|
segments:
|
31
31
|
- 0
|
32
32
|
- 1
|
33
|
-
-
|
34
|
-
version: 0.1.
|
33
|
+
- 5
|
34
|
+
version: 0.1.5
|
35
35
|
type: :runtime
|
36
36
|
version_requirements: *id001
|
37
37
|
- !ruby/object:Gem::Dependency
|
@@ -187,8 +187,10 @@ files:
|
|
187
187
|
- lib/slim/end_inserter.rb
|
188
188
|
- lib/slim/engine.rb
|
189
189
|
- lib/slim/filter.rb
|
190
|
+
- lib/slim/interpolation.rb
|
190
191
|
- lib/slim/parser.rb
|
191
192
|
- lib/slim/rails.rb
|
193
|
+
- lib/slim/sections.rb
|
192
194
|
- lib/slim/template.rb
|
193
195
|
- lib/slim/version.rb
|
194
196
|
- slim.gemspec
|
@@ -203,6 +205,7 @@ files:
|
|
203
205
|
- test/slim/test_html_structure.rb
|
204
206
|
- test/slim/test_parser_errors.rb
|
205
207
|
- test/slim/test_ruby_errors.rb
|
208
|
+
- test/slim/test_sections.rb
|
206
209
|
- test/slim/test_slim_template.rb
|
207
210
|
has_rdoc: true
|
208
211
|
homepage: http://github.com/stonean/slim
|