origami-docspring 2.2.0 → 2.3.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.
Files changed (118) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +18 -0
  3. data/examples/attachments/attachment.rb +7 -8
  4. data/examples/attachments/nested_document.rb +6 -5
  5. data/examples/encryption/encryption.rb +5 -4
  6. data/examples/events/events.rb +7 -6
  7. data/examples/flash/flash.rb +10 -9
  8. data/examples/forms/javascript.rb +14 -13
  9. data/examples/forms/xfa.rb +67 -66
  10. data/examples/javascript/hello_world.rb +6 -5
  11. data/examples/javascript/js_emulation.rb +26 -26
  12. data/examples/loop/goto.rb +12 -11
  13. data/examples/loop/named.rb +17 -16
  14. data/examples/signature/signature.rb +11 -11
  15. data/examples/uri/javascript.rb +25 -24
  16. data/examples/uri/open-uri.rb +5 -4
  17. data/examples/uri/submitform.rb +11 -10
  18. data/lib/origami/3d.rb +330 -334
  19. data/lib/origami/acroform.rb +267 -268
  20. data/lib/origami/actions.rb +266 -278
  21. data/lib/origami/annotations.rb +659 -670
  22. data/lib/origami/array.rb +192 -196
  23. data/lib/origami/boolean.rb +66 -70
  24. data/lib/origami/catalog.rb +360 -363
  25. data/lib/origami/collections.rb +132 -133
  26. data/lib/origami/compound.rb +125 -129
  27. data/lib/origami/destinations.rb +226 -237
  28. data/lib/origami/dictionary.rb +155 -154
  29. data/lib/origami/encryption.rb +967 -923
  30. data/lib/origami/extensions/fdf.rb +270 -275
  31. data/lib/origami/extensions/ppklite.rb +323 -328
  32. data/lib/origami/filespec.rb +170 -173
  33. data/lib/origami/filters/ascii.rb +162 -167
  34. data/lib/origami/filters/ccitt/tables.rb +248 -252
  35. data/lib/origami/filters/ccitt.rb +309 -312
  36. data/lib/origami/filters/crypt.rb +31 -34
  37. data/lib/origami/filters/dct.rb +47 -50
  38. data/lib/origami/filters/flate.rb +57 -60
  39. data/lib/origami/filters/jbig2.rb +50 -53
  40. data/lib/origami/filters/jpx.rb +40 -43
  41. data/lib/origami/filters/lzw.rb +151 -155
  42. data/lib/origami/filters/predictors.rb +250 -255
  43. data/lib/origami/filters/runlength.rb +111 -115
  44. data/lib/origami/filters.rb +319 -325
  45. data/lib/origami/font.rb +173 -177
  46. data/lib/origami/functions.rb +62 -66
  47. data/lib/origami/graphics/colors.rb +203 -208
  48. data/lib/origami/graphics/instruction.rb +79 -81
  49. data/lib/origami/graphics/path.rb +141 -144
  50. data/lib/origami/graphics/patterns.rb +156 -160
  51. data/lib/origami/graphics/render.rb +51 -47
  52. data/lib/origami/graphics/state.rb +144 -142
  53. data/lib/origami/graphics/text.rb +185 -188
  54. data/lib/origami/graphics/xobject.rb +818 -804
  55. data/lib/origami/graphics.rb +25 -26
  56. data/lib/origami/header.rb +63 -65
  57. data/lib/origami/javascript.rb +718 -651
  58. data/lib/origami/linearization.rb +284 -285
  59. data/lib/origami/metadata.rb +156 -135
  60. data/lib/origami/name.rb +98 -100
  61. data/lib/origami/null.rb +49 -51
  62. data/lib/origami/numeric.rb +133 -135
  63. data/lib/origami/obfuscation.rb +180 -182
  64. data/lib/origami/object.rb +634 -631
  65. data/lib/origami/optionalcontent.rb +147 -149
  66. data/lib/origami/outline.rb +46 -48
  67. data/lib/origami/outputintents.rb +76 -77
  68. data/lib/origami/page.rb +637 -596
  69. data/lib/origami/parser.rb +214 -221
  70. data/lib/origami/parsers/fdf.rb +44 -45
  71. data/lib/origami/parsers/pdf/lazy.rb +147 -154
  72. data/lib/origami/parsers/pdf/linear.rb +104 -109
  73. data/lib/origami/parsers/pdf.rb +109 -107
  74. data/lib/origami/parsers/ppklite.rb +44 -46
  75. data/lib/origami/pdf.rb +886 -896
  76. data/lib/origami/reference.rb +116 -120
  77. data/lib/origami/signature.rb +617 -625
  78. data/lib/origami/stream.rb +560 -558
  79. data/lib/origami/string.rb +366 -368
  80. data/lib/origami/template/patterns.rb +50 -52
  81. data/lib/origami/template/widgets.rb +111 -114
  82. data/lib/origami/trailer.rb +153 -157
  83. data/lib/origami/tree.rb +55 -57
  84. data/lib/origami/version.rb +19 -19
  85. data/lib/origami/webcapture.rb +87 -90
  86. data/lib/origami/xfa/config.rb +409 -414
  87. data/lib/origami/xfa/connectionset.rb +113 -117
  88. data/lib/origami/xfa/datasets.rb +38 -42
  89. data/lib/origami/xfa/localeset.rb +33 -37
  90. data/lib/origami/xfa/package.rb +49 -52
  91. data/lib/origami/xfa/pdf.rb +54 -59
  92. data/lib/origami/xfa/signature.rb +33 -37
  93. data/lib/origami/xfa/sourceset.rb +34 -38
  94. data/lib/origami/xfa/stylesheet.rb +35 -39
  95. data/lib/origami/xfa/template.rb +1630 -1634
  96. data/lib/origami/xfa/xdc.rb +33 -37
  97. data/lib/origami/xfa/xfa.rb +132 -123
  98. data/lib/origami/xfa/xfdf.rb +34 -38
  99. data/lib/origami/xfa/xmpmeta.rb +34 -38
  100. data/lib/origami/xfa.rb +50 -53
  101. data/lib/origami/xreftable.rb +462 -462
  102. data/lib/origami.rb +37 -38
  103. data/test/test_actions.rb +22 -20
  104. data/test/test_annotations.rb +54 -52
  105. data/test/test_forms.rb +23 -21
  106. data/test/test_native_types.rb +82 -78
  107. data/test/test_object_tree.rb +25 -24
  108. data/test/test_pages.rb +43 -41
  109. data/test/test_pdf.rb +2 -0
  110. data/test/test_pdf_attachment.rb +23 -21
  111. data/test/test_pdf_create.rb +16 -15
  112. data/test/test_pdf_encrypt.rb +69 -66
  113. data/test/test_pdf_parse.rb +131 -129
  114. data/test/test_pdf_parse_lazy.rb +53 -53
  115. data/test/test_pdf_sign.rb +67 -67
  116. data/test/test_streams.rb +145 -143
  117. data/test/test_xrefs.rb +46 -45
  118. metadata +64 -8
