quinn-ruby-svg 0.0.1 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.mkdn +0 -10
- data/VERSION.yml +1 -1
- data/lib/ruby-svg/core.rb +143 -0
- data/lib/ruby-svg/element.rb +358 -0
- data/lib/ruby-svg/misc.rb +82 -0
- data/lib/ruby-svg/style.rb +112 -0
- data/lib/ruby-svg.rb +11 -84
- metadata +10 -13
- data/lib/ruby-svg/complex/Pie.rb +0 -20
- data/lib/ruby-svg/primatives/A.rb +0 -33
- data/lib/ruby-svg/primatives/Defs.rb +0 -0
- data/lib/ruby-svg/primatives/Path.rb +0 -80
- data/lib/ruby-svg/primatives/Polygon.rb +0 -28
- data/lib/ruby-svg/primatives/Rectangle.rb +0 -21
data/README.mkdn
CHANGED
@@ -1,10 +0,0 @@
|
|
1
|
-
ruby-svg
|
2
|
-
========
|
3
|
-
|
4
|
-
This is the beginning of a library for creating SVG documents with Ruby.
|
5
|
-
|
6
|
-
Something I started on when I was bored, and didn't get very far before I was bored again.
|
7
|
-
|
8
|
-
Feel free to fork and continue work, please send me a pullrequest if you get something worthwhile going.
|
9
|
-
|
10
|
-
~ elliottcable.name
|
data/VERSION.yml
CHANGED
@@ -0,0 +1,143 @@
|
|
1
|
+
|
2
|
+
#==============================================================================#
|
3
|
+
# svg/core.rb
|
4
|
+
# $Id: core.rb,v 1.11 2003/02/06 14:59:43 yuya Exp $
|
5
|
+
#==============================================================================#
|
6
|
+
|
7
|
+
#==============================================================================#
|
8
|
+
# SVG Module
|
9
|
+
module SVG
|
10
|
+
|
11
|
+
def self.new(*args)
|
12
|
+
return Picture.new(*args)
|
13
|
+
end
|
14
|
+
|
15
|
+
#============================================================================#
|
16
|
+
# Picture Class
|
17
|
+
class Picture
|
18
|
+
|
19
|
+
include ArrayMixin
|
20
|
+
|
21
|
+
def initialize(width, height, view_box = nil)
|
22
|
+
@width = width
|
23
|
+
@height = height
|
24
|
+
@x = nil
|
25
|
+
@y = nil
|
26
|
+
@view_box = view_box
|
27
|
+
@title = nil
|
28
|
+
@desc = nil
|
29
|
+
|
30
|
+
@elements = []
|
31
|
+
@styles = []
|
32
|
+
@scripts = []
|
33
|
+
end
|
34
|
+
|
35
|
+
attr_reader :elements, :styles, :scripts
|
36
|
+
attr_accessor :width, :height, :x, :y, :view_box, :title, :desc
|
37
|
+
|
38
|
+
def array
|
39
|
+
return @elements
|
40
|
+
end
|
41
|
+
private :array
|
42
|
+
|
43
|
+
def define_style(class_name, style)
|
44
|
+
@styles << DefineStyle.new(class_name, style)
|
45
|
+
end
|
46
|
+
|
47
|
+
def to_s
|
48
|
+
text = %|<?xml version="1.0" standalone="no"?>\n|
|
49
|
+
text << %|<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">\n|
|
50
|
+
text << %|<svg width="#{@width}" height="#{@height}"|
|
51
|
+
text << %| viewBox="#{@view_box}"| if @view_box
|
52
|
+
text << %|>\n|
|
53
|
+
|
54
|
+
@scripts.each { |script|
|
55
|
+
text << script.to_s
|
56
|
+
}
|
57
|
+
|
58
|
+
unless @styles.empty?
|
59
|
+
text << %|<defs>\n|
|
60
|
+
text << %|<style type="text/css"><![CDATA[\n|
|
61
|
+
text << @styles.collect { |define| define.to_s + "\n" }.join
|
62
|
+
text << %|]]></style>\n|
|
63
|
+
text << %|</defs>\n|
|
64
|
+
end
|
65
|
+
|
66
|
+
text << %|<title>#{@title}</title>\n| if @title
|
67
|
+
text << %|<desc>#{@desc}</desc>\n| if @desc
|
68
|
+
text << @elements.collect { |element| element.to_s + "\n" }.join
|
69
|
+
text << %|</svg>\n|
|
70
|
+
return text
|
71
|
+
end
|
72
|
+
|
73
|
+
def svg
|
74
|
+
return self.to_s
|
75
|
+
end
|
76
|
+
|
77
|
+
def svgz
|
78
|
+
require 'zlib'
|
79
|
+
return Deflate.deflate(self.to_s, Deflate::BEST_COMPRESSION)
|
80
|
+
end
|
81
|
+
|
82
|
+
def mime_type
|
83
|
+
return 'image/svg+xml'
|
84
|
+
end
|
85
|
+
|
86
|
+
end # Picture
|
87
|
+
|
88
|
+
#============================================================================#
|
89
|
+
# DefineStyle Class
|
90
|
+
class DefineStyle
|
91
|
+
|
92
|
+
def initialize(class_name, style)
|
93
|
+
@class_name = class_name
|
94
|
+
@style = style
|
95
|
+
end
|
96
|
+
|
97
|
+
attr_accessor :class_name, :style
|
98
|
+
|
99
|
+
def to_s
|
100
|
+
return "#{@class_name} { #{@style} }"
|
101
|
+
end
|
102
|
+
|
103
|
+
end # DefineStyle
|
104
|
+
|
105
|
+
#============================================================================#
|
106
|
+
# ECMAScript Class
|
107
|
+
class ECMAScript
|
108
|
+
|
109
|
+
def initialize(script)
|
110
|
+
@script = script
|
111
|
+
end
|
112
|
+
|
113
|
+
attr_accessor :script
|
114
|
+
|
115
|
+
def to_s
|
116
|
+
text = %|<script type="text/ecmascript"><![CDATA[\n|
|
117
|
+
text << @script << "\n"
|
118
|
+
text << %|]]></script>\n|
|
119
|
+
return text
|
120
|
+
end
|
121
|
+
|
122
|
+
end # ECMAScript
|
123
|
+
|
124
|
+
#============================================================================#
|
125
|
+
# ECMAScriptURI Class
|
126
|
+
class ECMAScriptURI
|
127
|
+
|
128
|
+
def initialize(uri)
|
129
|
+
@uri = uri
|
130
|
+
end
|
131
|
+
|
132
|
+
attr_accessor :uri
|
133
|
+
|
134
|
+
def to_s
|
135
|
+
return %|<script type="text/ecmascript" xlink:href="#{@uri}" />\n|
|
136
|
+
end
|
137
|
+
|
138
|
+
end # ECMAScriptURI
|
139
|
+
|
140
|
+
end # SVG
|
141
|
+
|
142
|
+
#==============================================================================#
|
143
|
+
#==============================================================================#
|
@@ -0,0 +1,358 @@
|
|
1
|
+
|
2
|
+
#==============================================================================#
|
3
|
+
# svg/element.rb
|
4
|
+
# $Id: element.rb,v 1.14 2003/02/06 14:59:43 yuya Exp $
|
5
|
+
#==============================================================================#
|
6
|
+
|
7
|
+
#==============================================================================#
|
8
|
+
# SVG Module
|
9
|
+
module SVG
|
10
|
+
|
11
|
+
#============================================================================#
|
12
|
+
# ElementBase Class
|
13
|
+
class ElementBase
|
14
|
+
|
15
|
+
def initialize(&block)
|
16
|
+
@id = nil
|
17
|
+
@style = nil
|
18
|
+
@class = nil
|
19
|
+
@transform = nil
|
20
|
+
@attr = nil
|
21
|
+
|
22
|
+
if block_given?
|
23
|
+
instance_eval(&block)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
attr_accessor :id, :style, :class, :transform, :attr
|
28
|
+
|
29
|
+
def to_s
|
30
|
+
text = ''
|
31
|
+
text << %| id="#{@id}"| if @id
|
32
|
+
text << %| style="#{@style}"| if @style
|
33
|
+
text << %| class="#{@class}"| if @class
|
34
|
+
text << %| transform="#{@transform}"| if @transform
|
35
|
+
text << %| #{@attr}| if @attr
|
36
|
+
return text
|
37
|
+
end
|
38
|
+
|
39
|
+
end # ElementBase
|
40
|
+
|
41
|
+
#============================================================================#
|
42
|
+
# Group Class
|
43
|
+
class Group < ElementBase
|
44
|
+
|
45
|
+
include ArrayMixin
|
46
|
+
|
47
|
+
def initialize
|
48
|
+
super()
|
49
|
+
@elements = []
|
50
|
+
end
|
51
|
+
|
52
|
+
attr_reader :elements
|
53
|
+
|
54
|
+
def array
|
55
|
+
return @elements
|
56
|
+
end
|
57
|
+
private :array
|
58
|
+
|
59
|
+
def to_s
|
60
|
+
text = %|<g|
|
61
|
+
text << super()
|
62
|
+
text << %|>\n|
|
63
|
+
text << @elements.collect { |element| element.to_s + "\n" }.join
|
64
|
+
text << %|</g>\n|
|
65
|
+
end
|
66
|
+
|
67
|
+
end # Group
|
68
|
+
|
69
|
+
#============================================================================#
|
70
|
+
# Anchor Class
|
71
|
+
class Anchor < ElementBase
|
72
|
+
|
73
|
+
include ArrayMixin
|
74
|
+
|
75
|
+
def initialize(uri)
|
76
|
+
super()
|
77
|
+
@uri = uri
|
78
|
+
@elements = []
|
79
|
+
end
|
80
|
+
|
81
|
+
attr_accessor :uri
|
82
|
+
attr_reader :elements
|
83
|
+
|
84
|
+
def array
|
85
|
+
return @elements
|
86
|
+
end
|
87
|
+
private :array
|
88
|
+
|
89
|
+
def to_s
|
90
|
+
text = %|<a|
|
91
|
+
text << super()
|
92
|
+
text << %| xlink:href="#{@uri}">\n|
|
93
|
+
text << @elements.collect { |element| element.to_s + "\n" }.join
|
94
|
+
text << %|</a>\n|
|
95
|
+
end
|
96
|
+
|
97
|
+
end # Anchor
|
98
|
+
|
99
|
+
#============================================================================#
|
100
|
+
# Use Class
|
101
|
+
class Use < ElementBase
|
102
|
+
|
103
|
+
def initialize(uri)
|
104
|
+
super()
|
105
|
+
@uri = uri
|
106
|
+
end
|
107
|
+
|
108
|
+
attr_accessor :uri
|
109
|
+
|
110
|
+
def to_s
|
111
|
+
text = %|<use|
|
112
|
+
text << super()
|
113
|
+
text << %| xlink:href="#{@uri}"/>\n|
|
114
|
+
end
|
115
|
+
|
116
|
+
end # Use
|
117
|
+
|
118
|
+
#============================================================================#
|
119
|
+
# Rect Class
|
120
|
+
class Rect < ElementBase
|
121
|
+
|
122
|
+
def initialize(x, y, width, height, rx = nil, ry = nil)
|
123
|
+
super()
|
124
|
+
|
125
|
+
@x = x
|
126
|
+
@y = y
|
127
|
+
@width = width
|
128
|
+
@height = height
|
129
|
+
@rx = rx
|
130
|
+
@ry = ry
|
131
|
+
end
|
132
|
+
|
133
|
+
attr_accessor :width, :height, :x, :y, :rx, :ry
|
134
|
+
|
135
|
+
def to_s
|
136
|
+
text = %|<rect width="#{@width}" height="#{@height}"|
|
137
|
+
text << %| x="#{@x}"| if @x
|
138
|
+
text << %| y="#{@y}"| if @y
|
139
|
+
text << %| rx="#{@rx}"| if @rx
|
140
|
+
text << %| ry="#{@ry}"| if @ry
|
141
|
+
text << super()
|
142
|
+
text << %| />|
|
143
|
+
return text
|
144
|
+
end
|
145
|
+
|
146
|
+
end # Rect
|
147
|
+
|
148
|
+
#============================================================================#
|
149
|
+
# Circle Class
|
150
|
+
class Circle < ElementBase
|
151
|
+
|
152
|
+
def initialize(cx, cy, r)
|
153
|
+
super()
|
154
|
+
|
155
|
+
@cx = cx
|
156
|
+
@cy = cy
|
157
|
+
@r = r
|
158
|
+
end
|
159
|
+
|
160
|
+
attr_accessor :cx, :cy, :r
|
161
|
+
|
162
|
+
def to_s
|
163
|
+
text = %|<circle cx="#{@cx}" cy="#{@cy}" r="#{@r}"|
|
164
|
+
text << super()
|
165
|
+
text << %| />|
|
166
|
+
return text
|
167
|
+
end
|
168
|
+
|
169
|
+
end # Circle
|
170
|
+
|
171
|
+
#============================================================================#
|
172
|
+
# Ellipse Class
|
173
|
+
class Ellipse < ElementBase
|
174
|
+
|
175
|
+
def initialize(cx, cy, rx, ry)
|
176
|
+
super()
|
177
|
+
|
178
|
+
@cx = cx
|
179
|
+
@cy = cy
|
180
|
+
@rx = rx
|
181
|
+
@ry = ry
|
182
|
+
end
|
183
|
+
|
184
|
+
attr_accessor :cx, :cy, :rx, :ry
|
185
|
+
|
186
|
+
def to_s
|
187
|
+
text = %|<ellipse cx="#{@cx}" cy="#{@cy}" rx="#{@rx}" ry="#{@ry}"|
|
188
|
+
text << super()
|
189
|
+
text << %| />|
|
190
|
+
return text
|
191
|
+
end
|
192
|
+
|
193
|
+
end # Ellipse
|
194
|
+
|
195
|
+
#============================================================================#
|
196
|
+
# Line Class
|
197
|
+
class Line < ElementBase
|
198
|
+
|
199
|
+
def initialize(x1, y1, x2, y2)
|
200
|
+
super()
|
201
|
+
@x1 = x1
|
202
|
+
@y1 = y1
|
203
|
+
@x2 = x2
|
204
|
+
@y2 = y2
|
205
|
+
end
|
206
|
+
|
207
|
+
attr_accessor :x1, :y1, :x2, :y2
|
208
|
+
|
209
|
+
def to_s
|
210
|
+
text = %|<line x1="#{@x1}" y1="#{@y1}" x2="#{@x2}" y2="#{@y2}"|
|
211
|
+
text << super()
|
212
|
+
text << %| />|
|
213
|
+
return text
|
214
|
+
end
|
215
|
+
|
216
|
+
end # Line
|
217
|
+
|
218
|
+
#============================================================================#
|
219
|
+
# Polyline Class
|
220
|
+
class Polyline < ElementBase
|
221
|
+
|
222
|
+
def initialize(points)
|
223
|
+
super()
|
224
|
+
@points = points
|
225
|
+
end
|
226
|
+
|
227
|
+
attr_accessor :points
|
228
|
+
|
229
|
+
def to_s
|
230
|
+
text = %|<polyline points="#{@points.join(' ')}"|
|
231
|
+
text << super()
|
232
|
+
text << %| />|
|
233
|
+
return text
|
234
|
+
end
|
235
|
+
|
236
|
+
end # Polyline
|
237
|
+
|
238
|
+
#============================================================================#
|
239
|
+
# Polygon Class
|
240
|
+
class Polygon < ElementBase
|
241
|
+
|
242
|
+
def initialize(points)
|
243
|
+
super()
|
244
|
+
@points = points
|
245
|
+
end
|
246
|
+
|
247
|
+
attr_accessor :points
|
248
|
+
|
249
|
+
def to_s
|
250
|
+
text = %|<polygon points="#{@points.join(' ')}"|
|
251
|
+
text << super()
|
252
|
+
text << %| />|
|
253
|
+
return text
|
254
|
+
end
|
255
|
+
|
256
|
+
end # Polygon
|
257
|
+
|
258
|
+
#============================================================================#
|
259
|
+
# Image Class
|
260
|
+
class Image < ElementBase
|
261
|
+
|
262
|
+
def initialize(x, y, width, height, href)
|
263
|
+
super()
|
264
|
+
@x = x
|
265
|
+
@y = y
|
266
|
+
@width = width
|
267
|
+
@height = height
|
268
|
+
@href = href
|
269
|
+
end
|
270
|
+
|
271
|
+
attr_accessor :x, :y, :width, :height, :href
|
272
|
+
|
273
|
+
def to_s
|
274
|
+
text = %|<image|
|
275
|
+
text << %| x="#{@x}"| if @x
|
276
|
+
text << %| y="#{@y}"| if @y
|
277
|
+
text << %| width="#{@width}"|
|
278
|
+
text << %| height="#{@height}"|
|
279
|
+
text << %| xlink:href="#{@href}"|
|
280
|
+
text << super()
|
281
|
+
text << %| />|
|
282
|
+
return text
|
283
|
+
end
|
284
|
+
|
285
|
+
end # Image
|
286
|
+
|
287
|
+
#============================================================================#
|
288
|
+
# Path Class
|
289
|
+
class Path < ElementBase
|
290
|
+
|
291
|
+
def initialize(path, length = nil)
|
292
|
+
super()
|
293
|
+
@path = path
|
294
|
+
@length = length
|
295
|
+
end
|
296
|
+
|
297
|
+
attr_accessor :path, :length
|
298
|
+
|
299
|
+
def to_s
|
300
|
+
text = %|<path d="#{@path.join(' ')}"|
|
301
|
+
text = %| length="#{@length}"| if @length
|
302
|
+
text << super()
|
303
|
+
text << %| />|
|
304
|
+
return text
|
305
|
+
end
|
306
|
+
|
307
|
+
end # Path
|
308
|
+
|
309
|
+
#============================================================================#
|
310
|
+
# Text Class
|
311
|
+
class Text < ElementBase
|
312
|
+
|
313
|
+
def initialize(x, y, text)
|
314
|
+
super()
|
315
|
+
@x = x
|
316
|
+
@y = y
|
317
|
+
@text = text
|
318
|
+
@length = nil
|
319
|
+
@length_adjust = nil
|
320
|
+
end
|
321
|
+
|
322
|
+
attr_accessor :x, :y, :text, :length, :length_adjust
|
323
|
+
|
324
|
+
def to_s
|
325
|
+
svg = %|<text|
|
326
|
+
svg << %| x="#{@x}"| if @x
|
327
|
+
svg << %| y="#{@y}"| if @y
|
328
|
+
svg << %| textLength="#{@length}"| if @length
|
329
|
+
svg << %| lengthAdjust="#{@length_adjust}"| if @length_adjust
|
330
|
+
svg << super()
|
331
|
+
svg << %|>|
|
332
|
+
svg << text
|
333
|
+
svg << %|</text>|
|
334
|
+
return svg
|
335
|
+
end
|
336
|
+
|
337
|
+
end # Text
|
338
|
+
|
339
|
+
#============================================================================#
|
340
|
+
# Verbatim Class
|
341
|
+
class Verbatim
|
342
|
+
|
343
|
+
def initialize(xml)
|
344
|
+
@xml = xml
|
345
|
+
end
|
346
|
+
|
347
|
+
attr_accessor :xml
|
348
|
+
|
349
|
+
def to_s
|
350
|
+
return @xml
|
351
|
+
end
|
352
|
+
|
353
|
+
end # Verbatim
|
354
|
+
|
355
|
+
end # SVG
|
356
|
+
|
357
|
+
#==============================================================================#
|
358
|
+
#==============================================================================#
|
@@ -0,0 +1,82 @@
|
|
1
|
+
|
2
|
+
#==============================================================================#
|
3
|
+
# svg/misc.rb
|
4
|
+
# $Id: misc.rb,v 1.6 2003/02/06 14:59:43 yuya Exp $
|
5
|
+
#==============================================================================#
|
6
|
+
|
7
|
+
#==============================================================================#
|
8
|
+
# SVG Module
|
9
|
+
module SVG
|
10
|
+
|
11
|
+
#============================================================================#
|
12
|
+
# Point Class
|
13
|
+
class Point
|
14
|
+
|
15
|
+
def initialize(x, y)
|
16
|
+
@x = x
|
17
|
+
@y = y
|
18
|
+
end
|
19
|
+
|
20
|
+
attr_accessor :x, :y
|
21
|
+
|
22
|
+
def self.[](*points)
|
23
|
+
if points.size % 2 == 0
|
24
|
+
return (0...(points.size / 2)).collect { |i|
|
25
|
+
self.new(points[i * 2], points[i * 2 + 1])
|
26
|
+
}
|
27
|
+
else
|
28
|
+
raise ArgumentError, 'odd number args for Point'
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def to_s
|
33
|
+
return "#{@x} #{@y}"
|
34
|
+
end
|
35
|
+
|
36
|
+
end # Point
|
37
|
+
|
38
|
+
#============================================================================#
|
39
|
+
# ArrayMixin Module
|
40
|
+
module ArrayMixin
|
41
|
+
|
42
|
+
include Enumerable
|
43
|
+
|
44
|
+
def array
|
45
|
+
raise NotImplementedError
|
46
|
+
end
|
47
|
+
private :array
|
48
|
+
|
49
|
+
def [](index)
|
50
|
+
array[index]
|
51
|
+
end
|
52
|
+
|
53
|
+
def []=(index, value)
|
54
|
+
array[index] = value
|
55
|
+
end
|
56
|
+
|
57
|
+
def <<(other)
|
58
|
+
array << other
|
59
|
+
end
|
60
|
+
|
61
|
+
def clear
|
62
|
+
array.clear
|
63
|
+
end
|
64
|
+
|
65
|
+
def first
|
66
|
+
array.first
|
67
|
+
end
|
68
|
+
|
69
|
+
def last
|
70
|
+
array.last
|
71
|
+
end
|
72
|
+
|
73
|
+
def each(&block)
|
74
|
+
array.each(&block)
|
75
|
+
end
|
76
|
+
|
77
|
+
end # ArrayMixin
|
78
|
+
|
79
|
+
end # SVG
|
80
|
+
|
81
|
+
#==============================================================================#
|
82
|
+
#==============================================================================#
|
@@ -0,0 +1,112 @@
|
|
1
|
+
|
2
|
+
#==============================================================================#
|
3
|
+
# svg/style.rb
|
4
|
+
# $Id: style.rb,v 1.6 2003/02/06 14:59:43 yuya Exp $
|
5
|
+
#==============================================================================#
|
6
|
+
|
7
|
+
#==============================================================================#
|
8
|
+
# SVG Module
|
9
|
+
module SVG
|
10
|
+
|
11
|
+
#============================================================================#
|
12
|
+
# Style Class
|
13
|
+
class Style
|
14
|
+
|
15
|
+
Attributes = [
|
16
|
+
'stroke', #
|
17
|
+
'stroke-dasharray', #
|
18
|
+
'stroke-dashoffset', #
|
19
|
+
'stroke-linecap', # round | butt | square | inherit
|
20
|
+
'stroke-linejoin', # round | bevel | miter | inherit
|
21
|
+
'stroke-miterlimit', #
|
22
|
+
'stroke-opacity', #
|
23
|
+
'stroke-width', #
|
24
|
+
'fill', #
|
25
|
+
'fill-opacity', #
|
26
|
+
'fill-rule', # evenodd | nonzero | inherit
|
27
|
+
'alignment-baseline', # auto | baseline | before-edge | text-before-edge | middle | after-edge | text-after-edge | ideographic | alphabetic | hanging | mathematical | inherit
|
28
|
+
'baseline-shift', # baseline | sub | super | <percentage> | <length> | inherit
|
29
|
+
'direction', # ltr | rtl | inherit
|
30
|
+
'dominant-baseline', # auto | autosense-script | no-change | reset | ideographic | lower | hanging | mathematical | inherit
|
31
|
+
'font', #
|
32
|
+
'font-family', #
|
33
|
+
'font-size', #
|
34
|
+
'font-size-adjust', # [0-9]+ | none | inherit
|
35
|
+
'font-stretch', # normal | wider | narrower | ultra-condensed | extra-condensed | condensed | semi-condensed | semi-expanded | expanded | extra-expanded | ultra-expanded | inherit
|
36
|
+
'font-style', # normal | italic | oblique | inherit
|
37
|
+
'font-variant', # normal | small-caps | inherit
|
38
|
+
'font-weight', # normal | bold | bolder | lighter | 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900 | inherit
|
39
|
+
'glyph-orientation-hoizontal', # <angle> | inherit
|
40
|
+
'glyph-orientation-vertical', # auto | <angle> | inherit
|
41
|
+
'kerning', # auto | <length> | inherit
|
42
|
+
'letter-spacing', # normal | <length> | inherit
|
43
|
+
'text-anchor', # start | middle | end | inherit
|
44
|
+
'text-decoration', # none | underline | overline | line-through | blink | inherit
|
45
|
+
'text-rendering', # auto | optimizeSpeed | optimizeLegibility | geometricPrecision | inherit
|
46
|
+
'unicode-bidi', # normal | embed | bidi-override | inherit
|
47
|
+
'word-spacing', # normal | length | inherit
|
48
|
+
'writing-mode', # lr-tb | rl-tb | tb-rl | lr | rl | tb | inherit
|
49
|
+
'clip', # auto | rect(...) | inherit
|
50
|
+
'clip-path', # <uri> | none | inherit
|
51
|
+
'clip-rule', # evenodd | nonzero | inherit
|
52
|
+
'color', #
|
53
|
+
'color-interpolation', # auto | sRGB | linearRGB | inherit
|
54
|
+
'color-rendering', # auto | optimizeSpeed | optimizeQuality | inherit
|
55
|
+
'cursor', # [ [<uri> ,]* [ auto | crosshair | default | pointer | move | e-resize | ne-resize | nw-resize | n-resize | se-resize | sw-resize | s-resize | w-resize| text | wait | help ] ] | inherit
|
56
|
+
'display', # inline | none | inherit
|
57
|
+
'enable-background', # accumulate | new [ ( <x> <y> <width> <height> ) ] | inherit
|
58
|
+
'filter', # <uri> | none | uri
|
59
|
+
'image-rendering', # auto | optimizeSpeed | optimizeQuality
|
60
|
+
'marker', #
|
61
|
+
'marker-end', # none | <uri>
|
62
|
+
'marker-mid', #
|
63
|
+
'marker-start', #
|
64
|
+
'mask', #
|
65
|
+
'opacity', #
|
66
|
+
'overflow', # visible | hidden | scroll | auto | inherit
|
67
|
+
'pointer-events', # visiblePainted | visibleFill | visibleStroke | visible | painted | fill | stroke | all | none | inherit
|
68
|
+
'rendering-intent', # auto | perceptual | relative-colorimetric | saturation | absolute-colorimetric | inherit
|
69
|
+
'shape-rendering', # auto | optimizeSpeed | crispEdges|geometricPrecision | inherit
|
70
|
+
'visibility', # visible | hidden | collapse | inherit
|
71
|
+
]
|
72
|
+
|
73
|
+
def initialize(attr = nil)
|
74
|
+
@attributes = {}
|
75
|
+
|
76
|
+
if attr && attr.kind_of?(Hash)
|
77
|
+
attr.each { |key, value|
|
78
|
+
@attributes[key.to_s.gsub(/_/, '-')] = value
|
79
|
+
}
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
Attributes.each { |attr|
|
84
|
+
name = attr.gsub(/-/, '_')
|
85
|
+
class_eval(<<-EOS)
|
86
|
+
def #{name}
|
87
|
+
return @attributes['#{attr}']
|
88
|
+
end
|
89
|
+
def #{name}=(value)
|
90
|
+
@attributes['#{attr}'] = value
|
91
|
+
end
|
92
|
+
EOS
|
93
|
+
}
|
94
|
+
|
95
|
+
def to_s
|
96
|
+
text = @attributes.select { |key, value|
|
97
|
+
!value.nil?
|
98
|
+
}.sort { |(a_key, a_value), (b_key, b_value)|
|
99
|
+
a_key <=> b_key
|
100
|
+
}.collect { |key, value|
|
101
|
+
"#{key}: #{value};"
|
102
|
+
}.join(' ')
|
103
|
+
|
104
|
+
return text
|
105
|
+
end
|
106
|
+
|
107
|
+
end # Style
|
108
|
+
|
109
|
+
end # SVG
|
110
|
+
|
111
|
+
#==============================================================================#
|
112
|
+
#==============================================================================#
|
data/lib/ruby-svg.rb
CHANGED
@@ -1,86 +1,13 @@
|
|
1
|
-
require 'ruby-svg/primatives/Path'
|
2
|
-
require 'ruby-svg/primatives/Rectangle'
|
3
|
-
require 'ruby-svg/primatives/A'
|
4
|
-
# require 'ruby-svg/complex/Pie'
|
5
1
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
:namespace => 'svg',
|
11
|
-
:width => 500,
|
12
|
-
:height => 500 }.merge(args)
|
13
|
-
args.each do |k,v|
|
14
|
-
self.instance_variable_set(('@' + k.to_s).to_sym, v)
|
15
|
-
end
|
16
|
-
@content = Array.new
|
17
|
-
end
|
18
|
-
|
19
|
-
attr_accessor :style
|
20
|
-
attr_accessor :title
|
21
|
-
attr_accessor :desc
|
22
|
-
|
23
|
-
attr_reader :content
|
24
|
-
def << (element)
|
25
|
-
@content << element
|
26
|
-
end
|
27
|
-
|
28
|
-
def to_xml(args = {})
|
29
|
-
standalone = args[:standalone].nil? || args[:standalone].class == (TrueClass || FalseClass) ? true : args[:standalone]
|
30
|
-
indent = args[:indent].nil? || args[:indent].class != Fixnum ? 0 : args[:indent]
|
31
|
-
indent = 0 if standalone
|
32
|
-
|
33
|
-
out = Array.new
|
34
|
-
if standalone
|
35
|
-
out << SVGHelper::wrap("?xml version='1.0' encoding='#{@encoding}' standalone='no'?", indent)
|
36
|
-
out << SVGHelper::wrap("!DOCTYPE #{@doctype}", indent)
|
37
|
-
end
|
38
|
-
|
39
|
-
# Header
|
40
|
-
header = String.new
|
41
|
-
header << (standalone ? '' : @namespace + ':') + 'svg'
|
42
|
-
[:width, :height].each do |a|
|
43
|
-
header << " #{a.to_s}='#{instance_variable_get('@' + a.to_s)}'"
|
44
|
-
end
|
45
|
-
header << " version='1.1' xmlns='http://www.w3.org/2000/svg'" if standalone
|
46
|
-
header << " xmlns:xlink='http://www.w3.org/1999/xlink'"
|
47
|
-
out << SVGHelper::wrap(header, indent)
|
48
|
-
indent += 1
|
49
|
-
|
50
|
-
{:title => {}, :style => {:type => 'text/css'}, :desc => {}}.each do |tag,attribs|
|
51
|
-
it = instance_variable_get('@' + tag.to_s)
|
52
|
-
unless it.nil?
|
53
|
-
header = (standalone ? '' : @namespace + ':') + tag.to_s
|
54
|
-
attribs.each do |k,v|
|
55
|
-
header << " #{k}='#{v}'"
|
56
|
-
end
|
57
|
-
out << SVGHelper::wrap(header, indent)
|
58
|
-
indent += 1
|
59
|
-
lines = ''
|
60
|
-
it.each do |line|
|
61
|
-
lines << SVGHelper::indent(line, indent)
|
62
|
-
end
|
63
|
-
out << lines.sub(/([^\n])\z/, "\\1\n")
|
64
|
-
indent -= 1
|
65
|
-
out << SVGHelper::wrap('/' + tag.to_s, indent)
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
|
-
@content.each do |element|
|
70
|
-
out << element.to_xml(:standalone => standalone, :indent => indent)
|
71
|
-
end
|
72
|
-
|
73
|
-
indent -= 1
|
74
|
-
out << SVGHelper::wrap('/' + (standalone ? '' : @namespace + ':') + 'svg', indent).chomp
|
75
|
-
end
|
76
|
-
end
|
2
|
+
#==============================================================================#
|
3
|
+
# svg/svg.rb
|
4
|
+
# $Id: svg.rb,v 1.4 2002/09/10 09:59:08 yuya Exp $
|
5
|
+
#==============================================================================#
|
77
6
|
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
end
|
86
|
-
end
|
7
|
+
require 'svg/misc'
|
8
|
+
require 'svg/core'
|
9
|
+
require 'svg/element'
|
10
|
+
require 'svg/style'
|
11
|
+
|
12
|
+
#==============================================================================#
|
13
|
+
#==============================================================================#
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: quinn-ruby-svg
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- quinn
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-02-
|
12
|
+
date: 2009-02-10 00:00:00 -08:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -25,20 +25,17 @@ files:
|
|
25
25
|
- README.mkdn
|
26
26
|
- VERSION.yml
|
27
27
|
- lib/ruby-svg
|
28
|
-
- lib/ruby-svg/
|
29
|
-
- lib/ruby-svg/
|
30
|
-
- lib/ruby-svg/
|
31
|
-
- lib/ruby-svg/
|
32
|
-
- lib/ruby-svg/primatives/Defs.rb
|
33
|
-
- lib/ruby-svg/primatives/Path.rb
|
34
|
-
- lib/ruby-svg/primatives/Polygon.rb
|
35
|
-
- lib/ruby-svg/primatives/Rectangle.rb
|
28
|
+
- lib/ruby-svg/core.rb
|
29
|
+
- lib/ruby-svg/element.rb
|
30
|
+
- lib/ruby-svg/misc.rb
|
31
|
+
- lib/ruby-svg/style.rb
|
36
32
|
- lib/ruby-svg.rb
|
37
|
-
has_rdoc:
|
33
|
+
has_rdoc: true
|
38
34
|
homepage: http://github.com/quinn/ruby-svg
|
39
35
|
post_install_message:
|
40
|
-
rdoc_options:
|
41
|
-
|
36
|
+
rdoc_options:
|
37
|
+
- --inline-source
|
38
|
+
- --charset=UTF-8
|
42
39
|
require_paths:
|
43
40
|
- lib
|
44
41
|
required_ruby_version: !ruby/object:Gem::Requirement
|
data/lib/ruby-svg/complex/Pie.rb
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
class SVGPieChart
|
2
|
-
|
3
|
-
end
|
4
|
-
|
5
|
-
class SVGPieSlice
|
6
|
-
# x, y, radius, percent, used
|
7
|
-
def initialize(args = {})
|
8
|
-
args.each do |k,v|
|
9
|
-
self.instance_variable_set(('@' + k.to_s).to_sym, v)
|
10
|
-
end
|
11
|
-
@angle = (2 * Math::PI) * (@percent / 100.0)
|
12
|
-
@full = @percent + @used
|
13
|
-
end
|
14
|
-
|
15
|
-
def angle
|
16
|
-
(2 * Math::PI) * (@percent - / 100.0)
|
17
|
-
end
|
18
|
-
|
19
|
-
|
20
|
-
end
|
@@ -1,33 +0,0 @@
|
|
1
|
-
class SVGA
|
2
|
-
def initialize(args = {})
|
3
|
-
args = { :href => '#' }.merge(args)
|
4
|
-
args.each do |k,v|
|
5
|
-
self.instance_variable_set(('@' + k.to_s).to_sym, v)
|
6
|
-
end
|
7
|
-
@content = Array.new
|
8
|
-
end
|
9
|
-
|
10
|
-
attr_reader :content
|
11
|
-
def << (element)
|
12
|
-
@content << element
|
13
|
-
end
|
14
|
-
|
15
|
-
def to_xml(args = {})
|
16
|
-
standalone = args[:standalone].nil? || args[:standalone].class == (TrueClass || FalseClass) ? true : args[:standalone]
|
17
|
-
indent = args[:indent].nil? || args[:indent].class != Fixnum ? 0 : args[:indent]
|
18
|
-
|
19
|
-
element = (standalone ? '' : @namespace + ':') + 'a'
|
20
|
-
|
21
|
-
element << " xlink:href='#{@href}'"
|
22
|
-
|
23
|
-
out = SVGHelper::wrap(element, indent)
|
24
|
-
indent += 1
|
25
|
-
|
26
|
-
@content.each do |element|
|
27
|
-
out << element.to_xml(:standalone => standalone, :indent => indent)
|
28
|
-
end
|
29
|
-
|
30
|
-
indent -= 1
|
31
|
-
out << SVGHelper::wrap('/' + (standalone ? '' : @namespace + ':') + 'a', indent)
|
32
|
-
end
|
33
|
-
end
|
File without changes
|
@@ -1,80 +0,0 @@
|
|
1
|
-
class SVGPath
|
2
|
-
def initialize(args = {})
|
3
|
-
args.each do |k,v|
|
4
|
-
self.instance_variable_set(('@' + k.to_s).to_sym, v)
|
5
|
-
end
|
6
|
-
@descriptors = Array.new
|
7
|
-
end
|
8
|
-
|
9
|
-
attr_reader :descriptors
|
10
|
-
|
11
|
-
def <<(descriptor)
|
12
|
-
@descriptors << descriptor
|
13
|
-
end
|
14
|
-
|
15
|
-
def to_xml(args = {})
|
16
|
-
standalone = args[:standalone].nil? || args[:standalone].class == (TrueClass || FalseClass) ? true : args[:standalone]
|
17
|
-
indent = args[:indent].nil? || args[:indent].class != Fixnum ? 0 : args[:indent]
|
18
|
-
|
19
|
-
element = (standalone ? '' : @namespace + ':') + 'path'
|
20
|
-
|
21
|
-
descriptors = String.new
|
22
|
-
@descriptors.each do |descriptor|
|
23
|
-
descriptors << descriptor.to_s + " "
|
24
|
-
end
|
25
|
-
descriptors << "Z"
|
26
|
-
|
27
|
-
element << " d='#{descriptors}'"
|
28
|
-
|
29
|
-
[:id, :class, :style].each do |a|
|
30
|
-
element << " #{a.to_s}='#{instance_variable_get('@' + a.to_s)}'" unless a.nil?
|
31
|
-
end
|
32
|
-
out = SVGHelper::wrap(element + "/", indent)
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
class SVGPathMoveComponent
|
37
|
-
def initialize(args = {})
|
38
|
-
args = { :x => 0, :y => 0 }.merge(args)
|
39
|
-
args.each do |k,v|
|
40
|
-
self.instance_variable_set(('@' + k.to_s).to_sym, v)
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
def to_s
|
45
|
-
"M#{@x},#{@y}"
|
46
|
-
end
|
47
|
-
end
|
48
|
-
class SVGPathLineComponent
|
49
|
-
def initialize(args = {})
|
50
|
-
args = { :x => 0, :y => 0 }.merge(args)
|
51
|
-
args.each do |k,v|
|
52
|
-
self.instance_variable_set(('@' + k.to_s).to_sym, v)
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
def to_s
|
57
|
-
"L#{@x},#{@y}"
|
58
|
-
end
|
59
|
-
end
|
60
|
-
class SVGPathArcComponent
|
61
|
-
# :direction => :american
|
62
|
-
def initialize(args = {})
|
63
|
-
args = { :rx => 100, :ry => 100, :slant => 0, :long => false, :direction => :cartesian, :x => 100, :y => 100 }.merge(args)
|
64
|
-
args.each do |k,v|
|
65
|
-
self.instance_variable_set(('@' + k.to_s).to_sym, v)
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
|
-
def to_s
|
70
|
-
long = @long ? 1 : 0
|
71
|
-
direction = case @direction
|
72
|
-
when :cartesian
|
73
|
-
0
|
74
|
-
when :american
|
75
|
-
1
|
76
|
-
end
|
77
|
-
|
78
|
-
"A#{@rx},#{@ry} #{@slant} #{long},#{direction} #{@x},#{@y}"
|
79
|
-
end
|
80
|
-
end
|
@@ -1,28 +0,0 @@
|
|
1
|
-
class SVGPolygon
|
2
|
-
def initialize(args = {})
|
3
|
-
@points = ""
|
4
|
-
args = { :x => 0, :y => 0,
|
5
|
-
:width => 500, :height => 500 }.merge(args)
|
6
|
-
args.each do |k,v|
|
7
|
-
self.instance_variable_set(('@' + k.to_s).to_sym, v)
|
8
|
-
end
|
9
|
-
@content = Array.new
|
10
|
-
end
|
11
|
-
|
12
|
-
def vertex x,y
|
13
|
-
@points << "#{x}, #{y}"
|
14
|
-
end
|
15
|
-
|
16
|
-
alias_method :vertex, :point
|
17
|
-
|
18
|
-
def to_xml(args = {})
|
19
|
-
standalone = args[:standalone].nil? || args[:standalone].class == (TrueClass || FalseClass) ? true : args[:standalone]
|
20
|
-
indent = args[:indent].nil? || args[:indent].class != Fixnum ? 0 : args[:indent]
|
21
|
-
|
22
|
-
element = (standalone ? '' : @namespace + ':') + 'polygon'
|
23
|
-
[:x, :y, :points, :id, :class, :style].each do |a|
|
24
|
-
element << " #{a.to_s}='#{instance_variable_get('@' + a.to_s)}'" unless a.nil?
|
25
|
-
end
|
26
|
-
out = SVGHelper::wrap(element + "/", indent)
|
27
|
-
end
|
28
|
-
end
|
@@ -1,21 +0,0 @@
|
|
1
|
-
class SVGRectangle
|
2
|
-
def initialize(args = {})
|
3
|
-
args = { :x => 0, :y => 0,
|
4
|
-
:width => 500, :height => 500 }.merge(args)
|
5
|
-
args.each do |k,v|
|
6
|
-
self.instance_variable_set(('@' + k.to_s).to_sym, v)
|
7
|
-
end
|
8
|
-
@content = Array.new
|
9
|
-
end
|
10
|
-
|
11
|
-
def to_xml(args = {})
|
12
|
-
standalone = args[:standalone].nil? || args[:standalone].class == (TrueClass || FalseClass) ? true : args[:standalone]
|
13
|
-
indent = args[:indent].nil? || args[:indent].class != Fixnum ? 0 : args[:indent]
|
14
|
-
|
15
|
-
element = (standalone ? '' : @namespace + ':') + 'rect'
|
16
|
-
[:x, :y, :width, :height, :id, :class, :style].each do |a|
|
17
|
-
element << " #{a.to_s}='#{instance_variable_get('@' + a.to_s)}'" unless a.nil?
|
18
|
-
end
|
19
|
-
out = SVGHelper::wrap(element + "/", indent)
|
20
|
-
end
|
21
|
-
end
|