From f0346bd249ae29cdf4d9c2e88b09e63c41ff1ce8 Mon Sep 17 00:00:00 2001 From: dave Date: Wed, 24 Dec 2003 04:24:29 +0000 Subject: Forgot to save buffer.... sigh git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@5272 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- lib/rdoc/code_objects.rb | 4 + lib/rdoc/generators/html_generator.rb | 57 +- lib/rdoc/generators/ri_generator.rb | 10 +- lib/rdoc/generators/template/html/css2.rb | 631 -------------- lib/rdoc/generators/template/html/html.rb | 1085 +++++++++++-------------- lib/rdoc/generators/template/html/old_html.rb | 768 +++++++++++++++++ lib/rdoc/markup/simple_markup/inline.rb | 3 +- lib/rdoc/parsers/parse_c.rb | 2 +- lib/rdoc/ri/ri_cache.rb | 6 +- lib/rdoc/ri/ri_formatter.rb | 309 ++++++- lib/rdoc/ri/ri_options.rb | 55 +- lib/rdoc/ri/ri_reader.rb | 14 + 12 files changed, 1645 insertions(+), 1299 deletions(-) delete mode 100644 lib/rdoc/generators/template/html/css2.rb create mode 100644 lib/rdoc/generators/template/html/old_html.rb (limited to 'lib') diff --git a/lib/rdoc/code_objects.rb b/lib/rdoc/code_objects.rb index 7fdbbde027..bfacff1321 100644 --- a/lib/rdoc/code_objects.rb +++ b/lib/rdoc/code_objects.rb @@ -527,6 +527,9 @@ module RDoc attr_overridable :params, :param, :parameters, :parameter + attr_accessor :call_seq + + include TokenStream def initialize(text, name) @@ -540,6 +543,7 @@ module RDoc @aliases = [] @is_alias_for = nil @comment = "" + @call_seq = nil end def <=>(other) diff --git a/lib/rdoc/generators/html_generator.rb b/lib/rdoc/generators/html_generator.rb index 89349f4b00..c5a12eee39 100644 --- a/lib/rdoc/generators/html_generator.rb +++ b/lib/rdoc/generators/html_generator.rb @@ -394,16 +394,21 @@ module Generators def build_method_detail_list outer = [] + methods = @methods.sort for singleton in [true, false] for vis in [ :public, :protected, :private ] res = [] - @methods.each do |m| + methods.each do |m| if m.document_self and m.visibility == vis and m.singleton == singleton row = {} - row["name"] = CGI.escapeHTML(m.name) + if m.call_seq + row["callseq"] = m.call_seq + else + row["name"] = CGI.escapeHTML(m.name) + row["params"] = m.params + end desc = m.description.strip row["m_desc"] = desc unless desc.empty? - row["params"] = m.params row["aref"] = m.aref row["visibility"] = m.visibility.to_s @@ -878,20 +883,33 @@ module Generators @context.singleton end + def call_seq + cs = @context.call_seq + if cs + cs.gsub(/\n/, "
\n") + else + nil + end + end + def params - p = @context.params.gsub(/\s*\#.*/, '') - p = p.tr("\n", " ").squeeze(" ") - p = "(" + p + ")" unless p[0] == ?( - - if (block = @context.block_params) - block.gsub!(/\s*\#.*/, '') - block = block.tr("\n", " ").squeeze(" ") - if block[0] == ?( - block.sub!(/^\(/, '').sub!(/\)/, '') + # params coming from a call-seq in 'C' will start with the + # method name + p = @context.params + if p !~ /^\w/ + p = @context.params.gsub(/\s*\#.*/, '') + p = p.tr("\n", " ").squeeze(" ") + p = "(" + p + ")" unless p[0] == ?( + + if (block = @context.block_params) + block.gsub!(/\s*\#.*/, '') + block = block.tr("\n", " ").squeeze(" ") + if block[0] == ?( + block.sub!(/^\(/, '').sub!(/\)/, '') + end + p << " {|#{block.strip}| ...}" end - p << " {|#{block.strip}| ...}" end - CGI.escapeHTML(p) end @@ -948,16 +966,7 @@ module Generators end text = CGI.escapeHTML(t.text) -# case t -# when RubyToken::TkKW -# style = "kw" -# when RubyToken::TkCOMMENT -# style = "cmt" -# when RubyToken::TkSTRING -# style = "str" -# when RubyToken::TkREGEXP -# style = "re" -# end + if style src << "#{text}" else diff --git a/lib/rdoc/generators/ri_generator.rb b/lib/rdoc/generators/ri_generator.rb index 22467e4ba9..705ad7da06 100644 --- a/lib/rdoc/generators/ri_generator.rb +++ b/lib/rdoc/generators/ri_generator.rb @@ -189,11 +189,11 @@ module Generators end def params_of(method) - params = method.params || "" - - if params =~ /^!verb!(.*)/m - p = $1 + if method.call_seq + method.call_seq else + params = method.params || "" + p = params.gsub(/\s*\#.*/, '') p = p.tr("\n", " ").squeeze(" ") p = "(" + p + ")" unless p[0] == ?( @@ -206,8 +206,8 @@ module Generators end p << " {|#{block.strip}| ...}" end + p end - p end def markup(comment) diff --git a/lib/rdoc/generators/template/html/css2.rb b/lib/rdoc/generators/template/html/css2.rb deleted file mode 100644 index 0109ae3e7f..0000000000 --- a/lib/rdoc/generators/template/html/css2.rb +++ /dev/null @@ -1,631 +0,0 @@ -# -# = CSS2 RDoc HTML template -# -# This is a template for RDoc that uses XHTML 1.0 Transitional and dictates a -# bit more of the appearance of the output to cascading stylesheets than the -# default. It was designed for clean inline code display, and uses DHTMl to -# toggle the visbility of each method's source with each click on the '[source]' -# link. -# -# == Authors -# -# * Michael Granger -# -# Copyright (c) 2002, 2003 The FaerieMUD Consortium. Some rights reserved. -# -# This work is licensed under the Creative Commons Attribution License. To view -# a copy of this license, visit http://creativecommons.org/licenses/by/1.0/ or -# send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California -# 94305, USA. -# - -module RDoc - module Page - - FONTS = "Verdana,Arial,Helvetica,sans-serif" - -STYLE = %{ -body { - margin: 0; - padding: 0; -} - -h1,h2,h3,h4 { margin: 0; color: #efefef; background: transparent; } -h1 { font-size: 120%; } -h2,h3,h4 { margin-top: 1em; } - -a { background: #eef; color: #039; text-decoration: none; } -a:hover { background: #039; color: #eef; } - -/* Override the base stylesheet's Anchor inside a table cell */ -td > a { - background: transparent; - color: #039; - text-decoration: none; -} - -/* === Structural elements =================================== */ - -div#index { - margin: 0; - padding: 0; - font-size: 0.9em; -} - -div#index a { - margin-left: 0.7em; -} - -div#classHeader { - width: auto; - background: #039; - color: white; - padding: 0.5em 1.5em 0.5em 1.5em; - margin: 0; - border-bottom: 3px solid #006; -} - -div#classHeader a { - background: inherit; - color: white; -} - -div#classHeader td { - background: inherit; - color: white; -} - -div#fileHeader { - width: auto; - background: #039; - color: white; - padding: 0.5em 1.5em 0.5em 1.5em; - margin: 0; - border-bottom: 3px solid #006; -} - -div#fileHeader a { - background: inherit; - color: white; -} - -div#fileHeader td { - background: inherit; - color: white; -} - -div#bodyContent { - padding: 0 1.5em 0 1.5em; -} - -div#description { - padding: 0.5em 1.5em; - background: #efefef; - border: 1px dotted #999; -} - -div#description h1,h2,h3,h4,h5,h6 { - color: black; - background: transparent; -} - -div#validator-badges { - text-align: center; -} -div#validator-badges img { border: 0; } - -div#copyright { - color: #333; - background: #efefef; - font: 0.75em sans-serif; - margin-top: 5em; - margin-bottom: 0; - padding: 0.5em 2em; -} - - -/* === Classes =================================== */ - -table.header-table { - color: white; - font-size: small; -} - -.type-note { - font-size: small; - color: #DEDEDE; -} - -.section-bar { - background: #eee; - color: #333; - padding: 3px; - border: 1px solid #999; -} - -.top-aligned-row { vertical-align: vertical-align: top } - -/* --- Context section classes ----------------------- */ - -.context-row { } -.context-item-name { font-family: monospace; font-weight: bold; color: black; } -.context-item-value { font-size: x-small; color: #448; } -.context-item-desc { background: #efefef; } - -/* --- Method classes -------------------------- */ -.method-detail { - background: #EFEFEF; - padding: 0; - margin-top: 0.5em; - margin-bottom: 0.5em; - border: 1px dotted #DDD; -} -.method-heading { - color: black; - background: #AAA; - border-bottom: 1px solid #666; - padding: 0.2em 0.5em 0 0.5em; -} -.method-signature { color: black; background: inherit; } -.method-name { font-weight: bold; } -.method-args { font-style: italic; } -.method-description { padding: 0 0.5em 0 0.5em; } - -/* --- Source code sections -------------------- */ - -a.source-toggle { font-size: 90%; } -div.method-source-code { - background: #262626; - color: #ffdead; - margin: 1em; - padding: 0.5em; - border: 1px dashed #999; - overflow: hidden; -} - -div.method-source-code pre { color: #ffdead; overflow: hidden; } - -/* --- Ruby keyword styles --------------------- */ -/* (requires a hacked html_generator.rb to add more class-types) */ -.ruby-constant { color: #7fffd4; background: transparent; } -.ruby-keyword { color: #00ffff; background: transparent; } -.ruby-ivar { color: #eedd82; background: transparent; } -.ruby-operator { color: #00ffee; background: transparent; } -.ruby-identifier { color: #ffdead; background: transparent; } -.ruby-node { color: #ffa07a; background: transparent; } -.ruby-comment { color: #b22222; font-weight: bold; background: transparent; } -.ruby-regexp { color: #ffa07a; background: transparent; } -.ruby-value { color: #7fffd4; background: transparent; } -} - - -##################################################################### -### H E A D E R T E M P L A T E -##################################################################### - -XHTML_PREAMBLE = %{ - -} - -HEADER = XHTML_PREAMBLE + %{ - - - %title% - - - - - - - -} - - -##################################################################### -### C O N T E X T C O N T E N T T E M P L A T E -##################################################################### - -CONTEXT_CONTENT = %{ -
-IF:diagram -
- %diagram% -
-ENDIF:diagram - -IF:description -
- %description% -
-ENDIF:description - -IF:requires -
-

Required files

- -
-START:requires - HREF:aref:name:   -END:requires -
-
-ENDIF:requires - -IF:methods -
-

Methods

- -
-START:methods - HREF:aref:name:   -END:methods -
-
-ENDIF:methods - -IF:constants -
-

Constants

- -
- -START:constants - - - - - -IF:desc - - - - -ENDIF:desc -END:constants -
%name%=%value%
 %desc%
-
-
-ENDIF:constants - -IF:aliases -
-

External Aliases

- -
-START:aliases - %old_name% -> %new_name%
-END:aliases -
-
-ENDIF:aliases - - -IF:attributes -
-

Attributes

- -
- -START:attributes - - - - - -END:attributes -
%name% [%rw%] %a_desc%
-
-
-ENDIF:attributes - -IF:classlist -
-

Classes and Modules

- - %classlist% -
-ENDIF:classlist - -
- -} - - -##################################################################### -### F O O T E R T E M P L A T E -##################################################################### -FOOTER = %{ - - - - -} - - -##################################################################### -### F I L E P A G E H E A D E R T E M P L A T E -##################################################################### - -FILE_PAGE = %{ -
-

%short_name%

- - - - - - - - - -
Path:%full_path% -IF:cvsurl -  (CVS) -ENDIF:cvsurl -
Last Update:%dtm_modified%
-
-} - - -##################################################################### -### C L A S S P A G E H E A D E R T E M P L A T E -##################################################################### - -CLASS_PAGE = %{ -
-