data/lib/origami/array.rb CHANGED
@@ -1,242 +1,238 @@
1
- =begin
1
+ # frozen_string_literal: true
2
+
3
+ #
4
+ # This file is part of Origami, PDF manipulation framework for Ruby
5
+ # Copyright (C) 2016 Guillaume Delugré.
6
+ #
7
+ # Origami is free software: you can redistribute it and/or modify
8
+ # it under the terms of the GNU Lesser General Public License as published by
9
+ # the Free Software Foundation, either version 3 of the License, or
10
+ # (at your option) any later version.
11
+ #
12
+ # Origami is distributed in the hope that it will be useful,
13
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ # GNU Lesser General Public License for more details.
16
+ #
17
+ # You should have received a copy of the GNU Lesser General Public License
18
+ # along with Origami. If not, see <http://www.gnu.org/licenses/>.
19
+ #
2
20
 
3
- This file is part of Origami, PDF manipulation framework for Ruby
4
- Copyright (C) 2016 Guillaume Delugré.
21
+ module Origami
22
+ class InvalidArrayObjectError < InvalidObjectError # :nodoc:
23
+ end
24
+
25
+ #
26
+ # Class representing an Array Object.
27
+ # Arrays contain a set of Object.
28
+ #
29
+ class Array < ::Array
30
+ include CompoundObject
31
+ using TypeConversion
32
+
33
+ TOKENS = %w{[ ]} # :nodoc:
34
+ @@regexp_open = Regexp.new(WHITESPACES + Regexp.escape(TOKENS.first) + WHITESPACES)
35
+ @@regexp_close = Regexp.new(WHITESPACES + Regexp.escape(TOKENS.last) + WHITESPACES)
36
+
37
+ #
38
+ # Creates a new PDF Array Object.
39
+ # _data_:: An array of objects.
40
+ #
41
+ def initialize(data = [], parser = nil, hint_type: nil)
42
+ raise TypeError, "Expected type Array, received #{data.class}." unless data.is_a?(::Array)
43
+ super()
44
+
45
+ data.each_with_index do |value, index|
46
+ value = value.to_o
47
+
48
+ if Origami::OPTIONS[:enable_type_guessing]
49
+ index_type = hint_type.is_a?(::Array) ? hint_type[index % hint_type.size] : hint_type
50
+ if index_type.is_a?(::Array) && !value.is_a?(Reference)
51
+ index_type = index_type.find { |type| type < value.class }
52
+ end
53
+
54
+ if index_type.is_a?(Class) && (index_type < value.class)
55
+ value = value.cast_to(index_type, parser)
56
+ end
57
+
58
+ if index_type && parser && Origami::OPTIONS[:enable_type_propagation]
59
+ if value.is_a?(Reference)
60
+ parser.defer_type_cast(value, index_type)
61
+ end
62
+ end
63
+ end
64
+
65
+ push(value)
66
+ end
67
+ end
5
68
 
