sevgi 0.0.0 → 0.0.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1b971f6463976ab416c5c4f28eefdb1ee3e328bb55f5f45bf657cbd98d6a16ca
4
- data.tar.gz: ad9ae5335d726e61f46a56c1a197a2e63099c99379353f564aceede7fb8db4d5
3
+ metadata.gz: d10f877d0767cd2b04ac1165e6485601e85ba444486c0f9a304cf46bdcd9291b
4
+ data.tar.gz: 0bcbdaaf6df270a83a184de931bb70958447b0f446339fcf51daa74c2b76cc59
5
5
  SHA512:
6
- metadata.gz: f109c41b30c16a773a90c01559fa0468c7802b98929bb82c1d1b93a290c32c8a499af2d50a8f5ee54da3676748f70134e0b365384b43ab4ca7962c77371a65a8
7
- data.tar.gz: '09cac74bd7e21e347d6a89453ada53a36f1144466507e59cde71947b07a514b2be5a0e0c81fb5e4162b8f0e68dfde612d653c3497903759bd9c9c29afc881343'
6
+ metadata.gz: d08ecea5e16f48d8f950cd3245a5fa497913b68f0e6d9fa1303a8c7b3515a4d24af55c4bef2fb8c4b23e2d0d0d0ec8fd3ea6fcef78b899c0e857802eb64b1be9
7
+ data.tar.gz: 181d34db462e84b100194e33542243ee090e15933a5a37b14efdcf8c164b2d751b4231736826f3c51a7e37111902c82b97b67338cfcf57faada244f8108cf1e7
data/README.md CHANGED
@@ -1,15 +1,35 @@
1
1
  [![test status](https://github.com/roktas/sevgi/workflows/Test/badge.svg)](https://github.com/roktas/sevgi/actions?query=workflow%3ATest)
2
- [![code quality](https://codebeat.co/badges/f2de3389-dd66-4d7a-b7fb-452330d62176)](https://codebeat.co/projects/github-com-roktas-sevgi-dev)
2
+ [![code quality](https://codebeat.co/badges/b7c41452-51ba-417d-9cea-b29782993147)](https://codebeat.co/projects/github-com-roktas-sevgi-dev)
3
3
 
4
- # Sevgi
4
+ # SEVGI
5
+
6
+ **SEVGI** is a toolkit for creating SVG content programmatically with Ruby as demonstrated below[^1]. You can use it to
7
+ create pixel-perfect graphics without using a vector graphics editor in certain scenarios. Thanks to a mixin based
8
+ design, you can easily add custom features and use a rich set of methods, especially for tiling, hatching and various
9
+ geometric operations.
5
10
 
6
11
  <p align="center"><img src="srv/static/assets/light/logo.svg#gh-light-mode-only"/></p>
7
12
  <p align="center"><img src="srv/static/assets/dark/logo.svg#gh-dark-mode-only"/></p>
8
13
 
9
14
  <p align="center"><img src="srv/static/assets/light/pacman-animation.png"/></p>
10
15
 
11
- Inspired by [Victor](https://github.com/DannyBen/victor), which might be a better choice for those seeking something
12
- simpler. Please note that a fair amount of the examples used for demonstration purposes come from this project (thanks
13
- to the author).
14
-
15
16
  ### Roadmap
17
+
18
+ **The project is currently in pre-alpha stage. So many things might not work and many things can change.**
19
+
20
+ Alpha stage
21
+
22
+ - [ ] Stabilize API.
23
+ - [ ] Complete unit tests for all critical code paths.
24
+ - [ ] Populate examples while adding integration tests.
25
+ - [ ] Write entry-level user documentation.
26
+
27
+ Beta stage
28
+
29
+ - [ ] Complete Geometry library.
30
+ - [ ] Complete user documentation.
31
+ - [ ] Start documenting API.
32
+
33
+ [^1]: Inspired by [Victor](https://github.com/DannyBen/victor), which might be a better choice for those seeking
34
+ something simpler. Please note that a fair amount of the examples used for demonstration purposes come from this
35
+ project (thanks to the author).
@@ -3,15 +3,15 @@
3
3
  module Sevgi
4
4
  module Function
5
5
  module External
6
- EXTENSIONS = ["sevgi", "rb"].freeze
7
- DIRECTORIES = ["lib", "library"].freeze
6
+ EXTENSIONS = [ "sevgi", "rb" ].freeze
7
+ DIRECTORIES = [ "lib", "library" ].freeze
8
8
 
9
9
  def Lib(name)
10
10
  start = ::File.dirname(caller_locations(1..1).first.path)
11
11
 
12
12
  paths = F.variations(name, DIRECTORIES, EXTENSIONS)
13
13
 
14
- raise Error, "No library found matching: #{name}" unless (location = Locate.(paths, start))
14
+ raise(Error, "No library found matching: #{name}") unless (location = Locate.(paths, start))
15
15
 
16
16
  Kernel.load(location.file)
17
17
  end
@@ -17,7 +17,7 @@ module Sevgi
17
17
  top_left: position,
18
18
  top_right: position.translate(dx: rect.width),
19
19
  bottom_right: position.translate(dx: rect.width, dy: rect.height),
20
- bottom_left: position.translate(dy: rect.height),
20
+ bottom_left: position.translate(dy: rect.height)
21
21
  )
22
22
  end
23
23
  end
@@ -33,7 +33,7 @@ module Sevgi
33
33
  top: Segment[corner.top_left, corner.top_right],
34
34
  right: Segment[corner.top_right, corner.bottom_right],
35
35
  bottom: Segment[corner.bottom_left, corner.bottom_right],
36
- left: Segment[corner.top_left, corner.bottom_left],
36
+ left: Segment[corner.top_left, corner.bottom_left]
37
37
  )
38
38
  end
39
39
  end
@@ -45,7 +45,7 @@ module Sevgi
45
45
  end
46
46
 
47
47
  def infinite?
48
- [position, ending].any(&:infinite?)
48
+ [ position, ending ].any(&:infinite?)
49
49
  end
50
50
 
51
51
  def length
@@ -82,7 +82,7 @@ module Sevgi
82
82
  end
83
83
 
84
84
  def forward(p, q = nil)
85
- new(position: (points = [p, q || p]).sort!.shift, ending: points.shift)
85
+ new(position: (points = [ p, q || p ]).sort!.shift, ending: points.shift)
86
86
  end
87
87
 
88
88
  def directed(position: Point.origin, length:, direction:)
@@ -18,26 +18,20 @@ module Sevgi
18
18
  end
19
19
 
20
20
  def eql?(other)
21
- self.class == other.class && [slope, intercept] == [other.slope, other.intercept]
21
+ self.class == other.class && [ slope, intercept ] == [ other.slope, other.intercept ]
22
22
  end
23
23
 
24
24
  alias_method :==, :eql?
25
25
 
26
26
  def hash
27
- [self.class, slope, intercept].hash
27
+ [ self.class, slope, intercept ].hash
28
28
  end
29
29
 
30
30
  def intersection(other)
31
31
  case other
32
- when Diagonal
33
- x = (other.intercept - intercept) / (slope - other.slope)
34
- y = y(x)
35
- when Horizontal
36
- y = other.y
37
- x = x(y)
38
- when Vertical
39
- x = other.x
40
- y = y(x)
32
+ when Diagonal then y = y(x = (other.intercept - intercept) / (slope - other.slope))
33
+ when Horizontal then x = x(y = other.y)
34
+ when Vertical then y = y(x = other.x)
41
35
  end
42
36
 
43
37
  Point[x, y]
@@ -13,7 +13,7 @@ module Sevgi
13
13
 
14
14
  [
15
15
  *unisweep(element, line.shift(-step), -step, limit:).reverse,
16
- *unisweep(element, line, step, limit:),
16
+ *unisweep(element, line, step, limit:)
17
17
  ].tap do |segments|
18
18
  yield(segments) if block
19
19
  end
@@ -26,11 +26,11 @@ module Sevgi
26
26
  end
27
27
 
28
28
  def infinite?
29
- [x, y].any?(&:infinite?)
29
+ [ x, y ].any?(&:infinite?)
30
30
  end
31
31
 
32
32
  def nan?
33
- [x, y].any?(&:nan?)
33
+ [ x, y ].any?(&:nan?)
34
34
  end
35
35
 
36
36
  def to_s
@@ -42,7 +42,7 @@ module Sevgi
42
42
  end
43
43
 
44
44
  def unordered_between?(p, q)
45
- nan? ? false : between?([p, q].min, [p, q].max)
45
+ nan? ? false : between?([ p, q ].min, [ p, q ].max)
46
46
  end
47
47
 
48
48
  def <=>(other)
@@ -33,7 +33,7 @@ module Sevgi
33
33
 
34
34
  def import(attributes)
35
35
  hash = attributes.compact.to_a.map do |key, value|
36
- [key.to_sym, value.is_a?(::Hash) ? value.transform_keys!(&:to_sym) : value]
36
+ [ key.to_sym, value.is_a?(::Hash) ? value.transform_keys!(&:to_sym) : value ]
37
37
  end.to_h
38
38
 
39
39
  @store.merge!(hash)
@@ -91,10 +91,10 @@ module Sevgi
91
91
  private
92
92
 
93
93
  UPDATER = {
94
- ::String => proc { |old_value, new_value| [old_value, new_value].reject(&:empty?).join(" ") },
95
- ::Symbol => proc { |old_value, new_value| [old_value, new_value].reject(&:empty?).join(" ").to_sym },
96
- ::Array => proc { |old_value, new_value| [old_value, new_value] },
97
- ::Hash => proc { |old_value, new_value| merge(old_value, new_value.transform_keys(&:to_sym)) },
94
+ ::String => proc { |old_value, new_value| [ old_value, new_value ].reject(&:empty?).join(" ") },
95
+ ::Symbol => proc { |old_value, new_value| [ old_value, new_value ].reject(&:empty?).join(" ").to_sym },
96
+ ::Array => proc { |old_value, new_value| [ old_value, new_value ] },
97
+ ::Hash => proc { |old_value, new_value| merge(old_value, new_value.transform_keys(&:to_sym)) }
98
98
  }.freeze
99
99
 
100
100
  def update(id, new_value)
@@ -105,16 +105,16 @@ module Sevgi
105
105
  ArgumentError.("Incompatible values: #{new_value} vs #{old_value}") unless new_value.is_a?(old_value.class)
106
106
  ArgumentError.("Unsupported value for update: #{new_value}") unless UPDATER.key?(new_value.class)
107
107
 
108
- [old_value, new_value]
108
+ [ old_value, new_value ]
109
109
  end
110
110
 
111
111
  private_constant :UPDATER
112
112
 
113
113
  def to_xml(id, value)
114
114
  case value
115
- when ::Hash then %[#{id}="#{value.map { "#{_1}:#{_2}" }.join("; ")}"]
116
- when ::Array then %[#{id}="#{value.join(" ")}"]
117
- else %[#{id}=#{value.to_s.encode(xml: :attr)}]
115
+ when ::Hash then %(#{id}="#{value.map { "#{_1}:#{_2}" }.join("; ")}")
116
+ when ::Array then %(#{id}="#{value.join(" ")}")
117
+ else %(#{id}=#{value.to_s.encode(xml: :attr)})
118
118
  end
119
119
  end
120
120
  end
@@ -7,7 +7,7 @@ module Sevgi
7
7
 
8
8
  def initialize(content) = @content = content
9
9
 
10
- def render(renderer, depth) = raise NotImplementedError
10
+ def render(renderer, depth) = raise(NotImplementedError)
11
11
 
12
12
  def to_s = content.to_s
13
13
 
@@ -28,7 +28,7 @@ module Sevgi
28
28
  super
29
29
  end
30
30
 
31
- def render(renderer, depth)
31
+ def render(renderer, depth) # rubocop:disable Metrics/MethodLength
32
32
  depth += 1
33
33
 
34
34
  renderer.append(depth, "<![CDATA[")
@@ -7,11 +7,11 @@ module Sevgi
7
7
  document :default,
8
8
  attributes: {
9
9
  "xmlns": "http://www.w3.org/2000/svg",
10
- "xmlns:xlink": "http://www.w3.org/1999/xlink",
10
+ "xmlns:xlink": "http://www.w3.org/1999/xlink"
11
11
  },
12
- preambles: [
12
+ preambles: [
13
13
  '<?xml version="1.0" standalone="no"?>',
14
- '<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">',
14
+ '<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">'
15
15
  ]
16
16
  end
17
17
  end
@@ -4,10 +4,11 @@ module Sevgi
4
4
  module Graphics
5
5
  module Document
6
6
  class Inkscape < Default
7
- document :inkscape, attributes: {
7
+ document :inkscape,
8
+ attributes: {
8
9
  "xmlns:inkscape": "http://www.inkscape.org/slugs/inkscape",
9
10
  "xmlns:sodipodi": "http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd",
10
- "shape-rendering": "crispEdges",
11
+ "shape-rendering": "crispEdges"
11
12
  }
12
13
 
13
14
  mixture Mixtures::Inkscape
@@ -5,13 +5,13 @@ module Sevgi
5
5
  module Mixtures
6
6
  module Hatch
7
7
  module InstanceMethods
8
- def Draw(segments, **)
9
- segments.each { |segment| segment.draw(self, **) }
8
+ def Draw(segments, **kwargs)
9
+ segments.each { |segment| segment.draw(self, **kwargs) }
10
10
  end
11
11
 
12
- def Hatch(canvas, direction:, step:, **)
12
+ def Hatch(canvas, direction:, step:, **kwargs)
13
13
  Geometry::Operation.sweep!(rect = canvas.rect, initial: rect.position, direction:, step:).tap do |segments|
14
- Draw(segments, **)
14
+ Draw(segments, **kwargs)
15
15
  end
16
16
  end
17
17
  end
@@ -31,7 +31,7 @@ module Sevgi
31
31
  next unless (id = element[:id])
32
32
 
33
33
  if @namespace.key?(id)
34
- (@collision[id] ||= [@namespace[id]]) << element
34
+ (@collision[id] ||= [ @namespace[id] ]) << element
35
35
  else
36
36
  @namespace[id] = element
37
37
  end
@@ -59,7 +59,9 @@ module Sevgi
59
59
  SEPARATOR = "-"
60
60
 
61
61
  IdentifyAs = Data.define(:id) do
62
- def label(*indexes) = (id and [id, *indexes].map(&:to_s).join(SEPARATOR))
62
+ def label(*indexes)
63
+ id and [ id, *indexes ].map(&:to_s).join(SEPARATOR)
64
+ end
63
65
  end
64
66
 
65
67
  IdentifyAsList = Class.new(IdentifyAs) do
@@ -56,7 +56,7 @@ module Sevgi
56
56
 
57
57
  root.Traverse(
58
58
  0,
59
- proc { |element, depth| render_leave(element, depth) },
59
+ proc { |element, depth| render_leave(element, depth) }
60
60
  ) { |element, depth| render_enter(element, depth) }
61
61
 
62
62
  output.join("\n")
@@ -99,7 +99,7 @@ module Sevgi
99
99
  end
100
100
 
101
101
  def attributes_inline(element, depth, lines)
102
- line = "<#{[element.name, *lines].join(" ")}"
102
+ line = "<#{[ element.name, *lines ].join(" ")}"
103
103
 
104
104
  append(depth, (childless?(element) ? "#{line}/>".tap { closed } : "#{line}>"))
105
105
  end
@@ -5,6 +5,7 @@ module Sevgi
5
5
  module Mixtures
6
6
  module Replicate
7
7
  module InstanceMethods
8
+ # rubocop:disable Metrics/MethodLength
8
9
  def Replicate(nx: Undefined, dx: Undefined, ix: nil, ny: Undefined, dy: Undefined, iy: nil, id: nil, &block)
9
10
  Ensure.without_block(block, nx:, dx:, ny:, dy:)
10
11
 
@@ -32,9 +33,7 @@ module Sevgi
32
33
 
33
34
  With do |base|
34
35
  layer(id:) do
35
- (n - 1).times do |time|
36
- base.DuplicateH((time + 1) * d, parent: self)
37
- end
36
+ (n - 1).times { |time| base.DuplicateH((time + 1) * d, parent: self) }
38
37
  end.tap do |element|
39
38
  base.AdoptFirst(element)
40
39
  IdentifyAsList(element.children, i)
@@ -47,9 +46,7 @@ module Sevgi
47
46
 
48
47
  With do |base|
49
48
  layer(id:) do
50
- (n - 1).times do |time|
51
- base.DuplicateV((time + 1) * d, parent: self)
52
- end
49
+ (n - 1).times { |time| base.DuplicateV((time + 1) * d, parent: self) }
53
50
  end.tap do |element|
54
51
  base.AdoptFirst(element)
55
52
  IdentifyAsList(element.children, i)
@@ -89,7 +86,7 @@ module Sevgi
89
86
  ny: proc { |name, value| "Argument '#{name}' must be a positive integer" unless value.positive? },
90
87
  d: proc { |name, value| "Argument '#{name}' must be a number" unless value.is_a?(::Numeric) },
91
88
  dx: proc { |name, value| "Argument '#{name}' must be a number" unless value.is_a?(::Numeric) },
92
- dy: proc { |name, value| "Argument '#{name}' must be a number" unless value.is_a?(::Numeric) },
89
+ dy: proc { |name, value| "Argument '#{name}' must be a number" unless value.is_a?(::Numeric) }
93
90
  }.freeze
94
91
 
95
92
  def with_block(block, **)
@@ -9,7 +9,7 @@ module Sevgi
9
9
  tap do
10
10
  next if x.to_f == 0.0 && (y.nil? || y.to_f == 0.0)
11
11
 
12
- attributes[:"transform+"] = "translate(#{(y ? [x, y] : [x]).join(" ")})"
12
+ attributes[:"transform+"] = "translate(#{(y ? [ x, y ] : [ x ]).join(" ")})"
13
13
  end
14
14
  end
15
15
 
@@ -17,7 +17,7 @@ module Sevgi
17
17
  tap do
18
18
  next if x.to_f == 0.0 && (y.nil? || y.to_f == 0.0)
19
19
 
20
- attributes[:"transform+"] = "scale(#{(y ? [x, y] : [x]).join(", ")})"
20
+ attributes[:"transform+"] = "scale(#{(y ? [ x, y ] : [ x ]).join(", ")})"
21
21
  end
22
22
  end
23
23
 
@@ -49,7 +49,7 @@ module Sevgi
49
49
 
50
50
  next if a.to_f == 0.0
51
51
 
52
- attributes[:"transform+"] = "rotate(#{[a, *origin].join(", ")})"
52
+ attributes[:"transform+"] = "rotate(#{[ a, *origin ].join(", ")})"
53
53
  end
54
54
  end
55
55
 
@@ -20,9 +20,7 @@ module Sevgi
20
20
  here = Dir.pwd
21
21
  until (found = match(&block))
22
22
  Dir.chdir("..")
23
- return if Dir.pwd == here
24
-
25
- here = Dir.pwd
23
+ Dir.pwd == here ? return : here = Dir.pwd
26
24
  end
27
25
 
28
26
  Location[::File.expand_path(found, here), found, here]
@@ -3,7 +3,7 @@
3
3
  module Sevgi
4
4
  Margin = Data.define(:top, :right, :bottom, :left) do
5
5
  def initialize(top: nil, right: nil, bottom: nil, left: nil)
6
- case [top, right, bottom, left]
6
+ case [ top, right, bottom, left ]
7
7
  in Numeric, Numeric, Numeric, Numeric then # nop
8
8
  in Numeric, Numeric, Numeric, NilClass then left = right
9
9
  in Numeric, Numeric, NilClass, NilClass then bottom, left = top, right
@@ -34,7 +34,7 @@ module Sevgi
34
34
 
35
35
  def run_passive(*)
36
36
  warn(" ==> #{file}")
37
- Shell.run("sevgi", "-l", "/dev/stdin", file, *) { puts INTERCEPTOR }
37
+ Shell.run("sevgi", "-l", "/dev/stdin", file, *) { puts(INTERCEPTOR) }
38
38
  end
39
39
 
40
40
  private
@@ -45,14 +45,14 @@ module Sevgi
45
45
  out = stdout.readlines.map(&:chomp)
46
46
  err = stderr.readlines.map(&:chomp)
47
47
 
48
- [out, err, thread.value]
48
+ [ out, err, thread.value ]
49
49
  end
50
50
 
51
51
  def handle_sigint(pid)
52
52
  message, signal = if @coathooks > 1
53
- ["SIGINT received again. Force quitting...", "KILL"]
53
+ [ "SIGINT received again. Force quitting...", "KILL" ]
54
54
  else
55
- ["SIGINT received.", "TERM"]
55
+ [ "SIGINT received.", "TERM" ]
56
56
  end
57
57
 
58
58
  warn("\n#{message}")
@@ -15,7 +15,7 @@ module Sevgi
15
15
  @suites ||= @scripts.map(&:suite).uniq
16
16
  end
17
17
 
18
- NON_VALIDS = ["gotcha"]
18
+ NON_VALIDS = [ "gotcha" ]
19
19
 
20
20
  def non_valids
21
21
  NON_VALIDS.map { self[_1] }.flatten
@@ -17,7 +17,7 @@ module Sevgi
17
17
  pocket: Dim[90.0, 140.0],
18
18
  travelers: Dim[110.0, 210.0],
19
19
  us: Dim[215.9, 279.4],
20
- xlarge: Dim[190.0, 250.0],
20
+ xlarge: Dim[190.0, 250.0]
21
21
  }.tap do
22
22
  def _1.default_proc = proc { |_, key| ArgumentError.("No such paper: #{key}") }
23
23
 
@@ -4,7 +4,7 @@ module Sevgi
4
4
  module Standard
5
5
  module Attribute
6
6
  import(
7
- Animation: %i[
7
+ Animation: %i[
8
8
  accelerate
9
9
  accumulate
10
10
  additive
@@ -33,7 +33,7 @@ module Sevgi
33
33
  values
34
34
  ],
35
35
 
36
- AnimationAddition: %i[
36
+ AnimationAddition: %i[
37
37
  accumulate
38
38
  additive
39
39
  ],
@@ -43,7 +43,7 @@ module Sevgi
43
43
  attributeType
44
44
  ],
45
45
 
46
- AnimationValue: %i[
46
+ AnimationValue: %i[
47
47
  accelerate
48
48
  autoReverse
49
49
  by
@@ -56,7 +56,7 @@ module Sevgi
56
56
  values
57
57
  ],
58
58
 
59
- AnimationTiming: %i[
59
+ AnimationTiming: %i[
60
60
  begin
61
61
  dur
62
62
  end
@@ -68,7 +68,7 @@ module Sevgi
68
68
  restart
69
69
  ],
70
70
 
71
- Aria: %i[
71
+ Aria: %i[
72
72
  aria-activedescendant
73
73
  aria-atomic
74
74
  aria-autocomplete
@@ -119,13 +119,13 @@ module Sevgi
119
119
  aria-valuetext
120
120
  ],
121
121
 
122
- ConditionalProcessing: %i[
122
+ ConditionalProcessing: %i[
123
123
  requiredExtensions
124
124
  requiredFeatures
125
125
  systemLanguage
126
126
  ],
127
127
 
128
- Core: %i[
128
+ Core: %i[
129
129
  autofocus
130
130
  id
131
131
  lang
@@ -135,13 +135,13 @@ module Sevgi
135
135
  xml:space
136
136
  ],
137
137
 
138
- EventAnimation: %i[
138
+ EventAnimation: %i[
139
139
  onbegin
140
140
  onend
141
141
  onrepeat
142
142
  ],
143
143
 
144
- EventDocument: %i[
144
+ EventDocument: %i[
145
145
  onabort
146
146
  onerror
147
147
  onresize
@@ -149,13 +149,13 @@ module Sevgi
149
149
  onunload
150
150
  ],
151
151
 
152
- EventDocumentElement: %i[
152
+ EventDocumentElement: %i[
153
153
  oncopy
154
154
  oncut
155
155
  onpaste
156
156
  ],
157
157
 
158
- EventGlobal: %i[
158
+ EventGlobal: %i[
159
159
  oncancel
160
160
  oncanplay
161
161
  oncanplaythrough
@@ -214,13 +214,13 @@ module Sevgi
214
214
  onwaiting
215
215
  ],
216
216
 
217
- EventGraphical: %i[
217
+ EventGraphical: %i[
218
218
  onactivate
219
219
  onfocusin
220
220
  onfocusout
221
221
  ],
222
222
 
223
- FilterPrimitive: %i[
223
+ FilterPrimitive: %i[
224
224
  height
225
225
  result
226
226
  width
@@ -228,7 +228,7 @@ module Sevgi
228
228
  y
229
229
  ],
230
230
 
231
- FilterTransferFunction: %i[
231
+ FilterTransferFunction: %i[
232
232
  amplitude
233
233
  exponent
234
234
  intercept
@@ -238,7 +238,7 @@ module Sevgi
238
238
  type
239
239
  ],
240
240
 
241
- Presentation: %i[
241
+ Presentation: %i[
242
242
  alignment-baseline
243
243
  baseline-shift
244
244
  clip
@@ -303,12 +303,12 @@ module Sevgi
303
303
  writing-mode
304
304
  ],
305
305
 
306
- Style: %i[
306
+ Style: %i[
307
307
  class
308
308
  style
309
309
  ],
310
310
 
311
- Xlink: %i[
311
+ Xlink: %i[
312
312
  xlink:actuate
313
313
  xlink:arcrole
314
314
  xlink:href
@@ -320,7 +320,7 @@ module Sevgi
320
320
 
321
321
  # Uncategorized attributes (for the sake of completeness)
322
322
 
323
- Uncategorized: %i[
323
+ Uncategorized: %i[
324
324
  accent-height
325
325
  alphabetic
326
326
  arabic-form
@@ -480,7 +480,7 @@ module Sevgi
480
480
 
481
481
  # Deprecated attributes
482
482
 
483
- Deprecated: %i[
483
+ Deprecated: %i[
484
484
  accent-height
485
485
  alphabetic
486
486
  amplitude
@@ -489,7 +489,7 @@ module Sevgi
489
489
  attributeType
490
490
  baseProfile
491
491
  bbox
492
- ],
492
+ ]
493
493
  )
494
494
  end
495
495
  end