%full_name% (%classmod%)

- - - - - - -IF:parent - - - - -ENDIF:parent -
In: -START:infiles -IF:full_path_url - -ENDIF:full_path_url - %full_path% -IF:full_path_url - -ENDIF:full_path_url -IF:cvsurl -  (CVS) -ENDIF:cvsurl -
-END:infiles -
Parent: -IF:par_url - -ENDIF:par_url - %parent% -IF:par_url - -ENDIF:par_url -
-
-} - - -##################################################################### -### M E T H O D L I S T T E M P L A T E -##################################################################### - -METHOD_LIST = %{ - - -IF:includes -
-

Included Modules

- -
-START:includes - HREF:aref:name: -END:includes -
-
-ENDIF:includes - - - -IF:method_list -
-START:method_list -IF:methods -

%type% %category% methods

- -START:methods - -
- - -
-IF:codeurl - -ENDIF:codeurl -IF:sourcecode - -ENDIF:sourcecode - %name%%params% -IF:codeurl - -ENDIF:codeurl -IF:sourcecode - -ENDIF:sourcecode -
- -
-IF:m_desc - %m_desc% -ENDIF:m_desc -IF:sourcecode -

[Source]

-
-
-%sourcecode%
-
-
-ENDIF:sourcecode -
-
- -END:methods -ENDIF:methods -END:method_list - -
-ENDIF:method_list -} - - -##################################################################### -### B O D Y T E M P L A T E -##################################################################### - -BODY = HEADER + %{ - -!INCLUDE! - -
- -} + CONTEXT_CONTENT + METHOD_LIST + %{ - -
- -} + FOOTER - - - -##################################################################### -### S O U R C E C O D E T E M P L A T E -##################################################################### - -SRC_PAGE = XHTML_PREAMBLE + %{ - - - - %title% - - - - -
%code%
- - -} - - -##################################################################### -### I N D E X F I L E T E M P L A T E S -##################################################################### - -FR_INDEX_BODY = %{ -!INCLUDE! -} - -FILE_INDEX = XHTML_PREAMBLE + %{ - - - - %list_title% - - - - - -
-

