slim 0.2.0 → 0.3.0
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/.gitignore +2 -0
- data/lib/slim.rb +1 -1
- data/lib/slim/compiler.rb +21 -12
- data/lib/slim/engine.rb +2 -1
- data/lib/slim/optimizer.rb +70 -0
- data/lib/slim/rails.rb +3 -1
- data/slim.gemspec +2 -1
- data/test/test_slim.rb +0 -3
- metadata +3 -2
data/lib/slim.rb
CHANGED
data/lib/slim/compiler.rb
CHANGED
@@ -1,13 +1,16 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
|
+
require 'slim/optimizer'
|
4
|
+
|
3
5
|
module Slim
|
4
6
|
module Compiler
|
7
|
+
include Optimizer
|
5
8
|
AUTOCLOSED = %w(meta img link br hr input area param col base)
|
6
9
|
|
7
10
|
REGEX = /^(\s*)(!?`?-?=?\w*)(\s*\w*=".+")?(.*)/
|
8
11
|
|
9
12
|
def compile
|
10
|
-
@
|
13
|
+
@_buffer = ["_buf = [];"]
|
11
14
|
|
12
15
|
last_indent = -1; enders = []
|
13
16
|
|
@@ -49,7 +52,7 @@ module Slim
|
|
49
52
|
|
50
53
|
if ender_indent >= indent
|
51
54
|
unless ender == 'end;' && line_type == :control_code
|
52
|
-
@
|
55
|
+
@_buffer << ender
|
53
56
|
end
|
54
57
|
else
|
55
58
|
enders << [ender, ender_indent]
|
@@ -63,41 +66,47 @@ module Slim
|
|
63
66
|
case line_type
|
64
67
|
when :markup
|
65
68
|
if AUTOCLOSED.include?(marker)
|
66
|
-
@
|
69
|
+
@_buffer << "_buf << \"<#{marker}#{attrs || ''}/>\";"
|
67
70
|
else
|
68
71
|
enders << ["_buf << \"</#{marker}>\";", indent]
|
69
|
-
@
|
72
|
+
@_buffer << "_buf << \"<#{marker}#{attrs || ''}>\";"
|
70
73
|
end
|
71
74
|
|
72
75
|
if string
|
73
76
|
string.lstrip!
|
74
77
|
if string =~ /^=(.*)/
|
75
|
-
@
|
78
|
+
@_buffer << "_buf << #{$1.strip};"
|
76
79
|
else
|
77
|
-
@
|
80
|
+
@_buffer << "_buf << \"#{string}\";"
|
78
81
|
end
|
79
82
|
end
|
80
83
|
when :text
|
81
|
-
@
|
84
|
+
@_buffer << "_buf << \"#{string}\";"
|
82
85
|
when :control_code
|
83
86
|
unless enders.detect{|e| e[0] == 'end;' && e[1] == indent}
|
84
87
|
enders << ['end;', indent]
|
85
88
|
end
|
86
|
-
@
|
89
|
+
@_buffer << "#{string};"
|
87
90
|
when :output_code
|
88
|
-
@
|
91
|
+
@_buffer << "_buf << #{string};"
|
89
92
|
when :declaration
|
90
|
-
@
|
93
|
+
@_buffer << "_buf << \"<!#{string}>\";"
|
91
94
|
else
|
92
95
|
raise NotImplementedError.new("Don't know how to parse line: #{line}")
|
93
96
|
end
|
94
97
|
end # template iterator
|
95
98
|
|
96
99
|
enders.reverse_each do |t|
|
97
|
-
@
|
100
|
+
@_buffer << t[0].to_s
|
98
101
|
end
|
99
102
|
|
100
|
-
@
|
103
|
+
@_buffer << "_buf.join;"
|
104
|
+
|
105
|
+
@compiled = @_buffer.join
|
106
|
+
|
107
|
+
optimize
|
108
|
+
|
109
|
+
return nil
|
101
110
|
end
|
102
111
|
end
|
103
112
|
end
|
data/lib/slim/engine.rb
CHANGED
@@ -3,6 +3,7 @@ module Slim
|
|
3
3
|
include Compiler
|
4
4
|
|
5
5
|
attr_reader :compiled
|
6
|
+
attr_reader :optimized
|
6
7
|
|
7
8
|
# @param template The .slim template to convert
|
8
9
|
# @return [Slim::Engine] instance of engine
|
@@ -12,7 +13,7 @@ module Slim
|
|
12
13
|
end
|
13
14
|
|
14
15
|
def render(scope = Object.new, locals = {})
|
15
|
-
scope.instance_eval(
|
16
|
+
scope.instance_eval(optimized)
|
16
17
|
end
|
17
18
|
end
|
18
19
|
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
module Slim
|
2
|
+
# Given the following example:
|
3
|
+
# html
|
4
|
+
# head
|
5
|
+
# meta name="description" content="This is a Slim Test, that's all"
|
6
|
+
# title Simple Test Title
|
7
|
+
# body
|
8
|
+
# - if logged_in?
|
9
|
+
# p
|
10
|
+
# ` Welcome!
|
11
|
+
# - else
|
12
|
+
# p
|
13
|
+
# ` Please sign in.
|
14
|
+
#
|
15
|
+
# When compiling the above code to be eval'd, Slim produces a
|
16
|
+
# compiled string that looks like:
|
17
|
+
#
|
18
|
+
# buf = [];
|
19
|
+
# _buf << "<html>";
|
20
|
+
# _buf << "<head>";
|
21
|
+
# _buf << "<meta name=\"description\" content=\"This is a Slim Test, that's all\"/>";
|
22
|
+
# _buf << "<title>";
|
23
|
+
# _buf << "Simple Test Title";
|
24
|
+
# _buf << "</title>";
|
25
|
+
# _buf << "</head>";
|
26
|
+
# _buf << "<body>";
|
27
|
+
# if logged_in?;
|
28
|
+
# _buf << "<p>";
|
29
|
+
# _buf << "Welcome!";
|
30
|
+
# _buf << "</p>";
|
31
|
+
# else;
|
32
|
+
# _buf << "<p>";
|
33
|
+
# _buf << "Please sign in.";
|
34
|
+
# _buf << "</p>";
|
35
|
+
# end;
|
36
|
+
# _buf << "</body>";
|
37
|
+
# _buf << "</html>";
|
38
|
+
# _buf.join;
|
39
|
+
#
|
40
|
+
# The optimized string after:
|
41
|
+
#
|
42
|
+
# buf = [];
|
43
|
+
# _buf << "<html><head><meta name=\"description\" content=\"This is a Slim Test, that's all\"/><title>Simple Test Title</title></head><body>";
|
44
|
+
# if logged_in?;
|
45
|
+
# _buf << "<p>Welcome!</p>";
|
46
|
+
# else;
|
47
|
+
# _buf << "<p>Please sign in.</p>";
|
48
|
+
# end;
|
49
|
+
# _buf << "</body></html>";
|
50
|
+
# _buf.join;
|
51
|
+
module Optimizer
|
52
|
+
def optimize
|
53
|
+
@optimized = ""
|
54
|
+
string = nil
|
55
|
+
@_buffer.each do |line|
|
56
|
+
if line =~ /^_buf << "(.+)"/
|
57
|
+
string ||= ""
|
58
|
+
string << $1
|
59
|
+
else
|
60
|
+
if string
|
61
|
+
@optimized << "_buf << \"#{string}\";"
|
62
|
+
end
|
63
|
+
@optimized << line
|
64
|
+
string = nil
|
65
|
+
end
|
66
|
+
end
|
67
|
+
return nil
|
68
|
+
end
|
69
|
+
end # Optimizer
|
70
|
+
end # Slim
|
data/lib/slim/rails.rb
CHANGED
@@ -6,10 +6,12 @@ module ActionView
|
|
6
6
|
include Compilable
|
7
7
|
|
8
8
|
def compile(template)
|
9
|
-
return Slim::Engine.new(template.source).
|
9
|
+
return Slim::Engine.new(template.source).optimized
|
10
10
|
end
|
11
11
|
end
|
12
12
|
end
|
13
13
|
|
14
14
|
Template.register_default_template_handler :slim, TemplateHandlers::SlimHandler
|
15
15
|
end
|
16
|
+
|
17
|
+
puts ">> Slim (v#{Slim.version})"
|
data/slim.gemspec
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{slim}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.3.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Andrew Stone"]
|
@@ -22,6 +22,7 @@ Gem::Specification.new do |s|
|
|
22
22
|
"lib/slim.rb",
|
23
23
|
"lib/slim/compiler.rb",
|
24
24
|
"lib/slim/engine.rb",
|
25
|
+
"lib/slim/optimizer.rb",
|
25
26
|
"lib/slim/rails.rb",
|
26
27
|
"slim.gemspec",
|
27
28
|
"test/helper.rb",
|
data/test/test_slim.rb
CHANGED
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
-
-
|
7
|
+
- 3
|
8
8
|
- 0
|
9
|
-
version: 0.
|
9
|
+
version: 0.3.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Andrew Stone
|
@@ -33,6 +33,7 @@ files:
|
|
33
33
|
- lib/slim.rb
|
34
34
|
- lib/slim/compiler.rb
|
35
35
|
- lib/slim/engine.rb
|
36
|
+
- lib/slim/optimizer.rb
|
36
37
|
- lib/slim/rails.rb
|
37
38
|
- slim.gemspec
|
38
39
|
- test/helper.rb
|