6
- Origami is free software: you can redistribute it and/or modify
7
- it under the terms of the GNU Lesser General Public License as published by
8
- the Free Software Foundation, either version 3 of the License, or
9
- (at your option) any later version.
69
+ def pre_build
70
+ map!(&:to_o)
10
71
 
11
- Origami is distributed in the hope that it will be useful,
12
- but WITHOUT ANY WARRANTY; without even the implied warranty of
13
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
- GNU Lesser General Public License for more details.
72
+ super
73
+ end
15
74
 
16
- You should have received a copy of the GNU Lesser General Public License
17
- along with Origami. If not, see <http://www.gnu.org/licenses/>.
75
+ def self.parse(stream, parser = nil, hint_type: nil) # :nodoc:
76
+ scanner = Parser.init_scanner(stream)
77
+ offset = scanner.pos
78
+ data = []
18
79
 
19
- =end
80
+ if !scanner.skip(@@regexp_open)
81
+ raise InvalidArrayObjectError, "No token '#{TOKENS.first}' found"
82
+ end
20
83
 
84
+ while scanner.skip(@@regexp_close).nil?
85
+ type = Object.typeof(scanner)
86
+ raise InvalidArrayObjectError, "Bad embedded object format" if type.nil?
21
87
 
22
- module Origami
88
+ value = type.parse(scanner, parser)
89
+ data << value
90
+ end
23
91
 
24
- class InvalidArrayObjectError < InvalidObjectError #:nodoc:
92
+ array = Array.new(data, parser, hint_type: hint_type)
93
+ array.file_offset = offset
94
+
95
+ array
25
96
  end
26
97
 
27
98
  #
28
- # Class representing an Array Object.
29
- # Arrays contain a set of Object.
99
+ # Converts self into a Ruby array.
30
100
  #
