svg-render 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/canvas_enclosure.rb +12 -0
- data/lib/canvas_shape.rb +94 -0
- data/lib/elements.rb +34 -0
- data/lib/render_svg3.rb +265 -0
- data/lib/rvg_shape.rb +75 -0
- data/lib/shape_base.rb +23 -0
- data/lib/svg_browser.rb +36 -0
- data/lib/svg_to_canvas_browser.rb +17 -0
- data/lib/template_builder.rb +10 -0
- metadata +10 -1
@@ -0,0 +1,12 @@
|
|
1
|
+
def render_canvas(template_name)
|
2
|
+
url = "http://rorbuilder.info/r/heroku/erb/canvas.erb"
|
3
|
+
t = open(url, "UserAgent" => "Sinatra-Rscript").read
|
4
|
+
build_templates(t)
|
5
|
+
|
6
|
+
@@templates[template_name] = yield.strip
|
7
|
+
@content_type = 'text/xml'
|
8
|
+
erb @@templates[template_name]
|
9
|
+
end
|
10
|
+
|
11
|
+
|
12
|
+
|
data/lib/canvas_shape.rb
ADDED
@@ -0,0 +1,94 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
|
3
|
+
# file: canvas_shape.rb
|
4
|
+
|
5
|
+
require 'shape_base'
|
6
|
+
|
7
|
+
module CanvasShape
|
8
|
+
|
9
|
+
class Shape < ShapeBase
|
10
|
+
|
11
|
+
def initialize()
|
12
|
+
super
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def load_shapes()
|
18
|
+
|
19
|
+
line = Proc.new do |h|
|
20
|
+
x1, y1, x2, y2 = h[:x1], h[:y1], h[:x2], h[:y2]
|
21
|
+
#x2, y2 = (h[:width] - x1), (h[:height] - y1)
|
22
|
+
stroke = h[:stroke]
|
23
|
+
stroke_width = stroke[:width]
|
24
|
+
colour = stroke[:colour]
|
25
|
+
|
26
|
+
Proc.new do
|
27
|
+
puts "*** drawing a line"
|
28
|
+
"
|
29
|
+
ctx.strokeStyle = '#{colour}';
|
30
|
+
ctx.lineWidth = #{stroke_width};
|
31
|
+
ctx.beginPath();
|
32
|
+
ctx.moveTo(#{x1},#{y1});
|
33
|
+
ctx.lineTo(#{x2},#{y2});
|
34
|
+
ctx.stroke();"
|
35
|
+
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
rectangle = Proc.new do |h|
|
40
|
+
x, y = h[:x], h[:y]
|
41
|
+
width, height= h[:width], h[:height]
|
42
|
+
|
43
|
+
style = h[:style]
|
44
|
+
fill = style[:fill]
|
45
|
+
stroke = style[:stroke]
|
46
|
+
stroke_width = style['stroke-width']
|
47
|
+
|
48
|
+
Proc.new do
|
49
|
+
puts "*** drawing a rectangle"
|
50
|
+
|
51
|
+
<<CANVAS
|
52
|
+
|
53
|
+
ctx.fillStyle = "#{fill}";
|
54
|
+
ctx.fillRect (#{x}, #{y}, #{width}, #{height});
|
55
|
+
|
56
|
+
CANVAS
|
57
|
+
|
58
|
+
#canvas.rect(x2, y2, x1, y1).styles(:fill => fill, :stroke => stroke, :stroke_width => stroke_width)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
|
63
|
+
text = lambda do |h|
|
64
|
+
x, y = h[:x], h[:y]
|
65
|
+
font_size = h[:font][:size] # ???
|
66
|
+
fill = h[:style][:fill]
|
67
|
+
text2 = h[:text]
|
68
|
+
text_align = h[:style][:text_align]
|
69
|
+
|
70
|
+
#jr031209 stroke = h[:stroke]
|
71
|
+
#jr031209 r,g,b = stroke[:rgb]
|
72
|
+
|
73
|
+
return Proc.new {} if text2.length < 1
|
74
|
+
Proc.new do
|
75
|
+
puts "*** drawing text x %s y %s text: %s" % [x,y,text2]
|
76
|
+
<<CANVAS
|
77
|
+
|
78
|
+
ctx.font = "#{font_size}em Times New Roman";
|
79
|
+
ctx.fillStyle = "#{fill}";
|
80
|
+
ctx.textAlign = '#{text_align}';
|
81
|
+
ctx.fillText("#{text2}", #{x}, #{y});
|
82
|
+
|
83
|
+
CANVAS
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
@shape[:line] = line
|
88
|
+
@shape[:rectangle] = rectangle
|
89
|
+
@shape[:text] = text
|
90
|
+
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
end
|
data/lib/elements.rb
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
|
3
|
+
# file: elements.rb
|
4
|
+
|
5
|
+
# this code extends REXML::Document::Element
|
6
|
+
REXML::Element.class_eval do
|
7
|
+
|
8
|
+
def ui_element=(object)
|
9
|
+
@ui_element = object
|
10
|
+
end
|
11
|
+
|
12
|
+
def ui_element()
|
13
|
+
@ui_element
|
14
|
+
end
|
15
|
+
|
16
|
+
def render()
|
17
|
+
@ui_element.invoke
|
18
|
+
end
|
19
|
+
|
20
|
+
def load_ui_element
|
21
|
+
|
22
|
+
text = self.text.to_s.strip.chomp
|
23
|
+
@ui_element.text = text.length > 0 ? text : ''
|
24
|
+
|
25
|
+
# must load the parent properties
|
26
|
+
# inherit the parent properties
|
27
|
+
@ui_element.load_properties(self.parent.attributes)
|
28
|
+
# get the style
|
29
|
+
@ui_element.load_properties(self.attributes)
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
|
data/lib/render_svg3.rb
ADDED
@@ -0,0 +1,265 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
# file: render_svg3.rb
|
3
|
+
|
4
|
+
require 'elements'
|
5
|
+
|
6
|
+
class SvgEnvironment
|
7
|
+
|
8
|
+
def initialize()
|
9
|
+
@@scale = 0.5
|
10
|
+
end
|
11
|
+
|
12
|
+
def load_renderer(renderer)
|
13
|
+
@@shape2 = renderer
|
14
|
+
end
|
15
|
+
|
16
|
+
def scale()
|
17
|
+
@@scale
|
18
|
+
end
|
19
|
+
|
20
|
+
def scale=(val)
|
21
|
+
@@scale = val
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
class ElementSvg #< SvgEnvironment
|
26
|
+
#include RVGShape
|
27
|
+
|
28
|
+
# this initialize method should be overridden with a class_eval from the calling RSF job
|
29
|
+
def initialize()
|
30
|
+
initialize_variables()
|
31
|
+
#@@shape = RVGShape::Shape.new
|
32
|
+
#@@shape = Shape.new
|
33
|
+
end
|
34
|
+
|
35
|
+
def initialize_variables()
|
36
|
+
@property = {'style' => ''}
|
37
|
+
@style_property = {}
|
38
|
+
end
|
39
|
+
|
40
|
+
def text=(val)
|
41
|
+
@text = val
|
42
|
+
end
|
43
|
+
|
44
|
+
def text()
|
45
|
+
@text
|
46
|
+
end
|
47
|
+
|
48
|
+
def scale=(val); @@scale = val; end
|
49
|
+
def scale() @@scale end
|
50
|
+
|
51
|
+
def x_offset=(val); @@x_offset = val; end
|
52
|
+
def x_offset(); @@x_offset; end
|
53
|
+
|
54
|
+
def y_offset=(val); @@y_offset = val; end
|
55
|
+
def y_offset(); @@y_offset; end
|
56
|
+
|
57
|
+
def render_element()
|
58
|
+
#parse_style()
|
59
|
+
properties = yield
|
60
|
+
@@shape.draw @type, properties
|
61
|
+
end
|
62
|
+
|
63
|
+
def parse_style()
|
64
|
+
if @property['style'] then
|
65
|
+
properties = get_style_properties(@property['style'])
|
66
|
+
|
67
|
+
#h = Hash[*properties.join(';').split(';')]
|
68
|
+
properties.each do |name, value|
|
69
|
+
@style_property[name] = value if @style_property.has_key? name
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def get_style_properties(properties_string)
|
76
|
+
properties_string.split(/;/).map do |a|
|
77
|
+
a.match(/^(.[^:]+):([^$]+$)/).captures.map {|x| x.strip}
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def load_properties(attributes)
|
82
|
+
attributes.each_attribute do |attribute|
|
83
|
+
@property[attribute.name] = attribute.value if @property.has_key? attribute.name
|
84
|
+
end
|
85
|
+
parse_style()
|
86
|
+
end
|
87
|
+
|
88
|
+
def load_renderer(renderer)
|
89
|
+
@@shape = renderer
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
class ElementEllipse < ElementSvg
|
94
|
+
def initialize()
|
95
|
+
super
|
96
|
+
end
|
97
|
+
|
98
|
+
def invoke()
|
99
|
+
puts " -- render the 'ellipse' element"
|
100
|
+
render_element()
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
|
105
|
+
class ElementRect < ElementSvg
|
106
|
+
|
107
|
+
def initialize()
|
108
|
+
super
|
109
|
+
local_properties = {'x' => '','y' => '', 'width' => '', 'height' => ''}
|
110
|
+
@property.merge!(local_properties)
|
111
|
+
@style_property = {'fill' => '', 'stroke' => '', 'stroke-width' => ''}
|
112
|
+
@type = :rectangle
|
113
|
+
end
|
114
|
+
|
115
|
+
def invoke()
|
116
|
+
puts " -- render the 'rect' element"
|
117
|
+
render_element()
|
118
|
+
end
|
119
|
+
|
120
|
+
def render_element()
|
121
|
+
super do
|
122
|
+
h = @property; hs = @style_property
|
123
|
+
x1, y1, x2, y2 = h['x'].to_i, h['y'].to_i, h['x'].to_i + h['width'].to_i, h['y'].to_i + h['height'].to_i
|
124
|
+
#r,g,b = hs['fill'].match(/rgb\((\d{1,5}),(\d{1,5}),(\d{1,5})\)/).captures
|
125
|
+
style = {:fill => hs['fill'], :stroke => hs['stroke'], :stroke_width => hs['stroke-width']}
|
126
|
+
|
127
|
+
#scale = run_projectx('registry', 'get-key', :path => 'app/svg_viewer/scale').first.to_f
|
128
|
+
x1, y1, x2, y2 = [x1, y1, x2, y2].map {|x| x * @@scale}
|
129
|
+
x1, x2 = [x1, x2].map {|x| x + @@x_offset * @@scale}
|
130
|
+
y1, y2 = [y1, y2].map {|x| x + @@y_offset * @@scale}
|
131
|
+
|
132
|
+
properties = {:x => x1, :y => y1, :width => x2 - x1, :height => y2 - y1, :style => style}
|
133
|
+
#properties = {:x => x1, :y => y1, :width => x2 - x1, :height => y2 - y1}
|
134
|
+
#draw properties
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
end
|
139
|
+
|
140
|
+
|
141
|
+
class ElementLine < ElementSvg
|
142
|
+
|
143
|
+
def initialize()
|
144
|
+
super
|
145
|
+
local_properties = {'x1' => '','y1' => '', 'x2' => '', 'y2' => ''}
|
146
|
+
@property.merge!(local_properties)
|
147
|
+
@style_property = {'stroke' => '', 'stroke-width' => ''}
|
148
|
+
@type = :line
|
149
|
+
end
|
150
|
+
|
151
|
+
def invoke()
|
152
|
+
puts " -- render the 'line' element " + @text
|
153
|
+
render_element()
|
154
|
+
end
|
155
|
+
|
156
|
+
def render_element()
|
157
|
+
super do
|
158
|
+
h = @property; hs = @style_property
|
159
|
+
x1, y1, x2, y2 = h['x1'].to_i, h['y1'].to_i, h['x2'].to_i, h['y2'].to_i
|
160
|
+
stroke_width = hs['stroke-width'].to_i
|
161
|
+
colour = hs['stroke']
|
162
|
+
|
163
|
+
#scale = run_projectx('registry', 'get-key', :path => 'app/svg_viewer/scale').first.to_f
|
164
|
+
x1, y1, x2, y2 = [x1, y1, x2, y2].map {|x| x * @@scale}
|
165
|
+
x1, x2 = [x1, x2].map {|x| x + @@x_offset * @@scale}
|
166
|
+
y1, y2 = [y1, y2].map {|x| x + @@y_offset * @@scale}
|
167
|
+
|
168
|
+
stroke = {:width => stroke_width, :colour => colour}
|
169
|
+
{:x1 => x1, :y1 => y1, :x2 => x2, :y2 => y2, :stroke => stroke}
|
170
|
+
#draw properties
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
174
|
+
end
|
175
|
+
|
176
|
+
class ElementText < ElementSvg
|
177
|
+
def initialize()
|
178
|
+
super
|
179
|
+
local_properties = {'x' => '','y' => '', 'fill' => '', 'font-size' => '15'}
|
180
|
+
@property.merge!(local_properties)
|
181
|
+
@style_property = {'font-size' => '', 'font-style' => '', 'font-weight' => '',
|
182
|
+
'fill' => '', 'fill-opacity' => '', 'stroke' => '', 'font-family' => '', 'text-align' => 'start'}
|
183
|
+
@type = :text
|
184
|
+
end
|
185
|
+
|
186
|
+
def invoke()
|
187
|
+
puts " -- render the 'text' element"
|
188
|
+
render_element()
|
189
|
+
end
|
190
|
+
|
191
|
+
def render_element()
|
192
|
+
super do
|
193
|
+
h = @property; style = @style_property
|
194
|
+
style.delete_if {|key, value| value.empty?}
|
195
|
+
h.merge! style
|
196
|
+
x, y = h['x'].to_i, h['y'].to_i
|
197
|
+
font_size = (h['font-size'].to_f * 0.0625) unless h['font-size'].empty?
|
198
|
+
|
199
|
+
|
200
|
+
fill = h['fill']
|
201
|
+
text2 = self.text
|
202
|
+
text_align = h['text-align']
|
203
|
+
@style_property['text-align'] = 'start'
|
204
|
+
#@style_property = {'font-size' => '', 'font-style' => '', 'font-weight' => '',
|
205
|
+
# 'fill' => '', 'fill-opacity' => '', 'stroke' => '', 'font-family' => '', 'text-align' => 'start'}
|
206
|
+
#puts 'xzx ' + text2 + 'xzx'
|
207
|
+
|
208
|
+
#stroke_width = hs['stroke-width'].to_i
|
209
|
+
#r,g,b = hs['stroke'].match(/rgb\((\d{1,5}),(\d{1,5}),(\d{1,5})\)/).captures
|
210
|
+
#puts 'x0xx ' + font_size.to_s + ' y0yy'
|
211
|
+
#scale = run_projectx('registry', 'get-key', :path => 'app/svg_viewer/scale').first.to_f
|
212
|
+
x, y, font_size = [x, y, font_size].map {|x| x * @@scale }
|
213
|
+
#x_offset = -40
|
214
|
+
x += @@x_offset * @@scale
|
215
|
+
y += @@y_offset * @@scale
|
216
|
+
#puts 'x1xx ' + font_size.to_s + ' y1yy'
|
217
|
+
|
218
|
+
{:x => x, :y => y, :text => text2, :style => {:fill => fill, :text_align => text_align}, :font => {:size => font_size}}
|
219
|
+
end
|
220
|
+
end
|
221
|
+
|
222
|
+
end
|
223
|
+
|
224
|
+
|
225
|
+
class RenderSvg
|
226
|
+
def initialize()
|
227
|
+
@dom = {}
|
228
|
+
@svg_procs = []
|
229
|
+
puts 'render ...'
|
230
|
+
|
231
|
+
load_elements
|
232
|
+
#@dom = render_document(doc.root)
|
233
|
+
end
|
234
|
+
|
235
|
+
def load_elements()
|
236
|
+
@h = {}
|
237
|
+
@h['ellipse'] = ElementEllipse.new
|
238
|
+
@h['line'] = ElementLine.new
|
239
|
+
@h['rect'] = ElementRect.new
|
240
|
+
@h['text'] = ElementText.new
|
241
|
+
@h['tspan'] = ElementText.new
|
242
|
+
|
243
|
+
end
|
244
|
+
|
245
|
+
def render(doc)
|
246
|
+
@svg_procs = []
|
247
|
+
render_all doc
|
248
|
+
end
|
249
|
+
|
250
|
+
def render_all( doc)
|
251
|
+
if @h.has_key? doc.name then
|
252
|
+
doc.ui_element = @h[doc.name]
|
253
|
+
doc.load_ui_element
|
254
|
+
@svg_procs << doc.ui_element.invoke
|
255
|
+
end
|
256
|
+
|
257
|
+
doc.elements.each { |node| render_all node}
|
258
|
+
end
|
259
|
+
|
260
|
+
def svg_procs()
|
261
|
+
@svg_procs
|
262
|
+
end
|
263
|
+
|
264
|
+
end
|
265
|
+
|
data/lib/rvg_shape.rb
ADDED
@@ -0,0 +1,75 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
|
3
|
+
# file: rvg_shape.rb
|
4
|
+
|
5
|
+
require 'shape_base'
|
6
|
+
|
7
|
+
module RVGShape
|
8
|
+
|
9
|
+
class Shape < ShapeBase
|
10
|
+
|
11
|
+
def initialize()
|
12
|
+
super
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def load_shapes()
|
18
|
+
|
19
|
+
line = Proc.new do |h|
|
20
|
+
x1, y1, x2, y2 = h[:x1], h[:y1], h[:x2], h[:y2]
|
21
|
+
#x2, y2 = (h[:width] - x1), (h[:height] - y1)
|
22
|
+
stroke = h[:stroke]
|
23
|
+
stroke_width = stroke[:width]
|
24
|
+
colour = stroke[:colour]
|
25
|
+
|
26
|
+
Proc.new do |canvas|
|
27
|
+
puts "*** drawing a line"
|
28
|
+
canvas.line(x1, y1, x2, y2).styles(:stroke=> "#{colour}" , :stroke_width => stroke_width)
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
rectangle = Proc.new do |h|
|
34
|
+
x, y = h[:x], h[:y]
|
35
|
+
width, height = h[:width], h[:height]
|
36
|
+
|
37
|
+
style = h[:style]
|
38
|
+
fill = style[:fill]
|
39
|
+
stroke = style[:stroke]
|
40
|
+
stroke_width = style['stroke-width']
|
41
|
+
|
42
|
+
Proc.new do |canvas|
|
43
|
+
puts "*** drawing a rectangle x: %s y: %s" % [x, y]
|
44
|
+
canvas.rect(width, height, x, y).styles(:fill => fill, :stroke => stroke, :stroke_width => stroke_width)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
|
49
|
+
text = lambda do |h|
|
50
|
+
|
51
|
+
x, y = h[:x], h[:y]
|
52
|
+
font_size = (h[:font][:size] * 16) # ???
|
53
|
+
fill = h[:style][:fill]
|
54
|
+
text2 = h[:text]
|
55
|
+
text_align = h[:style][:text_align]
|
56
|
+
|
57
|
+
#jr031209 stroke = h[:stroke]
|
58
|
+
#jr031209 r,g,b = stroke[:rgb]
|
59
|
+
return Proc.new {} if text2.length < 1
|
60
|
+
|
61
|
+
Proc.new do |canvas|
|
62
|
+
puts "*** drawing text x: %s y: %s" % [x, y]
|
63
|
+
canvas.text(x, y, text2).styles(:text_anchor => text_align, :font_size=> font_size, :font_family=>'helvetica', :fill => fill)
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
67
|
+
|
68
|
+
@shape[:line] = line
|
69
|
+
@shape[:rectangle] = rectangle
|
70
|
+
@shape[:text] = text
|
71
|
+
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
data/lib/shape_base.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
|
3
|
+
# file: shape_base.rb
|
4
|
+
|
5
|
+
class ShapeBase
|
6
|
+
|
7
|
+
def initialize(scale=1)
|
8
|
+
@shape = {}
|
9
|
+
load_shapes()
|
10
|
+
end
|
11
|
+
|
12
|
+
def draw(name, properties)
|
13
|
+
@shape[name].call(properties)
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def load_shapes()
|
19
|
+
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
|
data/lib/svg_browser.rb
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'render_svg3'
|
2
|
+
require 'rcscript'
|
3
|
+
|
4
|
+
class Browser
|
5
|
+
|
6
|
+
attr_accessor :doc
|
7
|
+
|
8
|
+
def initialize(o={})
|
9
|
+
|
10
|
+
h = {scale:0.5, x_offset:0, y_offset:0}.merge o
|
11
|
+
svg_environ = ElementSvg.new
|
12
|
+
yield(svg_environ)
|
13
|
+
|
14
|
+
svg_environ.scale = h[:scale]
|
15
|
+
svg_environ.x_offset = h[:x_offset]
|
16
|
+
svg_environ.y_offset = h[:y_offset]
|
17
|
+
|
18
|
+
@svg_engine, @script = RenderSvg.new(), RScriptBase.new()
|
19
|
+
|
20
|
+
end
|
21
|
+
|
22
|
+
def load_page(url)
|
23
|
+
#url = 'http://rorbuilder.info/r/heroku/image/' + svg_file_name
|
24
|
+
buffer = open(url, 'UserAgent' => 'Sinatra-Rscript').read
|
25
|
+
#puts 'buffer : ' + buffer
|
26
|
+
doc = Document.new(buffer)
|
27
|
+
yield(doc) if block_given?
|
28
|
+
#puts '@doc : ' + @doc.to_s
|
29
|
+
script = @script.run(doc)
|
30
|
+
#eval(script) # de-activated for now
|
31
|
+
@svg_engine.render doc
|
32
|
+
@svg_engine.svg_procs
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'svg_browser'
|
2
|
+
require 'canvas_shape'
|
3
|
+
|
4
|
+
class CanvasBrowser < Browser
|
5
|
+
|
6
|
+
def initialize(o={})
|
7
|
+
super(o) {|env| env.load_renderer CanvasShape::Shape.new}
|
8
|
+
end
|
9
|
+
|
10
|
+
def load_page(svg_file_name)
|
11
|
+
super(svg_file_name) do |doc|
|
12
|
+
yield(doc)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
|
@@ -0,0 +1,10 @@
|
|
1
|
+
def build_templates(t)
|
2
|
+
a = []
|
3
|
+
t.gsub!(/\#\{/,'\#\\{')
|
4
|
+
t.scan(/@@ (\w+)/){ a << [$1,$']}
|
5
|
+
code = a.map {|x| i = x[1] =~ /@@/; r = i.nil? ? x[1] : x[1][0,i] ; [x[0], r] }
|
6
|
+
template_code = code.map {|f,c| "@@templates[:%s] = \"%s\"" % [f, c.gsub(/"/,'\\"')]}
|
7
|
+
instance_eval(template_code.join("\n"))
|
8
|
+
instance_eval("template :layout do \"%s\" end" % @@templates[:layout].strip) if @@templates.has_key? :layout
|
9
|
+
end
|
10
|
+
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: svg-render
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors: []
|
7
7
|
|
@@ -22,7 +22,16 @@ extensions: []
|
|
22
22
|
extra_rdoc_files: []
|
23
23
|
|
24
24
|
files:
|
25
|
+
- lib/elements.rb
|
26
|
+
- lib/shape_base.rb
|
27
|
+
- lib/rvg_shape.rb
|
28
|
+
- lib/template_builder.rb
|
29
|
+
- lib/canvas_shape.rb
|
30
|
+
- lib/canvas_enclosure.rb
|
25
31
|
- lib/svg-render.rb
|
32
|
+
- lib/svg_browser.rb
|
33
|
+
- lib/render_svg3.rb
|
34
|
+
- lib/svg_to_canvas_browser.rb
|
26
35
|
has_rdoc: true
|
27
36
|
homepage:
|
28
37
|
licenses: []
|