victor 0.3.4 → 0.4.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4f308143350a9236bbdf1c046de94a94728ecd90051004482e78cf9734484ef6
4
- data.tar.gz: 36b35af10ea11a1bc39063384c6a23e247c257d0364edb24b5914cfd73029a88
3
+ metadata.gz: 6cfb9ab7b01c8fe3986d973cf09708e47b05ec61d726f4db2e5c94f5b7697d8b
4
+ data.tar.gz: 55936a274c2b1f662ad6dfb4aacb8396499fe6f5c7366d33fde7858e082d02d1
5
5
  SHA512:
6
- metadata.gz: 353fd957d007ad7dd020f84a8866634a799e39ae94ba2ea65edf4eb09b6e8a354aa09961492a6cac0a530bcee5e904738df13bffc68c3b00f983348844adc074
7
- data.tar.gz: 3993f70f671cb4097e83279bc4b5b68d510aa74a40ae320960d56b4a6b1aa537270893975c473cbf66a263496cea39398cd742b217af6b327b595edef84ea36b
6
+ metadata.gz: 59e8f7b5c39d6c156b322eecd4719ecb3e036e51484ba915c4642400c3ec3547b79f057a4717188ff67e7b8aee9f999f1d493552e88cbb344ff2fe9e521ca087
7
+ data.tar.gz: 560fe1f61b66cce12912073349b33b1ad73c656ad47780be3c713deb735d3d71a1d2bdb896c419447a7a84ad73360bfc080b56bb69113c2874641826c8519fa3
data/README.md CHANGED
@@ -15,26 +15,6 @@ directly to SVG elements.
15
15
 
16
16
  ---
17
17
 