31
- class Array < ::Array
32
- include CompoundObject
33
- using TypeConversion
34
-
35
- TOKENS = %w{ [ ] } #:nodoc:
36
- @@regexp_open = Regexp.new(WHITESPACES + Regexp.escape(TOKENS.first) + WHITESPACES)
37
- @@regexp_close = Regexp.new(WHITESPACES + Regexp.escape(TOKENS.last) + WHITESPACES)
38
-
39
- #
40
- # Creates a new PDF Array Object.
41
- # _data_:: An array of objects.
42
- #
43
- def initialize(data = [], parser = nil, hint_type: nil)
44
- raise TypeError, "Expected type Array, received #{data.class}." unless data.is_a?(::Array)
45
- super()
46
-
47
- data.each_with_index do |value, index|
48
- value = value.to_o
49
-
50
- if Origami::OPTIONS[:enable_type_guessing]
51
- index_type = hint_type.is_a?(::Array) ? hint_type[index % hint_type.size] : hint_type
52
- if index_type.is_a?(::Array) and not value.is_a?(Reference)
53
- index_type = index_type.find {|type| type < value.class }
54
- end
55
-
56
- if index_type.is_a?(Class) and index_type < value.class
57
- value = value.cast_to(index_type, parser)
58
- end
59
-
60
- if index_type and parser and Origami::OPTIONS[:enable_type_propagation]
61
- if value.is_a?(Reference)
62
- parser.defer_type_cast(value, index_type)
63
- end
64
- end
65
- end
66
-
67
- self.push(value)
68
- end
69
- end
101
+ def to_a
102
+ super.map(&:value)
103
+ end
104
+ alias_method :value, :to_a
105
+
106
+ alias_method :each_value, :each
70
107
 
71
- def pre_build
72
- self.map!(&:to_o)
108
+ def to_s(eol: $/) # :nodoc:
109
+ content = TOKENS.first.dup
110
+ content << map { |entry|
111
+ entry = entry.to_o
73
112
 
74
- super
113
+ case entry
114
+ when Dictionary # Do not indent dictionaries inside of arrays.
115
+ entry.to_s(indent: 0, eol: eol)
116
+ else
117
+ entry.to_s(eol: eol)
75
118
  end
119
+ }.join(' ')
120
+ content << TOKENS.last
76
121
 
77
- def self.parse(stream, parser = nil, hint_type: nil) #:nodoc:
78
- scanner = Parser.init_scanner(stream)
79
- offset = scanner.pos
80
- data = []
122
+ super(content, eol: eol)
123
+ end
81
124
 
82
- if not scanner.skip(@@regexp_open)
83
- raise InvalidArrayObjectError, "No token '#{TOKENS.first}' found"
84
- end
125
+ def +(other)
126
+ a = Origami::Array.new(to_a + other.to_a)
127
+ a.no, a.generation = @no, @generation
85
128
 
86
- while scanner.skip(@@regexp_close).nil? do
87
- type = Object.typeof(scanner)
88
- raise InvalidArrayObjectError, "Bad embedded object format" if type.nil?
129
+ a
130
+ end
89
131
 
90
- value = type.parse(scanner, parser)
91
- data << value
92
- end
132
+ def <<(item)
133
+ super(link_object(item))
134
+ end
93
135
 
94
- array = Array.new(data, parser, hint_type: hint_type)
95
- array.file_offset = offset
136
+ def push(*items)
137
+ items.each { |item| self << item }
138
+ end
96
139
 
97
- array
98
- end
140
+ def []=(index, item)
141
+ super(index, link_object(item))
142
+ end
99
143
 
100
- #
101
- # Converts self into a Ruby array.
102
- #
103
- def to_a
104
- super.map(&:value)
105
- end
106
- alias value to_a
144
+ def insert(index, *items)
145
+ items.reverse_each do |item|
146
+ super(index, link_object(item))
147
+ end
107
148
 
108
- alias each_value each
149
+ self
150
+ end
109
151
 
110
- def to_s(eol: $/) #:nodoc:
111
- content = TOKENS.first.dup
112
- content << self.map {|entry|
113
- entry = entry.to_o
152
+ def concat(*arys)
153
+ push(*arys.flatten)
154
+ end
114
155
 
115
- case entry
116
- when Dictionary # Do not indent dictionaries inside of arrays.
117
- entry.to_s(indent: 0, eol: eol)
118
- else
119
- entry.to_s(eol: eol)
120
- end
121
- }.join(' ')
122
- content << TOKENS.last
156
+ #
157
+ # Parameterized Array class with additional typing information.
158
+ # Example: Array.of(Integer)
159
+ #
160
+ def self.of(klass, *klasses, length: nil)
161
+ Class.new(self) do
162
+ const_set('ARRAY_TYPE', (klasses.empty? && !klass.is_a?(::Array)) ? klass : [klass].concat(klasses))
163
+ const_set('STATIC_LENGTH', length)
123
164
 
