jrun-rstack 0.5.2
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.
- data/CHANGELOG.txt +0 -0
- data/LICENSE.txt +20 -0
- data/README.textile +57 -0
- data/Rakefile +13 -0
- data/bin/rstack +18 -0
- data/lib/rstack/configuration.rb +67 -0
- data/lib/rstack/generator.rb +58 -0
- data/lib/rstack/tasks/doc.rb +15 -0
- data/lib/rstack/tasks/gem.rb +52 -0
- data/lib/rstack/tasks/rspec.rb +24 -0
- data/lib/rstack/version.rb +9 -0
- data/lib/rstack.rb +25 -0
- data/spec/configuration_spec.rb +49 -0
- data/spec/generator_spec.rb +76 -0
- data/spec/spec_helper.rb +20 -0
- data/spec/tasks/doc_spec.rb +13 -0
- data/templates/README.txt +1 -0
- data/templates/Rakefile +11 -0
- data/templates/cruise_config.rb +10 -0
- data/templates/main.rb +1 -0
- data/templates/spec_helper.rb +14 -0
- data/templates/version.rb +8 -0
- data/vendor/allison-2.0.2/CHANGELOG +16 -0
- data/vendor/allison-2.0.2/LICENSE +184 -0
- data/vendor/allison-2.0.2/Manifest +23 -0
- data/vendor/allison-2.0.2/README +66 -0
- data/vendor/allison-2.0.2/allison.gemspec +45 -0
- data/vendor/allison-2.0.2/bin/allison +9 -0
- data/vendor/allison-2.0.2/cache/BODY +571 -0
- data/vendor/allison-2.0.2/cache/CLASS_INDEX +4 -0
- data/vendor/allison-2.0.2/cache/CLASS_PAGE +1 -0
- data/vendor/allison-2.0.2/cache/FILE_INDEX +4 -0
- data/vendor/allison-2.0.2/cache/FILE_PAGE +1 -0
- data/vendor/allison-2.0.2/cache/FONTS +1 -0
- data/vendor/allison-2.0.2/cache/FR_INDEX_BODY +1 -0
- data/vendor/allison-2.0.2/cache/INDEX +1 -0
- data/vendor/allison-2.0.2/cache/JAVASCRIPT +317 -0
- data/vendor/allison-2.0.2/cache/METHOD_INDEX +4 -0
- data/vendor/allison-2.0.2/cache/METHOD_LIST +1 -0
- data/vendor/allison-2.0.2/cache/PROJECT +1 -0
- data/vendor/allison-2.0.2/cache/SRC_PAGE +1 -0
- data/vendor/allison-2.0.2/cache/STYLE +321 -0
- data/vendor/allison-2.0.2/contrib/Rakefile +147 -0
- data/vendor/allison-2.0.2/lib/allison.css +315 -0
- data/vendor/allison-2.0.2/lib/allison.js +317 -0
- data/vendor/allison-2.0.2/lib/allison.rb +276 -0
- metadata +157 -0
@@ -0,0 +1,317 @@
|
|
1
|
+
|
2
|
+
// Allison template
|
3
|
+
// Copyright 2007 Cloudburst LLC, all rights reserved
|
4
|
+
// Redistribution or modification prohibited
|
5
|
+
|
6
|
+
var href_base = '%style_url%'.replace(/(.*\/).*/, '$1'); // inline js is good for something
|
7
|
+
|
8
|
+
function $(id) {
|
9
|
+
if (document.getElementById)
|
10
|
+
elem = document.getElementById(id);
|
11
|
+
else if ( document.all )
|
12
|
+
elem = eval("document.all." + id);
|
13
|
+
else
|
14
|
+
return false;
|
15
|
+
return elem;
|
16
|
+
}
|
17
|
+
|
18
|
+
function toggle(id) {
|
19
|
+
elem = $(id);
|
20
|
+
elemStyle = elem.style;
|
21
|
+
if (elemStyle.display == "block") {
|
22
|
+
elemStyle.display = "none"
|
23
|
+
} else {
|
24
|
+
elemStyle.display = "block"
|
25
|
+
}
|
26
|
+
return true;
|
27
|
+
}
|
28
|
+
|
29
|
+
function toggleText(id) {
|
30
|
+
elem = $(id)
|
31
|
+
if (m = elem.innerHTML.match(/(Hide)(.*)/)) {
|
32
|
+
elem.innerHTML = "Show" + m[2];
|
33
|
+
} else if (m = elem.innerHTML.match(/(Show)(.*)/)) {
|
34
|
+
elem.innerHTML = "Hide" + m[2];
|
35
|
+
}
|
36
|
+
return true;
|
37
|
+
}
|
38
|
+
|
39
|
+
function span(s, klass) {
|
40
|
+
return '<span class="' + klass + '">' + s + '</span>';
|
41
|
+
}
|
42
|
+
|
43
|
+
function highlightSymbols() {
|
44
|
+
pres = document.getElementsByTagName('pre');
|
45
|
+
for(var i = 0; i < pres.length; i++) {
|
46
|
+
pre = pres[i];
|
47
|
+
spans = pre.getElementsByTagName('span');
|
48
|
+
for(var k = 0; k < spans.length; k++) {
|
49
|
+
span = spans[k];
|
50
|
+
if (span.className.match(/ruby-identifier/)) {
|
51
|
+
if (span.innerHTML.match(/^:/)) {
|
52
|
+
span.className += " ruby-symbol";
|
53
|
+
}
|
54
|
+
}
|
55
|
+
}
|
56
|
+
}
|
57
|
+
}
|
58
|
+
|
59
|
+
function hasClass(obj) {
|
60
|
+
var result = false;
|
61
|
+
if (obj.getAttributeNode("class") != null) {
|
62
|
+
result = obj.getAttributeNode("class").value;
|
63
|
+
}
|
64
|
+
return result;
|
65
|
+
}
|
66
|
+
|
67
|
+
function stripe() {
|
68
|
+
var even = true;
|
69
|
+
var color = "#e4ebed";
|
70
|
+
var tables = document.getElementsByTagName('table');
|
71
|
+
if (tables.length == 0) { return; }
|
72
|
+
for (var h = 0; h < tables.length; h++) {
|
73
|
+
var trs = tables[h].getElementsByTagName("tr");
|
74
|
+
for (var i = 0; i < trs.length; i++) {
|
75
|
+
var tds = trs[i].getElementsByTagName("td");
|
76
|
+
for (var j = 0; j < tds.length; j++) {
|
77
|
+
if (hasClass(tds[j]) != "first") {
|
78
|
+
var mytd = tds[j];
|
79
|
+
if (even) {
|
80
|
+
mytd.style.backgroundColor = color;
|
81
|
+
}
|
82
|
+
}
|
83
|
+
}
|
84
|
+
even = ! even;
|
85
|
+
}
|
86
|
+
}
|
87
|
+
}
|
88
|
+
|
89
|
+
function ajaxGet(url) {
|
90
|
+
url = (href_base + url).replace('/./', '/')
|
91
|
+
var req = false;
|
92
|
+
|
93
|
+
if (window.ActiveXObject) {
|
94
|
+
try {
|
95
|
+
// stupid hack because IE7 disables local Ajax with the native xmlhttprequest object
|
96
|
+
// for security purposes. Yet ActiveX still works. Thanks, Microsoft. I hate you. Die.
|
97
|
+
req = new ActiveXObject("MSXML2.XMLHTTP.3.0");
|
98
|
+
} catch (e) {
|
99
|
+
try {
|
100
|
+
/* IE 6 and maybe 5, don't know, don't care */
|
101
|
+
req = new ActiveXObject("Msxml2.XMLHTTP");
|
102
|
+
} catch (e) {
|
103
|
+
try {
|
104
|
+
req = new ActiveXObject("Microsoft.XMLHTTP");
|
105
|
+
} catch (e) {
|
106
|
+
req = false;
|
107
|
+
}
|
108
|
+
}
|
109
|
+
}
|
110
|
+
}
|
111
|
+
|
112
|
+
/* real browsers */
|
113
|
+
if (!req && window.XMLHttpRequest) {
|
114
|
+
try {
|
115
|
+
req = new XMLHttpRequest();
|
116
|
+
} catch (e) {
|
117
|
+
req = false;
|
118
|
+
}
|
119
|
+
}
|
120
|
+
|
121
|
+
if (req) {
|
122
|
+
req.open('GET', url, false);
|
123
|
+
req.send(null);
|
124
|
+
return req.responseText;
|
125
|
+
} else {
|
126
|
+
return "Ajax error";
|
127
|
+
}
|
128
|
+
}
|
129
|
+
|
130
|
+
|
131
|
+
function addEvent(elm, evType, fn, useCapture) {
|
132
|
+
if (elm.addEventListener) {
|
133
|
+
elm.addEventListener(evType, fn, useCapture);
|
134
|
+
return true;
|
135
|
+
} else if (elm.attachEvent) {
|
136
|
+
var r = elm.attachEvent('on' + evType, fn);
|
137
|
+
return r;
|
138
|
+
} else {
|
139
|
+
elm['on' + evType] = fn;
|
140
|
+
}
|
141
|
+
}
|
142
|
+
|
143
|
+
function insertIndices() {
|
144
|
+
pages = ["class", "file", "method"]
|
145
|
+
for (x in pages) {
|
146
|
+
$(pages[x]).innerHTML += ajaxGet('fr_' + pages[x] + '_index.html').replace(/(href=")/g, '$1' + href_base);
|
147
|
+
}
|
148
|
+
/* mouseoverify method links */
|
149
|
+
links = $('method').getElementsByTagName('a');
|
150
|
+
for (var x = 0; x < links.length; x++) {
|
151
|
+
if (m = links[x].innerHTML.match(/(.*)\s\((.*)\)/)) {
|
152
|
+
links[x].innerHTML = m[1] + '<br>';
|
153
|
+
links[x].title = m[2];
|
154
|
+
}
|
155
|
+
}
|
156
|
+
/* this is stupid */
|
157
|
+
$('class').style.display = "block";
|
158
|
+
$('file').style.display = "block";
|
159
|
+
|
160
|
+
/* has to be here because IE7 does not guarantee the onLoad callback order */
|
161
|
+
abbreviateIndicesInner(["class", "file"], 25, "a");
|
162
|
+
/* same, linkTitle() depends on the class link list */
|
163
|
+
linkTitle();
|
164
|
+
}
|
165
|
+
|
166
|
+
function abbreviateIndices() {
|
167
|
+
var ids = ["defined_in", "child_of", "includes", "requires", "method", "methods"];
|
168
|
+
abbreviateIndicesInner(ids, 25, 'a');
|
169
|
+
abbreviateIndicesInner(ids, 25, 'span');
|
170
|
+
}
|
171
|
+
|
172
|
+
function abbreviateIndicesInner(indices, amount, tag) {
|
173
|
+
for (var x = 0; x < indices.length; x++) {
|
174
|
+
var the_index = $(indices[x]);
|
175
|
+
if (the_index) {
|
176
|
+
links = the_index.getElementsByTagName(tag);
|
177
|
+
for (var y = 0; y < links.length; y++) {
|
178
|
+
var link = links[y];
|
179
|
+
if (link.getElementsByTagName('span').length == 0 && link.getElementsByTagName('a').length == 0) {
|
180
|
+
// avoid nesting
|
181
|
+
link.innerHTML = link.innerHTML.replace(/<br>|\n/gi, '');
|
182
|
+
link.title = link.innerHTML;
|
183
|
+
link.innerHTML = abbreviate(link.innerHTML, amount) + '<br>';
|
184
|
+
}
|
185
|
+
}
|
186
|
+
}
|
187
|
+
}
|
188
|
+
}
|
189
|
+
|
190
|
+
function linkTitle() {
|
191
|
+
|
192
|
+
/* grab the correct title element from the index */
|
193
|
+
var index_page = ajaxGet('index.html');
|
194
|
+
title_text = index_page.match(/<title>(.*)<\/title>/m)[1];
|
195
|
+
document.title = title_text + " - " + document.title;
|
196
|
+
var p = $('header').getElementsByTagName('p')[0]
|
197
|
+
if (p.innerHTML.match(/^\s*$/)) {
|
198
|
+
p.innerHTML = title_text;
|
199
|
+
} else {
|
200
|
+
p.innerHTML = title_text + ": " + p.innerHTML;
|
201
|
+
}
|
202
|
+
|
203
|
+
/* set the link properly */
|
204
|
+
title_link = index_page.match(/<a\s+href="(.*?)"/)[1];
|
205
|
+
var element = $('title');
|
206
|
+
var item_type = "";
|
207
|
+
var item_name = "";
|
208
|
+
if (m = element.innerHTML.match(/(Class:|Module:|File:)\s*(.*)/)) {
|
209
|
+
item_type = m[1];
|
210
|
+
item_name = m[2];
|
211
|
+
} else {
|
212
|
+
item_name = element.innerHTML;
|
213
|
+
}
|
214
|
+
element.innerHTML = '<a href="' + href_base + title_link + '">' + item_type + " " + abbreviate(item_name, 45) + '</a>';
|
215
|
+
element.getElementsByTagName('a')[0].title = item_name
|
216
|
+
|
217
|
+
/* breadcrumb navigation */
|
218
|
+
items = item_name.split("::");
|
219
|
+
items_new = item_name.split("::");
|
220
|
+
file_links = $('class').getElementsByTagName('a');
|
221
|
+
for (var x = 0; x < items.length - 1; x++ ){
|
222
|
+
var item = items[x];
|
223
|
+
link = ("/classes/" + items.slice(0,x).join("/") + "/" + item + ".html").replace('//', '/');
|
224
|
+
regex = new RegExp(RegExp.escape(link) + '$');
|
225
|
+
for (var y = 0; y < file_links.length; y++) {
|
226
|
+
if (file_links[y].href.match(regex)) {
|
227
|
+
items_new[x] = '<a href="' + href_base + link + '">' + item + '</a>';
|
228
|
+
break;
|
229
|
+
}
|
230
|
+
}
|
231
|
+
}
|
232
|
+
$('item_name').innerHTML = item_type + ' ' + items_new.join(" :: ");
|
233
|
+
}
|
234
|
+
|
235
|
+
function abbreviate(s, size) {
|
236
|
+
while (s.length > size) {
|
237
|
+
var old_s = s;
|
238
|
+
s = s.replace(/\s|\n/mg, '');
|
239
|
+
s = s.replace(/([A-Z])[a-z]+/m, '$1');
|
240
|
+
if (!s || old_s == s) {
|
241
|
+
return "..." + s.substring(s.length - size, s.length);
|
242
|
+
}
|
243
|
+
}
|
244
|
+
return s;
|
245
|
+
}
|
246
|
+
|
247
|
+
function disableSubmit(event) {
|
248
|
+
var keyCode = event.keyCode ? event.keyCode : event.which ? event.which : event.charCode;
|
249
|
+
if (keyCode == 13) {
|
250
|
+
return false;
|
251
|
+
} else {
|
252
|
+
return true;
|
253
|
+
}
|
254
|
+
}
|
255
|
+
|
256
|
+
function filterList(id, s, event) {
|
257
|
+
|
258
|
+
/* some weak escaping */
|
259
|
+
s = s.replace(/[^\w\d\.\_\-\/\:\=\[\]\?\!]/g, '');
|
260
|
+
s = RegExp.escape(s);
|
261
|
+
|
262
|
+
var show_all = false;
|
263
|
+
if (s.match(/^\s*$/)) {
|
264
|
+
show_all = true;
|
265
|
+
}
|
266
|
+
|
267
|
+
links = $(id).getElementsByTagName('a')
|
268
|
+
regex = new RegExp(s, 'i');
|
269
|
+
|
270
|
+
for (var x = 0; x < links.length; x++) {
|
271
|
+
var link = links[x];
|
272
|
+
if (show_all) {
|
273
|
+
link.style.display = 'inline';
|
274
|
+
} else {
|
275
|
+
if (link.innerHTML.match(regex)) {
|
276
|
+
link.style.display = 'inline';
|
277
|
+
} else {
|
278
|
+
link.style.display = 'none';
|
279
|
+
}
|
280
|
+
}
|
281
|
+
}
|
282
|
+
return true;
|
283
|
+
}
|
284
|
+
|
285
|
+
RegExp.escape = function(text) {
|
286
|
+
if (!arguments.callee.sRE) {
|
287
|
+
var specials = ['/', '.', '*', '+', '?', '|', '(', ')', '[', ']', '{', '}', '\\\\'];
|
288
|
+
arguments.callee.sRE = new RegExp(
|
289
|
+
'(\\\\' + specials.join('|\\\\') + ')', 'g'
|
290
|
+
);
|
291
|
+
}
|
292
|
+
return text.replace(arguments.callee.sRE, '\\\\$1');
|
293
|
+
}
|
294
|
+
|
295
|
+
function hacks() {
|
296
|
+
// show the spacer if necessary,
|
297
|
+
divs = document.getElementsByTagName('div');
|
298
|
+
for(var x = 0; x < divs.length; x++) {
|
299
|
+
if (divs[x].className && divs[x].className.match(/top/)) {
|
300
|
+
document.getElementById('spacer').style.display = 'block';
|
301
|
+
}
|
302
|
+
}
|
303
|
+
// remove extra colons from tables
|
304
|
+
tds = document.getElementsByTagName('td');
|
305
|
+
for(var x = 0; x < tds.length; x++) {
|
306
|
+
str = tds[x].innerHTML
|
307
|
+
if (str.charAt(str.length - 1) == ":") {
|
308
|
+
tds[x].innerHTML = str.slice(0, str.length - 1)
|
309
|
+
}
|
310
|
+
}
|
311
|
+
}
|
312
|
+
|
313
|
+
addEvent(window, 'load', insertIndices, false);
|
314
|
+
addEvent(window, 'load', abbreviateIndices, false);
|
315
|
+
addEvent(window, 'load', stripe, false);
|
316
|
+
addEvent(window, 'load', highlightSymbols, false);
|
317
|
+
addEvent(window, 'load', hacks, false);
|
@@ -0,0 +1,276 @@
|
|
1
|
+
|
2
|
+
# RDoc workarounds
|
3
|
+
class String
|
4
|
+
def if_exists (item = nil)
|
5
|
+
unless item
|
6
|
+
self unless self =~ /(%(\w+)%)/
|
7
|
+
"\nIF:#{$2}\n#{self}\nENDIF:#{$2}\n"
|
8
|
+
else
|
9
|
+
"\nIF:#{item}\n#{self}\nENDIF:#{item}\n"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
def loop(item)
|
13
|
+
"\nSTART:#{item}\n#{self}\nEND:#{item}\n"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
module RDoc
|
18
|
+
module Page
|
19
|
+
|
20
|
+
puts "Allison 2 template (c) 2007 Cloudburst, LLC"
|
21
|
+
|
22
|
+
require 'pathname'
|
23
|
+
CACHE_DIR = File.expand_path(File.dirname(__FILE__) + "/../cache")
|
24
|
+
Dir.mkdir(CACHE_DIR) unless File.exist?(CACHE_DIR)
|
25
|
+
|
26
|
+
begin
|
27
|
+
require 'rubygems'
|
28
|
+
gem 'markaby', '>= 0.5'
|
29
|
+
require 'markaby'
|
30
|
+
require 'base64'
|
31
|
+
|
32
|
+
# Markaby page says Markaby is better in its own module
|
33
|
+
module Allison
|
34
|
+
|
35
|
+
FONTS = METHOD_LIST = SRC_PAGE = FILE_PAGE = CLASS_PAGE = ""
|
36
|
+
|
37
|
+
FR_INDEX_BODY = "!INCLUDE!" # Who knows
|
38
|
+
|
39
|
+
STYLE, JAVASCRIPT = ["css", "js"].map do |extension|
|
40
|
+
s = File.open(File.dirname(__FILE__) + "/allison.#{extension}").read
|
41
|
+
# Programmatic CSS
|
42
|
+
if extension == "css"
|
43
|
+
s_lines = s.split("\n")
|
44
|
+
meths = []
|
45
|
+
s_lines.collect! do |line|
|
46
|
+
line = line.squeeze(" ").strip
|
47
|
+
if line =~ /(\w+)/ and meths.include? $1
|
48
|
+
line = instance_eval line
|
49
|
+
# puts "Called method #{$1}"
|
50
|
+
elsif line !~ /\*\/|\/\*/ and line =~ /(@.*|^def (\w+).*)/
|
51
|
+
# printf "Evalled #{$1}"
|
52
|
+
result = instance_eval $1
|
53
|
+
# puts " to #{result.inspect}"
|
54
|
+
result = (result.is_a?(Fixnum) ? result.to_s + "px" : result.to_s)
|
55
|
+
line = (line == $1 ? "" : line.gsub($1, result))
|
56
|
+
meths.push $2 if $2
|
57
|
+
end
|
58
|
+
line !~ /^\s*$|\s*^\/\*.*\*\/\s*$|\{|\}/ ? line + ";" : line
|
59
|
+
end
|
60
|
+
s = s_lines.join("\n")
|
61
|
+
else
|
62
|
+
# Do nothing; the Javascript is already fine
|
63
|
+
end
|
64
|
+
s
|
65
|
+
end
|
66
|
+
|
67
|
+
INDEX = Markaby::Builder.new.xhtml_strict do
|
68
|
+
head do
|
69
|
+
title '%title%'
|
70
|
+
link :rel => 'stylesheet', :type => 'text/css', :href => 'rdoc-style.css', :media => 'screen'
|
71
|
+
tag! :meta, 'http-equiv' => 'refresh', 'content' => '0;url=%initial_page%'
|
72
|
+
end
|
73
|
+
body do
|
74
|
+
div.container! do
|
75
|
+
6.times {|n| div('', :class => "curve", :id => "preheader_curve_#{n}") }
|
76
|
+
div.header! do
|
77
|
+
span.title! do
|
78
|
+
p { ' ' }
|
79
|
+
h1 "Ruby Documentation"
|
80
|
+
end
|
81
|
+
end
|
82
|
+
div.clear {}
|
83
|
+
div.redirect! do
|
84
|
+
a :href => '%initial_page%' do
|
85
|
+
h1 "Redirect"
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end.to_s
|
91
|
+
|
92
|
+
FILE_INDEX = METHOD_INDEX = CLASS_INDEX = Markaby::Builder.new.capture do
|
93
|
+
a :href => '%href%' do
|
94
|
+
self << '%name%'
|
95
|
+
br
|
96
|
+
end
|
97
|
+
end.loop('entries')
|
98
|
+
|
99
|
+
BODY = Markaby::Builder.new.xhtml_strict do
|
100
|
+
head do
|
101
|
+
title "%title%"
|
102
|
+
link :rel => 'stylesheet', :type => 'text/css', :href => '%style_url%', :media => 'screen'
|
103
|
+
script :type => 'text/javascript' do
|
104
|
+
JAVASCRIPT
|
105
|
+
end
|
106
|
+
end
|
107
|
+
body do
|
108
|
+
div.container! do
|
109
|
+
6.times {|n| div('', :class => "curve", :id => "preheader_curve_#{n}") }
|
110
|
+
div.header! do
|
111
|
+
p {'%full_path%'.if_exists}
|
112
|
+
span do
|
113
|
+
h1.title! '%title%'.if_exists
|
114
|
+
end
|
115
|
+
self << "!INCLUDE!" # Always empty
|
116
|
+
end
|
117
|
+
div.clear {}
|
118
|
+
div.left! do
|
119
|
+
self << (div.navigation.darker.top.child_of! do
|
120
|
+
# Ugh
|
121
|
+
h3 "Child of"
|
122
|
+
self << "<span>\n#{"<a href='%par_url%'>".if_exists}%parent%#{"</a>".if_exists('par_url')}</span>"
|
123
|
+
end).if_exists('parent')
|
124
|
+
|
125
|
+
self << div.navigation.darker.top.defined_in! do
|
126
|
+
h3('Defined in')
|
127
|
+
self << a('%full_path%', :href => '%full_path_url%').if_exists.loop('infiles')
|
128
|
+
end.if_exists('infiles')
|
129
|
+
|
130
|
+
['includes', 'requires', 'methods'].each do |item|
|
131
|
+
self << div.navigation.top(:id => item) do
|
132
|
+
self << h3(item.capitalize)
|
133
|
+
self << "#{"<a href='%aref%'>".if_exists}%name%#{br}#{"</a>".if_exists('aref')}".if_exists('name').loop(item)
|
134
|
+
end.if_exists(item)
|
135
|
+
end
|
136
|
+
|
137
|
+
div.spacer! ''
|
138
|
+
|
139
|
+
# For the local AJAX includes
|
140
|
+
['class', 'file', 'method'].each do |item|
|
141
|
+
div.navigation.darker.index :id => "#{item}_wrapper" do
|
142
|
+
div.list_header do
|
143
|
+
h3 'All ' + (item == 'class' ? 'classes' : item + 's')
|
144
|
+
end
|
145
|
+
div.list_header_link do
|
146
|
+
a((item == 'method' ? 'Show...' : 'Hide...'),
|
147
|
+
:id => "#{item}_link", :href => "#",
|
148
|
+
:onclick=> "toggle('#{item}'); toggleText('#{item}_link'); return false;")
|
149
|
+
end
|
150
|
+
div.clear {}
|
151
|
+
div(:id => item) do
|
152
|
+
form do
|
153
|
+
label(:for => "filter_#{item}") { 'Filter:' + ' ' * 2 }
|
154
|
+
input '', :type => 'text', :id => "filter_#{item}",
|
155
|
+
:onKeyUp => "return filterList('#{item}', this.value, event);",
|
156
|
+
:onKeyPress => "return disableSubmit(event);"
|
157
|
+
end
|
158
|
+
end
|
159
|
+
end
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
div.content! do
|
164
|
+
|
165
|
+
self << capture do
|
166
|
+
h1.item_name! '%title%'
|
167
|
+
end.if_exists('title')
|
168
|
+
|
169
|
+
self << capture do
|
170
|
+
div.description! do
|
171
|
+
'%description%'
|
172
|
+
end
|
173
|
+
end.if_exists('description')
|
174
|
+
|
175
|
+
self << capture do
|
176
|
+
self << h1 {a '%sectitle%', :name => '%secsequence%'}.if_exists('sectitle')
|
177
|
+
self << p {'%seccomment%'}.if_exists
|
178
|
+
|
179
|
+
self << capture do
|
180
|
+
h1 "Child modules and classes"
|
181
|
+
p '%classlist%'
|
182
|
+
end.if_exists('classlist')
|
183
|
+
|
184
|
+
['constants', 'aliases', 'attributes'].each do |item|
|
185
|
+
self << capture do
|
186
|
+
h1(item.capitalize)
|
187
|
+
p do
|
188
|
+
table do
|
189
|
+
fields = %w[name value old_name new_name rw]
|
190
|
+
self << tr do
|
191
|
+
# Header row
|
192
|
+
if item == 'constants'
|
193
|
+
th 'Name'
|
194
|
+
th 'Value'
|
195
|
+
elsif item == 'aliases'
|
196
|
+
th 'Old name'
|
197
|
+
th 'New name'
|
198
|
+
elsif item == 'attributes'
|
199
|
+
th 'Name'
|
200
|
+
th 'Read/write?'
|
201
|
+
end
|
202
|
+
end
|
203
|
+
self << tr do
|
204
|
+
# Looped item rows
|
205
|
+
fields.each do |field|
|
206
|
+
if field !~ /desc/
|
207
|
+
self << td('%' + field + '%', :class => field =~ /^old|^name/ ? "highlight" : "normal").if_exists
|
208
|
+
else
|
209
|
+
self << td(('%' + field+ '%').if_exists)
|
210
|
+
end
|
211
|
+
end
|
212
|
+
end.loop(item)
|
213
|
+
end
|
214
|
+
end
|
215
|
+
end.if_exists(item)
|
216
|
+
end
|
217
|
+
|
218
|
+
self << capture do
|
219
|
+
h1('%type% %category% Methods')
|
220
|
+
self << capture do
|
221
|
+
self << a.small(:name => '%aref%') {br}.if_exists
|
222
|
+
div.method_block do
|
223
|
+
h3 { "<a href='#%aref%'>".if_exists + '%callseq%'.if_exists + '%name%'.if_exists + '%params%'.if_exists + "</a>".if_exists('aref')}
|
224
|
+
self << '%m_desc%'.if_exists
|
225
|
+
|
226
|
+
self << capture do
|
227
|
+
p.source_link :id => '%aref%-show-link' do
|
228
|
+
a "Show source...", :id => '%aref%-link', :href => "#",
|
229
|
+
:onclick=> "toggle('%aref%-source'); toggleText('%aref%-link'); return false;"
|
230
|
+
end
|
231
|
+
div.source :id => '%aref%-source' do
|
232
|
+
pre { '%sourcecode%' }
|
233
|
+
end
|
234
|
+
end.if_exists('sourcecode')
|
235
|
+
end
|
236
|
+
|
237
|
+
end.loop('methods').if_exists('methods')
|
238
|
+
end.loop('method_list').if_exists('method_list')
|
239
|
+
|
240
|
+
end.loop('sections').if_exists('sections')
|
241
|
+
|
242
|
+
end
|
243
|
+
|
244
|
+
div.footer!.clear do
|
245
|
+
self << Time.now.strftime("Generated on %b %d, %Y").gsub(' 0', ' ')
|
246
|
+
self << " / Allison 2 © 2007 "
|
247
|
+
a "Cloudburst, LLC", :href => "http://cloudbur.st"
|
248
|
+
end
|
249
|
+
end
|
250
|
+
end
|
251
|
+
|
252
|
+
end.to_s
|
253
|
+
end
|
254
|
+
|
255
|
+
Allison.constants.each do |c|
|
256
|
+
eval "#{c} = Allison::#{c}" # Jump out of the namespace
|
257
|
+
begin
|
258
|
+
File.open("#{CACHE_DIR}/#{c}", 'w') do |f|
|
259
|
+
f.puts eval(c) # Write cache
|
260
|
+
end
|
261
|
+
rescue Errno::EACCES => e
|
262
|
+
end
|
263
|
+
end
|
264
|
+
|
265
|
+
rescue LoadError => e
|
266
|
+
# We don't have some dependency
|
267
|
+
lib = (e.to_s[/(.*)\(/, 1] or e.to_s).split(" ").last.capitalize
|
268
|
+
puts "Using cache (couldn't load '#{lib}')"
|
269
|
+
Dir[CACHE_DIR + '/*'].each do |filename|
|
270
|
+
eval("#{filename.split("/").last} = File.open(filename) {|s| s.read}")
|
271
|
+
end
|
272
|
+
end
|
273
|
+
|
274
|
+
end
|
275
|
+
|
276
|
+
end
|