module IRuby::Display
Constants
- DEFAULT_MIME_TYPE_FORMAT_METHODS
- FORCE_TEXT_TYPES
-
Each of the following mime types must be a text type, but mime-types library tells us it is a non-text type.
Public Class Methods
Source
# File lib/iruby/display.rb, line 95 def clear_output(wait = false) IRuby::Kernel.instance.session.send(:publish, :clear_output, wait: wait) end
@private
Source
# File lib/iruby/display.rb, line 23 def convert(obj, options) Representation.new(obj, options) end
@private
Source
# File lib/iruby/display.rb, line 28 def display(obj, options = {}) obj = convert(obj, options) options = obj.options obj = obj.object fuzzy_mime = options[:format] # Treated like a fuzzy mime type unless !fuzzy_mime || String === fuzzy_mime raise 'Invalid argument :format' end if exact_mime = options[:mime] raise 'Invalid argument :mime' unless String === exact_mime raise 'Invalid mime type' unless exact_mime.include?('/') end data = if obj.respond_to?(:to_iruby_mimebundle) render_mimebundle(obj, exact_mime, fuzzy_mime) else {} end # Render by additional formatters render_by_registry(data, obj, exact_mime, fuzzy_mime) # Render by to_xxx methods default_renderers = if obj.respond_to?(:to_iruby_mimebundle) # Do not use Hash#slice for Ruby < 2.5 {"text/plain" => DEFAULT_MIME_TYPE_FORMAT_METHODS["text/plain"]} else DEFAULT_MIME_TYPE_FORMAT_METHODS end default_renderers.each do |mime, methods| next if mime.nil? && !data.empty? # for to_iruby next if mime && data.key?(mime) # do not overwrite method = Array(methods).find {|m| obj.respond_to?(m) } next if method.nil? result = obj.send(method) case mime when nil # to_iruby case result when nil # do nothing next when Array mime, result = result else warn(("Ignore the result of to_iruby method of %p because " + "it does not return a pair of mime-type and formatted representation") % obj) next end end data[mime] = result end # As a last resort, interpret string representation of the object # as the given mime type. if exact_mime && !data.key?(exact_mime) data[exact_mime] = protect(exact_mime, obj) end data end
@private
Private Class Methods
Source
# File lib/iruby/display.rb, line 112 def ascii?(mime) if FORCE_TEXT_TYPES.include?(mime) true else MIME::Type.new("content-type" => mime).ascii? end end
Source
# File lib/iruby/display.rb, line 101 def protect(mime, data) ascii?(mime) ? data.to_s : [data.to_s].pack('m0') end
Source
# File lib/iruby/display.rb, line 132 def render_by_registry(data, obj, exact_mime, fuzzy_mime) # Filter matching renderer by object type renderer = Registry.renderer.select { |r| r.match?(obj) } matching_renderer = nil # Find exactly matching display by exact_mime if exact_mime matching_renderer = renderer.find { |r| exact_mime == r.mime } end # Find fuzzy matching display by fuzzy_mime if fuzzy_mime matching_renderer ||= renderer.find { |r| r.mime&.include?(fuzzy_mime) } end renderer.unshift matching_renderer if matching_renderer # Return first render result which has the right mime type renderer.each do |r| mime, result = r.render(obj) next if data.key?(mime) if mime && result && (!exact_mime || exact_mime == mime) && (!fuzzy_mime || mime.include?(fuzzy_mime)) data[mime] = protect(mime, result) break end end nil end
Source
# File lib/iruby/display.rb, line 120 def render_mimebundle(obj, exact_mime, fuzzy_mime) data = {} include_mime = [exact_mime].compact formats, _metadata = obj.to_iruby_mimebundle(include: include_mime) formats.each do |mime, value| if fuzzy_mime.nil? || mime.include?(fuzzy_mime) data[mime] = value end end data end
Private Instance Methods
Source
# File lib/iruby/display.rb, line 165 def render_by_to_iruby(data, obj) if obj.respond_to?(:to_iruby) result = obj.to_iruby mime, rep = case result when Array result else [nil, result] end data[mime] = rep end end