A paging display module. Uses the RDoc::RI::Formatter class to do the actual presentation.
Display information about klass
. Fetches additional
information from ri_reader
as necessary.
# File rdoc/ri/display.rb, line 54 def display_class_info(klass) page do superclass = klass.superclass if superclass superclass = " < " + superclass else superclass = "" end @formatter.draw_line(klass.display_name + ": " + klass.full_name + superclass) display_flow(klass.comment) @formatter.draw_line unless klass.includes.empty? @formatter.blankline @formatter.display_heading("Includes:", 2, "") incs = [] klass.includes.each do |inc| incs << inc.name end @formatter.wrap(incs.sort.join(', ')) end unless klass.constants.empty? @formatter.blankline @formatter.display_heading("Constants:", 2, "") constants = klass.constants.sort_by { |constant| constant.name } constants.each do |constant| @formatter.wrap "#{constant.name} = #{constant.value}" if constant.comment then @formatter.indent do @formatter.display_flow constant.comment end else @formatter.break_to_newline end end end unless klass.attributes.empty? then @formatter.blankline @formatter.display_heading 'Attributes:', 2, '' attributes = klass.attributes.sort_by { |attribute| attribute.name } attributes.each do |attribute| if attribute.comment then @formatter.wrap "#{attribute.name} (#{attribute.rw}):" @formatter.indent do @formatter.display_flow attribute.comment end else @formatter.wrap "#{attribute.name} (#{attribute.rw})" @formatter.break_to_newline end end end return display_class_method_list(klass) end end
Display an Array of RDoc::Markup::Flow
objects, flow
.
# File rdoc/ri/display.rb, line 231 def display_flow(flow) if flow and not flow.empty? then @formatter.display_flow flow else @formatter.wrap '[no description]' end end
Display information about method
.
# File rdoc/ri/display.rb, line 242 def display_method_info(method) page do @formatter.draw_line(method.full_name) display_params(method) @formatter.draw_line display_flow(method.comment) if method.aliases and not method.aliases.empty? then @formatter.blankline aka = "(also known as #{method.aliases.map { |a| a.name }.join(', ')})" @formatter.wrap aka end end end
Display the list of methods
.
# File rdoc/ri/display.rb, line 261 def display_method_list(methods) page do @formatter.wrap "More than one method matched your request. You can refine your search by asking for information on one of:" @formatter.blankline methods.each do |method| @formatter.raw_print_line "#{method.full_name} [#{method.source_path}]\n" end end end
Display a list of methods
and allow the user to select one of
them.
# File rdoc/ri/display.rb, line 275 def display_method_list_choice(methods) page do @formatter.wrap "More than one method matched your request. Please choose one of the possible matches." @formatter.blankline methods.each_with_index do |method, index| @formatter.raw_print_line "%3d %s [%s]\n" % [index + 1, method.full_name, method.source_path] end @formatter.raw_print_line ">> " choice = $stdin.gets.strip! if(choice == '') return end choice = choice.to_i if ((choice == 0) || (choice > methods.size)) then @formatter.raw_print_line "Invalid choice!\n" else method = methods[choice - 1] display_method_info(method) end end end
Display the params for method
.
# File rdoc/ri/display.rb, line 306 def display_params(method) params = method.params if params[0,1] == "(" then if method.is_singleton params = method.full_name + params else params = method.name + params end end params.split(/\n/).each do |param| @formatter.wrap param @formatter.break_to_newline end @formatter.blankline @formatter.wrap("From #{method.source_path}") end
Given a Hash mapping a class' methods to method types (returned by display_class_method_list), this method allows the user to choose one of the methods.
# File rdoc/ri/display.rb, line 128 def get_class_method_choice(method_map) if CAN_USE_READLINE # prepare abbreviations for tab completion abbreviations = method_map.keys.abbrev Readline.completion_proc = proc do |string| abbreviations.values.uniq.grep(/^#{string}/) end end @formatter.raw_print_line "\nEnter the method name you want.\n" @formatter.raw_print_line "Class methods can be preceeded by '::' and instance methods by '#'.\n" if CAN_USE_READLINE @formatter.raw_print_line "You can use tab to autocomplete.\n" @formatter.raw_print_line "Enter a blank line to exit.\n" choice_string = Readline.readline(">> ").strip else @formatter.raw_print_line "Enter a blank line to exit.\n" @formatter.raw_print_line ">> " choice_string = $stdin.gets.strip end if choice_string == '' return nil else class_or_instance = method_map[choice_string] if class_or_instance # If the user's choice is not preceeded by a '::' or a '#', figure # out whether they want a class or an instance method and decorate # the choice appropriately. if(choice_string =~ /^[a-zA-Z]/) if(class_or_instance == :class) choice_string = "::#{choice_string}" else choice_string = "##{choice_string}" end end return choice_string else @formatter.raw_print_line "No method matched '#{choice_string}'.\n" return nil end end end
List the classes in classes
.
# File rdoc/ri/display.rb, line 329 def list_known_classes(classes) if classes.empty? warn_no_database else page do @formatter.draw_line "Known classes and modules" @formatter.blankline @formatter.wrap classes.sort.join(', ') end end end
Paginates output through a pager program.
# File rdoc/ri/display.rb, line 345 def page if pager = setup_pager then begin orig_output = @formatter.output @formatter.output = pager yield ensure @formatter.output = orig_output pager.close end else yield end rescue Errno::EPIPE end
Sets up a pager program to pass output through.
# File rdoc/ri/display.rb, line 364 def setup_pager unless @use_stdout then for pager in [ ENV['PAGER'], "less", "more", 'pager' ].compact.uniq return IO.popen(pager, "w") rescue nil end @use_stdout = true nil end end
Displays a message that describes how to build RI data.
# File rdoc/ri/display.rb, line 377 def warn_no_database output = @formatter.output output.puts "No ri data found" output.puts output.puts "If you've installed Ruby yourself, you need to generate documentation using:" output.puts output.puts " make install-doc" output.puts output.puts "from the same place you ran `make` to build ruby." output.puts output.puts "If you installed Ruby from a packaging system, then you may need to" output.puts "install an additional package, or ask the packager to enable ri generation." end