%list_title%

-
-START:entries - %name%
-END:entries -
-
- - -} - -CLASS_INDEX = FILE_INDEX -METHOD_INDEX = FILE_INDEX - -INDEX = %{ - - - - - - %title% - - - - - - - - - - - -} - - - end # module Page -end # class RDoc - diff --git a/lib/rdoc/generators/template/html/html.rb b/lib/rdoc/generators/template/html/html.rb index 18ad9dcb3b..8ac631490c 100644 --- a/lib/rdoc/generators/template/html/html.rb +++ b/lib/rdoc/generators/template/html/html.rb @@ -1,762 +1,635 @@ -module RDoc - -# This is how you define the HTML that RDoc generates. Simply create -# a file in rdoc/generators/html_templates that creates the -# module RDoc::Page and populate it as described below. Then invoke -# rdoc using the --template option, and -# your template will be used. -# -# The constants defining pages use a simple templating system: -# -# * The templating system is passed a hash. Keys in the hash correspond -# to tags on this page. The tag %abc% is looked up in the hash, -# and is replaced by the corresponding hash value. -# -# * Some tags are optional. You can detect this using IF/ENDIF -# -# IF: title -# The value of title is %title% -# ENDIF: title -# -# * Some entries in the hash have values that are arrays, where each -# entry in the array is itself a hash. These are used to generate -# lists using the START: construct. For example, given a hash -# containing -# -# { 'people' => [ { 'name' => 'Fred', 'age' => '12' }, -# { 'name' => 'Mary', 'age' => '21' } ] -# -# You could generate a simple table using -# -# -# START:people -# -# END:people -#
%name%%age%
-# -# These lists can be nested to an arbitrary depth -# -# * the construct HREF:url:name: generates %name% -# if +url+ is defined in the hash, or %name% otherwise. -# -# -# Your file must contain the following constants -# -# [*FONTS*] a list of fonts to be used -# [*STYLE*] a CSS section (without the " ) + + // ]]> + + + } -################################################################### - -METHOD_LIST = %{ -IF:includes - - -
Included modules
-
-START:includes - HREF:aref:name: -END:includes -
-ENDIF:includes - -IF:method_list -START:method_list -IF:methods - - -
%type% %category% methods
-START:methods - - -
- -IF:codeurl - -ENDIF:codeurl -%name%%params% -IF:codeurl - -ENDIF:codeurl -
-IF:m_desc -
-%m_desc% -
-ENDIF:m_desc -IF:aka -
-This method is also aliased as -START:aka -%name% -END:aka -
-ENDIF:aka -IF:sourcecode -
-%sourcecode%
-
-ENDIF:sourcecode -END:methods -ENDIF:methods -END:method_list -ENDIF:method_list -} - -################################################################### +##################################################################### +### C O N T E X T C O N T E N T T E M P L A T E +##################################################################### CONTEXT_CONTENT = %{ +
IF:diagram - -
-%diagram% -
+
+ %diagram% +
ENDIF:diagram - IF:description -
%description%
+
+ %description% +
ENDIF:description IF:requires - - -
Required files
-
+
+

