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