clarion-builder 1.0.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.
- checksums.yaml +7 -0
- data/CHANGES +107 -0
- data/MIT-LICENSE +20 -0
- data/README.md +269 -0
- data/Rakefile +194 -0
- data/WORK-LOG.md +133 -0
- data/doc/jamis.rb +591 -0
- data/doc/releases/builder-1.2.4.rdoc +31 -0
- data/doc/releases/builder-2.0.0.rdoc +46 -0
- data/doc/releases/builder-2.1.1.rdoc +58 -0
- data/lib/blankslate.rb +142 -0
- data/lib/builder/blankslate.rb +23 -0
- data/lib/builder/version.rb +8 -0
- data/lib/builder/xchar.rb +197 -0
- data/lib/builder/xmlbase.rb +199 -0
- data/lib/builder/xmlevents.rb +63 -0
- data/lib/builder/xmlmarkup.rb +341 -0
- data/lib/builder.rb +13 -0
- data/rakelib/publish.rake +26 -0
- data/rakelib/tags.rake +68 -0
- data/test/performance.rb +41 -0
- data/test/preload.rb +39 -0
- data/test/test_blankslate.rb +226 -0
- data/test/test_eventbuilder.rb +150 -0
- data/test/test_markupbuilder.rb +611 -0
- data/test/test_method_caching.rb +62 -0
- data/test/test_namecollision.rb +39 -0
- data/test/test_xchar.rb +78 -0
- metadata +94 -0
data/WORK-LOG.md
ADDED
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
# WORK LOG — builder (Jim Weirich, v3.2.2) keeper modernization
|
|
2
|
+
|
|
3
|
+
Keeper: Steve Wagner. Builder: subagent session 2026-10-07.
|
|
4
|
+
Jim Weirich's authorship and the MIT license are intact. Nothing renamed.
|
|
5
|
+
No push to GitHub, no fork, no publish — changes are commit-ready in the
|
|
6
|
+
working tree only.
|
|
7
|
+
|
|
8
|
+
## Keeper's foundation (Steve's directive, 2026-10-07)
|
|
9
|
+
|
|
10
|
+
- The keeper's mission statement was added verbatim to README.md as a
|
|
11
|
+
clearly-marked "Keeper's Note" section, above the original content.
|
|
12
|
+
All of Jim Weirich's content, authorship, and contact info untouched.
|
|
13
|
+
- **Battery bar (release requirement):** every change ships only after
|
|
14
|
+
the full test suite passes. No release goes out on a red suite.
|
|
15
|
+
- **Keeper's mark:** each release carries the keeper's mark. Steve
|
|
16
|
+
defines the mark at release time — none invented here.
|
|
17
|
+
|
|
18
|
+
## Environment setup
|
|
19
|
+
|
|
20
|
+
- VM had no Ruby (`ruby --version` → command not found; no ruby in apt
|
|
21
|
+
installed list).
|
|
22
|
+
- `sudo apt-get install -y ruby ruby-dev` initially failed ("Unable to
|
|
23
|
+
locate package") — package lists were empty.
|
|
24
|
+
- Ran `sudo apt-get update` (~74 MB at ~70 kB/s, ~18 min), then the
|
|
25
|
+
install succeeded.
|
|
26
|
+
- Result: **ruby 3.2.3** (2024-01-18), gem 3.4.20, rake 13.0.6,
|
|
27
|
+
test-unit 3.5.7, rdoc 6.5.0 (Ubuntu noble packages).
|
|
28
|
+
|
|
29
|
+
## What was broken (before: the suite could not run at all)
|
|
30
|
+
|
|
31
|
+
`rake` aborted during Rakefile/rakelib load — zero tests executed:
|
|
32
|
+
|
|
33
|
+
1. `lib/builder/xchar.rb` — `when Fixnum` in the `INVALID_XML_CHAR`
|
|
34
|
+
builder. `Fixnum` was removed in Ruby 3.0, so merely
|
|
35
|
+
`require "builder"` raised `NameError`. The whole library was
|
|
36
|
+
unloadable.
|
|
37
|
+
2. `Rakefile` — `s.has_rdoc = true` (2×, builder + blankslate specs).
|
|
38
|
+
Removed in RubyGems 3.0 → `NoMethodError` at Rakefile load.
|
|
39
|
+
3. `rakelib/publish.rake` — top-level `require 'rake/contrib/sshpublisher'`
|
|
40
|
+
(+ `rubyforgepublisher`); rake/contrib was removed from rake years ago
|
|
41
|
+
→ `LoadError` at rake startup. (Task publishes to RubyForge, dead
|
|
42
|
+
since ~2014.)
|
|
43
|
+
4. `rakelib/tags.rake` — backticked `` `rvm gemdir` `` at load with no rvm
|
|
44
|
+
binary → `Errno::ENOENT`; plus `File.exists?` (removed in Ruby 3.2).
|
|
45
|
+
5. Ruby 3.x kwargs separation — `XmlMarkup.new(indent: 2)` and
|
|
46
|
+
`instruct!(:xml, encoding: "UTF-8")` (new-style keywords) raised
|
|
47
|
+
`ArgumentError`, because `initialize(options={})` / `instruct!(tag,
|
|
48
|
+
attrs={})` take no keywords. (The tag path — `method_missing` /
|
|
49
|
+
`tag!` / cached `define_method` — was already safe: all use `*args`,
|
|
50
|
+
and Ruby 3 still collapses trailing keywords into a positional Hash
|
|
51
|
+
for `*args` methods, which re-splats positionally. All existing tests
|
|
52
|
+
use hash-rockets, which are positional hashes in every Ruby.)
|
|
53
|
+
6. `lib/blankslate.rb` (standalone BlankSlate component) —
|
|
54
|
+
`Module#append_features` hook only scanned includes into `Object`,
|
|
55
|
+
not `Kernel`. The code comment admitted Kernel includes "would have
|
|
56
|
+
to be removed as well" but relied on an old-Ruby "feature" that no
|
|
57
|
+
longer exists; late `Kernel.include` leaked methods onto BlankSlate
|
|
58
|
+
instances.
|
|
59
|
+
|
|
60
|
+
## Changes made (minimal)
|
|
61
|
+
|
|
62
|
+
- `lib/builder/xchar.rb`: `when Fixnum` → `when Integer` (1 line).
|
|
63
|
+
- `lib/builder/xmlmarkup.rb`:
|
|
64
|
+
`def initialize(options={}, **kwargs)` — kwargs merged into options,
|
|
65
|
+
so `XmlMarkup.new(indent: 2, margin: 4)` works on Ruby 3 while
|
|
66
|
+
`new(:indent => 2)` keeps working.
|
|
67
|
+
- `lib/builder/xmlmarkup.rb`:
|
|
68
|
+
`def instruct!(directive_tag=:xml, attrs={}, **kwargs)` — kwargs merged
|
|
69
|
+
into attrs, so `instruct!(:xml, encoding: "UTF-8")` works.
|
|
70
|
+
- `Rakefile`: deleted the two `s.has_rdoc = true` lines (metadata only).
|
|
71
|
+
- `rakelib/publish.rake`: wrapped the rake/contrib requires in
|
|
72
|
+
begin/rescue LoadError; the dead RubyForge publish task is defined only
|
|
73
|
+
when the contrib libraries exist.
|
|
74
|
+
- `rakelib/tags.rake`: guarded the `` `rvm gemdir` `` probe with
|
|
75
|
+
rescue Errno::ENOENT; `File.exists?` → `File.exist?`.
|
|
76
|
+
- `lib/blankslate.rb`: `Module#append_features` hook now also hides
|
|
77
|
+
methods from modules included into `Kernel` (was: `Object` only),
|
|
78
|
+
per the file's own comment.
|
|
79
|
+
- `README.md`: added the "Keeper's Note" section with the mission
|
|
80
|
+
statement verbatim (Steve's directive). No other README changes.
|
|
81
|
+
|
|
82
|
+
## Test results
|
|
83
|
+
|
|
84
|
+
- BEFORE: `rake` aborted at load (items 2–4 above); after fixing load,
|
|
85
|
+
`require "builder"` raised NameError (item 1). Zero tests ran.
|
|
86
|
+
- AFTER: `rake` → **113 tests, 192 assertions, 1 failure, 0 errors**
|
|
87
|
+
(99.1% pass).
|
|
88
|
+
- The one failure is `test_targetted_private_methods_are_undefined_during_instance_eval`
|
|
89
|
+
(test/test_blankslate.rb, legacy standalone BlankSlate only —
|
|
90
|
+
Builder::XmlMarkup/XmlEvents use BasicObject on modern Ruby and are
|
|
91
|
+
fully green).
|
|
92
|
+
- Also verified by hand: kwargs-style and hash-rocket-style calls for
|
|
93
|
+
`new`, tag attributes, and `instruct!`; XmlEvents event flow;
|
|
94
|
+
`rake -T` lists all tasks; `rake builder:gem` builds builder-3.2.2.gem
|
|
95
|
+
cleanly (pkg/ removed afterwards).
|
|
96
|
+
|
|
97
|
+
## What remains — needs Steve's decision
|
|
98
|
+
|
|
99
|
+
**The 1 failure is Ruby-language drift, not a library bug, and no
|
|
100
|
+
correct library change can fix it.** Root cause, verified by experiment:
|
|
101
|
+
BlankSlate never hid private methods (`Module#instance_methods` excludes
|
|
102
|
+
privates, so `puts` was never undefined), and Ruby 2.7 deliberately
|
|
103
|
+
legalized calling private methods with an explicit `self.` receiver.
|
|
104
|
+
So `@bs.instance_eval { self.puts "HI" }` now succeeds where the 2004-era
|
|
105
|
+
test expects NoMethodError. The library cannot distinguish `self.puts`
|
|
106
|
+
from bare `puts` — and the sibling test
|
|
107
|
+
`test_untargetted_private_methods_are_defined_during_instance_eval`
|
|
108
|
+
*requires* bare `puts` to keep working. Undefining `puts` would fix this
|
|
109
|
+
test and break that one; the two expectations are jointly unsatisfiable
|
|
110
|
+
on Ruby ≥ 2.7.
|
|
111
|
+
|
|
112
|
+
Options for Steve:
|
|
113
|
+
a. Accept the 1 known failure as documented Ruby drift in the dormant
|
|
114
|
+
blankslate component (it does not touch XML building), and ship with
|
|
115
|
+
the suite at 112/113.
|
|
116
|
+
b. Authorize updating that single test expectation to match Ruby ≥ 2.7
|
|
117
|
+
semantics (explicit-self private calls are legal now).
|
|
118
|
+
c. Drop the standalone blankslate gem from the keeper's tree entirely
|
|
119
|
+
(it was extracted upstream; builder itself doesn't use it on modern
|
|
120
|
+
Ruby).
|
|
121
|
+
|
|
122
|
+
No action taken on the test — weakening a 2004 expectation without his
|
|
123
|
+
word is not mine to do.
|
|
124
|
+
|
|
125
|
+
## Notes
|
|
126
|
+
|
|
127
|
+
- `git status`: 7 files modified (README.md, Rakefile, lib/blankslate.rb,
|
|
128
|
+
lib/builder/xchar.rb, lib/builder/xmlmarkup.rb, rakelib/publish.rake,
|
|
129
|
+
rakelib/tags.rake). No new files except this log. Nothing committed,
|
|
130
|
+
nothing pushed.
|
|
131
|
+
- Authorship: all files still credit Jim Weirich; MIT-LICENSE untouched.
|
|
132
|
+
Keeper additions are marked "keeper" / "Keeper's Note" inline and in
|
|
133
|
+
this log only — never in gem metadata.
|
data/doc/jamis.rb
ADDED
|
@@ -0,0 +1,591 @@
|
|
|
1
|
+
module RDoc
|
|
2
|
+
module Page
|
|
3
|
+
|
|
4
|
+
FONTS = "\"Bitstream Vera Sans\", Verdana, Arial, Helvetica, sans-serif"
|
|
5
|
+
|
|
6
|
+
STYLE = <<CSS
|
|
7
|
+
a {
|
|
8
|
+
color: #00F;
|
|
9
|
+
text-decoration: none;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
a:hover {
|
|
13
|
+
color: #77F;
|
|
14
|
+
text-decoration: underline;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
body, td, p {
|
|
18
|
+
font-family: %fonts%;
|
|
19
|
+
background: #FFF;
|
|
20
|
+
color: #000;
|
|
21
|
+
margin: 0px;
|
|
22
|
+
font-size: small;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
#content {
|
|
26
|
+
margin: 2em;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
#description p {
|
|
30
|
+
margin-bottom: 0.5em;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
.sectiontitle {
|
|
34
|
+
margin-top: 1em;
|
|
35
|
+
margin-bottom: 1em;
|
|
36
|
+
padding: 0.5em;
|
|
37
|
+
padding-left: 2em;
|
|
38
|
+
background: #005;
|
|
39
|
+
color: #FFF;
|
|
40
|
+
font-weight: bold;
|
|
41
|
+
border: 1px dotted black;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
.attr-rw {
|
|
45
|
+
padding-left: 1em;
|
|
46
|
+
padding-right: 1em;
|
|
47
|
+
text-align: center;
|
|
48
|
+
color: #055;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
.attr-name {
|
|
52
|
+
font-weight: bold;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
.attr-desc {
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
.attr-value {
|
|
59
|
+
font-family: monospace;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
.file-title-prefix {
|
|
63
|
+
font-size: large;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
.file-title {
|
|
67
|
+
font-size: large;
|
|
68
|
+
font-weight: bold;
|
|
69
|
+
background: #005;
|
|
70
|
+
color: #FFF;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
.banner {
|
|
74
|
+
background: #005;
|
|
75
|
+
color: #FFF;
|
|
76
|
+
border: 1px solid black;
|
|
77
|
+
padding: 1em;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
.banner td {
|
|
81
|
+
background: transparent;
|
|
82
|
+
color: #FFF;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
h1 a, h2 a, .sectiontitle a, .banner a {
|
|
86
|
+
color: #FF0;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
h1 a:hover, h2 a:hover, .sectiontitle a:hover, .banner a:hover {
|
|
90
|
+
color: #FF7;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
.dyn-source {
|
|
94
|
+
display: none;
|
|
95
|
+
background: #FFE;
|
|
96
|
+
color: #000;
|
|
97
|
+
border: 1px dotted black;
|
|
98
|
+
margin: 0.5em 2em 0.5em 2em;
|
|
99
|
+
padding: 0.5em;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
.dyn-source .cmt {
|
|
103
|
+
color: #00F;
|
|
104
|
+
font-style: italic;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
.dyn-source .kw {
|
|
108
|
+
color: #070;
|
|
109
|
+
font-weight: bold;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
.method {
|
|
113
|
+
margin-left: 1em;
|
|
114
|
+
margin-right: 1em;
|
|
115
|
+
margin-bottom: 1em;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
.description pre {
|
|
119
|
+
padding: 0.5em;
|
|
120
|
+
border: 1px dotted black;
|
|
121
|
+
background: #FFE;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
.method .title {
|
|
125
|
+
font-family: monospace;
|
|
126
|
+
font-size: large;
|
|
127
|
+
border-bottom: 1px dashed black;
|
|
128
|
+
margin-bottom: 0.3em;
|
|
129
|
+
padding-bottom: 0.1em;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
.method .description, .method .sourcecode {
|
|
133
|
+
margin-left: 1em;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
.description p, .sourcecode p {
|
|
137
|
+
margin-bottom: 0.5em;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
.method .sourcecode p.source-link {
|
|
141
|
+
text-indent: 0em;
|
|
142
|
+
margin-top: 0.5em;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
.method .aka {
|
|
146
|
+
margin-top: 0.3em;
|
|
147
|
+
margin-left: 1em;
|
|
148
|
+
font-style: italic;
|
|
149
|
+
text-indent: 2em;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
h1 {
|
|
153
|
+
padding: 1em;
|
|
154
|
+
border: 1px solid black;
|
|
155
|
+
font-size: x-large;
|
|
156
|
+
font-weight: bold;
|
|
157
|
+
color: #FFF;
|
|
158
|
+
background: #007;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
h2 {
|
|
162
|
+
padding: 0.5em 1em 0.5em 1em;
|
|
163
|
+
border: 1px solid black;
|
|
164
|
+
font-size: large;
|
|
165
|
+
font-weight: bold;
|
|
166
|
+
color: #FFF;
|
|
167
|
+
background: #009;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
h3, h4, h5, h6 {
|
|
171
|
+
padding: 0.2em 1em 0.2em 1em;
|
|
172
|
+
border: 1px dashed black;
|
|
173
|
+
color: #000;
|
|
174
|
+
background: #AAF;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
.sourcecode > pre {
|
|
178
|
+
padding: 0.5em;
|
|
179
|
+
border: 1px dotted black;
|
|
180
|
+
background: #FFE;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
CSS
|
|
184
|
+
|
|
185
|
+
XHTML_PREAMBLE = %{<?xml version="1.0" encoding="%charset%"?>
|
|
186
|
+
<!DOCTYPE html
|
|
187
|
+
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
|
188
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
HEADER = XHTML_PREAMBLE + <<ENDHEADER
|
|
192
|
+
<html>
|
|
193
|
+
<head>
|
|
194
|
+
<title>%title%</title>
|
|
195
|
+
<meta http-equiv="Content-Type" content="text/html; charset=%charset%" />
|
|
196
|
+
<link rel="stylesheet" href="%style_url%" type="text/css" media="screen" />
|
|
197
|
+
|
|
198
|
+
<script language="JavaScript" type="text/javascript">
|
|
199
|
+
// <![CDATA[
|
|
200
|
+
|
|
201
|
+
function toggleSource( id )
|
|
202
|
+
{
|
|
203
|
+
var elem
|
|
204
|
+
var link
|
|
205
|
+
|
|
206
|
+
if( document.getElementById )
|
|
207
|
+
{
|
|
208
|
+
elem = document.getElementById( id )
|
|
209
|
+
link = document.getElementById( "l_" + id )
|
|
210
|
+
}
|
|
211
|
+
else if ( document.all )
|
|
212
|
+
{
|
|
213
|
+
elem = eval( "document.all." + id )
|
|
214
|
+
link = eval( "document.all.l_" + id )
|
|
215
|
+
}
|
|
216
|
+
else
|
|
217
|
+
return false;
|
|
218
|
+
|
|
219
|
+
if( elem.style.display == "block" )
|
|
220
|
+
{
|
|
221
|
+
elem.style.display = "none"
|
|
222
|
+
link.innerHTML = "show source"
|
|
223
|
+
}
|
|
224
|
+
else
|
|
225
|
+
{
|
|
226
|
+
elem.style.display = "block"
|
|
227
|
+
link.innerHTML = "hide source"
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
function openCode( url )
|
|
232
|
+
{
|
|
233
|
+
window.open( url, "SOURCE_CODE", "width=400,height=400,scrollbars=yes" )
|
|
234
|
+
}
|
|
235
|
+
// ]]>
|
|
236
|
+
</script>
|
|
237
|
+
</head>
|
|
238
|
+
|
|
239
|
+
<body>
|
|
240
|
+
ENDHEADER
|
|
241
|
+
|
|
242
|
+
FILE_PAGE = <<HTML
|
|
243
|
+
<table border='0' cellpadding='0' cellspacing='0' width="100%" class='banner'>
|
|
244
|
+
<tr><td>
|
|
245
|
+
<table width="100%" border='0' cellpadding='0' cellspacing='0'><tr>
|
|
246
|
+
<td class="file-title" colspan="2"><span class="file-title-prefix">File</span><br />%short_name%</td>
|
|
247
|
+
<td align="right">
|
|
248
|
+
<table border='0' cellspacing="0" cellpadding="2">
|
|
249
|
+
<tr>
|
|
250
|
+
<td>Path:</td>
|
|
251
|
+
<td>%full_path%
|
|
252
|
+
IF:cvsurl
|
|
253
|
+
(<a href="%cvsurl%">CVS</a>)
|
|
254
|
+
ENDIF:cvsurl
|
|
255
|
+
</td>
|
|
256
|
+
</tr>
|
|
257
|
+
<tr>
|
|
258
|
+
<td>Modified:</td>
|
|
259
|
+
<td>%dtm_modified%</td>
|
|
260
|
+
</tr>
|
|
261
|
+
</table>
|
|
262
|
+
</td></tr>
|
|
263
|
+
</table>
|
|
264
|
+
</td></tr>
|
|
265
|
+
</table><br>
|
|
266
|
+
HTML
|
|
267
|
+
|
|
268
|
+
###################################################################
|
|
269
|
+
|
|
270
|
+
CLASS_PAGE = <<HTML
|
|
271
|
+
<table width="100%" border='0' cellpadding='0' cellspacing='0' class='banner'><tr>
|
|
272
|
+
<td class="file-title"><span class="file-title-prefix">%classmod%</span><br />%full_name%</td>
|
|
273
|
+
<td align="right">
|
|
274
|
+
<table cellspacing=0 cellpadding=2>
|
|
275
|
+
<tr valign="top">
|
|
276
|
+
<td>In:</td>
|
|
277
|
+
<td>
|
|
278
|
+
START:infiles
|
|
279
|
+
HREF:full_path_url:full_path:
|
|
280
|
+
IF:cvsurl
|
|
281
|
+
(<a href="%cvsurl%">CVS</a>)
|
|
282
|
+
ENDIF:cvsurl
|
|
283
|
+
END:infiles
|
|
284
|
+
</td>
|
|
285
|
+
</tr>
|
|
286
|
+
IF:parent
|
|
287
|
+
<tr>
|
|
288
|
+
<td>Parent:</td>
|
|
289
|
+
<td>
|
|
290
|
+
IF:par_url
|
|
291
|
+
<a href="%par_url%">
|
|
292
|
+
ENDIF:par_url
|
|
293
|
+
%parent%
|
|
294
|
+
IF:par_url
|
|
295
|
+
</a>
|
|
296
|
+
ENDIF:par_url
|
|
297
|
+
</td>
|
|
298
|
+
</tr>
|
|
299
|
+
ENDIF:parent
|
|
300
|
+
</table>
|
|
301
|
+
</td>
|
|
302
|
+
</tr>
|
|
303
|
+
</table>
|
|
304
|
+
HTML
|
|
305
|
+
|
|
306
|
+
###################################################################
|
|
307
|
+
|
|
308
|
+
METHOD_LIST = <<HTML
|
|
309
|
+
<div id="content">
|
|
310
|
+
IF:diagram
|
|
311
|
+
<table cellpadding='0' cellspacing='0' border='0' width="100%"><tr><td align="center">
|
|
312
|
+
%diagram%
|
|
313
|
+
</td></tr></table>
|
|
314
|
+
ENDIF:diagram
|
|
315
|
+
|
|
316
|
+
IF:description
|
|
317
|
+
<div class="description">%description%</div>
|
|
318
|
+
ENDIF:description
|
|
319
|
+
|
|
320
|
+
IF:requires
|
|
321
|
+
<div class="sectiontitle">Required Files</div>
|
|
322
|
+
<ul>
|
|
323
|
+
START:requires
|
|
324
|
+
<li>HREF:aref:name:</li>
|
|
325
|
+
END:requires
|
|
326
|
+
</ul>
|
|
327
|
+
ENDIF:requires
|
|
328
|
+
|
|
329
|
+
IF:toc
|
|
330
|
+
<div class="sectiontitle">Contents</div>
|
|
331
|
+
<ul>
|
|
332
|
+
START:toc
|
|
333
|
+
<li><a href="#%href%">%secname%</a></li>
|
|
334
|
+
END:toc
|
|
335
|
+
</ul>
|
|
336
|
+
ENDIF:toc
|
|
337
|
+
|
|
338
|
+
IF:methods
|
|
339
|
+
<div class="sectiontitle">Methods</div>
|
|
340
|
+
<ul>
|
|
341
|
+
START:methods
|
|
342
|
+
<li>HREF:aref:name:</li>
|
|
343
|
+
END:methods
|
|
344
|
+
</ul>
|
|
345
|
+
ENDIF:methods
|
|
346
|
+
|
|
347
|
+
IF:includes
|
|
348
|
+
<div class="sectiontitle">Included Modules</div>
|
|
349
|
+
<ul>
|
|
350
|
+
START:includes
|
|
351
|
+
<li>HREF:aref:name:</li>
|
|
352
|
+
END:includes
|
|
353
|
+
</ul>
|
|
354
|
+
ENDIF:includes
|
|
355
|
+
|
|
356
|
+
START:sections
|
|
357
|
+
IF:sectitle
|
|
358
|
+
<div class="sectiontitle"><a nem="%secsequence%">%sectitle%</a></div>
|
|
359
|
+
IF:seccomment
|
|
360
|
+
<div class="description">
|
|
361
|
+
%seccomment%
|
|
362
|
+
</div>
|
|
363
|
+
ENDIF:seccomment
|
|
364
|
+
ENDIF:sectitle
|
|
365
|
+
|
|
366
|
+
IF:classlist
|
|
367
|
+
<div class="sectiontitle">Classes and Modules</div>
|
|
368
|
+
%classlist%
|
|
369
|
+
ENDIF:classlist
|
|
370
|
+
|
|
371
|
+
IF:constants
|
|
372
|
+
<div class="sectiontitle">Constants</div>
|
|
373
|
+
<table border='0' cellpadding='5'>
|
|
374
|
+
START:constants
|
|
375
|
+
<tr valign='top'>
|
|
376
|
+
<td class="attr-name">%name%</td>
|
|
377
|
+
<td>=</td>
|
|
378
|
+
<td class="attr-value">%value%</td>
|
|
379
|
+
</tr>
|
|
380
|
+
IF:desc
|
|
381
|
+
<tr valign='top'>
|
|
382
|
+
<td> </td>
|
|
383
|
+
<td colspan="2" class="attr-desc">%desc%</td>
|
|
384
|
+
</tr>
|
|
385
|
+
ENDIF:desc
|
|
386
|
+
END:constants
|
|
387
|
+
</table>
|
|
388
|
+
ENDIF:constants
|
|
389
|
+
|
|
390
|
+
IF:attributes
|
|
391
|
+
<div class="sectiontitle">Attributes</div>
|
|
392
|
+
<table border='0' cellpadding='5'>
|
|
393
|
+
START:attributes
|
|
394
|
+
<tr valign='top'>
|
|
395
|
+
<td class='attr-rw'>
|
|
396
|
+
IF:rw
|
|
397
|
+
[%rw%]
|
|
398
|
+
ENDIF:rw
|
|
399
|
+
</td>
|
|
400
|
+
<td class='attr-name'>%name%</td>
|
|
401
|
+
<td class='attr-desc'>%a_desc%</td>
|
|
402
|
+
</tr>
|
|
403
|
+
END:attributes
|
|
404
|
+
</table>
|
|
405
|
+
ENDIF:attributes
|
|
406
|
+
|
|
407
|
+
IF:method_list
|
|
408
|
+
START:method_list
|
|
409
|
+
IF:methods
|
|
410
|
+
<div class="sectiontitle">%type% %category% methods</div>
|
|
411
|
+
START:methods
|
|
412
|
+
<div class="method">
|
|
413
|
+
<div class="title">
|
|
414
|
+
IF:callseq
|
|
415
|
+
<a name="%aref%"></a><b>%callseq%</b>
|
|
416
|
+
ENDIF:callseq
|
|
417
|
+
IFNOT:callseq
|
|
418
|
+
<a name="%aref%"></a><b>%name%</b>%params%
|
|
419
|
+
ENDIF:callseq
|
|
420
|
+
IF:codeurl
|
|
421
|
+
[ <a href="javascript:openCode('%codeurl%')">source</a> ]
|
|
422
|
+
ENDIF:codeurl
|
|
423
|
+
</div>
|
|
424
|
+
IF:m_desc
|
|
425
|
+
<div class="description">
|
|
426
|
+
%m_desc%
|
|
427
|
+
</div>
|
|
428
|
+
ENDIF:m_desc
|
|
429
|
+
IF:aka
|
|
430
|
+
<div class="aka">
|
|
431
|
+
This method is also aliased as
|
|
432
|
+
START:aka
|
|
433
|
+
<a href="%aref%">%name%</a>
|
|
434
|
+
END:aka
|
|
435
|
+
</div>
|
|
436
|
+
ENDIF:aka
|
|
437
|
+
IF:sourcecode
|
|
438
|
+
<div class="sourcecode">
|
|
439
|
+
<p class="source-link">[ <a href="javascript:toggleSource('%aref%_source')" id="l_%aref%_source">show source</a> ]</p>
|
|
440
|
+
<div id="%aref%_source" class="dyn-source">
|
|
441
|
+
<pre>
|
|
442
|
+
%sourcecode%
|
|
443
|
+
</pre>
|
|
444
|
+
</div>
|
|
445
|
+
</div>
|
|
446
|
+
ENDIF:sourcecode
|
|
447
|
+
</div>
|
|
448
|
+
END:methods
|
|
449
|
+
ENDIF:methods
|
|
450
|
+
END:method_list
|
|
451
|
+
ENDIF:method_list
|
|
452
|
+
END:sections
|
|
453
|
+
</div>
|
|
454
|
+
HTML
|
|
455
|
+
|
|
456
|
+
FOOTER = <<ENDFOOTER
|
|
457
|
+
</body>
|
|
458
|
+
</html>
|
|
459
|
+
ENDFOOTER
|
|
460
|
+
|
|
461
|
+
BODY = HEADER + <<ENDBODY
|
|
462
|
+
!INCLUDE! <!-- banner header -->
|
|
463
|
+
|
|
464
|
+
<div id="bodyContent">
|
|
465
|
+
#{METHOD_LIST}
|
|
466
|
+
</div>
|
|
467
|
+
|
|
468
|
+
#{FOOTER}
|
|
469
|
+
ENDBODY
|
|
470
|
+
|
|
471
|
+
########################## Source code ##########################
|
|
472
|
+
|
|
473
|
+
SRC_PAGE = XHTML_PREAMBLE + <<HTML
|
|
474
|
+
<html>
|
|
475
|
+
<head><title>%title%</title>
|
|
476
|
+
<meta http-equiv="Content-Type" content="text/html; charset=%charset%">
|
|
477
|
+
<style>
|
|
478
|
+
.ruby-comment { color: green; font-style: italic }
|
|
479
|
+
.ruby-constant { color: #4433aa; font-weight: bold; }
|
|
480
|
+
.ruby-identifier { color: #222222; }
|
|
481
|
+
.ruby-ivar { color: #2233dd; }
|
|
482
|
+
.ruby-keyword { color: #3333FF; font-weight: bold }
|
|
483
|
+
.ruby-node { color: #777777; }
|
|
484
|
+
.ruby-operator { color: #111111; }
|
|
485
|
+
.ruby-regexp { color: #662222; }
|
|
486
|
+
.ruby-value { color: #662222; font-style: italic }
|
|
487
|
+
.kw { color: #3333FF; font-weight: bold }
|
|
488
|
+
.cmt { color: green; font-style: italic }
|
|
489
|
+
.str { color: #662222; font-style: italic }
|
|
490
|
+
.re { color: #662222; }
|
|
491
|
+
</style>
|
|
492
|
+
</head>
|
|
493
|
+
<body bgcolor="white">
|
|
494
|
+
<pre>%code%</pre>
|
|
495
|
+
</body>
|
|
496
|
+
</html>
|
|
497
|
+
HTML
|
|
498
|
+
|
|
499
|
+
########################## Index ################################
|
|
500
|
+
|
|
501
|
+
FR_INDEX_BODY = <<HTML
|
|
502
|
+
!INCLUDE!
|
|
503
|
+
HTML
|
|
504
|
+
|
|
505
|
+
FILE_INDEX = XHTML_PREAMBLE + <<HTML
|
|
506
|
+
<html>
|
|
507
|
+
<head>
|
|
508
|
+
<meta http-equiv="Content-Type" content="text/html; charset=%charset%">
|
|
509
|
+
<style>
|
|
510
|
+
<!--
|
|
511
|
+
body {
|
|
512
|
+
background-color: #EEE;
|
|
513
|
+
font-family: #{FONTS};
|
|
514
|
+
color: #000;
|
|
515
|
+
margin: 0px;
|
|
516
|
+
}
|
|
517
|
+
.banner {
|
|
518
|
+
background: #005;
|
|
519
|
+
color: #FFF;
|
|
520
|
+
padding: 0.2em;
|
|
521
|
+
font-size: small;
|
|
522
|
+
font-weight: bold;
|
|
523
|
+
text-align: center;
|
|
524
|
+
}
|
|
525
|
+
.entries {
|
|
526
|
+
margin: 0.25em 1em 0 1em;
|
|
527
|
+
font-size: x-small;
|
|
528
|
+
}
|
|
529
|
+
a {
|
|
530
|
+
color: #00F;
|
|
531
|
+
text-decoration: none;
|
|
532
|
+
white-space: nowrap;
|
|
533
|
+
}
|
|
534
|
+
a:hover {
|
|
535
|
+
color: #77F;
|
|
536
|
+
text-decoration: underline;
|
|
537
|
+
}
|
|
538
|
+
-->
|
|
539
|
+
</style>
|
|
540
|
+
<base target="docwin">
|
|
541
|
+
</head>
|
|
542
|
+
<body>
|
|
543
|
+
<div class="banner">%list_title%</div>
|
|
544
|
+
<div class="entries">
|
|
545
|
+
START:entries
|
|
546
|
+
<a href="%href%">%name%</a><br>
|
|
547
|
+
END:entries
|
|
548
|
+
</div>
|
|
549
|
+
</body></html>
|
|
550
|
+
HTML
|
|
551
|
+
|
|
552
|
+
CLASS_INDEX = FILE_INDEX
|
|
553
|
+
METHOD_INDEX = FILE_INDEX
|
|
554
|
+
|
|
555
|
+
INDEX = XHTML_PREAMBLE + <<HTML
|
|
556
|
+
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
|
557
|
+
<head>
|
|
558
|
+
<title>%title%</title>
|
|
559
|
+
<meta http-equiv="Content-Type" content="text/html; charset=%charset%">
|
|
560
|
+
</head>
|
|
561
|
+
|
|
562
|
+
<frameset cols="20%,*">
|
|
563
|
+
<frameset rows="15%,35%,50%">
|
|
564
|
+
<frame src="fr_file_index.html" title="Files" name="Files" />
|
|
565
|
+
<frame src="fr_class_index.html" name="Classes" />
|
|
566
|
+
<frame src="fr_method_index.html" name="Methods" />
|
|
567
|
+
</frameset>
|
|
568
|
+
IF:inline_source
|
|
569
|
+
<frame src="%initial_page%" name="docwin">
|
|
570
|
+
ENDIF:inline_source
|
|
571
|
+
IFNOT:inline_source
|
|
572
|
+
<frameset rows="80%,20%">
|
|
573
|
+
<frame src="%initial_page%" name="docwin">
|
|
574
|
+
<frame src="blank.html" name="source">
|
|
575
|
+
</frameset>
|
|
576
|
+
ENDIF:inline_source
|
|
577
|
+
<noframes>
|
|
578
|
+
<body bgcolor="white">
|
|
579
|
+
Click <a href="html/index.html">here</a> for a non-frames
|
|
580
|
+
version of this page.
|
|
581
|
+
</body>
|
|
582
|
+
</noframes>
|
|
583
|
+
</frameset>
|
|
584
|
+
|
|
585
|
+
</html>
|
|
586
|
+
HTML
|
|
587
|
+
|
|
588
|
+
end
|
|
589
|
+
end
|
|
590
|
+
|
|
591
|
+
|