sevgi 0.0.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 +7 -0
- data/CHANGELOG.md +9 -0
- data/LICENSE +674 -0
- data/README.md +15 -0
- data/bin/sevgi +136 -0
- data/lib/sevgi/errors.rb +11 -0
- data/lib/sevgi/external.rb +8 -0
- data/lib/sevgi/function.rb +35 -0
- data/lib/sevgi/geometry/elements/rect.rb +133 -0
- data/lib/sevgi/geometry/elements/segment.rb +102 -0
- data/lib/sevgi/geometry/elements.rb +41 -0
- data/lib/sevgi/geometry/equation/line/diagonal.rb +90 -0
- data/lib/sevgi/geometry/equation/line/horizontal.rb +15 -0
- data/lib/sevgi/geometry/equation/line/vertical.rb +52 -0
- data/lib/sevgi/geometry/equation/line.rb +38 -0
- data/lib/sevgi/geometry/equation.rb +3 -0
- data/lib/sevgi/geometry/errors.rb +5 -0
- data/lib/sevgi/geometry/external.rb +15 -0
- data/lib/sevgi/geometry/operation/align.rb +40 -0
- data/lib/sevgi/geometry/operation/sweep.rb +52 -0
- data/lib/sevgi/geometry/operation.rb +28 -0
- data/lib/sevgi/geometry/point.rb +62 -0
- data/lib/sevgi/geometry.rb +10 -0
- data/lib/sevgi/graphics/attribute.rb +125 -0
- data/lib/sevgi/graphics/canvas.rb +51 -0
- data/lib/sevgi/graphics/content.rb +72 -0
- data/lib/sevgi/graphics/document/base.rb +51 -0
- data/lib/sevgi/graphics/document/default.rb +19 -0
- data/lib/sevgi/graphics/document/html.rb +11 -0
- data/lib/sevgi/graphics/document/inkscape.rb +17 -0
- data/lib/sevgi/graphics/document/minimal.rb +11 -0
- data/lib/sevgi/graphics/document.rb +53 -0
- data/lib/sevgi/graphics/element.rb +85 -0
- data/lib/sevgi/graphics/external.rb +15 -0
- data/lib/sevgi/graphics/mixtures/core.rb +81 -0
- data/lib/sevgi/graphics/mixtures/duplicate.rb +36 -0
- data/lib/sevgi/graphics/mixtures/hatch.rb +21 -0
- data/lib/sevgi/graphics/mixtures/identify.rb +93 -0
- data/lib/sevgi/graphics/mixtures/inkscape.rb +15 -0
- data/lib/sevgi/graphics/mixtures/lint.rb +33 -0
- data/lib/sevgi/graphics/mixtures/render.rb +149 -0
- data/lib/sevgi/graphics/mixtures/replicate.rb +125 -0
- data/lib/sevgi/graphics/mixtures/save.rb +23 -0
- data/lib/sevgi/graphics/mixtures/transform.rb +78 -0
- data/lib/sevgi/graphics/mixtures/underscore.rb +21 -0
- data/lib/sevgi/graphics/mixtures/validate.rb +27 -0
- data/lib/sevgi/graphics/mixtures/wrappers.rb +63 -0
- data/lib/sevgi/graphics/mixtures.rb +16 -0
- data/lib/sevgi/graphics.rb +10 -0
- data/lib/sevgi/internal/constant.rb +5 -0
- data/lib/sevgi/internal/dim.rb +13 -0
- data/lib/sevgi/internal/function/file.rb +30 -0
- data/lib/sevgi/internal/function/float.rb +35 -0
- data/lib/sevgi/internal/function/formula.rb +71 -0
- data/lib/sevgi/internal/function/math.rb +43 -0
- data/lib/sevgi/internal/function/string.rb +13 -0
- data/lib/sevgi/internal/function.rb +7 -0
- data/lib/sevgi/internal/list.rb +27 -0
- data/lib/sevgi/internal/locate.rb +47 -0
- data/lib/sevgi/internal/margin.rb +23 -0
- data/lib/sevgi/internal/minitest/script.rb +50 -0
- data/lib/sevgi/internal/minitest/shell.rb +71 -0
- data/lib/sevgi/internal/minitest/suite.rb +35 -0
- data/lib/sevgi/internal/minitest.rb +5 -0
- data/lib/sevgi/internal/paper.rb +26 -0
- data/lib/sevgi/internal.rb +10 -0
- data/lib/sevgi/standard/conform.rb +55 -0
- data/lib/sevgi/standard/data/attribute.rb +496 -0
- data/lib/sevgi/standard/data/element.rb +269 -0
- data/lib/sevgi/standard/data/specification.rb +1841 -0
- data/lib/sevgi/standard/data.rb +79 -0
- data/lib/sevgi/standard/errors.rb +28 -0
- data/lib/sevgi/standard/model.rb +82 -0
- data/lib/sevgi/standard.rb +26 -0
- data/lib/sevgi/utensils/external.rb +22 -0
- data/lib/sevgi/utensils/grid.rb +49 -0
- data/lib/sevgi/utensils/ruler.rb +47 -0
- data/lib/sevgi/utensils/tsquare.rb +28 -0
- data/lib/sevgi/utensils.rb +7 -0
- data/lib/sevgi/version.rb +5 -0
- data/lib/sevgi.rb +10 -0
- metadata +127 -0
@@ -0,0 +1,79 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Sevgi
|
4
|
+
module Standard
|
5
|
+
module Group
|
6
|
+
def all = @all ||= Set[*data.values.flatten.uniq.sort]
|
7
|
+
|
8
|
+
def is?(name, group) = self[group].include?(name)
|
9
|
+
|
10
|
+
def pick(names, *groups) = names.select { |name| groups.any? { is?(name, _1) } }
|
11
|
+
|
12
|
+
def set(*groups) = groups.empty? ? all : Set[*data.values_at(*groups).flatten.compact.uniq.sort]
|
13
|
+
|
14
|
+
def unpick(names, *groups) = names.reject { |name| groups.any? { is?(name, _1) } }
|
15
|
+
|
16
|
+
class << self
|
17
|
+
def extended(base) = base.extend(List)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
private_constant :Group
|
22
|
+
|
23
|
+
module Attribute
|
24
|
+
extend Group
|
25
|
+
|
26
|
+
require_relative "data/attribute"
|
27
|
+
end
|
28
|
+
|
29
|
+
private_constant :Attribute
|
30
|
+
|
31
|
+
module Element
|
32
|
+
extend Group
|
33
|
+
|
34
|
+
require_relative "data/element"
|
35
|
+
end
|
36
|
+
|
37
|
+
private_constant :Element
|
38
|
+
|
39
|
+
module Specification
|
40
|
+
extend List
|
41
|
+
extend self
|
42
|
+
|
43
|
+
require_relative "data/specification"
|
44
|
+
|
45
|
+
def [](name) = expand(name)
|
46
|
+
|
47
|
+
def group?(name) = F.start_with_upper?(name)
|
48
|
+
|
49
|
+
def model?(name, *models) = models.any? { (self[name] || {})[:model] == name }
|
50
|
+
|
51
|
+
private
|
52
|
+
|
53
|
+
@spec = {}
|
54
|
+
|
55
|
+
def expand(name)
|
56
|
+
@spec[name] ||= if data[name]
|
57
|
+
data[name].dup.tap do |spec|
|
58
|
+
expand_names(spec[:elements], Element.data)
|
59
|
+
expand_names(spec[:attributes], Attribute.data)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def expand_names(names, list)
|
65
|
+
return unless names
|
66
|
+
|
67
|
+
names.replace(names.map { |name| group?(name) ? list[name] : name }.flatten)
|
68
|
+
end
|
69
|
+
|
70
|
+
# For testing purposes
|
71
|
+
|
72
|
+
def charge = data.keys { expand(_1) }
|
73
|
+
|
74
|
+
def flush = (@spec = {})
|
75
|
+
end
|
76
|
+
|
77
|
+
private_constant :Specification
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Sevgi
|
4
|
+
class ValidationError < Error
|
5
|
+
def initialize(context, args)
|
6
|
+
@context = context
|
7
|
+
@args = Array(args)
|
8
|
+
|
9
|
+
super()
|
10
|
+
end
|
11
|
+
|
12
|
+
class << self
|
13
|
+
def call(context, args) = raise(new(context, args))
|
14
|
+
|
15
|
+
def variant(message)
|
16
|
+
Class.new(self) do
|
17
|
+
define_method(:message) { [@context, message, @args.map { "'#{_1}'" }.join(", ")].join(": ") }
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
InvalidAttributesError = ValidationError.variant("Invalid attribute(s)")
|
24
|
+
InvalidElementsError = ValidationError.variant("Invalid element(s)")
|
25
|
+
UnallowedCDataError = ValidationError.variant("Character data not allowed")
|
26
|
+
UnallowedElementsError = ValidationError.variant("Element(s) not allowed")
|
27
|
+
UnmetConditionError = ValidationError.variant("Condition unmet for the element")
|
28
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Sevgi
|
4
|
+
module Standard
|
5
|
+
module Model
|
6
|
+
module CDataOnly
|
7
|
+
def apply(cdata:, elements:)
|
8
|
+
UnallowedElementsError.(element, elements) unless elements.empty?
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
module CDataOrSomeElements
|
13
|
+
def apply(cdata:, elements:)
|
14
|
+
unallowed = elements - spec[:elements]
|
15
|
+
UnallowedElementsError.(element, unallowed) unless unallowed.empty?
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
module NoneElements
|
20
|
+
def apply(cdata:, elements:)
|
21
|
+
UnallowedCDataError.(element, cdata) if cdata
|
22
|
+
|
23
|
+
UnallowedElementsError.(element, elements) unless elements.empty?
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
module SomeElements
|
28
|
+
def apply(cdata:, elements:)
|
29
|
+
UnallowedCDataError.(element, cdata) if cdata
|
30
|
+
|
31
|
+
unallowed = elements - spec[:elements]
|
32
|
+
UnallowedElementsError.(element, unallowed) unless unallowed.empty?
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
module SpecialFeDiffuseLighting
|
37
|
+
# Any number of Descriptive elements and exactly one FilterLightSource element, in any order.
|
38
|
+
def apply(cdata:, elements:)
|
39
|
+
UnallowedCDataError.(element, cdata) if cdata
|
40
|
+
|
41
|
+
unless (filter_light_source_elements = Element.pick(elements, :FilterLightSource)).size == 1
|
42
|
+
UnmetConditionError.(element, "Exactly one FilterLightSource element required")
|
43
|
+
end
|
44
|
+
|
45
|
+
unless (unallowed = Element.unpick(elements - filter_light_source_elements, :Descriptive)).empty?
|
46
|
+
UnallowedElementsError.(element, unallowed)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
module SpecialFeSpecularLighting
|
52
|
+
# Exactly one FilterLightSource element first and any number of Descriptive elements in any order.
|
53
|
+
def apply(cdata:, elements:)
|
54
|
+
UnallowedCDataError.(element, cdata) if cdata
|
55
|
+
|
56
|
+
unless Element.is?(elements.first, :FilterLightSource)
|
57
|
+
UnmetConditionError.(element, "Exactly one FilterLightSource element as first required")
|
58
|
+
end
|
59
|
+
|
60
|
+
unless (unallowed = Element.unpick(elements[1..], :Descriptive)).empty?
|
61
|
+
UnallowedElementsError.(element, unallowed) unless unallowed.empty?
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
module SpecialFontFace
|
67
|
+
# Any number of Descriptive elements and at most one font-face element in any order.
|
68
|
+
def apply(cdata:, elements:)
|
69
|
+
UnallowedCDataError.(element, cdata) if cdata
|
70
|
+
|
71
|
+
if (font_face_elements = elements.select { |element| element == :"font-face" }).size > 1
|
72
|
+
UnmetConditionError.(element, "At most one font-face element allowed")
|
73
|
+
end
|
74
|
+
|
75
|
+
unless (unallowed = Element.unpick(elements - font_face_elements, :Descriptive)).empty?
|
76
|
+
UnallowedElementsError.(element, unallowed)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "standard/errors"
|
4
|
+
|
5
|
+
require_relative "standard/data"
|
6
|
+
require_relative "standard/conform"
|
7
|
+
|
8
|
+
module Sevgi
|
9
|
+
module Standard
|
10
|
+
extend self
|
11
|
+
|
12
|
+
def attributes(...) = Attribute.set(...)
|
13
|
+
|
14
|
+
def attribute?(name) = Attribute.all.include?(name.to_sym)
|
15
|
+
|
16
|
+
def conform(...) = Conform.(...)
|
17
|
+
|
18
|
+
def elements(...) = Element.set(...)
|
19
|
+
|
20
|
+
def element?(name) = Element.all.include?(name.to_sym)
|
21
|
+
|
22
|
+
def model?(...) = Specification.model?(...)
|
23
|
+
|
24
|
+
def [](name) = Specification[name.to_sym]
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Sevgi
|
4
|
+
module Utensils
|
5
|
+
module External
|
6
|
+
def Ruler(...)
|
7
|
+
Ruler.new(...)
|
8
|
+
end
|
9
|
+
|
10
|
+
def Ts(canvas, unit:, multiple:)
|
11
|
+
ArgumentError.("Must be a Canvas: #{canvas}") unless canvas.is_a?(Graphics::Canvas)
|
12
|
+
|
13
|
+
Tsquare.new(
|
14
|
+
hruler: Utensils::Ruler.new(brut: canvas.width, unit:, multiple:, minspace: canvas.left),
|
15
|
+
vruler: Utensils::Ruler.new(brut: canvas.height, unit:, multiple:, minspace: canvas.top),
|
16
|
+
)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
extend External
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Sevgi
|
4
|
+
module Utensils
|
5
|
+
class Grid
|
6
|
+
Types = Struct.new(:point, :contour, :segment)
|
7
|
+
private_constant :Types
|
8
|
+
|
9
|
+
Parts = Struct.new(:halves, :majors, :minors)
|
10
|
+
private_constant :Parts
|
11
|
+
|
12
|
+
attr_reader :h, :v
|
13
|
+
|
14
|
+
def initialize(ts)
|
15
|
+
@h = Types.new
|
16
|
+
@v = Types.new
|
17
|
+
|
18
|
+
compute(ts)
|
19
|
+
end
|
20
|
+
|
21
|
+
def all = @all ||= Parts.new(halves: h.point.halves.flatten, majors: h.point.majors.flatten, minors: h.point.minors.flatten)
|
22
|
+
|
23
|
+
alias_method :a, :all
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def compute(ts)
|
28
|
+
lps = points(ts.v.ls, ts.h.ls) # array of halve (l) points
|
29
|
+
mps = points(ts.v.ms, ts.h.ms) # array of major (m) points
|
30
|
+
nps = points(ts.v.ns, ts.h.ns) # array of minor (n) points
|
31
|
+
|
32
|
+
h.point, h.contour, h.segment = parts(lps, mps, nps)
|
33
|
+
v.point, v.contour, v.segment = parts(lps.transpose, mps.transpose, nps.transpose)
|
34
|
+
end
|
35
|
+
|
36
|
+
def parts(lps, mps, nps)
|
37
|
+
[
|
38
|
+
Parts.new(halves: lps, majors: mps, minors: nps), # points
|
39
|
+
Parts.new(halves: [lps.first, lps.last], majors: [mps.first, mps.last], minors: [nps.first, nps.last]), # contours
|
40
|
+
Parts.new(halves: segments(lps), majors: segments(mps), minors: segments(nps)), # segments
|
41
|
+
]
|
42
|
+
end
|
43
|
+
|
44
|
+
def segments(a) = a.first.zip(a.last).map { Geometry::Segment[_1, _2] }
|
45
|
+
|
46
|
+
def points(va, ha) = va.map { |y| ha.map { |x| Geometry::Point[x, y] } }
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# codebeat:disable[TOO_MANY_IVARS]
|
4
|
+
|
5
|
+
module Sevgi
|
6
|
+
module Utensils
|
7
|
+
#
|
8
|
+
# <------------------------------------------------- brut -------------------------------------------------->
|
9
|
+
# <------------------------- length = (n - 1) x minor = (m - 1) x major ----------------------->
|
10
|
+
# <- space -> <- minor -> <------- major = multiple x minor ------>
|
11
|
+
# |............|---------+---------+---------+---------|---------+---------+---------+---------|............|
|
12
|
+
# |
|
13
|
+
# +--> space = minspace + computed space for evenness
|
14
|
+
#
|
15
|
+
class Ruler
|
16
|
+
attr_reader :unit, :multiple, :brut, :minspace
|
17
|
+
|
18
|
+
def initialize(unit:, multiple:, brut:, minspace:)
|
19
|
+
@brut, @unit, @minspace = brut.to_f, unit.to_f, minspace.to_f
|
20
|
+
@multiple = multiple
|
21
|
+
end
|
22
|
+
|
23
|
+
def halve = @halve ||= major / 2.0
|
24
|
+
def length = @length ||= (n - 1) * unit
|
25
|
+
def major = @major ||= multiple * unit
|
26
|
+
def space = @space ||= brut - length
|
27
|
+
|
28
|
+
def l = @l ||= 2 * m - 1
|
29
|
+
def ls = @ls ||= Array.new(l) { |i| i * halve }
|
30
|
+
|
31
|
+
def m = @m ||= even(unit: major) + 1
|
32
|
+
def ms = @ms ||= Array.new(m) { |i| i * major }
|
33
|
+
|
34
|
+
def n = @n ||= even(unit:, multiple:) + 1
|
35
|
+
def ns = @ns ||= Array.new(n) { |i| i * unit }
|
36
|
+
|
37
|
+
alias_method :minor, :unit
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
def even(unit: nil, multiple: 1)
|
42
|
+
(n = ((brut - 2 * minspace) / (multiple * unit).to_f).to_i).even? ? n : (n - 1)
|
43
|
+
n * multiple
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "forwardable"
|
4
|
+
|
5
|
+
module Sevgi
|
6
|
+
module Utensils
|
7
|
+
class Tsquare
|
8
|
+
extend Forwardable
|
9
|
+
def_delegators :@h, :halve, :major, :minor
|
10
|
+
|
11
|
+
def_delegator :@h, :length, :width
|
12
|
+
def_delegator :@v, :length, :height
|
13
|
+
|
14
|
+
attr_reader :h, :v
|
15
|
+
|
16
|
+
def initialize(hruler:, vruler:)
|
17
|
+
@h = hruler
|
18
|
+
@v = vruler
|
19
|
+
end
|
20
|
+
|
21
|
+
def canvas = Graphics::Canvas.new(**Dim[h.brut, v.brut].to_h, margins: Margin[v.space / 2.0, h.space / 2.0].to_a)
|
22
|
+
|
23
|
+
def grid = Grid.new(self)
|
24
|
+
|
25
|
+
alias_method :unit, :minor
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
data/lib/sevgi.rb
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "sevgi/internal"
|
4
|
+
require_relative "sevgi/errors"
|
5
|
+
require_relative "sevgi/function"
|
6
|
+
|
7
|
+
require_relative "sevgi/graphics"
|
8
|
+
require_relative "sevgi/geometry"
|
9
|
+
require_relative "sevgi/standard"
|
10
|
+
require_relative "sevgi/utensils"
|
metadata
ADDED
@@ -0,0 +1,127 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: sevgi
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Recai Oktaş
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2023-09-23 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: Toolkit for Creating SVG Content Programmatically with Ruby
|
14
|
+
email: roktas@gmail.com
|
15
|
+
executables:
|
16
|
+
- sevgi
|
17
|
+
extensions: []
|
18
|
+
extra_rdoc_files: []
|
19
|
+
files:
|
20
|
+
- CHANGELOG.md
|
21
|
+
- LICENSE
|
22
|
+
- README.md
|
23
|
+
- bin/sevgi
|
24
|
+
- lib/sevgi.rb
|
25
|
+
- lib/sevgi/errors.rb
|
26
|
+
- lib/sevgi/external.rb
|
27
|
+
- lib/sevgi/function.rb
|
28
|
+
- lib/sevgi/geometry.rb
|
29
|
+
- lib/sevgi/geometry/elements.rb
|
30
|
+
- lib/sevgi/geometry/elements/rect.rb
|
31
|
+
- lib/sevgi/geometry/elements/segment.rb
|
32
|
+
- lib/sevgi/geometry/equation.rb
|
33
|
+
- lib/sevgi/geometry/equation/line.rb
|
34
|
+
- lib/sevgi/geometry/equation/line/diagonal.rb
|
35
|
+
- lib/sevgi/geometry/equation/line/horizontal.rb
|
36
|
+
- lib/sevgi/geometry/equation/line/vertical.rb
|
37
|
+
- lib/sevgi/geometry/errors.rb
|
38
|
+
- lib/sevgi/geometry/external.rb
|
39
|
+
- lib/sevgi/geometry/operation.rb
|
40
|
+
- lib/sevgi/geometry/operation/align.rb
|
41
|
+
- lib/sevgi/geometry/operation/sweep.rb
|
42
|
+
- lib/sevgi/geometry/point.rb
|
43
|
+
- lib/sevgi/graphics.rb
|
44
|
+
- lib/sevgi/graphics/attribute.rb
|
45
|
+
- lib/sevgi/graphics/canvas.rb
|
46
|
+
- lib/sevgi/graphics/content.rb
|
47
|
+
- lib/sevgi/graphics/document.rb
|
48
|
+
- lib/sevgi/graphics/document/base.rb
|
49
|
+
- lib/sevgi/graphics/document/default.rb
|
50
|
+
- lib/sevgi/graphics/document/html.rb
|
51
|
+
- lib/sevgi/graphics/document/inkscape.rb
|
52
|
+
- lib/sevgi/graphics/document/minimal.rb
|
53
|
+
- lib/sevgi/graphics/element.rb
|
54
|
+
- lib/sevgi/graphics/external.rb
|
55
|
+
- lib/sevgi/graphics/mixtures.rb
|
56
|
+
- lib/sevgi/graphics/mixtures/core.rb
|
57
|
+
- lib/sevgi/graphics/mixtures/duplicate.rb
|
58
|
+
- lib/sevgi/graphics/mixtures/hatch.rb
|
59
|
+
- lib/sevgi/graphics/mixtures/identify.rb
|
60
|
+
- lib/sevgi/graphics/mixtures/inkscape.rb
|
61
|
+
- lib/sevgi/graphics/mixtures/lint.rb
|
62
|
+
- lib/sevgi/graphics/mixtures/render.rb
|
63
|
+
- lib/sevgi/graphics/mixtures/replicate.rb
|
64
|
+
- lib/sevgi/graphics/mixtures/save.rb
|
65
|
+
- lib/sevgi/graphics/mixtures/transform.rb
|
66
|
+
- lib/sevgi/graphics/mixtures/underscore.rb
|
67
|
+
- lib/sevgi/graphics/mixtures/validate.rb
|
68
|
+
- lib/sevgi/graphics/mixtures/wrappers.rb
|
69
|
+
- lib/sevgi/internal.rb
|
70
|
+
- lib/sevgi/internal/constant.rb
|
71
|
+
- lib/sevgi/internal/dim.rb
|
72
|
+
- lib/sevgi/internal/function.rb
|
73
|
+
- lib/sevgi/internal/function/file.rb
|
74
|
+
- lib/sevgi/internal/function/float.rb
|
75
|
+
- lib/sevgi/internal/function/formula.rb
|
76
|
+
- lib/sevgi/internal/function/math.rb
|
77
|
+
- lib/sevgi/internal/function/string.rb
|
78
|
+
- lib/sevgi/internal/list.rb
|
79
|
+
- lib/sevgi/internal/locate.rb
|
80
|
+
- lib/sevgi/internal/margin.rb
|
81
|
+
- lib/sevgi/internal/minitest.rb
|
82
|
+
- lib/sevgi/internal/minitest/script.rb
|
83
|
+
- lib/sevgi/internal/minitest/shell.rb
|
84
|
+
- lib/sevgi/internal/minitest/suite.rb
|
85
|
+
- lib/sevgi/internal/paper.rb
|
86
|
+
- lib/sevgi/standard.rb
|
87
|
+
- lib/sevgi/standard/conform.rb
|
88
|
+
- lib/sevgi/standard/data.rb
|
89
|
+
- lib/sevgi/standard/data/attribute.rb
|
90
|
+
- lib/sevgi/standard/data/element.rb
|
91
|
+
- lib/sevgi/standard/data/specification.rb
|
92
|
+
- lib/sevgi/standard/errors.rb
|
93
|
+
- lib/sevgi/standard/model.rb
|
94
|
+
- lib/sevgi/utensils.rb
|
95
|
+
- lib/sevgi/utensils/external.rb
|
96
|
+
- lib/sevgi/utensils/grid.rb
|
97
|
+
- lib/sevgi/utensils/ruler.rb
|
98
|
+
- lib/sevgi/utensils/tsquare.rb
|
99
|
+
- lib/sevgi/version.rb
|
100
|
+
homepage: https://roktas.dev/sevgi
|
101
|
+
licenses:
|
102
|
+
- GPL-3.0-or-later
|
103
|
+
metadata:
|
104
|
+
changelog_uri: https://github.com/roktas/sevgi/blob/main/CHANGELOG.md
|
105
|
+
source_code_uri: https://github.com/roktas/sevgi
|
106
|
+
bug_tracker_uri: https://github.com/roktas/sevgi/issues
|
107
|
+
rubygems_mfa_required: 'true'
|
108
|
+
post_install_message:
|
109
|
+
rdoc_options: []
|
110
|
+
require_paths:
|
111
|
+
- lib
|
112
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
113
|
+
requirements:
|
114
|
+
- - ">="
|
115
|
+
- !ruby/object:Gem::Version
|
116
|
+
version: 3.2.2
|
117
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
118
|
+
requirements:
|
119
|
+
- - ">="
|
120
|
+
- !ruby/object:Gem::Version
|
121
|
+
version: '0'
|
122
|
+
requirements: []
|
123
|
+
rubygems_version: 3.4.19
|
124
|
+
signing_key:
|
125
|
+
specification_version: 4
|
126
|
+
summary: Toolkit for Creating SVG Content Programmatically with Ruby
|
127
|
+
test_files: []
|