Required files

+ +
START:requires -HREF:aref:name:    + HREF:aref:name:   END:requires -
+
+
ENDIF:requires IF:methods - - -
Methods
-
+
+

Methods

+ +
START:methods -HREF:aref:name:    + HREF:aref:name:   END:methods -
+
+
ENDIF:methods IF:constants - - -
Constants
- +
+

Constants

+ +
+
START:constants - + + + + + IF:desc - + + + + ENDIF:desc END:constants -
%name%=%value%
%name%=%value%
%desc%
 %desc%
+ +
+ ENDIF:constants IF:aliases - - -
External Aliases
-
+
+

External Aliases

+ +
START:aliases -%old_name% -> %new_name%
+ %old_name% -> %new_name%
END:aliases -
+
+
ENDIF:aliases + IF:attributes - - -
Attributes
- +
+

Attributes

+ +
+
START:attributes - - -IF:rw - -ENDIF:rw -IFNOT:rw - -ENDIF:rw - - + + + + + END:attributes -
%name% [%rw%] %a_desc%
%name% [%rw%] %a_desc%
+ + + ENDIF:attributes - + IF:classlist - - -
Classes and Modules
-
-%classlist% -
+
+

Classes and Modules

+ + %classlist% +
ENDIF:classlist + + + } -############################################################################### -BODY = HEADER + %{ - -!INCLUDE! -} + -CONTEXT_CONTENT + METHOD_LIST + -%{ +##################################################################### +### F O O T E R T E M P L A T E +##################################################################### +FOOTER = %{ + + } -############################################################################### +##################################################################### +### F I L E P A G E H E A D E R T E M P L A T E +##################################################################### -FILE_PAGE = <<_FILE_PAGE_ - - - + + + + + +
- - - -
%short_name% - - -
Path:%full_path% +FILE_PAGE = %{ +
+

%short_name%

+ + + + - - - - - -
Path:%full_path% IF:cvsurl  (CVS) ENDIF:cvsurl -
Modified:%dtm_modified%
-
-_FILE_PAGE_ +
Last Update:%dtm_modified%
+ +} -################################################################### + +##################################################################### +### C L A S S P A G E H E A D E R T E M P L A T E +##################################################################### CLASS_PAGE = %{ - - - -
- %classmod% %full_name% - - - - - - -
In: +
+