18
- ## Table of Contents
19
-
20
- * [Install](#install)
21
- * [Examples](#examples)
22
- * [Usage](#usage)
23
- * [Features](#features)
24
- * [Composite SVG](#composite-svg)
25
- * [Saving the Output](#saving-the-output)
26
- * [SVG Templates](#svg-templates)
27
- * [CSS](#css)
28
- * [Tagless Elements](#tagless-elements)
29
- * [XML Encoding](#xml-encoding)
30
- * [XML Newlines](#xml-newlines)
31
- * [DSL Syntax](#dsl-syntax)
32
- * [Using with Rails](#using-with-rails)
33
- * [Related Projects](#related-projects)
34
- * [Contributing / Support](#contributing--support)
35
-
36
- ---
37
-
38
18
  ## Install
39
19
 
40
20
  ```
@@ -267,18 +247,13 @@ svg.save 'filename'
267
247
 
268
248
  ### SVG Templates
269
249
 
270
- The `:default` SVG template is designed to be a full XML document (i.e.,
271
- a standalone SVG image). If you wish to use the output as an SVG element
272
- inside HTML, you can change the SVG template:
273
-
274
- ```ruby
275
- svg = Victor::SVG.new template: :html
276
- # accepts :html, :minimal, :default or a filename
277
- ```
250
+ Victor renders its content using the [`:default` template][default-template].
278
251
 
279
- You can also point it to any other template file:
252
+ If you wish to use another template, you can either use one of the built-in
253
+ templates (`:default` or `:minimal`), or provide your own:
280
254
 
281
255
  ```ruby
256
+ svg = Victor::SVG.new template: :minimal
282
257
  svg = Victor::SVG.new template: 'path/to/template.svg'
283
258
  ```
284
259
 
@@ -295,12 +270,10 @@ svg.render template: :minimal
295
270
 
296
271
  ### CSS
297
272
 
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
273
+ CSS gets a special treatment in `Victor::SVG`, in order to provide a DSL-like
274
+ syntax for CSS rules.
302
275
 
303
- The `Victor::SVG` objects has a `css` property, which can contain either a
276
+ The `Victor::SVG` object has a `css` property, which can contain either a
304
277
  Hash or a String:
305
278
 
306
279
  ```ruby
@@ -476,11 +449,6 @@ save 'output.svg'
476
449
 
477
450
  See the [dsl example](https://github.com/DannyBen/victor/tree/master/examples#19-dsl).
478
451
 
479
- ## Using with Rails
480
-
481
- See the [example_rails](example_rails) folder.
482
-
483
-
484
452
  ## Related Projects
485
453
 
486
454
  ### [Victor CLI][victor-cli]
@@ -516,6 +484,7 @@ to contribute, feel free to [open an issue][issues].
516
484
 
517
485
  [examples]: https://github.com/DannyBen/victor/tree/master/examples#examples
518
486
  [templates]: https://github.com/DannyBen/victor/tree/master/lib/victor/templates
487
+ [default-template]: https://github.com/DannyBen/victor/blob/master/lib/victor/templates/default.svg?short_path=c28efa4
519
488
  [icodi]: https://github.com/DannyBen/icodi
520
489
  [minichart]: https://github.com/DannyBen/minichart
521
490
  [victor-opal]: https://kuboon.github.io/victor-opal/
@@ -1,11 +1,10 @@
1
1
  module Victor
2
-
3
2
  # Handles conversion from a Hash of attributes, to an XML string or
4
3
  # a CSS string.
5
4
  class Attributes
6
5
  attr_reader :attributes
7
6
 
8
- def initialize(attributes={})
7
+ def initialize(attributes = {})
9
8
  @attributes = attributes
10
9
  end
11
10
 
@@ -13,10 +12,11 @@ module Victor
13
12
  mapped = attributes.map do |key, value|
14
13
  key = key.to_s.tr '_', '-'
15
14
 
16
- if value.is_a? Hash
15
+ case value
16
+ when Hash
17
17
  style = Attributes.new(value).to_style
18
18
  "#{key}=\"#{style}\""
19
- elsif value.is_a? Array
19
+ when Array
20
20
  "#{key}=\"#{value.join ' '}\""
21
21
  else
22
22
  "#{key}=#{value.to_s.encode(xml: :attr)}"
@@ -42,7 +42,5 @@ module Victor
42
42
  def []=(key, value)
43
43
  attributes[key] = value
44
44
  end
45
-
46
45
  end
47
-
48
- end
46
+ end
data/lib/victor/css.rb CHANGED
@@ -1,5 +1,4 @@
1
1
  module Victor
2
-
3
2
  class CSS
4
3
  attr_reader :attributes
5
4
 
@@ -13,12 +12,13 @@ module Victor
13
12
 
14
13
  def render
15
14
  return '' if attributes.empty?
16
- %Q{<style type="text/css">\n<![CDATA[\n#{self}\n]]>\n</style>\n}
15
+
16
+ %[<style>\n#{self}\n</style>\n]
17
17
  end
18
18
 
19
19
  protected
20
20
 
21
- def convert_hash(hash, indent=2)
21
+ def convert_hash(hash, indent = 2)
22
22
  return hash unless hash.is_a? Hash
23
23
 
24
24
  result = []
@@ -33,13 +33,14 @@ module Victor
33
33
  def css_block(key, value, indent)
34
34
  result = []
35
35
 
36
- my_indent = " " * indent
36
+ my_indent = ' ' * indent
37
37
 
38
- if value.is_a? Hash
38
+ case value
39
+ when Hash
39
40
  result.push "#{my_indent}#{key} {"
40
- result.push convert_hash(value, indent+2)
41
+ result.push convert_hash(value, indent + 2)
41
42
  result.push "#{my_indent}}"
42
- elsif value.is_a? Array
43
+ when Array
43
44
  value.each do |row|
44
45
  result.push "#{my_indent}#{key} #{row};"
45
46
  end
@@ -50,5 +51,4 @@ module Victor
50
51
  result
51
52
  end
52
53
  end
53
-
54
- end
54
+ end
@@ -0,0 +1,39 @@
1
+ module Victor
2
+ module Marshaling
3
+ # YAML serialization methods
4
+ def encode_with(coder)
5
+ coder['template'] = @template
6
+ coder['glue'] = @glue
7
+ coder['svg_attributes'] = @svg_attributes
8
+ coder['css'] = @css
9
+ coder['content'] = @content
10
+ end
11
+
12
+ def init_with(coder)
13
+ @template = coder['template']
14
+ @glue = coder['glue']
15
+ @svg_attributes = coder['svg_attributes']
16
+ @css = coder['css']
17
+ @content = coder['content']
18
+ end
19
+
20
+ # Marshal serialization methods
21
+ def marshal_dump
22
+ {
23
+ template: @template,
24
+ glue: @glue,
25
+ svg_attributes: @svg_attributes,
26
+ css: @css,
27
+ content: @content,
28
+ }
29
+ end
30
+
31
+ def marshal_load(data)
32
+ @template = data[:template]
33
+ @glue = data[:glue]
34
+ @svg_attributes = data[:svg_attributes]
35
+ @css = data[:css]
36
+ @content = data[:content]
37
+ end
38
+ end
39
+ end
data/lib/victor/svg.rb CHANGED
@@ -1,7 +1,11 @@
1
1
  module Victor
2
2
  class SVG < SVGBase
3
- def method_missing(method_sym, *arguments, &block)
4
- element method_sym, *arguments, &block
3
+ def method_missing(method_sym, ...)
4
+ element(method_sym, ...)
5
+ end
6
+
7
+ def respond_to_missing?(*)
8
+ true
5
9
  end
6
10
  end
7
- end
11
+ end
@@ -1,13 +1,15 @@
1
1
  module Victor
2
-
3
2
  class SVGBase
3
+ include Marshaling
4
+
4
5
  attr_accessor :template, :glue
5
6
  attr_reader :content, :svg_attributes
7
+ attr_writer :css
6
8
 
7
9
  def initialize(attributes = nil, &block)
8
10
  setup attributes
9
11
  @content = []
10
- build &block if block_given?
12
+ build(&block) if block
11
13
  end
12
14
 
13
15
  def <<(additional_content)
@@ -17,8 +19,8 @@ module Victor
17
19
 
18
20
  def setup(attributes = nil)
19
21
  attributes ||= {}
20
- attributes[:width] ||= "100%"
21
- attributes[:height] ||= "100%"
22
+ attributes[:width] ||= '100%'
23
+ attributes[:height] ||= '100%'
22
24
 
23
25
  @template = attributes[:template] || @template || :default
24
26
  @glue = attributes[:glue] || @glue || "\n"
@@ -30,10 +32,10 @@ module Victor
30
32
  end
31
33
 
32
34
  def build(&block)
33
- self.instance_eval(&block)
35
+ instance_eval(&block)
34
36
  end
35
37
 
36
- def element(name, value=nil, attributes={}, &_block)
38
+ def element(name, value = nil, attributes = {})
37
39
  if value.is_a? Hash
38
40
  attributes = value
39
41
  value = nil
@@ -50,14 +52,14 @@ module Victor
50
52
  empty_tag = name.to_s == '_'
51
53
 
52
54
  if block_given? || value
53
- content.push "<#{name} #{attributes}".strip + ">" unless empty_tag
55
+ content.push "#{"<#{name} #{attributes}".strip}>" unless empty_tag
54
56
  if value
55
57
  content.push(escape ? value.to_s.encode(xml: :text) : value)
56
58
  else
57
59
  yield
58
60
  end
59
61
  content.push "</#{name}>" unless empty_tag
60
- else
62
+ else
61
63
  content.push "<#{name} #{attributes}/>"
62
64
  end
63
65
  end
@@ -68,20 +70,16 @@ module Victor
68
70
  @css
69
71
  end
70
72
 
71
- def css=(defs)
72
- @css = defs
73
- end
74
-
75
73
  def render(template: nil, glue: nil)
76
74
  @template = template if template
77
75
  @glue = glue if glue
78
76
  css_handler = CSS.new css
79
77
 
80
78
  svg_template % {
81
- css: css_handler,
82
- style: css_handler.render,
79
+ css: css_handler,
80
+ style: css_handler.render,
83
81
  attributes: svg_attributes,
84
- content: to_s
82
+ content: to_s,
85
83
  }
86
84
  end
87
85
 
@@ -90,7 +88,7 @@ module Victor
90
88
  end
91
89
 
92
90
  def save(filename, template: nil, glue: nil)
93
- filename = "#{filename}.svg" unless filename =~ /\..{2,4}$/
91
+ filename = "#{filename}.svg" unless /\..{2,4}$/.match?(filename)
94
92
  File.write filename, render(template: template, glue: glue)
95
93
  end
96
94
 
@@ -108,5 +106,4 @@ module Victor
108
106
  end
109
107
  end
110
108
  end
111
-
112
- end
109
+ end
@@ -1,6 +1,3 @@
1
- <?xml version="1.0" standalone="no"?>
2
- <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
3
-
4
1
  <svg %{attributes}
5
2
  xmlns="http://www.w3.org/2000/svg"
6
3
  xmlns:xlink="http://www.w3.org/1999/xlink">
@@ -8,4 +5,4 @@
8
5
  %{style}
9
6
  %{content}
10
7
 
11
- </svg>
8
+ </svg>
@@ -1,4 +1,4 @@
1
1
  <svg %{attributes}>
2
2
  %{style}
3
3
  %{content}
4
- </svg>
4
+ </svg>
@@ -1,3 +1,3 @@
1
1
  module Victor
2
- VERSION = "0.3.4"
3
- end
2
+ VERSION = '0.4.0'
3
+ end
data/lib/victor.rb CHANGED
@@ -1,8 +1,7 @@
1
1
  require 'victor/version'
2
+ require 'victor/marshaling'
2
3
  require 'victor/svg_base'
3
4
  require 'victor/svg'
4
5
  require 'victor/attributes'
5
6
  require 'victor/css'
6
7
  require 'victor/dsl'
7
-
8
- require 'byebug' if ENV['BYEBUG']
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
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Danny Ben Shitrit
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-07-01 00:00:00.000000000 Z
11
+ date: 2024-08-25 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Build SVG images with ease
14
14
  email: db@dannyben.com
@@ -21,18 +21,22 @@ files:
21
21
  - lib/victor/attributes.rb
22
22
  - lib/victor/css.rb
23
23
  - lib/victor/dsl.rb
24
+ - lib/victor/marshaling.rb
24
25
  - lib/victor/script.rb
25
26
  - lib/victor/svg.rb
26
27
  - lib/victor/svg_base.rb
27
28
  - lib/victor/templates/default.svg
28
- - lib/victor/templates/html.svg
29
29
  - lib/victor/templates/minimal.svg
30
30
  - lib/victor/version.rb
31
31
  homepage: https://github.com/DannyBen/victor
32
32
  licenses:
33
33
  - MIT
34
- metadata: {}
35
- post_install_message:
34
+ metadata:
35
+ bug_tracker_uri: https://github.com/DannyBen/victor/issues
36
+ changelog_uri: https://github.com/DannyBen/victor/blob/master/CHANGELOG.md
37
+ source_code_uri: https://github.com/DannyBen/victor
38
+ rubygems_mfa_required: 'true'
39
+ post_install_message:
36
40
  rdoc_options: []
37
41
  require_paths:
38
42
  - lib
@@ -40,15 +44,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
40
44
  requirements:
41
45
  - - ">="
42
46
  - !ruby/object:Gem::Version
43
- version: 2.6.0
47
+ version: 3.0.0
44
48
  required_rubygems_version: !ruby/object:Gem::Requirement
45
49
  requirements:
46
50
  - - ">="
47
51
  - !ruby/object:Gem::Version
48
52
  version: '0'
49
53
  requirements: []
50
- rubygems_version: 3.3.14
51
- signing_key:
54
+ rubygems_version: 3.5.17
55
+ signing_key:
52
56
  specification_version: 4
53
57
  summary: SVG Builder
54
58
  test_files: []
@@ -1,8 +0,0 @@
1
- <svg %{attributes}
2
- xmlns="http://www.w3.org/2000/svg"
3
- xmlns:xlink="http://www.w3.org/1999/xlink">
4
-
5
- %{style}
6
- %{content}
7
-
8
- </svg>