sevgi 0.0.0 → 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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