%full_name% (%classmod%)

+ + + + - + + + IF:parent - - - + + - + + ENDIF:parent -
In: START:infiles IF:full_path_url - + ENDIF:full_path_url -%full_path% + %full_path% IF:full_path_url - + ENDIF:full_path_url IF:cvsurl -  (CVS) +  (CVS) ENDIF:cvsurl -
+
END:infiles -
Parent: +
Parent: IF:par_url - + ENDIF:par_url -%parent% + %parent% IF:par_url - + ENDIF:par_url -
-
-} - -=begin -=end - -########################## Source code ########################## - -SRC_PAGE = %{ - - - - -%title% - - - -
%code%
- - -} - -########################## Index ################################ - -FR_INDEX_BODY = %{ -!INCLUDE! -} - -FILE_INDEX = %{ - - - - -%list_title% - - - - - -START:entries -%name%
-END:entries - -} - -CLASS_INDEX = FILE_INDEX -METHOD_INDEX = FILE_INDEX - -INDEX = %{ - - - - -%title% - - - - - - - - - - <body bgcolor="white"> - Sorry, RDoc currently only generates HTML using frames. - </body> - - - - +
+ } -###################################################################### -# -# The following is used for the -1 option -# -CONTENTS_XML = %{ -IF:description -%description% -ENDIF:description +##################################################################### +### M E T H O D L I S T T E M P L A T E +##################################################################### -IF:requires -

Requires:

-
    -START:requires -IF:aref -
  • %name%
  • -ENDIF:aref -IFNOT:aref -
  • %name%
  • -ENDIF:aref -END:requires -
-ENDIF:requires - -IF:attributes -

Attributes

- -START:attributes - -END:attributes -
%name%%rw%%a_desc%
-ENDIF:attributes +METHOD_LIST = %{ + IF:includes -

Includes

-
    +
    +

    Included Modules

    + +
    START:includes -IF:aref -
  • %name%
  • -ENDIF:aref -IFNOT:aref -
  • %name%
  • -ENDIF:aref + HREF:aref:name: END:includes -
+ + ENDIF:includes + + IF:method_list -

Methods

+
START:method_list IF:methods +

%type% %category% methods

+ START:methods -

%type% %category% method: %name%%params%

+
+ + + +
IF:m_desc -%m_desc% + %m_desc% ENDIF:m_desc - IF:sourcecode -
+					

[Source]

+
+
 %sourcecode%
-
+ +
ENDIF:sourcecode +
+
+ END:methods ENDIF:methods END:method_list + + ENDIF:method_list } -######################################################################## -ONE_PAGE = %{ - +##################################################################### +### B O D Y T E M P L A T E +##################################################################### + +BODY = HEADER + %{ + +!INCLUDE! + +
+ +} + CONTEXT_CONTENT + METHOD_LIST + %{ + +
+ +} + FOOTER + + + +##################################################################### +### S O U R C E C O D E T E M P L A T E +##################################################################### + +SRC_PAGE = XHTML_PREAMBLE + %{ + - %title% - + %title% + + -START:files -

File: %short_name%

- - - -
Path:%full_path%
Modified:%dtm_modified%
-} + CONTENTS_XML + %{ -END:files - -IF:classes -

Classes

-START:classes -IF:parent -

%classmod% %full_name% < HREF:par_url:parent:

-ENDIF:parent -IFNOT:parent -

%classmod% %full_name%

-ENDIF:parent +
%code%
+ + +} -IF:infiles -(in files -START:infiles -HREF:full_path_url:full_path: -END:infiles -) -ENDIF:infiles -} + CONTENTS_XML + %{ -END:classes -ENDIF:classes + +##################################################################### +### I N D E X F I L E T E M P L A T E S +##################################################################### + +FR_INDEX_BODY = %{ +!INCLUDE! +} + +FILE_INDEX = XHTML_PREAMBLE + %{ + + + + %list_title% + + + + + +
+

%list_title%

+
+START:entries + %name%
+END:entries +
+
} -end -end +CLASS_INDEX = FILE_INDEX +METHOD_INDEX = FILE_INDEX + +INDEX = %{ + + + + + + %title% + + + + + + + + + + + +} + + + end # module Page +end # class RDoc + diff --git a/lib/rdoc/generators/template/html/old_html.rb b/lib/rdoc/generators/template/html/old_html.rb new file mode 100644 index 0000000000..3398dc808f --- /dev/null +++ b/lib/rdoc/generators/template/html/old_html.rb @@ -0,0 +1,768 @@ +module RDoc + +# This is how you define the HTML that RDoc generates. Simply create +# a file in rdoc/generators/html_templates that creates the +# module RDoc::Page and populate it as described below. Then invoke +# rdoc using the --template option, and +# your template will be used. +# +# The constants defining pages use a simple templating system: +# +# * The templating system is passed a hash. Keys in the hash correspond +# to tags on this page. The tag %abc% is looked up in the hash, +# and is replaced by the corresponding hash value. +# +# * Some tags are optional. You can detect this using IF/ENDIF +# +# IF: title +# The value of title is %title% +# ENDIF: title +# +# * Some entries in the hash have values that are arrays, where each +# entry in the array is itself a hash. These are used to generate +# lists using the START: construct. For example, given a hash +# containing +# +# { 'people' => [ { 'name' => 'Fred', 'age' => '12' }, +# { 'name' => 'Mary', 'age' => '21' } ] +# +# You could generate a simple table using +# +# +# START:people +# +# END:people +#
%name%%age%
+# +# These lists can be nested to an arbitrary depth +# +# * the construct HREF:url:name: generates %name% +# if +url+ is defined in the hash, or %name% otherwise. +# +# +# Your file must contain the following constants +# +# [*FONTS*] a list of fonts to be used +# [*STYLE*] a CSS section (without the + + + + +START:entries +%name%
+END:entries + +} + +CLASS_INDEX = FILE_INDEX +METHOD_INDEX = FILE_INDEX + +INDEX = %{ + + + + +%title% + + + + + + + + + + <body bgcolor="white"> + Sorry, RDoc currently only generates HTML using frames. + </body> + + + + +} + +###################################################################### +# +# The following is used for the -1 option +# + +CONTENTS_XML = %{ +IF:description +%description% +ENDIF:description + +IF:requires +

