rdoc_osx_dictionary 1.2.0 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,3 +1,16 @@
1
+ === 1.3.0 / 2010-02-09
2
+
3
+ * 4 minor enhancements:
4
+
5
+ * Improved hyperlinks in class definitions to point straight at methods.
6
+ * Improved method signature output (imajes)
7
+ * Made method signature a pre block to improve display of space formatted text.
8
+ * Refactored and improved class output to clearly define class extensions.
9
+
10
+ * 1 bug fix:
11
+
12
+ * Specify exactly which ruby to execute (hinegardner)
13
+
1
14
  === 1.2.0 / 2010-02-03
2
15
 
3
16
  * 3 minor enhancements:
data/README.txt CHANGED
@@ -7,6 +7,8 @@
7
7
  rdoc via Apple's Dictionary.app. Automatically builds and installs an
8
8
  Apple Dictionary with all rdoc nicely formatted.
9
9
 
10
+ Inspired by: http://priithaamer.com/blog/ruby-on-rails-dictionary-for-macosx
11
+
10
12
  == FEATURES/PROBLEMS:
11
13
 
12
14
  * Automatically builds and installs an Apple Dictionary with all rdoc
@@ -1,4 +1,4 @@
1
- #!/usr/bin/ruby -ws
1
+ #!/usr/bin/env ruby -ws
2
2
 
3
3
  $v ||= false
4
4
  $f ||= false
@@ -3,20 +3,21 @@
3
3
  require 'fileutils'
4
4
  require 'rdoc/ri/driver'
5
5
 
6
+ $q ||= false
7
+
6
8
  # Forces /bin/tr to ignore badly formatted "unicode". (no clue where from)
7
9
  ENV['LANG'] = ""
8
10
  ENV['LC_ALL'] = "C"
9
11
 
10
12
  class RDoc::OSXDictionary
11
- VERSION = '1.2.0'
12
-
13
- exclude = %w[ StringScanner#pre_match
14
- StringScanner#post_match
15
- Gem::Package::TarInput
16
- IRB::OutputMethod
17
- ]
13
+ VERSION = '1.3.0'
18
14
 
19
- EXCLUDE = Hash[*exclude.map { |k| [k, true] }.flatten]
15
+ EXCLUDE = {
16
+ "StringScanner#pre_match" => true,
17
+ "StringScanner#post_match" => true,
18
+ "Gem::Package::TarInput" => true,
19
+ "IRB::OutputMethod" => true,
20
+ }
20
21
 
21
22
  NAME_MAP = {
22
23
  '!' => 'bang',
@@ -55,75 +56,108 @@ class RDoc::OSXDictionary
55
56
  }.reverse.join("|"))
56
57
 
57
58
 
59
+ def id *args
60
+ args.map { |s| s.gsub(/:/, ',') }.join(",").gsub(/#{NAME_MAP_RE}/) { |x|
61
+ ",#{NAME_MAP[x]}"
62
+ }
63
+ end
64
+
58
65
  def display_class_info definition
59
66
  name = definition["name"]
60
67
  fullname = definition["full_name"]
61
68
  supername = definition["superclass"]
62
- includes = (definition["includes"]||[]).join(", ")
63
- classmeths = definition["class_methods"].map { |hash| hash["name"] }
64
- instmeths = definition["instance_methods"].map { |hash| hash["name"] }
65
69
  type = supername ? "class" : "module"
66
70
  title = supername ? "class #{fullname} < #{supername}" : "module #{fullname}"
67
71
  comment = Array(definition["comment"]).join("\n")
68
- constants = Array(definition["constants"])
69
- sources = definition["sources"].map { |path|
70
- next if path =~ /^.System/
71
- path.sub(%r%^.*?1\.[89]/doc/([^/]+).*%, '\1')
72
- }.compact
73
72
 
74
- comment = "Improperly formatted" if EXCLUDE[fullname]
73
+ definition["includes"].map! { |c| c["name"] }
74
+ definition["constants"].map! { |c| c["name"] }
75
75
 
