non-haml 1.0.1 → 1.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/lib/non-haml/parser.rb +62 -38
- data/lib/non-haml/version.rb +1 -1
- metadata +2 -2
data/lib/non-haml/parser.rb
CHANGED
@@ -4,11 +4,27 @@
|
|
4
4
|
|
5
5
|
# Example usage:
|
6
6
|
# require 'non-haml'
|
7
|
-
# NonHaml.generate
|
7
|
+
# NonHaml.generate source, local_vars|context
|
8
|
+
# NonHaml.generate_file 'output/source.c', 'source.c', local_vars|context
|
8
9
|
|
9
10
|
module NonHaml
|
10
11
|
class << self
|
12
|
+
def generate out_name, in_name, context_or_vars={}, base_dir='./', verbose=false
|
13
|
+
NonHamlParser.new.generate out_name, in_name, context_or_vars, base_dir, verbose
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
class IndentError < StandardError
|
18
|
+
end
|
19
|
+
|
20
|
+
class ParseError < StandardError
|
21
|
+
end
|
22
|
+
|
23
|
+
class NonHamlParser
|
11
24
|
attr_accessor :last_ok_line, :out, :base_dir
|
25
|
+
def initialize
|
26
|
+
self.out = ""
|
27
|
+
end
|
12
28
|
|
13
29
|
def concat spaces=nil, text=nil
|
14
30
|
if spaces.nil? and text.nil?
|
@@ -20,10 +36,6 @@ module NonHaml
|
|
20
36
|
end
|
21
37
|
end
|
22
38
|
|
23
|
-
def generate out_name, in_name, context, base_dir='./', verbose=false
|
24
|
-
NonHamlParser.new.generate out_name, in_name, context, base_dir, verbose
|
25
|
-
end
|
26
|
-
|
27
39
|
def filename
|
28
40
|
# Retrieves the current filename.
|
29
41
|
@filenames.last
|
@@ -39,17 +51,9 @@ module NonHaml
|
|
39
51
|
end
|
40
52
|
|
41
53
|
def current_filename
|
42
|
-
"#{base_dir}#{
|
54
|
+
"#{base_dir}#{filename}"
|
43
55
|
end
|
44
|
-
end
|
45
56
|
|
46
|
-
class IndentError < StandardError
|
47
|
-
end
|
48
|
-
|
49
|
-
class ParseError < StandardError
|
50
|
-
end
|
51
|
-
|
52
|
-
class NonHamlParser
|
53
57
|
def parse text, base_control_indent=0, base_indent=0
|
54
58
|
@s = ""
|
55
59
|
def store text
|
@@ -88,11 +92,11 @@ module NonHaml
|
|
88
92
|
# Entering a block.
|
89
93
|
|
90
94
|
if %w{elsif else}.include? $2
|
91
|
-
store control_indent + "
|
95
|
+
store control_indent + "self.last_ok_line = #{i}"
|
92
96
|
dedent indent, %w{elsif else}.include?($2)
|
93
97
|
else
|
94
98
|
dedent indent, %w{elsif else}.include?($2)
|
95
|
-
store control_indent + "
|
99
|
+
store control_indent + "self.last_ok_line = #{i}"
|
96
100
|
end
|
97
101
|
|
98
102
|
store control_indent + $1
|
@@ -101,28 +105,28 @@ module NonHaml
|
|
101
105
|
# Output should have same indent as block.
|
102
106
|
concat_indent = indent
|
103
107
|
elsif line =~ /= ?non_haml ['"](.*)['"]/
|
104
|
-
store control_indent + "
|
105
|
-
file =
|
108
|
+
store control_indent + "self.last_ok_line = #{i}"
|
109
|
+
file = base_dir + $1
|
106
110
|
if File.readable? file
|
107
|
-
store control_indent + "
|
111
|
+
store control_indent + "push_filename '#{$1}'"
|
108
112
|
@s += parse open(file).read, control_indent.length, indent
|
109
113
|
else
|
110
114
|
store control_indent + "raise Errno::ENOENT, '\"#{$1}\"'"
|
111
115
|
end
|
112
|
-
store control_indent + "
|
116
|
+
store control_indent + "pop_filename"
|
113
117
|
elsif line.strip.length.zero?
|
114
118
|
# Blank line. Output and move on. Don't change indent. Only do this
|
115
119
|
# for if blocks though, so 'if false' doesn't generate optional blank
|
116
120
|
# line and 'if true' does.
|
117
121
|
#if @statements.last == 'if' or @statements.empty?
|
118
122
|
# XXX disabled temporarily because it sucked.
|
119
|
-
store control_indent + "
|
123
|
+
store control_indent + "self.last_ok_line = #{i}"
|
120
124
|
#if @statements.empty?
|
121
|
-
store "#{control_indent}
|
125
|
+
store "#{control_indent}concat"
|
122
126
|
#end
|
123
127
|
else
|
124
128
|
dedented = dedent indent
|
125
|
-
store control_indent + "
|
129
|
+
store control_indent + "self.last_ok_line = #{i}"
|
126
130
|
|
127
131
|
# Now deal with whatever we have left.
|
128
132
|
if line =~ /^- *(.*)$/
|
@@ -134,7 +138,7 @@ module NonHaml
|
|
134
138
|
# Deal with blank lines.
|
135
139
|
content = $1
|
136
140
|
content = '""' if content.empty?
|
137
|
-
store "#{control_indent}
|
141
|
+
store "#{control_indent}concat(#{target_indent}, (#{content}))"
|
138
142
|
elsif dedented and line.strip.empty?
|
139
143
|
puts 'skipping'
|
140
144
|
# Skip up to one blank line after dedenting.
|
@@ -155,7 +159,7 @@ module NonHaml
|
|
155
159
|
# functions get the right arguments.
|
156
160
|
subst = " % [#{to_sub.map{|x| "(#{x})"}.join ', '}]"
|
157
161
|
end
|
158
|
-
store "#{control_indent}
|
162
|
+
store "#{control_indent}concat #{target_indent}, (%q##{line.gsub('#', '\\#')}##{subst})"
|
159
163
|
end
|
160
164
|
end
|
161
165
|
end
|
@@ -163,29 +167,49 @@ module NonHaml
|
|
163
167
|
@s
|
164
168
|
end
|
165
169
|
|
166
|
-
def
|
167
|
-
|
168
|
-
|
170
|
+
def evaluate(code)
|
171
|
+
eval(code, @context)
|
172
|
+
end
|
173
|
+
|
174
|
+
def prepare_context(_context_or_vars)
|
175
|
+
case _context_or_vars
|
176
|
+
when Hash
|
177
|
+
@context = binding
|
178
|
+
_context_or_vars.each do |name, value|
|
179
|
+
evaluate("#{name} = nil")
|
180
|
+
setter = evaluate("lambda{|v| #{name} = v}")
|
181
|
+
setter.call(value)
|
182
|
+
end
|
183
|
+
else
|
184
|
+
raise TypeError, "cannot use context of type #{_context_or_vars.class}"
|
185
|
+
end
|
186
|
+
evaluate("concat = nil")
|
187
|
+
setter = evaluate("lambda{|v| concat = v}")
|
188
|
+
end
|
189
|
+
|
190
|
+
def generate out_name, in_name, context_or_vars, base_dir, verbose
|
191
|
+
self.base_dir = base_dir
|
192
|
+
push_filename(in_name)
|
169
193
|
|
170
|
-
|
194
|
+
context = prepare_context(context_or_vars)
|
195
|
+
source = File.read(current_filename)
|
196
|
+
parsed = parse(source)
|
171
197
|
|
172
|
-
src = parse open(NonHaml.current_filename).read
|
173
198
|
if verbose
|
174
|
-
|
199
|
+
parsed.lines.each_with_index do |l,i|
|
175
200
|
print Color.blue '%3d ' % (i + 1)
|
176
201
|
puts l
|
177
202
|
end
|
178
203
|
end
|
179
204
|
|
180
205
|
begin
|
181
|
-
|
206
|
+
evaluate(parsed)
|
182
207
|
rescue Exception => e
|
183
208
|
# Interrupt everything, give more info, then dump out the old exception.
|
184
|
-
$stderr.puts
|
185
|
-
$stderr.puts "in #{NonHaml.current_filename}:"
|
209
|
+
$stderr.puts "In #{current_filename}:"
|
186
210
|
$stderr.puts Color.red " #{e.class.name}: #{Color.blue e.to_s}"
|
187
|
-
|
188
|
-
if i ==
|
211
|
+
File.read(current_filename).lines.each_with_index.drop([last_ok_line - 2, 0].max).first(5).each do |line,i|
|
212
|
+
if i == last_ok_line
|
189
213
|
$stderr.print Color.red ' %3d ' % (i + 1)
|
190
214
|
$stderr.print Color.red line
|
191
215
|
else
|
@@ -195,8 +219,8 @@ module NonHaml
|
|
195
219
|
end
|
196
220
|
raise e
|
197
221
|
else
|
198
|
-
open(out_name,
|
199
|
-
f.
|
222
|
+
File.open(out_name, "w") do |f|
|
223
|
+
f.write(out)
|
200
224
|
end
|
201
225
|
end
|
202
226
|
end
|
data/lib/non-haml/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: non-haml
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: '1.1'
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-12-05 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: HAML-like syntax for non-HTML
|
15
15
|
email: jem@ieee.org
|