[フレーム]

Module: PP::PPMethods

Included in:
PP , SingleLine
Defined in:
opal/stdlib/pp.rb

Instance Method Summary collapse

Instance Method Details

#check_inspect_key(id) ⇒ Object

Check whether the object_id +id+ is in the current buffer of objects to be pretty printed. Used to break cycles in chains of objects to be pretty printed.

132
133
134
135
136
# File 'opal/stdlib/pp.rb', line 132
def check_inspect_key(id)
 Thread .current [:__recursive_key__] &&
 Thread .current [:__recursive_key__][:inspect] &&
 Thread .current [:__recursive_key__][:inspect].include?(id)
end

#comma_breakableObject

A convenience method which is same as follows:

text ',' breakable

207
208
209
210
# File 'opal/stdlib/pp.rb', line 207
def comma_breakable
 text ','
 breakable
end

#guard_inspect_keyObject

Yields to a block and preserves the previous set of objects being printed.

110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
# File 'opal/stdlib/pp.rb', line 110
def guard_inspect_key
 if Thread .current [:__recursive_key__] == nil
 Thread .current [:__recursive_key__] = {}.compare_by_identity
 end
 if Thread .current [:__recursive_key__][:inspect] == nil
 Thread .current [:__recursive_key__][:inspect] = {}.compare_by_identity
 end
 save = Thread .current [:__recursive_key__][:inspect]
 begin
 Thread .current [:__recursive_key__][:inspect] = {}.compare_by_identity
 yield
 ensure
 Thread .current [:__recursive_key__][:inspect] = save
 end
end

#object_address_group(obj, &block) ⇒ Object

A convenience method, like object_group, but also reformats the Object's object_id.

197
198
199
200
201
# File 'opal/stdlib/pp.rb', line 197
def object_address_group(obj, &block)
 str = Kernel .instance_method(:to_s).bind_call(obj)
 str = str.chomp('>')
 group(1, str, '>', &block)
end

#object_group(obj, &block) ⇒ Object

A convenience method which is same as follows:

group(1, '#<' + obj.class.name, '>') { ... }

191
192
193
# File 'opal/stdlib/pp.rb', line 191
def object_group(obj, &block) # :yield:
 group(1, '#<' + obj.class.name, '>', &block)
end

#pop_inspect_key(id) ⇒ Object

Removes an object from the set of objects being pretty printed.

145
146
147
# File 'opal/stdlib/pp.rb', line 145
def pop_inspect_key(id)
 Thread .current [:__recursive_key__][:inspect].delete id
end

#pp(obj = undefined) ⇒ Object

Adds +obj+ to the pretty printing buffer using Object#pretty_print or Object#pretty_print_cycle.

Object#pretty_print_cycle is used when +obj+ is already printed, a.k.a the object reference chain has a cycle.

154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
# File 'opal/stdlib/pp.rb', line 154
def pp(obj = undefined)
 # Opal: consider JS-native variables:
 %x{
 if (obj === null) {
 #{text "null"}#{return}
 }
 else if (obj === undefined) {
 #{text "undefined"}#{return}
 }
 else if (obj.$$class === undefined) {
 #{text `Object.prototype.toString.apply(obj)`}#{return}
 }
 }
 # If obj is a Delegator then use the object being delegated to for cycle
 # detection
 obj = obj.__getobj__ if defined?(::Delegator ) and obj.is_a?(::Delegator )
 if check_inspect_key(obj)
 group {obj.pretty_print_cycle self}
 return
 end
 begin
 push_inspect_key(obj)
 group {obj.pretty_print self}
 ensure
 pop_inspect_key(obj) unless PP .sharing_detection 
 end
end

#pp_hash(obj) ⇒ Object

A pretty print for a Hash

266
267
268
269
270
271
272
273
274
275
276
277
278
279
# File 'opal/stdlib/pp.rb', line 266
def pp_hash(obj)
 group(1, '{', '}') {
 seplist(obj, nil, :each_pair) {|k, v|
 group {
 pp k
 text '=>'
 group(1) {
 breakable ''
 pp v
 }
 }
 }
 }
end

#pp_object(obj) ⇒ Object

A present standard failsafe for pretty printing any given Object

250
251
252
253
254
255
256
257
258
259
260
261
262
263
# File 'opal/stdlib/pp.rb', line 250
def pp_object(obj)
 object_address_group(obj) {
 seplist(obj.pretty_print_instance_variables, lambda { text ',' }) {|v|
 breakable
 v = v.to_s if Symbol === v
 text v
 text '='
 group(1) {
 breakable ''
 pp(obj.instance_eval(v))
 }
 }
 }
end

#push_inspect_key(id) ⇒ Object

Adds the object_id +id+ to the set of objects being pretty printed, so as to not repeat objects.

140
141
142
# File 'opal/stdlib/pp.rb', line 140
def push_inspect_key(id)
 Thread .current [:__recursive_key__][:inspect][id] = true
end

#seplist(list, sep = nil, iter_method = :each) ⇒ Object

Adds a separated list. The list is separated by comma with breakable space, by default.

seplist iterates the +list+ using +iter_method+.

It yields each object to the block given for #seplist. The procedure +separator_proc+ is called between each yields.

If the iteration is zero times, +separator_proc+ is not called at all.

If +separator_proc+ is nil or not given, +lambda { comma_breakable }+ is used. If +iter_method+ is not given, :each is used.

For example, following 3 code fragments has similar effect.

q.seplist([1,2,3]) {|v| xxx v }

q.seplist([1,2,3], lambda { q.comma_breakable }, :each) {|v| xxx v }

xxx 1 q.comma_breakable xxx 2 q.comma_breakable xxx 3

236
237
238
239
240
241
242
243
244
245
246
247
# File 'opal/stdlib/pp.rb', line 236
def seplist(list, sep=nil, iter_method=:each) # :yield: element
 sep ||= lambda { comma_breakable }
 first = true
 list.__send__(iter_method) {|*v|
 if first
 first = false
 else
 sep.call
 end
 yield(*v)
 }
end

AltStyle によって変換されたページ (->オリジナル) /