postscript 0.1.0 → 0.2.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 +4 -4
- data/.rubocop.yml +19 -0
- data/.rubocop_todo.yml +323 -0
- data/CHANGELOG.md +71 -0
- data/LICENSE +24 -0
- data/exe/postscript +7 -0
- data/lib/postscript/cli.rb +83 -0
- data/lib/postscript/color.rb +6 -4
- data/lib/postscript/format_number.rb +4 -1
- data/lib/postscript/model/operator.rb +1 -1
- data/lib/postscript/model/operators/arithmetic.rb +30 -0
- data/lib/postscript/model/operators/boolean.rb +23 -11
- data/lib/postscript/model/operators/color.rb +8 -0
- data/lib/postscript/model/operators/container.rb +24 -0
- data/lib/postscript/model/operators/control_flow.rb +16 -1
- data/lib/postscript/model/operators/dictionary.rb +8 -0
- data/lib/postscript/model/operators/font.rb +14 -0
- data/lib/postscript/model/operators/graphics_state.rb +10 -0
- data/lib/postscript/model/operators/path.rb +16 -0
- data/lib/postscript/model/operators/stack.rb +4 -0
- data/lib/postscript/model/operators/transformations.rb +11 -1
- data/lib/postscript/model/program.rb +2 -2
- data/lib/postscript/serializer.rb +32 -212
- data/lib/postscript/source/ast_builder.rb +30 -22
- data/lib/postscript/source/lexer.rb +18 -21
- data/lib/postscript/version.rb +1 -1
- data/lib/postscript.rb +30 -0
- metadata +29 -6
- data/postscript.gemspec +0 -37
|
@@ -31,11 +31,13 @@ module Postscript
|
|
|
31
31
|
class Def < Operator
|
|
32
32
|
register_as "def", consumes: 2, produces: 0
|
|
33
33
|
attr_reader :key, :value
|
|
34
|
+
|
|
34
35
|
def initialize(key:, value:)
|
|
35
36
|
@key = key
|
|
36
37
|
@value = value
|
|
37
38
|
freeze
|
|
38
39
|
end
|
|
40
|
+
|
|
39
41
|
def self.from_operands(stack)
|
|
40
42
|
value = stack.pop
|
|
41
43
|
key = stack.pop
|
|
@@ -46,10 +48,12 @@ module Postscript
|
|
|
46
48
|
class Load < Operator
|
|
47
49
|
register_as "load", consumes: 1, produces: 1
|
|
48
50
|
attr_reader :key
|
|
51
|
+
|
|
49
52
|
def initialize(key:)
|
|
50
53
|
@key = key
|
|
51
54
|
freeze
|
|
52
55
|
end
|
|
56
|
+
|
|
53
57
|
def self.from_operands(stack)
|
|
54
58
|
new(key: stack.pop)
|
|
55
59
|
end
|
|
@@ -58,11 +62,13 @@ module Postscript
|
|
|
58
62
|
class Store < Operator
|
|
59
63
|
register_as "store", consumes: 2, produces: 0
|
|
60
64
|
attr_reader :key, :value
|
|
65
|
+
|
|
61
66
|
def initialize(key:, value:)
|
|
62
67
|
@key = key
|
|
63
68
|
@value = value
|
|
64
69
|
freeze
|
|
65
70
|
end
|
|
71
|
+
|
|
66
72
|
def self.from_operands(stack)
|
|
67
73
|
value = stack.pop
|
|
68
74
|
key = stack.pop
|
|
@@ -78,6 +84,7 @@ module Postscript
|
|
|
78
84
|
new(key: key, dict: dict)
|
|
79
85
|
end
|
|
80
86
|
attr_reader :key, :dict
|
|
87
|
+
|
|
81
88
|
def initialize(key:, dict:)
|
|
82
89
|
@key = key
|
|
83
90
|
@dict = dict
|
|
@@ -107,6 +114,7 @@ module Postscript
|
|
|
107
114
|
new(operand: stack.pop)
|
|
108
115
|
end
|
|
109
116
|
attr_reader :operand
|
|
117
|
+
|
|
110
118
|
def initialize(operand:)
|
|
111
119
|
@operand = operand
|
|
112
120
|
freeze
|
|
@@ -14,10 +14,12 @@ module Postscript
|
|
|
14
14
|
class Findfont < Operator
|
|
15
15
|
register_as "findfont", consumes: 1, produces: 1
|
|
16
16
|
attr_reader :name
|
|
17
|
+
|
|
17
18
|
def initialize(name:)
|
|
18
19
|
@name = name
|
|
19
20
|
freeze
|
|
20
21
|
end
|
|
22
|
+
|
|
21
23
|
def self.from_operands(stack)
|
|
22
24
|
new(name: stack.pop)
|
|
23
25
|
end
|
|
@@ -27,11 +29,13 @@ module Postscript
|
|
|
27
29
|
class Scalefont < Operator
|
|
28
30
|
register_as "scalefont", consumes: 2, produces: 1
|
|
29
31
|
attr_reader :font, :size
|
|
32
|
+
|
|
30
33
|
def initialize(font:, size:)
|
|
31
34
|
@font = font
|
|
32
35
|
@size = size
|
|
33
36
|
freeze
|
|
34
37
|
end
|
|
38
|
+
|
|
35
39
|
def self.from_operands(stack)
|
|
36
40
|
size = stack.pop_number
|
|
37
41
|
font = stack.pop
|
|
@@ -43,10 +47,12 @@ module Postscript
|
|
|
43
47
|
class Setfont < Operator
|
|
44
48
|
register_as "setfont", consumes: 1, produces: 0
|
|
45
49
|
attr_reader :font
|
|
50
|
+
|
|
46
51
|
def initialize(font:)
|
|
47
52
|
@font = font
|
|
48
53
|
freeze
|
|
49
54
|
end
|
|
55
|
+
|
|
50
56
|
def self.from_operands(stack)
|
|
51
57
|
new(font: stack.pop)
|
|
52
58
|
end
|
|
@@ -56,10 +62,12 @@ module Postscript
|
|
|
56
62
|
class Show < Operator
|
|
57
63
|
register_as "show", consumes: 1, produces: 0
|
|
58
64
|
attr_reader :text
|
|
65
|
+
|
|
59
66
|
def initialize(text:)
|
|
60
67
|
@text = text
|
|
61
68
|
freeze
|
|
62
69
|
end
|
|
70
|
+
|
|
63
71
|
def self.from_operands(stack)
|
|
64
72
|
new(text: stack.pop)
|
|
65
73
|
end
|
|
@@ -70,12 +78,14 @@ module Postscript
|
|
|
70
78
|
class Xyshow < Operator
|
|
71
79
|
register_as "xyshow"
|
|
72
80
|
attr_reader :text, :dx, :dy
|
|
81
|
+
|
|
73
82
|
def initialize(text:, dx:, dy:)
|
|
74
83
|
@text = text
|
|
75
84
|
@dx = dx
|
|
76
85
|
@dy = dy
|
|
77
86
|
freeze
|
|
78
87
|
end
|
|
88
|
+
|
|
79
89
|
def self.from_operands(stack)
|
|
80
90
|
dy = stack.pop
|
|
81
91
|
dx = stack.pop
|
|
@@ -90,10 +100,12 @@ module Postscript
|
|
|
90
100
|
class Stringwidth < Operator
|
|
91
101
|
register_as "stringwidth"
|
|
92
102
|
attr_reader :text
|
|
103
|
+
|
|
93
104
|
def initialize(text:)
|
|
94
105
|
@text = text
|
|
95
106
|
freeze
|
|
96
107
|
end
|
|
108
|
+
|
|
97
109
|
def self.from_operands(stack)
|
|
98
110
|
new(text: stack.pop)
|
|
99
111
|
end
|
|
@@ -104,11 +116,13 @@ module Postscript
|
|
|
104
116
|
class Charpath < Operator
|
|
105
117
|
register_as "charpath"
|
|
106
118
|
attr_reader :text, :stroke
|
|
119
|
+
|
|
107
120
|
def initialize(text:, stroke:)
|
|
108
121
|
@text = text
|
|
109
122
|
@stroke = stroke
|
|
110
123
|
freeze
|
|
111
124
|
end
|
|
125
|
+
|
|
112
126
|
def self.from_operands(stack)
|
|
113
127
|
stroke = stack.pop
|
|
114
128
|
text = stack.pop
|
|
@@ -19,10 +19,12 @@ module Postscript
|
|
|
19
19
|
class Setlinewidth < Operator
|
|
20
20
|
register_as "setlinewidth"
|
|
21
21
|
attr_reader :width
|
|
22
|
+
|
|
22
23
|
def initialize(width:)
|
|
23
24
|
@width = width
|
|
24
25
|
freeze
|
|
25
26
|
end
|
|
27
|
+
|
|
26
28
|
def self.from_operands(stack)
|
|
27
29
|
new(width: stack.pop_number)
|
|
28
30
|
end
|
|
@@ -31,10 +33,12 @@ module Postscript
|
|
|
31
33
|
class Setlinecap < Operator
|
|
32
34
|
register_as "setlinecap"
|
|
33
35
|
attr_reader :cap_code
|
|
36
|
+
|
|
34
37
|
def initialize(cap_code:)
|
|
35
38
|
@cap_code = cap_code.to_i
|
|
36
39
|
freeze
|
|
37
40
|
end
|
|
41
|
+
|
|
38
42
|
def self.from_operands(stack)
|
|
39
43
|
new(cap_code: stack.pop_number.to_i)
|
|
40
44
|
end
|
|
@@ -43,10 +47,12 @@ module Postscript
|
|
|
43
47
|
class Setlinejoin < Operator
|
|
44
48
|
register_as "setlinejoin"
|
|
45
49
|
attr_reader :join_code
|
|
50
|
+
|
|
46
51
|
def initialize(join_code:)
|
|
47
52
|
@join_code = join_code.to_i
|
|
48
53
|
freeze
|
|
49
54
|
end
|
|
55
|
+
|
|
50
56
|
def self.from_operands(stack)
|
|
51
57
|
new(join_code: stack.pop_number.to_i)
|
|
52
58
|
end
|
|
@@ -55,10 +61,12 @@ module Postscript
|
|
|
55
61
|
class Setmiterlimit < Operator
|
|
56
62
|
register_as "setmiterlimit"
|
|
57
63
|
attr_reader :limit
|
|
64
|
+
|
|
58
65
|
def initialize(limit:)
|
|
59
66
|
@limit = limit
|
|
60
67
|
freeze
|
|
61
68
|
end
|
|
69
|
+
|
|
62
70
|
def self.from_operands(stack)
|
|
63
71
|
new(limit: stack.pop_number)
|
|
64
72
|
end
|
|
@@ -67,11 +75,13 @@ module Postscript
|
|
|
67
75
|
class Setdash < Operator
|
|
68
76
|
register_as "setdash"
|
|
69
77
|
attr_reader :pattern, :offset
|
|
78
|
+
|
|
70
79
|
def initialize(pattern:, offset:)
|
|
71
80
|
@pattern = pattern
|
|
72
81
|
@offset = offset
|
|
73
82
|
freeze
|
|
74
83
|
end
|
|
84
|
+
|
|
75
85
|
def self.from_operands(stack)
|
|
76
86
|
offset = stack.pop_number
|
|
77
87
|
pattern = stack.pop
|
|
@@ -11,11 +11,13 @@ module Postscript
|
|
|
11
11
|
class Moveto < Operator
|
|
12
12
|
register_as "moveto"
|
|
13
13
|
attr_reader :x, :y
|
|
14
|
+
|
|
14
15
|
def initialize(x:, y:)
|
|
15
16
|
@x = x
|
|
16
17
|
@y = y
|
|
17
18
|
freeze
|
|
18
19
|
end
|
|
20
|
+
|
|
19
21
|
def self.from_operands(stack)
|
|
20
22
|
y = stack.pop_number
|
|
21
23
|
x = stack.pop_number
|
|
@@ -26,11 +28,13 @@ module Postscript
|
|
|
26
28
|
class Rmoveto < Operator
|
|
27
29
|
register_as "rmoveto"
|
|
28
30
|
attr_reader :dx, :dy
|
|
31
|
+
|
|
29
32
|
def initialize(dx:, dy:)
|
|
30
33
|
@dx = dx
|
|
31
34
|
@dy = dy
|
|
32
35
|
freeze
|
|
33
36
|
end
|
|
37
|
+
|
|
34
38
|
def self.from_operands(stack)
|
|
35
39
|
dy = stack.pop_number
|
|
36
40
|
dx = stack.pop_number
|
|
@@ -41,11 +45,13 @@ module Postscript
|
|
|
41
45
|
class Lineto < Operator
|
|
42
46
|
register_as "lineto"
|
|
43
47
|
attr_reader :x, :y
|
|
48
|
+
|
|
44
49
|
def initialize(x:, y:)
|
|
45
50
|
@x = x
|
|
46
51
|
@y = y
|
|
47
52
|
freeze
|
|
48
53
|
end
|
|
54
|
+
|
|
49
55
|
def self.from_operands(stack)
|
|
50
56
|
y = stack.pop_number
|
|
51
57
|
x = stack.pop_number
|
|
@@ -56,11 +62,13 @@ module Postscript
|
|
|
56
62
|
class Rlineto < Operator
|
|
57
63
|
register_as "rlineto"
|
|
58
64
|
attr_reader :dx, :dy
|
|
65
|
+
|
|
59
66
|
def initialize(dx:, dy:)
|
|
60
67
|
@dx = dx
|
|
61
68
|
@dy = dy
|
|
62
69
|
freeze
|
|
63
70
|
end
|
|
71
|
+
|
|
64
72
|
def self.from_operands(stack)
|
|
65
73
|
dy = stack.pop_number
|
|
66
74
|
dx = stack.pop_number
|
|
@@ -71,6 +79,7 @@ module Postscript
|
|
|
71
79
|
class Curveto < Operator
|
|
72
80
|
register_as "curveto"
|
|
73
81
|
attr_reader :x1, :y1, :x2, :y2, :x3, :y3
|
|
82
|
+
|
|
74
83
|
def initialize(x1:, y1:, x2:, y2:, x3:, y3:)
|
|
75
84
|
@x1 = x1
|
|
76
85
|
@y1 = y1
|
|
@@ -80,6 +89,7 @@ module Postscript
|
|
|
80
89
|
@y3 = y3
|
|
81
90
|
freeze
|
|
82
91
|
end
|
|
92
|
+
|
|
83
93
|
def self.from_operands(stack)
|
|
84
94
|
y3 = stack.pop_number
|
|
85
95
|
x3 = stack.pop_number
|
|
@@ -94,6 +104,7 @@ module Postscript
|
|
|
94
104
|
class Rcurveto < Operator
|
|
95
105
|
register_as "rcurveto"
|
|
96
106
|
attr_reader :dx1, :dy1, :dx2, :dy2, :dx3, :dy3
|
|
107
|
+
|
|
97
108
|
def initialize(dx1:, dy1:, dx2:, dy2:, dx3:, dy3:)
|
|
98
109
|
@dx1 = dx1
|
|
99
110
|
@dy1 = dy1
|
|
@@ -103,6 +114,7 @@ module Postscript
|
|
|
103
114
|
@dy3 = dy3
|
|
104
115
|
freeze
|
|
105
116
|
end
|
|
117
|
+
|
|
106
118
|
def self.from_operands(stack)
|
|
107
119
|
dy3 = stack.pop_number
|
|
108
120
|
dx3 = stack.pop_number
|
|
@@ -117,6 +129,7 @@ module Postscript
|
|
|
117
129
|
class Arc < Operator
|
|
118
130
|
register_as "arc"
|
|
119
131
|
attr_reader :x, :y, :radius, :angle1, :angle2
|
|
132
|
+
|
|
120
133
|
def initialize(x:, y:, radius:, angle1:, angle2:)
|
|
121
134
|
@x = x
|
|
122
135
|
@y = y
|
|
@@ -125,6 +138,7 @@ module Postscript
|
|
|
125
138
|
@angle2 = angle2
|
|
126
139
|
freeze
|
|
127
140
|
end
|
|
141
|
+
|
|
128
142
|
def self.from_operands(stack)
|
|
129
143
|
angle2 = stack.pop_number
|
|
130
144
|
angle1 = stack.pop_number
|
|
@@ -138,6 +152,7 @@ module Postscript
|
|
|
138
152
|
class Arcn < Operator
|
|
139
153
|
register_as "arcn"
|
|
140
154
|
attr_reader :x, :y, :radius, :angle1, :angle2
|
|
155
|
+
|
|
141
156
|
def initialize(x:, y:, radius:, angle1:, angle2:)
|
|
142
157
|
@x = x
|
|
143
158
|
@y = y
|
|
@@ -146,6 +161,7 @@ module Postscript
|
|
|
146
161
|
@angle2 = angle2
|
|
147
162
|
freeze
|
|
148
163
|
end
|
|
164
|
+
|
|
149
165
|
def self.from_operands(stack)
|
|
150
166
|
angle2 = stack.pop_number
|
|
151
167
|
angle1 = stack.pop_number
|
|
@@ -35,10 +35,12 @@ module Postscript
|
|
|
35
35
|
class Index < Operator
|
|
36
36
|
register_as "index", consumes: 1, produces: 1
|
|
37
37
|
attr_reader :index
|
|
38
|
+
|
|
38
39
|
def initialize(index:)
|
|
39
40
|
@index = index
|
|
40
41
|
freeze
|
|
41
42
|
end
|
|
43
|
+
|
|
42
44
|
def self.from_operands(stack)
|
|
43
45
|
new(index: stack.pop_number.to_i)
|
|
44
46
|
end
|
|
@@ -47,11 +49,13 @@ module Postscript
|
|
|
47
49
|
class Roll < Operator
|
|
48
50
|
register_as "roll", consumes: 2, produces: 0
|
|
49
51
|
attr_reader :count, :positions
|
|
52
|
+
|
|
50
53
|
def initialize(count:, positions:)
|
|
51
54
|
@count = count
|
|
52
55
|
@positions = positions
|
|
53
56
|
freeze
|
|
54
57
|
end
|
|
58
|
+
|
|
55
59
|
def self.from_operands(stack)
|
|
56
60
|
positions = stack.pop_number.to_i
|
|
57
61
|
count = stack.pop_number.to_i
|
|
@@ -7,11 +7,13 @@ module Postscript
|
|
|
7
7
|
class Translate < Operator
|
|
8
8
|
register_as "translate"
|
|
9
9
|
attr_reader :tx, :ty
|
|
10
|
+
|
|
10
11
|
def initialize(tx:, ty:)
|
|
11
12
|
@tx = tx
|
|
12
13
|
@ty = ty
|
|
13
14
|
freeze
|
|
14
15
|
end
|
|
16
|
+
|
|
15
17
|
def self.from_operands(stack)
|
|
16
18
|
ty = stack.pop_number
|
|
17
19
|
tx = stack.pop_number
|
|
@@ -22,11 +24,13 @@ module Postscript
|
|
|
22
24
|
class Scale < Operator
|
|
23
25
|
register_as "scale"
|
|
24
26
|
attr_reader :sx, :sy
|
|
27
|
+
|
|
25
28
|
def initialize(sx:, sy:)
|
|
26
29
|
@sx = sx
|
|
27
30
|
@sy = sy
|
|
28
31
|
freeze
|
|
29
32
|
end
|
|
33
|
+
|
|
30
34
|
def self.from_operands(stack)
|
|
31
35
|
sy = stack.pop_number
|
|
32
36
|
sx = stack.pop_number
|
|
@@ -37,10 +41,12 @@ module Postscript
|
|
|
37
41
|
class Rotate < Operator
|
|
38
42
|
register_as "rotate"
|
|
39
43
|
attr_reader :angle
|
|
44
|
+
|
|
40
45
|
def initialize(angle:)
|
|
41
46
|
@angle = angle
|
|
42
47
|
freeze
|
|
43
48
|
end
|
|
49
|
+
|
|
44
50
|
def self.from_operands(stack)
|
|
45
51
|
new(angle: stack.pop_number)
|
|
46
52
|
end
|
|
@@ -49,17 +55,19 @@ module Postscript
|
|
|
49
55
|
class Concat < Operator
|
|
50
56
|
register_as "concat"
|
|
51
57
|
attr_reader :matrix
|
|
58
|
+
|
|
52
59
|
def initialize(matrix:)
|
|
53
60
|
@matrix = matrix
|
|
54
61
|
freeze
|
|
55
62
|
end
|
|
63
|
+
|
|
56
64
|
def self.from_operands(stack)
|
|
57
65
|
new(matrix: stack.pop)
|
|
58
66
|
end
|
|
59
67
|
end
|
|
60
68
|
|
|
61
69
|
class Matrix < Operator
|
|
62
|
-
register_as "matrix"
|
|
70
|
+
register_as "matrix", consumes: 0, produces: 1
|
|
63
71
|
end
|
|
64
72
|
|
|
65
73
|
class Currentmatrix < Operator
|
|
@@ -69,10 +77,12 @@ module Postscript
|
|
|
69
77
|
class Setmatrix < Operator
|
|
70
78
|
register_as "setmatrix"
|
|
71
79
|
attr_reader :matrix
|
|
80
|
+
|
|
72
81
|
def initialize(matrix:)
|
|
73
82
|
@matrix = matrix
|
|
74
83
|
freeze
|
|
75
84
|
end
|
|
85
|
+
|
|
76
86
|
def self.from_operands(stack)
|
|
77
87
|
new(matrix: stack.pop)
|
|
78
88
|
end
|
|
@@ -51,7 +51,7 @@ module Postscript
|
|
|
51
51
|
end
|
|
52
52
|
|
|
53
53
|
def with(**overrides)
|
|
54
|
-
Header.new(**to_h
|
|
54
|
+
Header.new(**to_h, **overrides)
|
|
55
55
|
end
|
|
56
56
|
|
|
57
57
|
def to_h
|
|
@@ -59,7 +59,7 @@ module Postscript
|
|
|
59
59
|
bounding_box: bounding_box, hires_bounding_box: hires_bounding_box,
|
|
60
60
|
title: title, creator: creator, creation_date: creation_date,
|
|
61
61
|
pages: pages, page_count: page_count, epsf: epsf,
|
|
62
|
-
language_level: language_level, custom: custom
|
|
62
|
+
language_level: language_level, custom: custom
|
|
63
63
|
}
|
|
64
64
|
end
|
|
65
65
|
end
|