124
- super(content, eol: eol)
165
+ def initialize(data = [], parser = nil)
166
+ super(data, parser, hint_type: self.class.const_get('ARRAY_TYPE'))
125
167
  end
126
168
 
127
- def +(other)
128
- a = Origami::Array.new(self.to_a + other.to_a)
129
- a.no, a.generation = @no, @generation
169
+ def pre_build # :nodoc:
170
+ do_type_check if Origami::OPTIONS[:enable_type_checking]
130
171
 
131
- a
172
+ super
132
173
  end
133
174
 
134
- def <<(item)
135
- super link_object(item)
175
+ def self.parse(stream, parser = nil)
176
+ super(stream, parser, hint_type: const_get('ARRAY_TYPE'))
136
177
  end
137
178
 
138
- def push(*items)
139
- items.each {|item| self << item }
140
- end
141
-
142
- def []=(index, item)
143
- super(index, link_object(item))
144
- end
179
+ def do_type_check # :nodoc:
180
+ static_length = self.class.const_get('STATIC_LENGTH')
181
+ array_type = self.class.const_get('ARRAY_TYPE')
145
182
 
146
- def insert(index, *items)
147
- items.reverse_each do |item|
148
- super(index, link_object(item))
149
- end
183
+ if static_length && (self.length != static_length)
184
+ warn "Warning: object #{self.class.name} has unexpected length #{self.length} (should be #{static_length})"
185
+ end
150
186
 
151
- self
152
- end
187
+ each_with_index do |object, index|
188
+ index_type = array_type.is_a?(::Array) ? array_type[index % array_type.size] : array_type
153
189
 
154
- def concat(*arys)
155
- self.push(*arys.flatten)
156
- end
190
+ begin
191
+ object_value = object.solve
192
+ rescue InvalidReferenceError
193
+ warn "Warning: in object #{self.class}, invalid reference at index #{index}"
194
+ next
195
+ end
157
196
 
158
- #
159
- # Parameterized Array class with additional typing information.
160
- # Example: Array.of(Integer)
161
- #
162
- def self.of(klass, *klasses, length: nil)
163
- Class.new(self) do
164
- const_set('ARRAY_TYPE', (klasses.empty? and not klass.is_a?(::Array)) ? klass : [ klass ].concat(klasses))
165
- const_set('STATIC_LENGTH', length)
166
-
167
- def initialize(data = [], parser = nil)
168
- super(data, parser, hint_type: self.class.const_get('ARRAY_TYPE'))
169
- end
170
-
171
- def pre_build #:nodoc:
172
- do_type_check if Origami::OPTIONS[:enable_type_checking]
173
-
174
- super
175
- end
176
-
177
- def self.parse(stream, parser = nil)
178
- super(stream, parser, hint_type: const_get('ARRAY_TYPE'))
179
- end
180
-
181
- def do_type_check #:nodoc:
182
- static_length = self.class.const_get('STATIC_LENGTH')
183
- array_type = self.class.const_get('ARRAY_TYPE')
184
-
185
- if static_length and self.length != static_length
186
- STDERR.puts "Warning: object #{self.class.name} has unexpected length #{self.length} (should be #{static_length})"
187
- end
188
-
189
- self.each_with_index do |object, index|
190
- index_type = array_type.is_a?(::Array) ? array_type[index % array_type.size] : array_type
191
-
192
- begin
193
- object_value = object.solve
194
- rescue InvalidReferenceError
195
- STDERR.puts "Warning: in object #{self.class}, invalid reference at index #{index}"
196
- next
197
- end
198
-
199
- unless object_value.is_a?(index_type)
200
- STDERR.puts "Warning: object #{self.class.name || 'Array'} should be composed of #{index_type.name} at index #{index} (got #{object_value.type} instead)"
201
- end
202
- end
203
- end
197
+ unless object_value.is_a?(index_type)
198
+ warn "Warning: object #{self.class.name || "Array"} should be composed of #{index_type.name} at index #{index} (got #{object_value.type} instead)"
204
199
  end