76
- id = "#{type}_#{fullname}".munge.gsub(/[\s:.#]/, '_')
76
+ return if $q and fullname !~ /^(String|Array|Bignum)/
77
+
78
+ comment = "Improperly formatted" if EXCLUDE[fullname]
77
79
 
78
80
  result = []
79
81
 
80
82
  shortname = "<d:index d:value=#{name.munge.inspect}/>" if name != fullname
81
83
 
82
84
  result << <<-"EOD".gsub(/^ /, '')
83
- <d:entry id="#{id}" d:title="#{fullname}">
85
+ <d:entry id="#{id type, fullname}" d:title="#{fullname}">
84
86
  <d:index d:value="#{fullname.munge}"/>
85
87
  #{shortname}
86
88
  <h1>#{title.munge}</h1>
87
89
 
88
90
  #{comment}
89
- EOD
91
+ EOD
92
+
93
+ extensions = []
94
+
95
+ definition["sources"].shift # remove first one as the original source
96
+ definition["sources"].each do |path|
97
+ next if path =~ /^.System/
98
+
99
+ gemname = File.basename(path.sub(%r(/ri/\w+/cdesc-\w+.yaml), ''))
100
+ extension = YAML.load File.read(path).gsub(/- !.+/, '-')
101
+
102
+ extension["includes"].map! { |c| c["name"] }
103
+ extension["constants"].map! { |c| c["name"] }
90
104
 
91
- constants.map! { |c| c["name"] }
92
-
93
- ext, ext_type = sources.size == 1 ? ["From", :str] : ["Extensions", :list]
94
-
95
- [["Includes", includes.munge, :str],
96
- ["Constants", constants.join(", "), :str],
97
- ["Class Methods", classmeths.join(", ").munge, :str],
98
- ["Instance Methods", instmeths.join(", ").munge, :str],
99
- [ext, sources, ext_type]].each do |n, s, t|
100
- next if s.empty?
101
- case t
102
- when :str then
103
- result << "<h3>#{n}:</h3><p>#{s}</p>"
104
- when :list then
105
- items = s.map { |o| "<li>#{o}</li>" }.join("\n")
106
- result << "<h3>#{n}:</h3><ul>#{items}</ul>"
107
- else
108
- raise "unknown type #{t.inspect}"
105
+ detail = class_details(name, fullname, extension, 4)
106
+
107
+ next if detail.empty?
108
+
109
+ extensions << "<h3>#{gemname}:</h3>"
110
+ extensions << detail
111
+ %w(class_methods instance_methods includes constants).each do |k|
112
+ definition[k] -= extension[k]
109
113
  end
110
114
  end
111
115
 
112
- %w(name comment superclass includes constants class_methods
113
- instance_methods sources display_name full_name).each do |key|
114
- definition.delete key
115
- end
116
+ result << class_details(name, fullname, definition)
117
+ result << "<h2>Extensions:</h2>" unless extensions.empty?
118
+ result << extensions
116
119
 
117
120
  result << <<-"EOD".gsub(/^ /, '')
118
121
  </d:entry>
119
- EOD
122
+ EOD
120
123
  result.join("\n")
121
124
  end
122
125
 
126
+ def class_details name, fullname, definition, level = 2
127
+ h = "h#{level}"
128
+ result = []
129
+ includes = definition["includes"]
130
+ constants = definition["constants"]
131
+
132
+ classmeths = definition["class_methods"].map { |hash|
133
+ name = hash["name"]
134
+ "<a href=\"x-dictionary:r:#{id "defs", fullname, name}\">#{name}</a>"
135
+ }
136
+
137
+ instmeths = definition["instance_methods"].map { |hash|
138
+ name = hash["name"]
139
+ "<a href=\"x-dictionary:r:#{id "def", fullname, name}\">#{name.munge}</a>"
140
+ }
141
+
142
+ [["Includes", includes],
143
+ ["Constants", constants],
144
+ ["Class Methods", classmeths],
145
+ ["Instance Methods", instmeths],
146
+ ].each do |n, a|
147
+ next if a.empty?
148
+
149
+ result << "<#{h}>#{n}:</#{h}><p>#{a.join ", "}</p>"
150
+ end
151
+
152
+ result
153
+ end
154
+
123
155
  def display_method_info definition
124
156
  fullname = definition["full_name"]
157
+ klass = definition["class"]
125
158
  name = definition["name"]
126
- id = fullname.gsub(/#{NAME_MAP_RE}/) { |x| "_#{NAME_MAP[x]}" }
159
+
160
+ return if $q and klass !~ /^(String|Array|Bignum)/
127
161
 
128
162
  return if name =~ /_reduce_\d+/
129
163
 
@@ -133,19 +167,32 @@ class RDoc::OSXDictionary
133
167
 
134
168
  comment = "Improperly formatted" if EXCLUDE[fullname]
135
169
 
170
+ type = definition["is_singleton"] ? "defs" : "def"
171
+
172
+ # TODO: aliases don't have recv
173
+ # TODO: some regular methods don't have recv
174
+
136
175
  result = <<-"EOD".gsub(/^ /, '')
137
- <d:entry id="def_#{id}" d:title="#{id}">
176
+ <d:entry id="#{id type, klass, name}" d:title="#{fullname.munge}">
138
177
  <d:index d:value="#{fullname.munge}"/>
139
178
  <d:index d:value="#{name.munge}"/>
140
179
  <h1>#{fullname.munge}</h1>
141
- <p class="signatures">
142
- <b>#{name.munge}#{params.munge}</b>
143
- </p>
180
+ <pre class="signatures">
181
+ #{d_signatures(name, params)}
182
+ </pre>
144
183
  #{comment}
145
184
  </d:entry>
146
185
  EOD
147
186
  end
148
187
 
188
+ def d_signatures name, params
189
+ result = " "
190
+ if params.strip =~ /^\(/
191
+ result << "<b>#{name.munge}</b>"
192
+ end
193
+ result << "<b>#{params.munge.gsub(/\n/, "<br />")}</b>"
194
+ end
195
+
149
196
  def d_header
150
197
  result = <<-"EOD"
151
198
  <?xml version="1.0" encoding="UTF-8"?>
@@ -225,6 +272,7 @@ class RDoc::OSXDictionary
225
272
  result << d_entry(klass, dict[klass], true)
226
273
 
227
274
  methods.each do |k,v|
275
+ v["class"] = klass
228
276
  result << d_entry(k, v)
229
277
  end
230
278
 
@@ -291,7 +339,8 @@ class RDoc::OSXDictionary
291
339
  def self.install_gem_hooks
292
340
  return if @hooked[:hook]
293
341
 
294
- cmd = File.expand_path File.join(__FILE__, "../../bin/rdoc_osx_dictionary")
342
+ rdoc_osx_dictionary_path = File.expand_path File.join(__FILE__, "../../bin/rdoc_osx_dictionary")
343
+ cmd = "#{Gem.ruby} #{rdoc_osx_dictionary_path}"
295
344
 
296
345
  # post_install isn't actually fully post-install... so I must
297
346
  # force via at_exit :(
@@ -321,7 +370,7 @@ end
321
370
 
322
371
  class String
323
372
  def munge
324
- self.gsub(/&/, '&amp;').gsub(/>/, '&gt;').gsub(/</, '&lt;').gsub(/-/, 'minus')
373
+ self.gsub(/&/, '&amp;').gsub(/>/, '&gt;').gsub(/</, '&lt;').gsub(/-/, '&#45;')
325
374
  end
326
375
  end
327
376
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rdoc_osx_dictionary
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryan Davis
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2010-02-03 00:00:00 -08:00
12
+ date: 2010-02-09 00:00:00 -08:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -65,6 +65,8 @@ dependencies:
65
65
  description: |-
66
66
  rdoc via Apple's Dictionary.app. Automatically builds and installs an
67
67
  Apple Dictionary with all rdoc nicely formatted.
68
+
69
+ Inspired by: http://priithaamer.com/blog/ruby-on-rails-dictionary-for-macosx
68
70
  email:
69
71
  - ryand-ruby@zenspider.com
70
72
  executables: