Imported File#ftype spec from rubyspecs.
[rbx.git] / lib / rdoc / generator / xml.rb
blob3335f2ce7c3b3c3f3214a0061fbab237e882dd47
1 require 'rdoc/generator/html'
3 ##
4 # Generate XML output as one big file
6 class RDoc::Generator::XML < RDoc::Generator::HTML
8   ##
9   # Standard generator factory
11   def self.for(options)
12     new(options)
13   end
15   def initialize(*args)
16     super
17   end
19   ##
20   # Build the initial indices and output objects
21   # based on an array of TopLevel objects containing
22   # the extracted information.
24   def generate(info)
25     @info       = info
26     @files      = []
27     @classes    = []
28     @hyperlinks = {}
30     build_indices
31     generate_xml
32   end
34   ##
35   # Generate:
36   #
37   # * a list of HtmlFile objects for each TopLevel object.
38   # * a list of HtmlClass objects for each first level
39   #   class or module in the TopLevel objects
40   # * a complete list of all hyperlinkable terms (file,
41   #   class, module, and method names)
43   def build_indices
44     @info.each do |toplevel|
45       @files << RDoc::Generator::HtmlFile.new(toplevel, @options, RDoc::Generator::FILE_DIR)
46     end
48     RDoc::TopLevel.all_classes_and_modules.each do |cls|
49       build_class_list(cls, @files[0], RDoc::Generator::CLASS_DIR)
50     end
51   end
53   def build_class_list(from, html_file, class_dir)
54     @classes << RDoc::Generator::HtmlClass.new(from, html_file, class_dir, @options)
55     from.each_classmodule do |mod|
56       build_class_list(mod, html_file, class_dir)
57     end
58   end
60   ##
61   # Generate all the HTML. For the one-file case, we generate
62   # all the information in to one big hash
64   def generate_xml
65     values = {
66       'charset' => @options.charset,
67       'files'   => gen_into(@files),
68       'classes' => gen_into(@classes)
69     }
71     # this method is defined in the template file
72     write_extra_pages if defined? write_extra_pages
74     template = RDoc::TemplatePage.new @template::ONE_PAGE
76     if @options.op_name
77       opfile = File.open(@options.op_name, "w")
78     else
79       opfile = $stdout
80     end
81     template.write_html_on(opfile, values)
82   end
84   def gen_into(list)
85     res = []
86     list.each do |item|
87       res << item.value_hash
88     end
89     res
90   end
92   def gen_file_index
93     gen_an_index(@files, 'Files')
94   end
96   def gen_class_index
97     gen_an_index(@classes, 'Classes')
98   end
100   def gen_method_index
101     gen_an_index(RDoc::Generator::HtmlMethod.all_methods, 'Methods')
102   end
104   def gen_an_index(collection, title)
105     res = []
106     collection.sort.each do |f|
107       if f.document_self
108         res << { "href" => f.path, "name" => f.index_name }
109       end
110     end
112     return {
113       "entries" => res,
114       'list_title' => title,
115       'index_url'  => main_url,
116     }
117   end