200
+ end
205
201
  end
202
+ end
206
203
  end
207
-
208
- #
209
- # Class representing a location on a page or a bounding box.
210
- #
211
- class Rectangle < Array.of(Number, length: 4)
212
-
213
- def self.[](coords)
214
- corners =
215
- if [ :llx, :lly, :urx, :ury ].all? {|p| coords.include?(p)}
216
- coords.values_at(:llx, :lly, :urx, :ury)
217
- elsif [ :width, :height ].all? {|p| coords.include?(p)}
218
- width, height = coords.values_at(:width, :height)
219
- x = coords.fetch(:x, 0)
220
- y = coords.fetch(:y, 0)
221
- [ x, y, x+width, y+height ]
222
- else
223
- raise ArgumentError, "Bad arguments for #{self.class}: #{coords.inspect}"
224
- end
225
-
226
- unless corners.all? { |corner| corner.is_a?(Numeric) }
227
- raise TypeError, "All coords must be numbers"
228
- end
229
-
230
- Rectangle.new(corners)
204
+ end
205
+
206
+ #
207
+ # Class representing a location on a page or a bounding box.
208
+ #
209
+ class Rectangle < Array.of(Number, length: 4)
210
+ def self.[](coords)
211
+ corners =
212
+ if [:llx, :lly, :urx, :ury].all? { |p| coords.include?(p) }
213
+ coords.values_at(:llx, :lly, :urx, :ury)
214
+ elsif [:width, :height].all? { |p| coords.include?(p) }
215
+ width, height = coords.values_at(:width, :height)
216
+ x = coords.fetch(:x, 0)
217
+ y = coords.fetch(:y, 0)
218
+ [x, y, x + width, y + height]
219
+ else
220
+ raise ArgumentError, "Bad arguments for #{self.class}: #{coords.inspect}"
231
221
  end
232
222
 
233
- def width
234
- self[2] - self[0]
235
- end
223
+ unless corners.all? { |corner| corner.is_a?(Numeric) }
224
+ raise TypeError, "All coords must be numbers"
225
+ end
236
226
 
237
- def height
238
- self[3] - self[1]
239
- end
227
+ Rectangle.new(corners)
240
228
  end
241
229
 
230
+ def width
231
+ self[2] - self[0]
232
+ end
233
+
234
+ def height
235
+ self[3] - self[1]
236
+ end
237
+ end
242
238
  end
@@ -1,90 +1,86 @@
1
- =begin
2
-
3
- This file is part of Origami, PDF manipulation framework for Ruby
4
- Copyright (C) 2016 Guillaume Delugré.
5
-
6
- Origami is free software: you can redistribute it and/or modify
7
- it under the terms of the GNU Lesser General Public License as published by
8
- the Free Software Foundation, either version 3 of the License, or
9
- (at your option) any later version.
10
-
11
- Origami is distributed in the hope that it will be useful,
12
- but WITHOUT ANY WARRANTY; without even the implied warranty of
13
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
- GNU Lesser General Public License for more details.
15
-
16
- You should have received a copy of the GNU Lesser General Public License
17
- along with Origami. If not, see <http://www.gnu.org/licenses/>.
18
-
19
- =end
1
+ # frozen_string_literal: true
2
+
3
+ #
4
+ # This file is part of Origami, PDF manipulation framework for Ruby
5
+ # Copyright (C) 2016 Guillaume Delugré.
6
+ #
7
+ # Origami is free software: you can redistribute it and/or modify
8
+ # it under the terms of the GNU Lesser General Public License as published by
9
+ # the Free Software Foundation, either version 3 of the License, or
10
+ # (at your option) any later version.
11
+ #
12
+ # Origami is distributed in the hope that it will be useful,
13
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ # GNU Lesser General Public License for more details.
16
+ #
17
+ # You should have received a copy of the GNU Lesser General Public License
18
+ # along with Origami. If not, see <http://www.gnu.org/licenses/>.
19
+ #
20
20
 
21
21
  module Origami
22
+ class InvalidBooleanObjectError < InvalidObjectError # :nodoc:
23
+ end
22
24
 
23
- class InvalidBooleanObjectError < InvalidObjectError #:nodoc:
24
- end
25
+ #
26
+ # Class representing a Boolean Object.
27
+ # A Boolean Object can be *true* or *false*.
28
+ #
29
+ class Boolean
30
+ include Origami::Object
31
+
32
+ TOKENS = %w[true false] # :nodoc:
33
+ @@regexp = Regexp.new(WHITESPACES + "(?<value>#{Regexp.union(TOKENS)})")
25
34
 
26
35
  #
27
- # Class representing a Boolean Object.
28
- # A Boolean Object can be *true* or *false*.
36
+ # Creates a new Boolean value.
37
+ # _value_:: *true* or *false*.
29
38
  #
30
- class Boolean
31
- include Origami::Object
32
-
33
- TOKENS = %w{ true false } #:nodoc:
34
- @@regexp = Regexp.new(WHITESPACES + "(?<value>#{Regexp.union(TOKENS)})")
35
-
36
- #
37
- # Creates a new Boolean value.
38
- # _value_:: *true* or *false*.
39
- #
40
- def initialize(value)
41
- unless value.is_a?(TrueClass) or value.is_a?(FalseClass)
42
- raise TypeError, "Expected type TrueClass or FalseClass, received #{value.class}."
43
- end
39
+ def initialize(value)
40
+ unless value.is_a?(TrueClass) || value.is_a?(FalseClass)
41
+ raise TypeError, "Expected type TrueClass or FalseClass, received #{value.class}."
42
+ end
44
43
 
45
- super()
44
+ super()
46
45
 
47
- @value = (value == true)
48
- end
49
-
50
- def to_s(eol: $/) #:nodoc:
51
- super(@value.to_s, eol: eol)
52
- end
46
+ @value = (value == true)
47
+ end
53
48
 
54
- def self.parse(stream, _parser = nil) #:nodoc:
55
- scanner = Parser.init_scanner(stream)
56
- offset = scanner.pos
49
+ def to_s(eol: $/) # :nodoc:
50
+ super(@value.to_s, eol: eol)
51
+ end
57
52
 
58
- if scanner.scan(@@regexp).nil?
59
- raise InvalidBooleanObjectError
60
- end
53
+ def self.parse(stream, _parser = nil) # :nodoc:
54
+ scanner = Parser.init_scanner(stream)
55
+ offset = scanner.pos
61
56
 
62
- value = (scanner['value'] == "true")
57
+ if scanner.scan(@@regexp).nil?
58
+ raise InvalidBooleanObjectError
59
+ end
63
60
 
64
- bool = Boolean.new(value)
65
- bool.file_offset = offset
61
+ value = (scanner['value'] == "true")
66
62
 
67
- bool
68
- end
63
+ bool = Boolean.new(value)
64
+ bool.file_offset = offset
69
65
 
70
- #
71
- # Converts self into a Ruby boolean, that is TrueClass or FalseClass instance.
72
- #
73
- def value
74
- @value
75
- end
66
+ bool
67
+ end
76
68
 
77
- def false?
78
- @value == false
79
- end
69
+ #
70
+ # Converts self into a Ruby boolean, that is TrueClass or FalseClass instance.
71
+ #
72
+ attr_reader :value
80
73
 
81
- def true?
82
- @value == true
83
- end
74
+ def false?
75
+ @value == false
76
+ end
84
77
 
85
- def ==(bool)
86
- @value == bool
87
- end
78
+ def true?
79
+ @value == true
88
80
  end
89
81
 
82
+ def ==(other)
83
+ @value == other
84
+ end
85
+ end
90
86
  end