rdoc-f95 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (71) hide show
  1. data/History.txt +4 -0
  2. data/Manifest.txt +79 -0
  3. data/PostInstall.txt +7 -0
  4. data/README.rdoc +147 -0
  5. data/Rakefile +28 -0
  6. data/bin/rdoc-f95 +70 -0
  7. data/lib/rdoc-f95.rb +306 -0
  8. data/lib/rdoc-f95/code_objects.rb +776 -0
  9. data/lib/rdoc-f95/diagram.rb +342 -0
  10. data/lib/rdoc-f95/dot.rb +249 -0
  11. data/lib/rdoc-f95/generator.rb +1088 -0
  12. data/lib/rdoc-f95/generator/chm.rb +113 -0
  13. data/lib/rdoc-f95/generator/chm/chm.rb +98 -0
  14. data/lib/rdoc-f95/generator/html.rb +370 -0
  15. data/lib/rdoc-f95/generator/html/hefss.rb +414 -0
  16. data/lib/rdoc-f95/generator/html/html.rb +708 -0
  17. data/lib/rdoc-f95/generator/html/kilmer.rb +418 -0
  18. data/lib/rdoc-f95/generator/html/one_page_html.rb +121 -0
  19. data/lib/rdoc-f95/generator/ri.rb +229 -0
  20. data/lib/rdoc-f95/generator/xhtml.rb +106 -0
  21. data/lib/rdoc-f95/generator/xhtml/ctop.xsl +1318 -0
  22. data/lib/rdoc-f95/generator/xhtml/mathml.xsl +42 -0
  23. data/lib/rdoc-f95/generator/xhtml/pmathml.xsl +612 -0
  24. data/lib/rdoc-f95/generator/xhtml/pmathmlcss.xsl +872 -0
  25. data/lib/rdoc-f95/generator/xhtml/xhtml.rb +732 -0
  26. data/lib/rdoc-f95/generator/xml.rb +120 -0
  27. data/lib/rdoc-f95/generator/xml/rdf.rb +113 -0
  28. data/lib/rdoc-f95/generator/xml/xml.rb +111 -0
  29. data/lib/rdoc-f95/install.rb +166 -0
  30. data/lib/rdoc-f95/markup.rb +506 -0
  31. data/lib/rdoc-f95/markup/formatter.rb +14 -0
  32. data/lib/rdoc-f95/markup/fragments.rb +337 -0
  33. data/lib/rdoc-f95/markup/inline.rb +361 -0
  34. data/lib/rdoc-f95/markup/install.rb +57 -0
  35. data/lib/rdoc-f95/markup/lines.rb +152 -0
  36. data/lib/rdoc-f95/markup/mathml_wrapper.rb +91 -0
  37. data/lib/rdoc-f95/markup/preprocess.rb +71 -0
  38. data/lib/rdoc-f95/markup/sample/rdoc2latex.rb +16 -0
  39. data/lib/rdoc-f95/markup/sample/sample.rb +42 -0
  40. data/lib/rdoc-f95/markup/to_flow.rb +185 -0
  41. data/lib/rdoc-f95/markup/to_html.rb +357 -0
  42. data/lib/rdoc-f95/markup/to_html_crossref.rb +123 -0
  43. data/lib/rdoc-f95/markup/to_latex.rb +328 -0
  44. data/lib/rdoc-f95/markup/to_test.rb +50 -0
  45. data/lib/rdoc-f95/markup/to_xhtml_texparser.rb +234 -0
  46. data/lib/rdoc-f95/options.rb +745 -0
  47. data/lib/rdoc-f95/parsers/parse_c.rb +775 -0
  48. data/lib/rdoc-f95/parsers/parse_f95.rb +2499 -0
  49. data/lib/rdoc-f95/parsers/parse_rb.rb +2587 -0
  50. data/lib/rdoc-f95/parsers/parse_simple.rb +39 -0
  51. data/lib/rdoc-f95/parsers/parserfactory.rb +99 -0
  52. data/lib/rdoc-f95/ri.rb +2 -0
  53. data/lib/rdoc-f95/ri/cache.rb +188 -0
  54. data/lib/rdoc-f95/ri/descriptions.rb +147 -0
  55. data/lib/rdoc-f95/ri/display.rb +244 -0
  56. data/lib/rdoc-f95/ri/driver.rb +435 -0
  57. data/lib/rdoc-f95/ri/formatter.rb +603 -0
  58. data/lib/rdoc-f95/ri/paths.rb +105 -0
  59. data/lib/rdoc-f95/ri/reader.rb +106 -0
  60. data/lib/rdoc-f95/ri/util.rb +81 -0
  61. data/lib/rdoc-f95/ri/writer.rb +64 -0
  62. data/lib/rdoc-f95/stats.rb +23 -0
  63. data/lib/rdoc-f95/template.rb +64 -0
  64. data/lib/rdoc-f95/tokenstream.rb +33 -0
  65. data/lib/rdoc-f95/usage.rb +210 -0
  66. data/script/console +10 -0
  67. data/script/destroy +14 -0
  68. data/script/generate +14 -0
  69. data/test/test_helper.rb +3 -0
  70. data/test/test_rdoc-f95.rb +11 -0
  71. metadata +156 -0
