yard 0.9.36 → 0.9.40

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.
Files changed (81) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +59 -1
  3. data/README.md +29 -25
  4. data/docs/GettingStarted.md +41 -15
  5. data/docs/Tags.md +5 -5
  6. data/docs/Templates.md +5 -4
  7. data/docs/WhatsNew.md +59 -7
  8. data/docs/templates/default/yard_tags/html/setup.rb +1 -1
  9. data/lib/yard/autoload.rb +18 -0
  10. data/lib/yard/cli/diff.rb +7 -2
  11. data/lib/yard/code_objects/base.rb +1 -1
  12. data/lib/yard/code_objects/extra_file_object.rb +1 -0
  13. data/lib/yard/code_objects/macro_object.rb +0 -1
  14. data/lib/yard/code_objects/proxy.rb +1 -1
  15. data/lib/yard/docstring_parser.rb +0 -1
  16. data/lib/yard/handlers/base.rb +23 -1
  17. data/lib/yard/handlers/processor.rb +1 -1
  18. data/lib/yard/handlers/rbs/attribute_handler.rb +43 -0
  19. data/lib/yard/handlers/rbs/base.rb +38 -0
  20. data/lib/yard/handlers/rbs/constant_handler.rb +18 -0
  21. data/lib/yard/handlers/rbs/method_handler.rb +327 -0
  22. data/lib/yard/handlers/rbs/mixin_handler.rb +20 -0
  23. data/lib/yard/handlers/rbs/namespace_handler.rb +26 -0
  24. data/lib/yard/handlers/ruby/attribute_handler.rb +7 -4
  25. data/lib/yard/handlers/ruby/constant_handler.rb +24 -6
  26. data/lib/yard/handlers/ruby/legacy/visibility_handler.rb +2 -1
  27. data/lib/yard/handlers/ruby/visibility_handler.rb +14 -1
  28. data/lib/yard/i18n/locale.rb +1 -1
  29. data/lib/yard/i18n/pot_generator.rb +1 -1
  30. data/lib/yard/logging.rb +116 -61
  31. data/lib/yard/open_struct.rb +67 -0
  32. data/lib/yard/parser/rbs/rbs_parser.rb +325 -0
  33. data/lib/yard/parser/rbs/statement.rb +75 -0
  34. data/lib/yard/parser/ruby/ast_node.rb +5 -4
  35. data/lib/yard/parser/ruby/legacy/irb/slex.rb +19 -1
  36. data/lib/yard/parser/ruby/legacy/ruby_lex.rb +20 -5
  37. data/lib/yard/parser/ruby/ruby_parser.rb +109 -24
  38. data/lib/yard/parser/source_parser.rb +5 -4
  39. data/lib/yard/registry_resolver.rb +7 -0
  40. data/lib/yard/rubygems/specification.rb +1 -1
  41. data/lib/yard/server/library_version.rb +1 -1
  42. data/lib/yard/server/templates/default/fulldoc/html/js/autocomplete.js +208 -12
  43. data/lib/yard/server/templates/default/layout/html/breadcrumb.erb +1 -17
  44. data/lib/yard/server/templates/default/method_details/html/permalink.erb +4 -2
  45. data/lib/yard/server/templates/doc_server/library_list/html/headers.erb +3 -3
  46. data/lib/yard/server/templates/doc_server/library_list/html/library_list.erb +2 -3
  47. data/lib/yard/server/templates/doc_server/processing/html/processing.erb +22 -16
  48. data/lib/yard/tags/default_factory.rb +1 -0
  49. data/lib/yard/tags/directives.rb +7 -1
  50. data/lib/yard/tags/library.rb +3 -3
  51. data/lib/yard/tags/overload_tag.rb +2 -1
  52. data/lib/yard/tags/tag.rb +2 -1
  53. data/lib/yard/tags/types_explainer.rb +5 -4
  54. data/lib/yard/templates/engine.rb +0 -1
  55. data/lib/yard/templates/helpers/base_helper.rb +1 -1
  56. data/lib/yard/templates/helpers/html_helper.rb +21 -6
  57. data/lib/yard/templates/helpers/html_syntax_highlight_helper.rb +6 -1
  58. data/lib/yard/templates/helpers/markup/hybrid_markdown.rb +2125 -0
  59. data/lib/yard/templates/helpers/markup/rdoc_markup.rb +2 -0
  60. data/lib/yard/templates/helpers/markup_helper.rb +4 -2
  61. data/lib/yard/templates/template_options.rb +0 -1
  62. data/lib/yard/version.rb +1 -1
  63. data/po/ja.po +82 -82
  64. data/templates/default/fulldoc/html/css/full_list.css +3 -3
  65. data/templates/default/fulldoc/html/css/style.css +8 -15
  66. data/templates/default/fulldoc/html/full_list.erb +8 -5
  67. data/templates/default/fulldoc/html/js/app.js +546 -281
  68. data/templates/default/fulldoc/html/js/full_list.js +315 -189
  69. data/templates/default/fulldoc/html/setup.rb +10 -2
  70. data/templates/default/layout/html/headers.erb +1 -1
  71. data/templates/default/method/html/header.erb +3 -3
  72. data/templates/default/module/html/defines.erb +3 -3
  73. data/templates/default/module/html/inherited_methods.erb +1 -0
  74. data/templates/default/module/html/method_summary.erb +8 -0
  75. data/templates/default/module/setup.rb +20 -0
  76. data/templates/default/onefile/html/headers.erb +2 -0
  77. data/templates/default/onefile/html/layout.erb +3 -4
  78. data/templates/default/tags/html/example.erb +2 -2
  79. data/templates/guide/fulldoc/html/js/app.js +57 -26
  80. data/templates/guide/layout/html/layout.erb +9 -11
  81. metadata +19 -8
