p5rb 0.0.1 → 0.0.2
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 +5 -5
- data/lib/p5rb.rb +121 -54
- data/p5rb.gemspec +1 -1
- metadata +3 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: f5142534f423ae6b2e335259f2b2e949d0c67923caed5257b18536467cd071dc
|
4
|
+
data.tar.gz: 2d0fdb1a392ba9601bc82c0ca5ac5f281ea8b09dadf27f8a44800af2c0bf5683
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7e1cf13da82440fc26ef0cf0ac63a022e58c3b9543b78256c04f984e3e5aa3ba3abe37b3a36ed941eb3ab9791dcbfbbe8a4a24a47d2a8ef7044f8d64ed8fd8d7
|
7
|
+
data.tar.gz: d1b0f0a06fa8a585f5534ff1d1e8d9071fa06543bebc2bc141fa4b54f8887f199646f1f3cfc727267e4caaad87c12d8977379040309fbe3ac7a9f78655035038
|
data/lib/p5rb.rb
CHANGED
@@ -3,68 +3,135 @@ module P5
|
|
3
3
|
attr_reader :buffer_setup
|
4
4
|
attr_reader :buffer_draw
|
5
5
|
end
|
6
|
-
|
7
|
-
|
6
|
+
@buffer_setup = []
|
7
|
+
@buffer_draw = []
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
9
|
+
module Block
|
10
|
+
class << self
|
11
|
+
attr_writer :buffer
|
12
|
+
def raw _
|
13
|
+
@buffer.push _
|
14
|
+
end
|
15
|
+
def background color
|
16
|
+
@buffer.push "background(#{color})"
|
17
|
+
end
|
18
|
+
def noStroke
|
19
|
+
@buffer.push "noStroke()"
|
20
|
+
end
|
21
|
+
def stroke color
|
22
|
+
@buffer.push "stroke(#{color})"
|
23
|
+
end
|
24
|
+
def translate x, y
|
25
|
+
@buffer.push "translate(#{x}, #{y})"
|
26
|
+
end
|
27
|
+
def line x1, y1, x2, y2
|
28
|
+
@buffer.push "line(#{x1}, #{y1}, #{x2}, #{y2})"
|
29
|
+
end
|
30
|
+
def circle x, y, r
|
31
|
+
@buffer.push "circle(#{x}, #{y}, #{r})"
|
32
|
+
end
|
33
|
+
def ellipse *args # not tested yet
|
34
|
+
@buffer.push "ellipse(#{args.join ?,})"
|
35
|
+
end
|
36
|
+
def fill color, alpha = nil
|
37
|
+
@buffer.push "fill(#{color.inspect}#{", #{alpha}" if alpha})"
|
38
|
+
end
|
39
|
+
def rect x, y, w, h, fill: nil
|
40
|
+
(@buffer.push "push()"; fill fill) if fill
|
41
|
+
@buffer.push "rect(#{x}, #{y}, #{w}, #{h})"
|
42
|
+
@buffer.push "pop()" if fill
|
43
|
+
end
|
44
|
+
def point x, y
|
45
|
+
@buffer.push "point(#{x}, #{y})"
|
46
|
+
end
|
47
|
+
def textSize size
|
48
|
+
@buffer.push "textSize(#{size})"
|
49
|
+
end
|
50
|
+
def textAlign *args
|
51
|
+
@buffer.push "textAlign(#{args.join ", "})"
|
52
|
+
end
|
53
|
+
def text text, x, y, fill: nil
|
54
|
+
(@buffer.push "push()"; fill fill) if fill
|
55
|
+
@buffer.push "text(#{text.inspect}, #{x}, #{y})"
|
56
|
+
@buffer.push "pop()" if fill
|
57
|
+
end
|
58
|
+
def map *args
|
59
|
+
"map(#{args.join ", "})"
|
60
|
+
end
|
50
61
|
end
|
62
|
+
end
|
51
63
|
|
64
|
+
class << self
|
52
65
|
def setup &block
|
53
|
-
|
54
|
-
|
55
|
-
@buffer = []
|
66
|
+
::P5::Block.buffer = @buffer_setup
|
67
|
+
::P5::Block.module_eval &block
|
56
68
|
end
|
57
|
-
def draw &block
|
58
|
-
|
59
|
-
|
60
|
-
@buffer = []
|
69
|
+
def draw &block # not tested yet
|
70
|
+
::P5::Block.buffer = @buffer_draw
|
71
|
+
::P5::Block.module_eval &block
|
61
72
|
end
|
73
|
+
end
|
62
74
|
|
75
|
+
class << self
|
76
|
+
def plot_scatter data, reverse_y: false
|
77
|
+
size = 1000
|
78
|
+
max = nil
|
79
|
+
(x_range, x_from, x_to, x_enum, x_f),
|
80
|
+
(y_range, y_from, y_to, y_enum, y_f) = data.transpose.map do |axis|
|
81
|
+
min, max = axis.minmax
|
82
|
+
range = (min - max).abs
|
83
|
+
division = 10**Math::log10(range).floor
|
84
|
+
from = min.div(division)*division
|
85
|
+
to = -(-max).div(division)*division
|
86
|
+
[
|
87
|
+
to - from,
|
88
|
+
from, to,
|
89
|
+
from.step(to, division),
|
90
|
+
]
|
91
|
+
end
|
92
|
+
max = [x_range, y_range].max
|
93
|
+
x_f = ->_{ 20 + (size-40.0) * (_ - x_from) / max }
|
94
|
+
y_f = ->_{ 20 + (size-40.0) * (reverse_y ? y_to - _ : _ - y_from) / max }
|
95
|
+
P5 40 + (size-40.0) * x_range / max + 50, # TODO: properly fix the issue that with wide labels the right end of the plot may be cut off
|
96
|
+
40 + (size-40.0) * y_range / max do
|
97
|
+
setup do
|
98
|
+
textSize 15
|
99
|
+
raw "const w = max([#{y_enum.map{ |_| "textWidth(#{_})" }.join ?,}])"
|
100
|
+
raw "translate(w, 15)"
|
101
|
+
stroke 200
|
102
|
+
textAlign :CENTER, :BOTTOM; x_enum.each{ |_| line x_f[_], y_f[y_from], x_f[_], y_f[y_to]; text _, x_f[_], 20-5 }
|
103
|
+
textAlign :RIGHT, :CENTER; y_enum.each{ |_| line x_f[x_from], y_f[_], x_f[x_to], y_f[_]; text _, x_f[x_from]-5, y_f[_] }
|
104
|
+
stroke 0
|
105
|
+
data.each{ |x,y| point x_f[x], y_f[y] }
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
def plot_bar data
|
110
|
+
cls = data.values.flat_map(&:keys).uniq.sort
|
111
|
+
size = cls.size + 1
|
112
|
+
from, to = data.keys.minmax
|
113
|
+
max = data.values.flat_map(&:values).max
|
114
|
+
P5 500, 500 do
|
115
|
+
setup do
|
116
|
+
noStroke
|
117
|
+
textAlign :CENTER
|
118
|
+
cls.each_with_index{ |_, i| text _, 50+400/(size-2)*i, 25, fill: %w{ red green blue }[i] }
|
119
|
+
textAlign :RIGHT, :TOP
|
120
|
+
(from..to).each do |date|
|
121
|
+
y = map date.ajd.to_i, from.ajd.to_i, to.ajd.to_i, 50, 450
|
122
|
+
text date.strftime("%m-%d"), 45, y
|
123
|
+
rect 50, y, map(data.fetch(date,{})[cls[0]]||0, 0, max, 0, 400), 400/(to-from)/size, fill: "red"
|
124
|
+
rect 50, "#{y}+#{400/(to-from)/size}", map(data.fetch(date,{})[cls[1]]||0, 0, max, 0, 400), 400/(to-from)/size, fill: "green"
|
125
|
+
rect 50, "#{y}+#{800/(to-from)/size}", map(data.fetch(date,{})[cls[2]]||0, 0, max, 0, 400), 400/(to-from)/size, fill: "blue"
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
63
130
|
end
|
64
131
|
end
|
65
132
|
|
66
133
|
def P5 width, height, &block
|
67
|
-
P5.module_eval &block
|
134
|
+
::P5.module_eval &block
|
68
135
|
<<~HEREDOC
|
69
136
|
<html>
|
70
137
|
<head>
|
@@ -73,17 +140,17 @@ def P5 width, height, &block
|
|
73
140
|
function setup() {
|
74
141
|
createCanvas(#{width}, #{height});
|
75
142
|
#{
|
76
|
-
P5.buffer_setup.join(";\n").gsub(/^/, ?\s*
|
143
|
+
::P5.buffer_setup.join(";\n").gsub(/^/, ?\s*12)
|
77
144
|
}
|
78
145
|
}
|
79
146
|
function draw() {
|
80
147
|
#{
|
81
|
-
P5.buffer_draw.join(";\n").gsub(/^/, ?\s*
|
148
|
+
::P5.buffer_draw.join(";\n").gsub(/^/, ?\s*12)
|
82
149
|
}
|
83
150
|
}
|
84
151
|
</script>
|
85
152
|
</head>
|
86
|
-
<body><main></main></body>
|
153
|
+
<body style="margin: 0"><main></main></body>
|
87
154
|
</html>
|
88
155
|
HEREDOC
|
89
156
|
end
|
data/p5rb.gemspec
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: p5rb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Victor Maslov aka Nakilon
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-12-08 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description:
|
14
14
|
email: nakilon@gmail.com
|
@@ -39,8 +39,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
requirements: []
|
42
|
-
|
43
|
-
rubygems_version: 2.5.2.3
|
42
|
+
rubygems_version: 3.3.25
|
44
43
|
signing_key:
|
45
44
|
specification_version: 4
|
46
45
|
summary: Ruby DSL for p5.js
|