@@ -0,0 +1,4 @@
1
+ == 0.0.1 2009-01-08
2
+
3
+ * 1 major enhancement:
4
+ * Initial release
@@ -0,0 +1,79 @@
1
+ History.txt
2
+ Manifest.txt
3
+ PostInstall.txt
4
+ README.rdoc
5
+ Rakefile
6
+ lib/rdoc-f95.rb
7
+ script/console
8
+ script/destroy
9
+ script/generate
10
+ test/test_helper.rb
11
+ test/test_rdoc-f95.rb
12
+ bin/rdoc-f95
13
+ lib/rdoc-f95/code_objects.rb
14
+ lib/rdoc-f95/diagram.rb
15
+ lib/rdoc-f95/dot.rb
16
+ lib/rdoc-f95/generator
17
+ lib/rdoc-f95/generator/chm.rb
18
+ lib/rdoc-f95/generator/html.rb
19
+ lib/rdoc-f95/generator/ri.rb
20
+ lib/rdoc-f95/generator/xhtml.rb
21
+ lib/rdoc-f95/generator/xml.rb
22
+ lib/rdoc-f95/generator/chm
23
+ lib/rdoc-f95/generator/chm/chm.rb
24
+ lib/rdoc-f95/generator/html
25
+ lib/rdoc-f95/generator/html/hefss.rb
26
+ lib/rdoc-f95/generator/html/html.rb
27
+ lib/rdoc-f95/generator/html/kilmer.rb
28
+ lib/rdoc-f95/generator/html/one_page_html.rb
29
+ lib/rdoc-f95/generator/xhtml
30
+ lib/rdoc-f95/generator/xhtml/ctop.xsl
31
+ lib/rdoc-f95/generator/xhtml/mathml.xsl
32
+ lib/rdoc-f95/generator/xhtml/pmathml.xsl
33
+ lib/rdoc-f95/generator/xhtml/pmathmlcss.xsl
34
+ lib/rdoc-f95/generator/xhtml/xhtml.rb
35
+ lib/rdoc-f95/generator/xml
36
+ lib/rdoc-f95/generator/xml/rdf.rb
37
+ lib/rdoc-f95/generator/xml/xml.rb
38
+ lib/rdoc-f95/generator.rb
39
+ lib/rdoc-f95/install.rb
40
+ lib/rdoc-f95/markup
41
+ lib/rdoc-f95/markup/formatter.rb
42
+ lib/rdoc-f95/markup/fragments.rb
43
+ lib/rdoc-f95/markup/inline.rb
44
+ lib/rdoc-f95/markup/install.rb
45
+ lib/rdoc-f95/markup/lines.rb
46
+ lib/rdoc-f95/markup/mathml_wrapper.rb
47
+ lib/rdoc-f95/markup/preprocess.rb
48
+ lib/rdoc-f95/markup/to_flow.rb
49
+ lib/rdoc-f95/markup/to_html.rb
50
+ lib/rdoc-f95/markup/to_html_crossref.rb
51
+ lib/rdoc-f95/markup/to_latex.rb
52
+ lib/rdoc-f95/markup/to_test.rb
53
+ lib/rdoc-f95/markup/to_xhtml_texparser.rb
54
+ lib/rdoc-f95/markup/sample
55
+ lib/rdoc-f95/markup/sample/rdoc2latex.rb
56
+ lib/rdoc-f95/markup/sample/sample.rb
57
+ lib/rdoc-f95/markup.rb
58
+ lib/rdoc-f95/options.rb
59
+ lib/rdoc-f95/parsers
60
+ lib/rdoc-f95/parsers/parse_c.rb
61
+ lib/rdoc-f95/parsers/parse_f95.rb
62
+ lib/rdoc-f95/parsers/parse_rb.rb
63
+ lib/rdoc-f95/parsers/parse_simple.rb
64
+ lib/rdoc-f95/parsers/parserfactory.rb
65
+ lib/rdoc-f95/ri
66
+ lib/rdoc-f95/ri/cache.rb
67
+ lib/rdoc-f95/ri/descriptions.rb
68
+ lib/rdoc-f95/ri/display.rb
69
+ lib/rdoc-f95/ri/driver.rb
70
+ lib/rdoc-f95/ri/formatter.rb
71
+ lib/rdoc-f95/ri/paths.rb
72
+ lib/rdoc-f95/ri/reader.rb
73
+ lib/rdoc-f95/ri/util.rb
74
+ lib/rdoc-f95/ri/writer.rb
75
+ lib/rdoc-f95/ri.rb
76
+ lib/rdoc-f95/stats.rb
77
+ lib/rdoc-f95/template.rb
78
+ lib/rdoc-f95/tokenstream.rb
79
+ lib/rdoc-f95/usage.rb
@@ -0,0 +1,7 @@
1
+
2
+ For more information on rdoc-f95, see http://rdoc-f95.rubyforge.org
3
+
4
+ NOTE: Change this information in PostInstall.txt
5
+ You can also delete it if you don't want it.
6
+
7
+
@@ -0,0 +1,147 @@
1
+ = rdoc-f95: Enhanced version of RDoc Fortran 90/95 parser
2
+
3
+ * Project Page: http://rubyforge.org/projects/rdoc/
4
+ * Documentation: http://rdoc-f95.rubyforge.org/
5
+
6
+ == INSTALLATION
7
+
8
+ % sudo gem install rdoc-f95
9
+
10
+ == USAGE
11
+
12
+ Set the environment variable *PATH* to include
13
+ the directory where the execution program is installed,
14
+ and *RUBYLIB* to include the directory
15
+ where the libraries are installed.
16
+
17
+ Move to a directory where your Fortran 90/95 files exist,
18
+ and execute the following command. HTML documents will be generated in
19
+ *doc* directory.
20
+
21
+ % rdoc-f95 -U --ignore-case --inline-source
22
+
23
+ Files ending <tt>.f90</tt>, <tt>.F90</tt>, <tt>.f95</tt>, <tt>.F95</tt>
24
+ are parsed as Fortran 90/95 programs.
25
+ All Fortran 90/95 programs in subdirectories are parsed recursively.
26
+
27
+ Just as in the original RDoc, files ending with <tt>.rb</tt> and <tt>.rbw</tt>
28
+ are parsed as Ruby programs and files ending with <tt>.c</tt>, <tt>.cc</tt>,
29
+ <tt>.cpp</tt>, <tt>.CC</tt>, <tt>.cxx</tt> are parsed as C programs.
30
+
31
+ With the option <tt>--op</tt>,
32
+ the directory where HTML documents are generated can be changed.
33
+ <tt>--title</tt> option sets title of HTML documents.
34
+ When <tt>--all</tt> option is used,
35
+ private subroutines, functions etc. in
36
+ Fortran 90/95 programs are shown in HTML documents (for developers).
37
+ If files or directories are specified as arguments (for example,
38
+ "<tt>src/*.f90</tt>" or "<tt>test/</tt>"), the particular files
39
+ are parsed.
40
+ In the following example, files with suffix "<tt>.f90</tt>" in a
41
+ directory "<tt>src/</tt>" and files in a directory "<tt>test/</tt>"
42
+ are parsed.
43
+
44
+ % rdoc-f95 -U --ignore-case --inline-source \
45
+ --op rdoc --title "RDoc documentations" src/*.f90 test/
46
+
47
+ Alternatively, you can parse only a part of files by creating a
48
+ "<tt>.document</tt>" file and writing names of the files and the
49
+ directories to the file.
50
+
51
+ For more information,
52
+ see http://www.ruby-doc.org/stdlib/libdoc/rdoc/rdoc/index.html
53
+
54
+
55
+ == RULES for RDocF95 Document
56
+
57
+ Refer to {parse_f95.rb}[link:files/lib/rdoc-f95/parsers/parse_f95_rb.html] which
58
+ explains parsed information, way of looking at documents,
59
+ the format of comment blocks in Fortran 90/95 source code.
60
+ If you use "--mathml" option (see below),
61
+ refer to <b>RDoc::Markup::ToXHtmlTexParser</b>, too.
62
+ For general information, see
63
+ http://www.ruby-doc.org/stdlib/libdoc/rdoc/rdoc/index.html
64
+
65
+ == SAMPLES
66
+
67
+ * {Code reference of gtool5 library that is a Fortran 90/95 library for numerical models for geophysical fluid (only JAPANESE)}[http://www.gfd-dennou.org/library/gtool/gtool5/gtool5_current/doc/develop_reference/]
68
+
69
+ * {Code reference of planetary atmospheric general circulation model DCPAM}[http://www.gfd-dennou.org/library/dcpam/dcpam5/dcpam5_current/doc/code_reference/xml]
70
+
71
+ == DIFFERENCES from original RDoc
72
+
73
+ This patch has been created for enhancing the Fortran 90/95 parser of RDoc .
74
+ {The Fortran 90/95 parse script}[http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/lib/rdoc/parser/f95.rb]
75
+ is mainly modified, and other programs are also improved.
76
+
77
+
78
+ The original RDoc has been developed by Dave Thomas and is now
79
+ maintained by Ryan Davis and Eric Hodel, etc. .
80
+ The RDoc is available from the Ruby source code repository.
81
+ See {Ruby Repository Guide}[http://www.ruby-lang.org/en/news/2006/12/22/cvs-repository-moved-to-svn/].
82
+ For more information about RDoc, see
83
+ http://www.ruby-doc.org/stdlib/libdoc/rdoc/rdoc/index.html
84
+ or
85
+ {RubyForge: rdoc Project}[http://rubyforge.org/projects/rdoc]
86
+
87
+ Differences to the original one are given below.
88
+
89
+ --
90
+ #<b>Enhancement of an analytical performance of Fortran 90/95 source codes</b> ::
91
+ # See lib/rdoc-f95/parsers/parse_f95.rb for details.
92
+
93
+ #<b>Modification of format of comment blocks</b> ::
94
+ # See lib/rdoc-f95/parsers/parse_f95.rb for details.
95
+ ++
96
+
97
+ <b>Addition of <tt>--ignore-case</tt> option </b> ::
98
+ In the Fortran 90/95 Standard,
99
+ upper case letters are not distinguished from lower case letters,
100
+ although original RDoc produces case-dependently
101
+ cross-references of Class and Methods.
102
+ When this options is specified,
103
+ upper cases are not distinguished from lower cases.
104
+
105
+ <b>Cross-reference of file names</b> ::
106
+ Cross-reference of file names is available as well as
107
+ modules, subroutines, and so on.
108
+
109
+ <b>Modification of <tt>--style</tt> option</b> ::
110
+ Original RDoc can not treat relative path stylesheet.
111
+ Application of this patch modifies this function.
112
+
113
+ <b>Conversion of TeX formula into MathML</b>::
114
+ TeX formula can be converted into MathML format
115
+ with --mathml option,
116
+ if <b>MathML library for Ruby version 0.6b -- 0.8</b> is installed.
117
+ This library is available from {Bottega of Hiraku (only JAPANESE)}[http://www.hinet.mydns.jp/~hiraku/].
118
+ See <b>RDoc::Markup::ToXHtmlTexParser</b> about format.
119
+
120
+ <b>*** Caution ***</b>
121
+ Documents generated with "--mathml" option are not displayed correctly
122
+ according to browser and/or its setting.
123
+ We have been confirmed that
124
+ documents generated with "--mathml" option are displayed correctly
125
+ with {Mozilla Firefox}[http://www.mozilla.org/products/firefox/]
126
+ and Internet Explorer
127
+ (+ {MathPlayer}[http://www.dessci.com/en/products/mathplayer/]).
128
+ See {MathML Software - Browsers}[http://www.w3.org/Math/Software/mathml_software_cat_browsers.html]
129
+ for other browsers.
130
+
131
+ Some formats of comments in HTML document are changed
132
+ to improve the analysis features.
133
+ See {parse_f95.rb}[link:files/lib/rdoc-f95/parsers/parse_f95_rb.html]
134
+
135
+ == LICENSE
136
+
137
+ Licence of the enhanced version of RDoc Fortran 90/95 parser
138
+ conforms to that of original RDoc.
139
+ see http://rdoc.rubyforge.org/
140
+
141
+
142
+ == HISTORY
143
+
144
+ === 0.0.1
145
+
146
+ * Initial release
147
+
@@ -0,0 +1,28 @@
1
+ %w[rubygems rake rake/clean fileutils newgem rubigen].each { |f| require f }
2
+ require File.dirname(__FILE__) + '/lib/rdoc-f95'
3
+
4
+ # Generate all the Rake tasks
5
+ # Run 'rake -T' to see list of generated tasks (from gem root directory)
6
+ $hoe = Hoe.new('rdoc-f95', RDocF95::VERSION) do |p|
7
+ p.developer('FIXME full name', 'morikawa@gfd-dennou.org')
8
+ p.changes = p.paragraphs_of("History.txt", 0..1).join("\n\n")
9
+ p.post_install_message = 'PostInstall.txt' # TODO remove if post-install message not required
10
+ p.rubyforge_name = p.name # TODO this is default value
11
+ # p.extra_deps = [
12
+ # ['activesupport','>= 2.0.2'],
13
+ # ]
14
+ p.extra_dev_deps = [
15
+ ['newgem', ">= #{::Newgem::VERSION}"]
16
+ ]
17
+
18
+ p.clean_globs |= %w[**/.DS_Store tmp *.log]
19
+ path = (p.rubyforge_name == p.name) ? p.rubyforge_name : "\#{p.rubyforge_name}/\#{p.name}"
20
+ p.remote_rdoc_dir = File.join(path.gsub(/^#{p.rubyforge_name}\/?/,''), 'rdoc')
21
+ p.rsync_args = '-av --delete --ignore-errors'
22
+ end
23
+
24
+ require 'newgem/tasks' # load /tasks/*.rake
25
+ Dir['tasks/**/*.rake'].each { |t| load t }
26
+
27
+ # TODO - want other tests/tasks run by default? Add them to the list
28
+ # task :default => [:spec, :features]
@@ -0,0 +1,70 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # RDoc: Documentation tool for source code
4
+ # (see lib/rdoc/rdoc.rb for more information)
5
+ #
6
+ # Copyright (c) 2003 Dave Thomas
7
+ # Released under the same terms as Ruby
8
+ #
9
+ # $Revision: 1.2 $
10
+
11
+ ## Transitional Hack ####
12
+ #
13
+ # RDoc was initially distributed independently, and installed
14
+ # itself into <prefix>/lib/ruby/site_ruby/<ver>/rdoc...
15
+ #
16
+ # Now that RDoc is part of the distribution, it's installed into
17
+ # <prefix>/lib/ruby/<ver>, which unfortunately appears later in the
18
+ # search path. This means that if you have previously installed RDoc,
19
+ # and then install from ruby-lang, you'll pick up the old one by
20
+ # default. This hack checks for the condition, and readjusts the
21
+ # search path if necessary.
22
+
23
+ #def adjust_for_existing_rdoc(path)
24
+ #
25
+ # $stderr.puts %{
26
+ # It seems as if you have a previously-installed RDoc in
27
+ # the directory #{path}.
28
+ #
29
+ # Because this is now out-of-date, you might want to consider
30
+ # removing the directories:
31
+ #
32
+ # #{File.join(path, "rdoc")}
33
+ #
34
+ # and
35
+ #
36
+ # #{File.join(path, "markup")}
37
+ #
38
+ # }
39
+ #
40
+ # # Move all the site_ruby directories to the end
41
+ # p $:
42
+ # $:.replace($:.partition {|path| /site_ruby/ !~ path}.flatten)
43
+ # p $:
44
+ #end
45
+ #
46
+ # $:.each do |path|
47
+ # if /site_ruby/ =~ path
48
+ # rdoc_path = File.join(path, 'rdoc', 'rdoc.rb')
49
+ # if File.exists?(rdoc_path)
50
+ # adjust_for_existing_rdoc(path)
51
+ # break
52
+ # end
53
+ # end
54
+ #end
55
+
56
+ ## End of Transitional Hack ##
57
+
58
+
59
+ require 'rdoc-f95'
60
+
61
+ begin
62
+ r = RDocF95::RDocF95.new
63
+ r.document ARGV
64
+ rescue Interrupt
65
+ $stderr.puts
66
+ $stderr.puts "Interrupted"
67
+ rescue RDocF95::Error => e
68
+ $stderr.puts e.message
69
+ exit 1
70
+ end
@@ -0,0 +1,306 @@
1
+ # See README.
2
+ #
3
+
4
+
5
+ require 'rdoc-f95/parsers/parse_rb.rb'
6
+ require 'rdoc-f95/parsers/parse_c.rb'
7
+ require 'rdoc-f95/parsers/parse_f95.rb'
8
+ require 'rdoc-f95/parsers/parse_simple.rb'
9
+
10
+ require 'rdoc-f95/stats'
11
+ require 'rdoc-f95/options'
12
+
13
+ require 'rdoc-f95/diagram'
14
+
15
+ require 'find'
16
+ require 'fileutils'
17
+ require 'time'
18
+
19
+ module RDocF95
20
+
21
+ ##
22
+ # RDoc version you are using
23
+
24
+ VERSION = '0.0.1'
25
+
26
+ ##
27
+ # Exception thrown by any rdoc error.
28
+
29
+ class Error < RuntimeError; end
30
+
31
+ RDocError = Error # :nodoc:
32
+
33
+ DOT_DOC_FILENAME = ".document"
34
+
35
+ GENERAL_MODIFIERS = %w[nodoc].freeze
36
+
37
+ CLASS_MODIFIERS = GENERAL_MODIFIERS
38
+
39
+ ATTR_MODIFIERS = GENERAL_MODIFIERS
40
+
41
+ CONSTANT_MODIFIERS = GENERAL_MODIFIERS
42
+
43
+ METHOD_MODIFIERS = GENERAL_MODIFIERS +
44
+ %w[arg args yield yields notnew not-new not_new doc]
45
+
46
+ ##
47
+ # Encapsulate the production of rdoc documentation. Basically
48
+ # you can use this as you would invoke rdoc from the command
49
+ # line:
50
+ #
51
+ # rdoc = RDocF95::RDoc.new
52
+ # rdoc.document(args)
53
+ #
54
+ # where _args_ is an array of strings, each corresponding to
55
+ # an argument you'd give rdoc on the command line. See rdoc/rdoc.rb
56
+ # for details.
57
+
58
+ class RDocF95
59
+
60
+ Generator = Struct.new(:file_name, :class_name, :key)
61
+
62
+ ##
63
+ # This is the list of output generator that we support
64
+
65
+ GENERATORS = {}
66
+
67
+ $LOAD_PATH.collect do |d|
68
+ File.expand_path d
69
+ end.find_all do |d|
70
+ File.directory? "#{d}/rdoc-f95/generator"
71
+ end.each do |dir|
72
+ Dir.entries("#{dir}/rdoc-f95/generator").each do |gen|
73
+ next unless /(\w+)\.rb$/ =~ gen
74
+ type = $1
75
+ unless GENERATORS.has_key? type
76
+ GENERATORS[type] = Generator.new("rdoc-f95/generator/#{gen}",
77
+ "#{type.upcase}".intern,
78
+ type)
79
+ end
80
+ end
81
+ end
82
+
83
+ def initialize
84
+ @stats = Stats.new
85
+ end
86
+
87
+ ##
88
+ # Report an error message and exit
89
+
90
+ def error(msg)
91
+ raise ::RDocF95::Error, msg
92
+ end
93
+
94
+ ##
95
+ # Create an output dir if it doesn't exist. If it does exist, but doesn't
96
+ # contain the flag file <tt>created.rid</tt> then we refuse to use it, as
97
+ # we may clobber some manually generated documentation
98
+
99
+ def setup_output_dir(op_dir, force)
100
+ flag_file = output_flag_file(op_dir)
101
+ if File.exist?(op_dir)
102
+ unless File.directory?(op_dir)
103
+ error "'#{op_dir}' exists, and is not a directory"
104
+ end
105
+ begin
106
+ created = File.read(flag_file)
107
+ rescue SystemCallError
108
+ error "\nDirectory #{op_dir} already exists, but it looks like it\n" +
109
+ "isn't an RDoc directory. Because RDoc doesn't want to risk\n" +
110
+ "destroying any of your existing files, you'll need to\n" +
111
+ "specify a different output directory name (using the\n" +
112
+ "--op <dir> option).\n\n"
113
+ else
114
+ last = (Time.parse(created) unless force rescue nil)
115
+ end
116
+ else
117
+ FileUtils.mkdir_p(op_dir)
118
+ end
119
+ last
120
+ end
121
+
122
+ ##
123
+ # Update the flag file in an output directory.
124
+
125
+ def update_output_dir(op_dir, time)
126
+ File.open(output_flag_file(op_dir), "w") {|f| f.puts time.rfc2822 }
127
+ end
128
+
129
+ ##
130
+ # Return the path name of the flag file in an output directory.
131
+
132
+ def output_flag_file(op_dir)
133
+ File.join(op_dir, "created.rid")
134
+ end
135
+
136
+ ##
137
+ # The .document file contains a list of file and directory name patterns,
138
+ # representing candidates for documentation. It may also contain comments
139
+ # (starting with '#')
140
+
141
+ def parse_dot_doc_file(in_dir, filename, options)
142
+ # read and strip comments
143
+ patterns = File.read(filename).gsub(/#.*/, '')
144
+
145
+ result = []
146
+
147
+ patterns.split.each do |patt|
148
+ candidates = Dir.glob(File.join(in_dir, patt))
149
+ result.concat(normalized_file_list(options, candidates))
150
+ end
151
+ result
152
+ end
153
+
154
+ ##
155
+ # Given a list of files and directories, create a list of all the Ruby
156
+ # files they contain.
157
+ #
158
+ # If +force_doc+ is true we always add the given files, if false, only
159
+ # add files that we guarantee we can parse. It is true when looking at
160
+ # files given on the command line, false when recursing through
161
+ # subdirectories.
162
+ #
163
+ # The effect of this is that if you want a file with a non-standard
164
+ # extension parsed, you must name it explicity.
165
+
166
+ def normalized_file_list(options, relative_files, force_doc = false,
167
+ exclude_pattern = nil)
168
+ file_list = []
169
+
170
+ relative_files.each do |rel_file_name|
171
+ next if exclude_pattern && exclude_pattern =~ rel_file_name
172
+ stat = File.stat(rel_file_name)
173
+ case type = stat.ftype
174
+ when "file"
175
+ next if @last_created and stat.mtime < @last_created
176
+ file_list << rel_file_name.sub(/^\.\//, '') if force_doc || ParserFactory.can_parse(rel_file_name)
177
+ when "directory"
178
+ next if rel_file_name == "CVS" || rel_file_name == ".svn"
179
+ dot_doc = File.join(rel_file_name, DOT_DOC_FILENAME)
180
+ if File.file?(dot_doc)
181
+ file_list.concat(parse_dot_doc_file(rel_file_name, dot_doc, options))
182
+ else
183
+ file_list.concat(list_files_in_directory(rel_file_name, options))
184
+ end
185
+ else
186
+ raise RDocF95::Error, "I can't deal with a #{type} #{rel_file_name}"
187
+ end
188
+ end
189
+
190
+ file_list
191
+ end
192
+
193
+ ##
194
+ # Return a list of the files to be processed in a directory. We know that
195
+ # this directory doesn't have a .document file, so we're looking for real
196
+ # files. However we may well contain subdirectories which must be tested
197
+ # for .document files.
198
+
199
+ def list_files_in_directory(dir, options)
200
+ files = Dir.glob File.join(dir, "*")
201
+
202
+ normalized_file_list options, files, false, options.exclude
203
+ end
204
+
205
+ ##
206
+ # Parse each file on the command line, recursively entering directories.
207
+
208
+ def parse_files(options)
209
+ files = options.files
210
+ files = ["."] if files.empty?
211
+
212
+ file_list = normalized_file_list(options, files, true)
213
+
214
+ return [] if file_list.empty?
215
+
216
+ file_info = []
217
+ width = file_list.map { |name| name.length }.max + 1
218
+
219
+ file_list.each do |fn|
220
+ $stderr.printf("\n%*s: ", width, fn) unless options.quiet
221
+
222
+ content = if RUBY_VERSION >= '1.9' then
223
+ File.open(fn, "r:ascii-8bit") { |f| f.read }
224
+ else
225
+ File.read fn
226
+ end
227
+
228
+ if /coding:\s*(\S+)/ =~ content[/\A(?:.*\n){0,2}/]
229
+ if enc = Encoding.find($1)
230
+ content.force_encoding(enc)
231
+ end
232
+ end
233
+
234
+ top_level = TopLevel.new(fn)
235
+ parser = ParserFactory.parser_for(top_level, fn, content, options, @stats)
236
+ file_info << parser.scan
237
+ @stats.num_files += 1
238
+ end
239
+
240
+ file_info
241
+ end
242
+
243
+ ##
244
+ # Format up one or more files according to the given arguments.
245
+ #
246
+ # For simplicity, _argv_ is an array of strings, equivalent to the strings
247
+ # that would be passed on the command line. (This isn't a coincidence, as
248
+ # we _do_ pass in ARGV when running interactively). For a list of options,
249
+ # see rdoc/rdoc.rb. By default, output will be stored in a directory
250
+ # called +doc+ below the current directory, so make sure you're somewhere
251
+ # writable before invoking.
252
+ #
253
+ # Throws: RDocF95::Error on error
254
+
255
+ def document(argv)
256
+ TopLevel::reset
257
+
258
+ @options = Options.new GENERATORS
259
+ @options.parse argv
260
+
261
+ @last_created = nil
262
+
263
+ unless @options.all_one_file
264
+ @last_created = setup_output_dir(@options.op_dir, @options.force_update)
265
+ end
266
+
267
+ start_time = Time.now
268
+
269
+ file_info = parse_files @options
270
+
271
+ @options.title = "RDoc Documentation"
272
+
273
+ if file_info.empty?
274
+ $stderr.puts "\nNo newer files." unless @options.quiet
275
+ else
276
+ @gen = @options.generator
277
+
278
+ $stderr.puts "\nGenerating #{@gen.key.upcase}..." unless @options.quiet
279
+
280
+ require @gen.file_name
281
+
282
+ gen_class = ::RDocF95::Generator.const_get @gen.class_name
283
+ @gen = gen_class.for @options
284
+
285
+ pwd = Dir.pwd
286
+
287
+ Dir.chdir(@options.op_dir) unless @options.all_one_file
288
+
289
+ begin
290
+ Diagram.new(file_info, @options).draw if @options.diagram
291
+ @gen.generate(file_info)
292
+ update_output_dir(".", start_time)
293
+ ensure
294
+ Dir.chdir(pwd)
295
+ end
296
+ end
297
+
298
+ unless @options.quiet
299
+ puts
300
+ @stats.print
301
+ end
302
+ end
303
+ end
304
+
305
+ end
306
+