@@ -1,216 +1,342 @@
1
1
  (function() {
2
+ var clicked = null;
3
+ var searchTimeout = null;
4
+ var searchCache = [];
5
+ var caseSensitiveMatch = false;
6
+ var ignoreKeyCodeMin = 8;
7
+ var ignoreKeyCodeMax = 46;
8
+ var commandKey = 91;
2
9
 
3
- var $clicked = $(null);
4
- var searchTimeout = null;
5
- var searchCache = [];
6
- var caseSensitiveMatch = false;
7
- var ignoreKeyCodeMin = 8;
8
- var ignoreKeyCodeMax = 46;
9
- var commandKey = 91;
10
+ function query(selector, root) {
11
+ return (root || document).querySelector(selector);
12
+ }
13
+
14
+ function queryAll(selector, root) {
15
+ return Array.prototype.slice.call(
16
+ (root || document).querySelectorAll(selector)
17
+ );
18
+ }
10
19
 
11
- RegExp.escape = function(text) {
20
+ function isVisible(element) {
21
+ if (!element) return false;
22
+ if (window.getComputedStyle(element).display === "none") return false;
23
+ if (element.parentElement && element.parentElement !== document.body) {
24
+ return isVisible(element.parentElement);
25
+ }
26
+ return true;
27
+ }
28
+
29
+ RegExp.escape = function(text) {
12
30
  return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
13
- }
31
+ };
14
32
 
15
- function escapeShortcut() {
16
- $(document).keydown(function(evt) {
17
- if (evt.which == 27) {
18
- window.parent.postMessage('navEscape', '*');
33
+ function ready(callback) {
34
+ if (document.readyState === "loading") {
35
+ document.addEventListener("DOMContentLoaded", callback, { once: true });
36
+ } else {
37
+ callback();
19
38
  }
20
- });
21
- }
22
-
23
- function navResizer() {
24
- $(window).mousemove(function(e) {
25
- window.parent.postMessage({
26
- action: 'mousemove', event: {pageX: e.pageX, which: e.which}
27
- }, '*');
28
- }).mouseup(function(e) {
29
- window.parent.postMessage({action: 'mouseup'}, '*');
30
- });
31
- window.parent.postMessage("navReady", "*");
32
- }
33
-
34
- function clearSearchTimeout() {
35
- clearTimeout(searchTimeout);
36
- searchTimeout = null;
37
- }
38
-
39
- function enableLinks() {
40
- // load the target page in the parent window
41
- $('#full_list li').on('click', function(evt) {
42
- $('#full_list li').removeClass('clicked');
43
- $clicked = $(this);
44
- $clicked.addClass('clicked');
45
- evt.stopPropagation();
46
-
47
- if (evt.target.tagName === 'A') return true;
48
-
49
- var elem = $clicked.find('> .item .object_link a')[0];
50
- var e = evt.originalEvent;
51
- var newEvent = new MouseEvent(evt.originalEvent.type);
52
- newEvent.initMouseEvent(e.type, e.canBubble, e.cancelable, e.view, e.detail, e.screenX, e.screenY, e.clientX, e.clientY, e.ctrlKey, e.altKey, e.shiftKey, e.metaKey, e.button, e.relatedTarget);
53
- elem.dispatchEvent(newEvent);
54
- evt.preventDefault();
55
- return false;
56
- });
57
- }
58
-
59
- function enableToggles() {
60
- // show/hide nested classes on toggle click
61
- $('#full_list a.toggle').on('click', function(evt) {
62
- evt.stopPropagation();
63
- evt.preventDefault();
64
- $(this).parent().parent().toggleClass('collapsed');
39
+ }
40
+
41
+ function escapeShortcut() {
42
+ document.addEventListener("keydown", function(event) {
43
+ if (event.key === "Escape") {
44
+ window.parent.postMessage("navEscape", "*");
45
+ }
46
+ });
47
+ }
48
+
49
+ function clearSearchTimeout() {
50
+ clearTimeout(searchTimeout);
51
+ searchTimeout = null;
52
+ }
53
+
54
+ function setClicked(item) {
55
+ queryAll("#full_list li.clicked").forEach(function(node) {
56
+ node.classList.remove("clicked");
57
+ });
58
+ clicked = item;
59
+ if (clicked) clicked.classList.add("clicked");
60
+ }
61
+
62
+ function enableLinks() {
63
+ queryAll("#full_list li").forEach(function(item) {
64
+ item.addEventListener("click", function(event) {
65
+ var targetLink;
66
+ var mouseEvent;
67
+ var url;
68
+
69
+ setClicked(item);
70
+ event.stopPropagation();
71
+
72
+ if (window.origin === "null") {
73
+ if (event.target.tagName === "A") return true;
74
+
75
+ targetLink = item.querySelector(":scope > .item .object_link a");
76
+ if (!targetLink) return false;
77
+ mouseEvent = new MouseEvent("click", {
78
+ bubbles: true,
79
+ cancelable: true,
80
+ view: event.view || window,
81
+ detail: event.detail,
82
+ screenX: event.screenX,
83
+ screenY: event.screenY,
84
+ clientX: event.clientX,
85
+ clientY: event.clientY,
86
+ ctrlKey: event.ctrlKey,
87
+ shiftKey: event.shiftKey,
88
+ altKey: event.altKey,
89
+ metaKey: event.metaKey,
90
+ button: event.button,
91
+ buttons: event.buttons,
92
+ relatedTarget: event.relatedTarget
93
+ });
94
+ targetLink.dispatchEvent(mouseEvent);
95
+ event.preventDefault();
96
+ } else {
97
+ url = item.querySelector(".object_link a").getAttribute("href");
98
+ try {
99
+ url = new URL(url, window.location.href).href;
100
+ } catch (error) {}
101
+ window.top.postMessage({ action: "navigate", url: url }, "*");
102
+ }
103
+ return false;
104
+ });
105
+ });
106
+ }
107
+
108
+ function toggleItem(toggle) {
109
+ var item = toggle.parentElement.parentElement;
110
+ var expanded = item.classList.contains("collapsed");
111
+
112
+ item.classList.toggle("collapsed");
113
+ toggle.setAttribute("aria-expanded", expanded ? "true" : "false");
65
114
  highlight();
66
- });
67
- }
115
+ }
116
+
117
+ function enableToggles() {
118
+ queryAll("#full_list a.toggle").forEach(function(toggle) {
119
+ toggle.addEventListener("click", function(event) {
120
+ event.stopPropagation();
121
+ event.preventDefault();
122
+ toggleItem(toggle);
123
+ });
124
+
125
+ toggle.addEventListener("keypress", function(event) {
126
+ if (event.key !== "Enter") return;
127
+ event.stopPropagation();
128
+ event.preventDefault();
129
+ toggleItem(toggle);
130
+ });
131
+ });
132
+ }
133
+
134
+ function populateSearchCache() {
135
+ queryAll("#full_list li .item").forEach(function(node) {
136
+ var link = query(".object_link a", node);
137
+ if (!link) return;
68
138
 
69
- function populateSearchCache() {
70
- $('#full_list li .item').each(function() {
71
- var $node = $(this);
72
- var $link = $node.find('.object_link a');
73
- if ($link.length > 0) {
74
139
  searchCache.push({
75
- node: $node,
76
- link: $link,
77
- name: $link.text(),
78
- fullName: $link.attr('title').split(' ')[0]
140
+ node: node,
141
+ link: link,
142
+ name: link.textContent,
143
+ fullName: link.getAttribute("title").split(" ")[0]
79
144
  });
145
+ });
146
+ }
147
+
148
+ function enableSearch() {
149
+ var input = query("#search input");
150
+ var fullList = query("#full_list");
151
+
152
+ if (!input || !fullList) return;
153
+
154
+ input.addEventListener("keyup", function(event) {
155
+ if (ignoredKeyPress(event)) return;
156
+ if (input.value === "") {
157
+ clearSearch();
158
+ } else {
159
+ performSearch(input.value);
160
+ }
161
+ });
162
+
163
+ fullList.insertAdjacentHTML(
164
+ "afterend",
165
+ "<div id='noresults' role='status' style='display: none'></div>"
166
+ );
167
+ }
168
+
169
+ function ignoredKeyPress(event) {
170
+ return (
171
+ (event.keyCode > ignoreKeyCodeMin && event.keyCode < ignoreKeyCodeMax) ||
172
+ event.keyCode === commandKey
173
+ );
174
+ }
175
+
176
+ function clearSearch() {
177
+ clearSearchTimeout();
178
+ queryAll("#full_list .found").forEach(function(node) {
179
+ var link = query(".object_link a", node);
180
+ node.classList.remove("found");
181
+ link.textContent = link.textContent;
182
+ });
183
+ query("#full_list").classList.remove("insearch");
184
+ query("#content").classList.remove("insearch");
185
+ if (clicked) {
186
+ var current = clicked.parentElement;
187
+ while (current) {
188
+ if (current.tagName === "LI") current.classList.remove("collapsed");
189
+ if (current.id === "full_list") break;
190
+ current = current.parentElement;
191
+ }
192
+ }
193
+ highlight();
194
+ }
195
+
196
+ function performSearch(searchString) {
197
+ clearSearchTimeout();
198
+ query("#full_list").classList.add("insearch");
199
+ query("#content").classList.add("insearch");
200
+ query("#noresults").textContent = "";
201
+ query("#noresults").style.display = "none";
202
+ partialSearch(searchString, 0);
203
+ }
204
+
205
+ function partialSearch(searchString, offset) {
206
+ var lastRowClass = "";
207
+ var i;
208
+
209
+ for (i = offset; i < Math.min(offset + 50, searchCache.length); i += 1) {
210
+ var item = searchCache[i];
211
+ var searchName =
212
+ searchString.indexOf("::") !== -1 ? item.fullName : item.name;
213
+ var matchRegexp = new RegExp(
214
+ buildMatchString(searchString),
215
+ caseSensitiveMatch ? "" : "i"
216
+ );
217
+
218
+ if (!searchName.match(matchRegexp)) {
219
+ item.node.classList.remove("found");
220
+ item.link.textContent = item.link.textContent;
221
+ } else {
222
+ item.node.classList.add("found");
223
+ if (lastRowClass) item.node.classList.remove(lastRowClass);
224
+ item.node.classList.add(lastRowClass === "r1" ? "r2" : "r1");
225
+ lastRowClass = item.node.classList.contains("r1") ? "r1" : "r2";
226
+ item.link.innerHTML = item.name.replace(matchRegexp, "<strong>$&</strong>");
227
+ }
80
228
  }
81
- });
82
- }
83
229
 
84
- function enableSearch() {
85
- $('#search input').keyup(function(event) {
86
- if (ignoredKeyPress(event)) return;
87
- if (this.value === "") {
88
- clearSearch();
230
+ if (i === searchCache.length) {
231
+ searchDone();
89
232
  } else {
90
- performSearch(this.value);
233
+ searchTimeout = setTimeout(function() {
234
+ partialSearch(searchString, i);
235
+ }, 0);
91
236
  }
92
- });
237
+ }
93
238
 
94
- $('#full_list').after("<div id='noresults' style='display:none'></div>");
95
- }
239
+ function searchDone() {
240
+ var found = queryAll("#full_list li").filter(isVisible).length;
96
241
 
97
- function ignoredKeyPress(event) {
98
- if (
99
- (event.keyCode > ignoreKeyCodeMin && event.keyCode < ignoreKeyCodeMax) ||
100
- (event.keyCode == commandKey)
101
- ) {
102
- return true;
103
- } else {
104
- return false;
105
- }
106
- }
242
+ searchTimeout = null;
243
+ highlight();
107
244
 
108
- function clearSearch() {
109
- clearSearchTimeout();
110
- $('#full_list .found').removeClass('found').each(function() {
111
- var $link = $(this).find('.object_link a');
112
- $link.text($link.text());
113
- });
114
- $('#full_list, #content').removeClass('insearch');
115
- $clicked.parents().removeClass('collapsed');
116
- highlight();
117
- }
118
-
119
- function performSearch(searchString) {
120
- clearSearchTimeout();
121
- $('#full_list, #content').addClass('insearch');
122
- $('#noresults').text('').hide();
123
- partialSearch(searchString, 0);
124
- }
125
-
126
- function partialSearch(searchString, offset) {
127
- var lastRowClass = '';
128
- var i = null;
129
- for (i = offset; i < Math.min(offset + 50, searchCache.length); i++) {
130
- var item = searchCache[i];
131
- var searchName = (searchString.indexOf('::') != -1 ? item.fullName : item.name);
132
- var matchString = buildMatchString(searchString);
133
- var matchRegexp = new RegExp(matchString, caseSensitiveMatch ? "" : "i");
134
- if (searchName.match(matchRegexp) == null) {
135
- item.node.removeClass('found');
136
- item.link.text(item.link.text());
245
+ if (found === 0) {
246
+ query("#noresults").textContent = "No results were found.";
247
+ } else {
248
+ query("#noresults").textContent = "There are " + found + " results.";
137
249
  }
138
- else {
139
- item.node.addClass('found');
140
- item.node.removeClass(lastRowClass).addClass(lastRowClass == 'r1' ? 'r2' : 'r1');
141
- lastRowClass = item.node.hasClass('r1') ? 'r1' : 'r2';
142
- item.link.html(item.name.replace(matchRegexp, "<strong>$&</strong>"));
250
+ query("#noresults").style.display = "block";
251
+ query("#content").classList.remove("insearch");
252
+ }
253
+
254
+ function buildMatchString(searchString) {
255
+ var regexSearchString;
256
+
257
+ caseSensitiveMatch = /[A-Z]/.test(searchString);
258
+ regexSearchString = RegExp.escape(searchString);
259
+ if (caseSensitiveMatch) {
260
+ regexSearchString +=
261
+ "|" +
262
+ searchString
263
+ .split("")
264
+ .map(function(character) {
265
+ return RegExp.escape(character);
266
+ })
267
+ .join(".+?");
143
268
  }
269
+ return regexSearchString;
144
270
  }
145
- if(i == searchCache.length) {
146
- searchDone();
147
- } else {
148
- searchTimeout = setTimeout(function() {
149
- partialSearch(searchString, i);
150
- }, 0);
151
- }
152
- }
153
-
154
- function searchDone() {
155
- searchTimeout = null;
156
- highlight();
157
- if ($('#full_list li:visible').size() === 0) {
158
- $('#noresults').text('No results were found.').hide().fadeIn();
159
- } else {
160
- $('#noresults').text('').hide();
161
- }
162
- $('#content').removeClass('insearch');
163
- }
164
-
165
- function buildMatchString(searchString, event) {
166
- caseSensitiveMatch = searchString.match(/[A-Z]/) != null;
167
- var regexSearchString = RegExp.escape(searchString);
168
- if (caseSensitiveMatch) {
169
- regexSearchString += "|" +
170
- $.map(searchString.split(''), function(e) { return RegExp.escape(e); }).
171
- join('.+?');
172
- }
173
- return regexSearchString;
174
- }
175
-
176
- function highlight() {
177
- $('#full_list li:visible').each(function(n) {
178
- $(this).removeClass('even odd').addClass(n % 2 == 0 ? 'odd' : 'even');
179
- });
180
- }
181
-
182
- /**
183
- * Expands the tree to the target element and its immediate
184
- * children.
185
- */
186
- function expandTo(path) {
187
- var $target = $(document.getElementById('object_' + path));
188
- $target.addClass('clicked');
189
- $target.removeClass('collapsed');
190
- $target.parentsUntil('#full_list', 'li').removeClass('collapsed');
191
- if($target[0]) {
192
- window.scrollTo(window.scrollX, $target.offset().top - 250);
193
- highlight();
271
+
272
+ function highlight() {
273
+ queryAll("#full_list li")
274
+ .filter(isVisible)
275
+ .forEach(function(item, index) {
276
+ item.classList.remove("even");
277
+ item.classList.remove("odd");
278
+ item.classList.add(index % 2 === 0 ? "odd" : "even");
279
+ });
194
280
  }
195
- }
196
281
 
197
- function windowEvents(event) {
198
- var msg = event.data;
199
- if (msg.action === "expand") {
200
- expandTo(msg.path);
282
+ function isInView(element) {
283
+ var rect = element.getBoundingClientRect();
284
+ var windowHeight =
285
+ window.innerHeight || document.documentElement.clientHeight;
286
+ return rect.left >= 0 && rect.bottom <= windowHeight;
287
+ }
288
+
289
+ function expandTo(path) {
290
+ var target = document.getElementById("object_" + path);
291
+
292
+ if (!target) return;
293
+
294
+ target.classList.add("clicked");
295
+ target.classList.remove("collapsed");
296
+
297
+ var current = target.parentElement;
298
+ while (current && current.id !== "full_list") {
299
+ if (current.tagName === "LI") current.classList.remove("collapsed");
300
+ current = current.parentElement;
301
+ }
302
+
303
+ queryAll("a.toggle", target).forEach(function(toggle) {
304
+ toggle.setAttribute("aria-expanded", "true");
305
+ });
306
+
307
+ current = target.parentElement;
308
+ while (current && current.id !== "full_list") {
309
+ if (current.tagName === "LI") {
310
+ var toggle = current.querySelector(":scope > div > a.toggle");
311
+ if (toggle) toggle.setAttribute("aria-expanded", "true");
312
+ }
313
+ current = current.parentElement;
314
+ }
315
+
316
+ if (!isInView(target)) {
317
+ window.scrollTo(
318
+ window.scrollX,
319
+ target.getBoundingClientRect().top + window.scrollY - 250
320
+ );
321
+ highlight();
322
+ }
201
323
  }
202
- return false;
203
- }
204
324
 
205
- window.addEventListener("message", windowEvents, false);
325
+ function windowEvents(event) {
326
+ var msg = event.data;
327
+ if (msg.action === "expand") {
328
+ expandTo(msg.path);
329
+ }
330
+ return false;
331
+ }
206
332
 
207
- $(document).ready(function() {
208
- escapeShortcut();
209
- navResizer();
210
- enableLinks();
211
- enableToggles();
212
- populateSearchCache();
213
- enableSearch();
214
- });
333
+ window.addEventListener("message", windowEvents, false);
215
334
 
335
+ ready(function() {
336
+ escapeShortcut();
337
+ enableLinks();
338
+ enableToggles();
339
+ populateSearchCache();
340
+ enableSearch();
341
+ });
216
342
  })();
@@ -104,6 +104,12 @@ def javascripts_full_list
104
104
  %w(js/jquery.js js/full_list.js)
105
105
  end
106
106
 
107
+ # Sets the HTML language lang="value" where value is the value returned from
108
+ # this method. Defaults to nil which does not set the lang attribute.
109
+ def html_lang
110
+ nil
111
+ end
112
+
107
113
  def menu_lists
108
114
  Object.new.extend(T('layout')).menu_lists
109
115
  end
@@ -225,7 +231,8 @@ def class_list(root = Registry.root, tree = TreeContext.new)
225
231
  has_children = run_verifier(child.children).any? {|o| o.is_a?(CodeObjects::NamespaceObject) }
226
232
  out << "<li id='object_#{child.path}' class='#{tree.classes.join(' ')}'>"
227
233
  out << "<div class='item' style='padding-left:#{tree.indent}'>"
228
- out << "<a class='toggle'></a> " if has_children
234
+ accessible_props = "aria-label='#{name} child nodes' aria-expanded='false' aria-controls='object_#{child.path}'"
235
+ out << "<a tabindex='0' class='toggle' role='button' #{accessible_props}></a> " if has_children
229
236
  out << linkify(child, name)
230
237
  out << " &lt; #{child.superclass.name}" if child.is_a?(CodeObjects::ClassObject) && child.superclass
231
238
  out << "<small class='search_info'>"
@@ -233,7 +240,8 @@ def class_list(root = Registry.root, tree = TreeContext.new)
233
240
  out << "</small>"
234
241
  out << "</div>"
235
242
  tree.nest do
236
- out << "<ul>#{class_list(child, tree)}</ul>" if has_children
243
+ labeled_by = "aria-labelledby='object_#{child.path}'"
244
+ out << "<div #{labeled_by}><ul>#{class_list(child, tree)}</ul></div>" if has_children
237
245
  end
238
246
  out << "</li>"
239
247
  end
@@ -7,7 +7,7 @@
7
7
  <% end %>
8
8
  </title>
9
9
  <% stylesheets.each do |stylesheet| %>
10
- <link rel="stylesheet" href="<%= mtime_url(stylesheet) %>" type="text/css" />
10
+ <link rel="stylesheet" href="<%= mtime_url(stylesheet) %>" type="text/css">
11
11
  <% end %>
12
12
  <%= erb :script_setup %>
13
13
  <% javascripts.each do |javascript| %>
@@ -3,8 +3,8 @@
3
3
  <dl>
4
4
  <dt class="">Defined in:</dt>
5
5
  <dd class="">
6
- <%= object.file %><% if object.files.size > 1 %><span class="defines">,<br />
7
- <%= object.files[1..-1].map {|f| f.first }.join(",<br /> ") %></div>
6
+ <%= object.file %><% if object.files.size > 1 %><span class="defines">,<br>
7
+ <%= object.files[1..-1].map {|f| f.first }.join(",<br> ") %></div>
8
8
  <% end %>
9
9
  </dd>
10
10
  </dl>
@@ -14,4 +14,4 @@
14
14
  <div id="method_details">
15
15
  <%= yieldall :index => 0 %>
16
16
  </div>
17
- </div>
17
+ </div>
@@ -1,3 +1,3 @@
1
- <%= object.file ? object.file : '(unknown)' %><% if object.files.size > 1 %><span class="defines">,<br />
2
- <%= object.files[1..-1].map {|f| f.first }.join(",<br /> ") %></span>
3
- <% end %>
1
+ <%= object.file ? object.file : '(unknown)' %><% if object.files.size > 1 %><span class="defines">,<br>
2
+ <%= object.files[1..-1].map {|f| f.first }.join(",<br> ") %></span>
3
+ <% end %>
@@ -5,6 +5,7 @@
5
5
  <% meths = prune_method_listing(superclass.meths(:included => false, :inherited => false)) %>
6
6
  <% meths.reject! {|m| object.child(:scope => m.scope, :name => m.name) != nil } %>
7
7
  <% meths.reject! {|m| m.is_alias? || m.is_attribute? } %>
8
+ <% meths.reject! {|m| m.group && object.groups && object.groups.include?(m.group) } %>
8
9
  <% next if meths.size == 0 %>
9
10
  <% if method_listing.size == 0 && !found_method %><h2>Method Summary</h2><% end %>
10
11
  <% found_method = true %>
@@ -10,5 +10,13 @@
10
10
  <%= yieldall :item => meth %>
11
11
  <% end %>
12
12
  </ul>
13
+ <% (inherited_methods_by_group[name] || {}).each do |superclass, meths| %>
14
+ <h3 class="inherited">Methods <%= superclass.type == :class ? 'inherited' : 'included' %> from <%= linkify superclass %></h3>
15
+ <p class="inherited"><%= meths.sort_by {|o| o.name.to_s }.map {|m|
16
+ mname = m.name(true)
17
+ mname = mname.gsub(/^#/, '') if superclass.type == :module && object.class_mixins.include?(superclass)
18
+ linkify(m, mname)
19
+ }.join(", ") %></p>
20
+ <% end %>
13
21
  <% end %>
14
22
  <% end %>
@@ -104,6 +104,26 @@ def inherited_constant_list
104
104
  end
105
105
  end
106
106
 
107
+ def inherited_methods_by_group
108
+ return @inherited_meths_by_group if defined?(@inherited_meths_by_group)
109
+ @inherited_meths_by_group = {}
110
+ return @inherited_meths_by_group unless object.groups
111
+
112
+ object.inheritance_tree(true)[1..-1].each do |superclass|
113
+ next if superclass.is_a?(YARD::CodeObjects::Proxy)
114
+ next if options.embed_mixins.size > 0 && options.embed_mixins_match?(superclass) != false
115
+ meths = prune_method_listing(superclass.meths(:included => false, :inherited => false))
116
+ meths.reject! {|m| object.child(:scope => m.scope, :name => m.name) != nil }
117
+ meths.reject! {|m| m.is_alias? || m.is_attribute? }
118
+ meths.each do |m|
119
+ next unless m.group && object.groups.include?(m.group)
120
+ (@inherited_meths_by_group[m.group] ||= {})[superclass] ||= []
121
+ @inherited_meths_by_group[m.group][superclass] << m
122
+ end
123
+ end
124
+ @inherited_meths_by_group
125
+ end
126
+
107
127
  def docstring_full(obj)
108
128
  docstring = obj.tags(:overload).size == 1 && obj.docstring.empty? ?
109
129
  obj.tag(:overload).docstring : obj.docstring
@@ -1,5 +1,7 @@
1
1
  <style type="text/css">
2
2
  <%= @css_data %>
3
+ html { width: auto; height: auto; }
4
+ body { display: block; margin: 1rem; width: auto; }
3
5
  </style>
4
6
  <script type="text/javascript">
5
7
  <%= @js_data %>
@@ -1,8 +1,7 @@
1
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3
- <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
1
+ <!DOCTYPE html>
2
+ <html lang="en">
4
3
  <head>
5
- <meta http-equiv="Content-Type" content="text/html; charset=<%= charset %>" />
4
+ <meta charset="<%= charset %>">
6
5
  <title><%= defined?(@title) ? @title : '' %></title>
7
6
  <%= erb(:headers) %>
8
7
  </head>