Requires:

+
    +START:requires +IF:aref +
  • %name%
  • +ENDIF:aref +IFNOT:aref +
  • %name%
  • +ENDIF:aref +END:requires +
+ENDIF:requires + +IF:attributes +

Attributes

+ +START:attributes + +END:attributes +
%name%%rw%%a_desc%
+ENDIF:attributes + +IF:includes +

Includes

+
    +START:includes +IF:aref +
  • %name%
  • +ENDIF:aref +IFNOT:aref +
  • %name%
  • +ENDIF:aref +END:includes +
+ENDIF:includes + +IF:method_list +

Methods

+START:method_list +IF:methods +START:methods +

%type% %category% method: %name%%params%

+ +IF:m_desc +%m_desc% +ENDIF:m_desc + +IF:sourcecode +
+%sourcecode%
+
+ENDIF:sourcecode +END:methods +ENDIF:methods +END:method_list +ENDIF:method_list +} + +######################################################################## + +ONE_PAGE = %{ + + + + %title% + + + +START:files +

File: %short_name%

+ + + +
Path:%full_path%
Modified:%dtm_modified%
+} + CONTENTS_XML + %{ +END:files + +IF:classes +

Classes

+START:classes +IF:parent +

%classmod% %full_name% < HREF:par_url:parent:

+ENDIF:parent +IFNOT:parent +

%classmod% %full_name%

+ENDIF:parent + +IF:infiles +(in files +START:infiles +HREF:full_path_url:full_path: +END:infiles +) +ENDIF:infiles +} + CONTENTS_XML + %{ +END:classes +ENDIF:classes + + +} + +end +end diff --git a/lib/rdoc/markup/simple_markup/inline.rb b/lib/rdoc/markup/simple_markup/inline.rb index 684ff4b275..7b476e559d 100644 --- a/lib/rdoc/markup/simple_markup/inline.rb +++ b/lib/rdoc/markup/simple_markup/inline.rb @@ -227,7 +227,8 @@ module SM add_html("em", :EM) add_html("i", :EM) add_html("b", :BOLD) - add_html("tt", :TT) + add_html("tt", :TT) + add_html("code", :TT) end def add_word_pair(start, stop, name) diff --git a/lib/rdoc/parsers/parse_c.rb b/lib/rdoc/parsers/parse_c.rb index 1de4797c5f..83fd3a0209 100644 --- a/lib/rdoc/parsers/parse_c.rb +++ b/lib/rdoc/parsers/parse_c.rb @@ -324,7 +324,7 @@ module RDoc if comment.sub!(/call-seq:(.*?)^\s*\*?\s*$/m, '') seq = $1 seq.gsub!(/^\s*\*\s*/, '') - meth_obj.params = "!verb!" + seq + meth_obj.call_seq = seq end # meth_obj.params = params diff --git a/lib/rdoc/ri/ri_cache.rb b/lib/rdoc/ri/ri_cache.rb index 9e8c897d36..8d7c982409 100644 --- a/lib/rdoc/ri/ri_cache.rb +++ b/lib/rdoc/ri/ri_cache.rb @@ -53,6 +53,10 @@ module RI @inferior_classes.find_all {|c| c.name[name]} end + def classes_and_modules + @inferior_classes + end + # Return an exact match to a particular name def contained_class_named(name) @inferior_classes.find {|c| c.name == name} @@ -60,7 +64,7 @@ module RI # return the list of local methods matching name # We're split into two because we need distinct behavior - # when called from the toplevel + # when called from the _toplevel_ def methods_matching(name, is_class_method) local_methods_matching(name, is_class_method) end diff --git a/lib/rdoc/ri/ri_formatter.rb b/lib/rdoc/ri/ri_formatter.rb index b3024d4c6c..03fee89d8f 100644 --- a/lib/rdoc/ri/ri_formatter.rb +++ b/lib/rdoc/ri/ri_formatter.rb @@ -1,8 +1,17 @@ module RI class TextFormatter - def TextFormatter.create(options, indent) - new(options, indent) + def TextFormatter.list + "plain, bs, ansi" + end + + def TextFormatter.for(name) + case name + when /plain/i then TextFormatter + when /bs/i then OverstrikeFormatter + when /ansi/i then AnsiFormatter + else nil + end end attr_reader :indent @@ -20,7 +29,10 @@ module RI len = @width len -= (label.size+1) if label print "-"*len - print(" ", label) if label + if label + print(" ") + bold_print(label) + end puts end @@ -55,6 +67,12 @@ module RI ###################################################################### + def bold_print(txt) + print txt + end + + ###################################################################### + # convert HTML entities back to ASCII def conv_html(txt) txt. @@ -126,7 +144,7 @@ module RI else display_flow_item(item) end - end + end end ###################################################################### @@ -147,24 +165,7 @@ module RI blankline when SM::Flow::H - text = conv_html(item.text.join) - case item.level - when 1 - ul = "=" * text.length - puts - puts text.upcase - puts ul - puts - - when 2 - ul = "-" * text.length - puts - puts text - puts ul - puts - else - print "\n", @indent, text, "\n\n" - end + display_heading(conv_html(item.text.join), item.level, @indent) else fail "Unknown flow element: #{item.class}" end @@ -172,13 +173,277 @@ module RI ###################################################################### + def display_heading(text, level, indent) + case level + when 1 + ul = "=" * text.length + puts + puts text.upcase + puts ul +# puts + + when 2 + ul = "-" * text.length + puts + puts text + puts ul +# puts + else + print indent, text, "\n" + end + end + + ###################################################################### + def display_flow(flow) flow.each do |f| display_flow_item(f) end end end + + + # Handle text with attributes. We're a base class: there are + # different presentation classes (one, for example, uses overstrikes + # to handle bold and underlinig, while another using ANSI escape + # sequences + + class AttributeFormatter < TextFormatter + + BOLD = 1 + ITALIC = 2 + CODE = 4 + + ATTR_MAP = { + "b" => BOLD, + "code" => CODE, + "em" => ITALIC, + "i" => ITALIC, + "tt" => CODE + } + + # TODO: struct? + class AttrChar + attr_reader :char + attr_reader :attr + + def initialize(char, attr) + @char = char + @attr = attr + end + end + + + class AttributeString + def initialize + @txt = [] + @optr = 0 + end + + def <<(char) + @txt << char + end + + def empty? + @optr >= @txt.length + end + + # accept non space, then all following spaces + def next_word + start = @optr + len = @txt.length + + while @optr < len && @txt[@optr].char != " " + @optr += 1 + end + + while @optr < len && @txt[@optr].char == " " + @optr += 1 + end + + @txt[start...@optr] + end + end + + ###################################################################### + # overrides base class. Looks for ... etc sequences + # and generates an array of AttrChars. This array is then used + # as the basis for the split + + def wrap(txt, prefix=@indent, linelen=@width) + return unless txt && !txt.empty? + + txt = add_attributes_to(txt) + + line = [] + + until txt.empty? + word = txt.next_word + if word.size + line.size > linelen - @indent.size + write_attribute_text(line) + line = [] + end + line.concat(word) + end + + write_attribute_text(line) if line.length > 0 + end + + protected + + # overridden in specific formatters + + def write_attribute_text(line) + print @indent + line.each do |achar| + print achar.char + end + puts + end + + # again, overridden + + def bold_print(txt) + print txt + end + + private + + def add_attributes_to(txt) + tokens = txt.split(%r{()}) + text = AttributeString.new + attributes = 0 + tokens.each do |tok| + case tok + when %r{^$} then attributes &= ~(ATTR_MAP[$1]||0) + when %r{^<(\w+)>$} then attributes |= (ATTR_MAP[$1]||0) + else + tok.split(//).each {|ch| text << AttrChar.new(ch, attributes)} + end + end + text + end + + end + + + ################################################## + + # This formatter generates overstrike-style formatting, which + # works with pages such as man and less. + + class OverstrikeFormatter < AttributeFormatter + + BS = "\C-h" + + def write_attribute_text(line) + print @indent + line.each do |achar| + attr = achar.attr + if (attr & (ITALIC+CODE)) != 0 + print "_", BS + end + if (attr & BOLD) != 0 + print achar.char, BS + end + print achar.char + end + puts + end + + # draw a string in bold + def bold_print(text) + text.split(//).each do |ch| + print ch, BS, ch + end + end + end + + ################################################## + + # This formatter uses ANSI escape sequences + # to colorize stuff + # works with pages such as man and less. + + class AnsiFormatter < AttributeFormatter + + BS = "\C-h" + + def initialize(*args) + print "\033[0m" + super + end + + def write_attribute_text(line) + print @indent + curr_attr = 0 + line.each do |achar| + attr = achar.attr + if achar.attr != curr_attr + update_attributes(achar.attr) + curr_attr = achar.attr + end + print achar.char + end + update_attributes(0) unless curr_attr.zero? + puts + end + + + def bold_print(txt) + print "\033[1m#{txt}\033[m" + end + + HEADINGS = { + 1 => "\033[1;32m%s\033[m", + 2 => "\033[4;32m%s\033[m", + 3 => "\033[32m%s\033[m" + } + + def display_heading(text, level, indent) + level = 3 if level > 3 + print indent + printf(HEADINGS[level], text) + puts + end + + private + + ATTR_MAP = { + BOLD => "1", + ITALIC => "33", + CODE => "36" + } + + def update_attributes(attr) + str = "\033[" + for quality in [ BOLD, ITALIC, CODE] + unless (attr & quality).zero? + str << ATTR_MAP[quality] + end + end + print str, "m" + end + end +# options = "options" +# def options.width +# 70 +# end +# a = OverstrikeFormatter.new(options, " ") +# a.wrap( +# "The quick brown and italic dog " + +# "The quick brown and italic dog " + +# "The quick brown and italic dog " + +# "The quick brown and italic dog " + +# "The quick brown and italic dog " + +# "The quick brown and italic dog " + +# "The quick brown and italic dog " + +# "The quick brown and italic dog " + +# "The quick brown and italic dog " + +# "The quick brown and italic dog " + +# "The quick brown and italic dog " +# ) end diff --git a/lib/rdoc/ri/ri_options.rb b/lib/rdoc/ri/ri_options.rb index 3ec6d4657c..9b0704d421 100644 --- a/lib/rdoc/ri/ri_options.rb +++ b/lib/rdoc/ri/ri_options.rb @@ -18,13 +18,24 @@ module RI # The width of the output line attr_reader :width - + + # the formatting we apply to the output + attr_reader :formatter + module OptionList OPTION_LIST = [ [ "--help", "-h", nil, "you're looking at it" ], - + + [ "--format", "-f", "", + "Format to use when displaying output:\n" + + " " + RI::TextFormatter.list + "\n" + + "Use 'bs' (backspace) with most pager programs.\n" + + "To use ANSI, either also use the -T option, or\n\n" + + "tell your pager to allow control characters\n" + + "(for example using the -R option to less)"], + [ "--no-pager", "-T", nil, "Send output directly to stdout." ], @@ -63,7 +74,7 @@ module RI # Show usage and exit - def OptionList.usage + def OptionList.usage(short_form=false) puts puts(RI::VERSION_STRING) @@ -96,12 +107,15 @@ module RI containing puncuation: ri 'Array.[]' - ri compact\! - - Options: + ri compact\\! EOT - + + if short_form + class_list + puts "For help, type 'ri -h'" + else + puts "Options:\n\n" OPTION_LIST.each do |long, short, arg, desc| opt = sprintf("%20s", "#{long}, #{short}") oparg = sprintf("%-7s", arg) @@ -120,6 +134,23 @@ module RI exit 0 end + end + + def OptionList.class_list + paths = RI::Paths::PATH + if paths.empty? + puts "Before using ri, you need to generate documentation" + puts "using 'rdoc' with the --ri option" + else + @ri_reader = RI::RiReader.new(RI::RiCache.new(paths)) + puts + puts "Classes and modules I know about:" + puts + puts @ri_reader.class_names.sort.join(", ") + puts + end + end + end # Parse command line options. @@ -128,7 +159,8 @@ module RI @use_stdout = !STDOUT.tty? @width = 72 - + @formatter = RI::TextFormatter.for("plain") + begin go = GetoptLong.new(*OptionList.options) @@ -138,6 +170,13 @@ module RI case opt when "--help" then OptionList.usage when "--no-pager" then @use_stdout = true + when "--format" + @formatter = RI::TextFormatter.for(arg) + unless @formatter + $stderr.print "Invalid formatter (should be one of " + $stderr.puts RI::TextFormatter.list + ")" + exit 1 + end when "--width" begin @width = Integer(arg) diff --git a/lib/rdoc/ri/ri_reader.rb b/lib/rdoc/ri/ri_reader.rb index dd647b3f89..ddce38f101 100644 --- a/lib/rdoc/ri/ri_reader.rb +++ b/lib/rdoc/ri/ri_reader.rb @@ -52,5 +52,19 @@ module RI File.open(path) {|f| RI::Description.deserialize(f) } end + # return the names of all classes and modules + def class_names + res = [] + find_classes_in(res, @cache.toplevel) + end + + def find_classes_in(res, klass) + classes = klass.classes_and_modules + for c in classes + res << c.name + find_classes_in(res, c) + end + res + end end end -- cgit v1.2.3