victor 0.3.1 → 0.3.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +82 -17
- data/lib/victor/dsl.rb +1 -1
- data/lib/victor/svg_base.rb +26 -15
- data/lib/victor/version.rb +1 -1
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4f308143350a9236bbdf1c046de94a94728ecd90051004482e78cf9734484ef6
|
4
|
+
data.tar.gz: 36b35af10ea11a1bc39063384c6a23e247c257d0364edb24b5914cfd73029a88
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 353fd957d007ad7dd020f84a8866634a799e39ae94ba2ea65edf4eb09b6e8a354aa09961492a6cac0a530bcee5e904738df13bffc68c3b00f983348844adc074
|
7
|
+
data.tar.gz: 3993f70f671cb4097e83279bc4b5b68d510aa74a40ae320960d56b4a6b1aa537270893975c473cbf66a263496cea39398cd742b217af6b327b595edef84ea36b
|
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
![Victor](/examples
|
1
|
+
![Victor](/examples/16_victor_logo.svg)
|
2
2
|
|
3
3
|
# Victor - Ruby SVG Image Builder
|
4
4
|
|
@@ -27,6 +27,7 @@ directly to SVG elements.
|
|
27
27
|
* [CSS](#css)
|
28
28
|
* [Tagless Elements](#tagless-elements)
|
29
29
|
* [XML Encoding](#xml-encoding)
|
30
|
+
* [XML Newlines](#xml-newlines)
|
30
31
|
* [DSL Syntax](#dsl-syntax)
|
31
32
|
* [Using with Rails](#using-with-rails)
|
32
33
|
* [Related Projects](#related-projects)
|
@@ -71,7 +72,7 @@ svg.save 'pacman'
|
|
71
72
|
|
72
73
|
Output:
|
73
74
|
|
74
|
-
[![pacman](https://cdn.rawgit.com/DannyBen/victor/master/examples/
|
75
|
+
[![pacman](https://cdn.rawgit.com/DannyBen/victor/master/examples/10_pacman.svg)](https://github.com/DannyBen/victor/blob/master/examples/10_pacman.rb)
|
75
76
|
|
76
77
|
|
77
78
|
See the [examples] folder for several ruby scripts and their SVG output.
|
@@ -148,7 +149,7 @@ space delimited string:
|
|
148
149
|
|
149
150
|
```ruby
|
150
151
|
svg.path d: ['M', 150, 0, 'L', 75, 200, 'L', 225, 200, 'Z']
|
151
|
-
# => <path d="M
|
152
|
+
# => <path d="M 150 0 L 75 200 L 225 200 Z"/>
|
152
153
|
```
|
153
154
|
|
154
155
|
For SVG elements that have an inner content - such as text - simply pass it as
|
@@ -185,7 +186,7 @@ svg.text "Victor", x: 40, y: 50, font_family: 'arial', font_weight: 'bold', font
|
|
185
186
|
|
186
187
|
### Composite SVG
|
187
188
|
|
188
|
-
Victor also supports the
|
189
|
+
Victor also supports the ability to combine several smaller SVG objects into
|
189
190
|
one using the `<<` operator or the `#append` method.
|
190
191
|
|
191
192
|
This operator expects to receive any object that responds to `#to_s` (can be another `SVG` object).
|
@@ -215,7 +216,7 @@ svg.save 'framed-troll'
|
|
215
216
|
|
216
217
|
Output:
|
217
218
|
|
218
|
-
[![troll](https://cdn.rawgit.com/DannyBen/victor/master/examples/
|
219
|
+
[![troll](https://cdn.rawgit.com/DannyBen/victor/master/examples/14_composite_svg.svg)](https://cdn.rawgit.com/DannyBen/victor/master/examples/14_composite_svg.svg)
|
219
220
|
|
220
221
|
These two calls are identical:
|
221
222
|
|
@@ -244,8 +245,8 @@ end
|
|
244
245
|
Another approach to a more modular SVG composition, would be to subclass
|
245
246
|
`Victor::SVG`.
|
246
247
|
|
247
|
-
See the [composite svg example](https://github.com/DannyBen/victor/tree/master/examples#
|
248
|
-
or the [subclassing example](https://github.com/DannyBen/victor/tree/master/examples#
|
248
|
+
See the [composite svg example](https://github.com/DannyBen/victor/tree/master/examples#14-composite-svg)
|
249
|
+
or the [subclassing example](https://github.com/DannyBen/victor/tree/master/examples#15-subclassing)
|
249
250
|
for more details.
|
250
251
|
|
251
252
|
|
@@ -284,11 +285,40 @@ svg = Victor::SVG.new template: 'path/to/template.svg'
|
|
284
285
|
See the [templates] folder for an understanding of how templates are
|
285
286
|
structured.
|
286
287
|
|
288
|
+
Templates can also be provided when rendering or saving the output:
|
289
|
+
|
290
|
+
```ruby
|
291
|
+
svg.save 'filename', template: :minimal
|
292
|
+
svg.render template: :minimal
|
293
|
+
```
|
294
|
+
|
287
295
|
|
288
296
|
### CSS
|
289
297
|
|
290
|
-
|
291
|
-
|
298
|
+
CSS gets a special treatment in `Victor::SVG`, with these objectives in mind:
|
299
|
+
|
300
|
+
- Hide implementation details (such as the need for a `CDATA` marker)
|
301
|
+
- Provide a DSL-like syntax for CSS rules
|
302
|
+
|
303
|
+
The `Victor::SVG` objects has a `css` property, which can contain either a
|
304
|
+
Hash or a String:
|
305
|
+
|
306
|
+
```ruby
|
307
|
+
svg = Victor::SVG.new
|
308
|
+
|
309
|
+
svg.css = css_hash_or_string
|
310
|
+
# or without the equal sign:
|
311
|
+
svg.css css_hash_or_string
|
312
|
+
|
313
|
+
svg.build do
|
314
|
+
# ...
|
315
|
+
end
|
316
|
+
```
|
317
|
+
|
318
|
+
This flexibility allows you to apply CSS in multiple ways. Below are some
|
319
|
+
examples.
|
320
|
+
|
321
|
+
#### Assigning CSS rules using the hash syntax
|
292
322
|
|
293
323
|
```ruby
|
294
324
|
svg = Victor::SVG.new
|
@@ -304,7 +334,7 @@ svg.build do
|
|
304
334
|
end
|
305
335
|
```
|
306
336
|
|
307
|
-
|
337
|
+
#### Assigning a full hash to the CSS property
|
308
338
|
|
309
339
|
```ruby
|
310
340
|
svg.css = {
|
@@ -325,6 +355,13 @@ svg.css = {
|
|
325
355
|
Underscore characters will be converted to dashes (`stroke_width` becomes
|
326
356
|
`stroke-width`).
|
327
357
|
|
358
|
+
#### Importing CSS from an external file
|
359
|
+
|
360
|
+
```ruby
|
361
|
+
svg.css = File.read 'styles.css'
|
362
|
+
```
|
363
|
+
|
364
|
+
#### CSS `@import` directives
|
328
365
|
|
329
366
|
If you need to add CSS statements , like `@import`, use the following syntax:
|
330
367
|
|
@@ -335,11 +372,13 @@ css['@import'] = [
|
|
335
372
|
]
|
336
373
|
```
|
337
374
|
|
338
|
-
|
339
|
-
the
|
340
|
-
will result in two `@import url(...)` rows.
|
375
|
+
This is achieved thanks to the fact that when Victor encounters an array
|
376
|
+
in the CSS hash, it will prefix each of the array elements with the hash
|
377
|
+
key, so the above will result in two `@import url(...)` rows.
|
341
378
|
|
342
|
-
See the [
|
379
|
+
See the [css example](https://github.com/DannyBen/victor/tree/master/examples#08-css),
|
380
|
+
[css string example](https://github.com/DannyBen/victor/tree/master/examples#09-css-string),
|
381
|
+
or the [custom fonts example](https://github.com/DannyBen/victor/tree/master/examples#13-custom-fonts).
|
343
382
|
|
344
383
|
|
345
384
|
### Tagless Elements
|
@@ -368,7 +407,7 @@ svg.build do
|
|
368
407
|
end
|
369
408
|
```
|
370
409
|
|
371
|
-
See the [
|
410
|
+
See the [tagless elements example](https://github.com/DannyBen/victor/tree/master/examples#17-tagless-elements).
|
372
411
|
|
373
412
|
|
374
413
|
### XML Encoding
|
@@ -391,7 +430,25 @@ end
|
|
391
430
|
# <text>Ben & Jerry's</text>
|
392
431
|
```
|
393
432
|
|
394
|
-
See the [xml encoding example](https://github.com/DannyBen/victor/tree/master/examples#
|
433
|
+
See the [xml encoding example](https://github.com/DannyBen/victor/tree/master/examples#18-xml-encoding).
|
434
|
+
|
435
|
+
|
436
|
+
### XML Newlines
|
437
|
+
|
438
|
+
By default, the generated SVGs will have a newline glue between the elements.
|
439
|
+
You can change this (for example, to an empty string) if the default newlines
|
440
|
+
are not appropriate for your use case.
|
441
|
+
|
442
|
+
```ruby
|
443
|
+
svg = Victor::SVG.new glue: ''
|
444
|
+
```
|
445
|
+
|
446
|
+
The glue can also be provided when rendering or saving the output:
|
447
|
+
|
448
|
+
```ruby
|
449
|
+
svg.save 'filename', glue: ''
|
450
|
+
svg.render glue: ''
|
451
|
+
```
|
395
452
|
|
396
453
|
### DSL Syntax
|
397
454
|
|
@@ -417,7 +474,7 @@ puts render
|
|
417
474
|
save 'output.svg'
|
418
475
|
```
|
419
476
|
|
420
|
-
See the [dsl example](https://github.com/DannyBen/victor/tree/master/examples#
|
477
|
+
See the [dsl example](https://github.com/DannyBen/victor/tree/master/examples#19-dsl).
|
421
478
|
|
422
479
|
## Using with Rails
|
423
480
|
|
@@ -435,6 +492,13 @@ Victor Ruby scripts.
|
|
435
492
|
|
436
493
|
A Victor playground that works in the browser.
|
437
494
|
|
495
|
+
### [Minichart][minichart]
|
496
|
+
|
497
|
+
A Ruby gem that uses Victor to generate SVG charts
|
498
|
+
|
499
|
+
[![Minichart](assets/minichart.svg)][minichart]
|
500
|
+
|
501
|
+
|
438
502
|
### [Icodi][icodi]
|
439
503
|
|
440
504
|
A Ruby gem that uses Victor to generate consistent random icon
|
@@ -453,6 +517,7 @@ to contribute, feel free to [open an issue][issues].
|
|
453
517
|
[examples]: https://github.com/DannyBen/victor/tree/master/examples#examples
|
454
518
|
[templates]: https://github.com/DannyBen/victor/tree/master/lib/victor/templates
|
455
519
|
[icodi]: https://github.com/DannyBen/icodi
|
520
|
+
[minichart]: https://github.com/DannyBen/minichart
|
456
521
|
[victor-opal]: https://kuboon.github.io/victor-opal/
|
457
522
|
[victor-cli]: https://github.com/DannyBen/victor-cli
|
458
523
|
[issues]: https://github.com/DannyBen/victor/issues
|
data/lib/victor/dsl.rb
CHANGED
data/lib/victor/svg_base.rb
CHANGED
@@ -1,13 +1,12 @@
|
|
1
1
|
module Victor
|
2
2
|
|
3
3
|
class SVGBase
|
4
|
-
attr_accessor :template, :
|
4
|
+
attr_accessor :template, :glue
|
5
5
|
attr_reader :content, :svg_attributes
|
6
6
|
|
7
7
|
def initialize(attributes = nil, &block)
|
8
8
|
setup attributes
|
9
9
|
@content = []
|
10
|
-
@css = {}
|
11
10
|
build &block if block_given?
|
12
11
|
end
|
13
12
|
|
@@ -21,11 +20,11 @@ module Victor
|
|
21
20
|
attributes[:width] ||= "100%"
|
22
21
|
attributes[:height] ||= "100%"
|
23
22
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
23
|
+
@template = attributes[:template] || @template || :default
|
24
|
+
@glue = attributes[:glue] || @glue || "\n"
|
25
|
+
|
26
|
+
attributes.delete :template
|
27
|
+
attributes.delete :glue
|
29
28
|
|
30
29
|
@svg_attributes = Attributes.new attributes
|
31
30
|
end
|
@@ -63,24 +62,36 @@ module Victor
|
|
63
62
|
end
|
64
63
|
end
|
65
64
|
|
66
|
-
def
|
67
|
-
|
65
|
+
def css(defs = nil)
|
66
|
+
@css ||= {}
|
67
|
+
@css = defs if defs
|
68
|
+
@css
|
69
|
+
end
|
70
|
+
|
71
|
+
def css=(defs)
|
72
|
+
@css = defs
|
73
|
+
end
|
74
|
+
|
75
|
+
def render(template: nil, glue: nil)
|
76
|
+
@template = template if template
|
77
|
+
@glue = glue if glue
|
78
|
+
css_handler = CSS.new css
|
68
79
|
|
69
80
|
svg_template % {
|
70
|
-
css:
|
71
|
-
style:
|
81
|
+
css: css_handler,
|
82
|
+
style: css_handler.render,
|
72
83
|
attributes: svg_attributes,
|
73
|
-
content:
|
84
|
+
content: to_s
|
74
85
|
}
|
75
86
|
end
|
76
87
|
|
77
88
|
def to_s
|
78
|
-
content.join
|
89
|
+
content.join glue
|
79
90
|
end
|
80
91
|
|
81
|
-
def save(filename)
|
92
|
+
def save(filename, template: nil, glue: nil)
|
82
93
|
filename = "#{filename}.svg" unless filename =~ /\..{2,4}$/
|
83
|
-
File.write filename, render
|
94
|
+
File.write filename, render(template: template, glue: glue)
|
84
95
|
end
|
85
96
|
|
86
97
|
protected
|
data/lib/victor/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: victor
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Danny Ben Shitrit
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-07-01 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Build SVG images with ease
|
14
14
|
email: db@dannyben.com
|
@@ -40,14 +40,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
40
40
|
requirements:
|
41
41
|
- - ">="
|
42
42
|
- !ruby/object:Gem::Version
|
43
|
-
version: 2.
|
43
|
+
version: 2.6.0
|
44
44
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
45
45
|
requirements:
|
46
46
|
- - ">="
|
47
47
|
- !ruby/object:Gem::Version
|
48
48
|
version: '0'
|
49
49
|
requirements: []
|
50
|
-
rubygems_version: 3.
|
50
|
+
rubygems_version: 3.3.14
|
51
51
|
signing_key:
|
52
52
|
specification_version: 4
|
53
53
|
summary: SVG Builder
|