xspf 0.3 → 0.4
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/AUTHORS +1 -1
- data/ChangeLog +15 -0
- data/README +6 -9
- data/USAGE +350 -0
- data/coverage/index.html +17 -17
- data/coverage/lib-xspf_rb.html +466 -305
- data/doc/created.rid +1 -1
- data/doc/fr_file_index.html +4 -0
- data/doc/fr_method_index.html +88 -44
- data/doc/index.html +1 -1
- data/examples/parse_and_generate_right.rb +25 -0
- data/examples/parse_and_generate_right_too.rb +27 -0
- data/examples/parse_and_generate_wrong.rb +25 -0
- data/examples/{example.rb → parse_from_file.rb} +15 -16
- data/examples/parse_from_string.rb +70 -0
- data/examples/playlist-tiersen.xspf +100 -0
- data/lib/xspf.rb +335 -174
- data/test/tc_dogfood.rb +106 -0
- data/test/tc_generate_output_formats.rb +352 -0
- data/test/tc_generate_playlist.rb +196 -0
- data/test/tc_generate_track.rb +38 -0
- data/test/tc_generate_tracklist.rb +72 -0
- data/test/tc_generate_xspf.rb +90 -0
- data/test/{tc_output_formats.rb → tc_parse_output_formats.rb} +124 -9
- data/test/{tc_playlist.rb → tc_parse_playlist.rb} +9 -1
- data/test/{tc_track.rb → tc_parse_track.rb} +1 -1
- data/test/{tc_tracklist.rb → tc_parse_tracklist.rb} +1 -1
- data/test/{tc_xspf.rb → tc_parse_xspf.rb} +4 -3
- data/test/ts_xspf.rb +12 -5
- data/xspf-expanded.rb +644 -76
- metadata +30 -16
data/AUTHORS
CHANGED
data/ChangeLog
CHANGED
@@ -1,3 +1,18 @@
|
|
1
|
+
0.4
|
2
|
+
|
3
|
+
* XSPF document generator (see examples of use)
|
4
|
+
|
5
|
+
* Renamed the methods which show the XML code for XSPF and XSPF::Playlist to XSPF#playlist_xml, XSPF::Playlist#tracklist_xml. These methods are now protected and should never be used. If you need to see the XML code, use to_xml
|
6
|
+
|
7
|
+
* Removed the 'xspf' parameter in to_m3u, to_smil, to_soundblox and to_html
|
8
|
+
|
9
|
+
* XSPF#playlist always returns a valid XSPF::Playlist object (both in parse and generation modes)
|
10
|
+
|
11
|
+
* XSPF::Playlist#tracklist always returns a valid XSPF::Tracklist object (both in parse and generation modes)
|
12
|
+
|
13
|
+
* It is able to eat its own dogfood (but keep in mind the limitations about <attribution>, <extension>, <link> and <meta>)
|
14
|
+
|
15
|
+
|
1
16
|
0.3
|
2
17
|
|
3
18
|
* Add methods to export the XSPF document to M3U, HTML, SMIL and SoundBlox
|
data/README
CHANGED
@@ -1,16 +1,13 @@
|
|
1
1
|
= README: XSPF for Ruby
|
2
|
-
This library
|
3
|
-
|
4
|
-
At this early stage of development, it is not yet possible to write XSPF
|
5
|
-
files.
|
2
|
+
This library parses and generates XSPF playlist documents. This is release 0.4.
|
6
3
|
|
7
4
|
Current limitations:
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
5
|
+
- For 'link', 'meta' and 'extension' elements, only the first one is parsed and only
|
6
|
+
one can be generated
|
7
|
+
- The content of the 'attribution' element is not parsed (the XML content is returned)
|
8
|
+
- The content of the 'extension' element is not parsed (the XML content is returned)
|
12
9
|
|
13
|
-
Homepage:: http://
|
10
|
+
Homepage:: http://xspf.rubyforge.org
|
14
11
|
|
15
12
|
== Licensing
|
16
13
|
XSPF for Ruby is available under the Ruby license and the GPLv2 license
|
data/USAGE
ADDED
@@ -0,0 +1,350 @@
|
|
1
|
+
:title: USAGE
|
2
|
+
|
3
|
+
XSPF for Ruby implements a XML Shareable Playlist Format (XSPF[http://www.xspf.org]) v1 parser and generator in pure Ruby. It makes use of REXML to parse and generate the XML code, and Ruby-XSLT to export XSPF to different formats by means of XSLT transformations (XSPF for Ruby includes the XSLT templates by Lucas Gonze in its distribution).
|
4
|
+
|
5
|
+
The API is quite straightforward if you know the XSPF specification. It is possible to combine parse and generation modes: you may load (parse) a file, then modify some of its attributes or contents and save it to XSPF again.
|
6
|
+
|
7
|
+
The important thing to remember while using XSPF for Ruby is in generation mode you create objects by passing a hash or nil, and in parse mode you create objects by passing its 'parent' in the XSPF hierarchy.
|
8
|
+
|
9
|
+
If a XSPF attribute or element is not set, the corresponding method will return _nil_.
|
10
|
+
|
11
|
+
=== Examples
|
12
|
+
==== Parse from file
|
13
|
+
|
14
|
+
require 'xspf'
|
15
|
+
|
16
|
+
f = File.new("playlist.xspf")
|
17
|
+
x = XSPF.new(f)
|
18
|
+
f.close
|
19
|
+
pl = XSPF::Playlist.new(x)
|
20
|
+
tl = XSPF::Tracklist.new(pl)
|
21
|
+
|
22
|
+
puts "XML version: #{x.version}"
|
23
|
+
puts "XML encoding: #{ x.encoding}"
|
24
|
+
puts "XSPF version: #{pl.version}"
|
25
|
+
puts "Namespace: #{pl.xmlns}"
|
26
|
+
puts "Playlist title: #{pl.title}"
|
27
|
+
puts "Playlist creator: #{pl.creator}"
|
28
|
+
puts "Playlist annotation: #{pl.annotation}"
|
29
|
+
puts "Playlist info: #{pl.info}"
|
30
|
+
puts "Playlist identifier: #{pl.identifier}"
|
31
|
+
puts "Playlist attribution: #{pl.attribution}"
|
32
|
+
puts "Tracklist: #{pl.tracklist}"
|
33
|
+
tl.tracks.each do |t|
|
34
|
+
puts "Track identifier: #{t.identifier}"
|
35
|
+
puts "Track title: #{t.title}"
|
36
|
+
puts "Track creator: #{t.creator}"
|
37
|
+
puts "Track duration: #{t.duration}"
|
38
|
+
puts "Track metainformation: link=#{t.meta_rel} content=#{t.meta_content}"
|
39
|
+
end
|
40
|
+
|
41
|
+
# Convert the XSPF document to SMIL
|
42
|
+
x.to_smil
|
43
|
+
|
44
|
+
# Convert the XSPF document to HTML
|
45
|
+
x.to_html
|
46
|
+
|
47
|
+
# Convert the XSPF document in a M3U playlist
|
48
|
+
x.to_m3u
|
49
|
+
|
50
|
+
==== Parse from string
|
51
|
+
|
52
|
+
require 'xspf'
|
53
|
+
|
54
|
+
playlist_document = <<-END_OF_PLAYLIST
|
55
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
56
|
+
<playlist version="0" xmlns="http://xspf.org/ns/0/">
|
57
|
+
<title>XSPlF it up!</title>
|
58
|
+
<creator>Mayhem & Chaos Coordinator</creator>
|
59
|
+
<annotation>Just a few songs to enjoy while you XSPlF it up!</annotation>
|
60
|
+
<info>http://mayhem-chaos.net/xspf/xspf_it_up.html</info>
|
61
|
+
<identifier>http://mayhem-chaos.net/xspf/xspf_it_up/1.0</identifier>
|
62
|
+
<attribution>
|
63
|
+
<location>ihttp://mayhem-chaos.net/xspf/xspf_it_up.html</location>
|
64
|
+
</attribution>
|
65
|
+
<trackList>
|
66
|
+
<track>
|
67
|
+
<identifier>http://musicbrainz.org/track/bdab6db0-2fd6-4166-a5fa-fbf2ff213793</identifier>
|
68
|
+
<title>I Wanna Get High</title>
|
69
|
+
<creator>Cypress Hill</creator>
|
70
|
+
<duration>174613</duration>
|
71
|
+
<meta rel="http://musicbrainz.org/track">http://musicbrainz.org/mm-2.1/track/bdab6db0-2fd6-4166-a5fa-fbf2ff213793</meta>
|
72
|
+
</track>
|
73
|
+
<track>
|
74
|
+
<identifier>bdc846e7-6c26-4193-82a6-8d1b5a4d3429</identifier>
|
75
|
+
<title>Smoke Two Joints</title>
|
76
|
+
<creator>Sublime</creator>
|
77
|
+
<duration>175466</duration>
|
78
|
+
<meta rel="http://musicbrainz.org/track">http://musicbrainz.org/mm-2.1/track/bdc846e7-6c26-4193-82a6-8d1b5a4d3429</meta>
|
79
|
+
</track>
|
80
|
+
<track>
|
81
|
+
<identifier>http://musicbrainz.org/track/7d9776f7-d428-40dc-a425-3c6e3dce4d58</identifier>
|
82
|
+
<title>Hash Pipe</title>
|
83
|
+
<creator>Weezer</creator>
|
84
|
+
<duration>186533</duration>
|
85
|
+
<meta rel="http://musicbrainz.org/track">http://musicbrainz.org/mm-2.1/track/7d9776f7-d428-40dc-a425-3c6e3dce4d58</meta>
|
86
|
+
</track>
|
87
|
+
</trackList>
|
88
|
+
</playlist>
|
89
|
+
END_OF_PLAYLIST
|
90
|
+
|
91
|
+
x = XSPF.new(playlist_document)
|
92
|
+
pl = XSPF::Playlist.new(x)
|
93
|
+
tl = XSPF::Tracklist.new(pl)
|
94
|
+
|
95
|
+
puts "XML version: #{x.version}"
|
96
|
+
puts "XML encoding: #{ x.encoding}"
|
97
|
+
puts "XSPF version: #{pl.version}"
|
98
|
+
puts "Namespace: #{pl.xmlns}"
|
99
|
+
puts "Playlist title: #{pl.title}"
|
100
|
+
puts "Playlist creator: #{pl.creator}"
|
101
|
+
puts "Playlist annotation: #{pl.annotation}"
|
102
|
+
puts "Playlist info: #{pl.info}"
|
103
|
+
puts "Playlist identifier: #{pl.identifier}"
|
104
|
+
puts "Playlist attribution: #{pl.attribution}"
|
105
|
+
puts "Tracklist: #{pl.tracklist}"
|
106
|
+
tl.tracks.each do |t|
|
107
|
+
puts "Track identifier: #{t.identifier}"
|
108
|
+
puts "Track title: #{t.title}"
|
109
|
+
puts "Track creator: #{t.creator}"
|
110
|
+
puts "Track duration: #{t.duration}"
|
111
|
+
puts "Track metainformation: link=#{t.meta_rel} content=#{t.meta_content}"
|
112
|
+
end
|
113
|
+
|
114
|
+
# Convert the XSPF document to SMIL
|
115
|
+
x.to_smil
|
116
|
+
|
117
|
+
# Convert the XSPF document to HTML
|
118
|
+
x.to_html
|
119
|
+
|
120
|
+
# Convert the XSPF document in a M3U playlist
|
121
|
+
x.to_m3u
|
122
|
+
|
123
|
+
==== Generate
|
124
|
+
|
125
|
+
require 'xspf'
|
126
|
+
|
127
|
+
track1 = XSPF::Track.new( {
|
128
|
+
:location => 'http://some.nifty.locati.on/file1.ogg',
|
129
|
+
:identifier => 'http://musicbrainz.org/track/9f342af1-982d-4c26-9f61-3ac258957a83', :title => 'Plus au sud',
|
130
|
+
:creator => 'Yann Tiersen',
|
131
|
+
:tracknum => '1',
|
132
|
+
:album => 'Tout est calme',
|
133
|
+
:meta_rel => 'http://www.example.org/key',
|
134
|
+
:meta_content => 'value'
|
135
|
+
} )
|
136
|
+
|
137
|
+
track2 = XSPF::Track.new( {
|
138
|
+
:location => 'http://some.nifty.locati.on/file2.ogg',
|
139
|
+
:identifier => 'http://musicbrainz.org/track/eba1a9a9-1810-41f1-8cc9-2a00dda0a68c',
|
140
|
+
:title => 'Les Grandes Marées',
|
141
|
+
:creator => 'Yann Tiersen',
|
142
|
+
:tracknum => '2',
|
143
|
+
:album => 'Tout est calme',
|
144
|
+
:meta_rel => 'http://www.example.org/key',
|
145
|
+
:meta_content => 'value'
|
146
|
+
} )
|
147
|
+
|
148
|
+
track3 = XSPF::Track.new( {
|
149
|
+
:location => 'http://some.nifty.locati.on/file3.ogg',
|
150
|
+
:identifier => 'http://musicbrainz.org/track/0c18ef8c-04fa-47d5-b078-66ab6a819a83',
|
151
|
+
:title => 'La Crise',
|
152
|
+
:creator => 'Yann Tiersen',
|
153
|
+
:tracknum => '3',
|
154
|
+
:album => 'Tout est calme',
|
155
|
+
:meta_rel => 'http://www.example.org/key',
|
156
|
+
:meta_content => 'value'
|
157
|
+
} )
|
158
|
+
|
159
|
+
track4 = XSPF::Track.new( {
|
160
|
+
:location => 'http://some.nifty.locati.on/file4.ogg',
|
161
|
+
:identifier => 'http://musicbrainz.org/track/0f66dd52-bda0-4526-979d-af95ac637cc4',
|
162
|
+
:title => 'Tout est calme',
|
163
|
+
:creator => 'Yann Tiersen',
|
164
|
+
:tracknum => '4',
|
165
|
+
:album => 'Tout est calme',
|
166
|
+
:meta_rel => 'http://www.example.org/key',
|
167
|
+
:meta_content => 'value'
|
168
|
+
} )
|
169
|
+
|
170
|
+
track5 = XSPF::Track.new( {
|
171
|
+
:location => 'http://some.nifty.locati.on/file5.ogg',
|
172
|
+
:identifier => 'http://musicbrainz.org/track/a06ef58e-019e-409a-bf72-9bd080012ac3',
|
173
|
+
:title => 'La Rupture',
|
174
|
+
:creator => 'Yann Tiersen',
|
175
|
+
:tracknum => '5',
|
176
|
+
:album => 'Tout est calme',
|
177
|
+
:meta_rel => 'http://www.example.org/key',
|
178
|
+
:meta_content => 'value'
|
179
|
+
} )
|
180
|
+
|
181
|
+
track6 = XSPF::Track.new( {
|
182
|
+
:location => 'http://some.nifty.locati.on/file6.ogg',
|
183
|
+
:identifier => 'http://musicbrainz.org/track/f82c0a06-d4a8-41a5-9238-029e38fa9d7c',
|
184
|
+
:title => 'La Relève',
|
185
|
+
:creator => 'Yann Tiersen',
|
186
|
+
:tracknum => '6',
|
187
|
+
:album => 'Tout est calme',
|
188
|
+
:meta_rel => 'http://www.example.org/key',
|
189
|
+
:meta_content => 'value'
|
190
|
+
} )
|
191
|
+
|
192
|
+
track7 = XSPF::Track.new( {
|
193
|
+
:location => 'http://some.nifty.locati.on/file7.ogg',
|
194
|
+
:identifier => 'http://musicbrainz.org/track/97591e2b-967e-47eb-b2b3-9a450cd33352',
|
195
|
+
:title => 'La Pharmacie',
|
196
|
+
:creator => 'Yann Tiersen',
|
197
|
+
:tracknum => '7',
|
198
|
+
:album => 'Tout est calme',
|
199
|
+
:meta_rel => 'http://www.example.org/key',
|
200
|
+
:meta_content => 'value'
|
201
|
+
} )
|
202
|
+
|
203
|
+
track8 = XSPF::Track.new( {
|
204
|
+
:location => 'http://some.nifty.locati.on/file8.ogg',
|
205
|
+
:identifier => 'http://musicbrainz.org/track/ae7f8502-778d-4f5e-9dba-6fc5d553ad0e',
|
206
|
+
:title => 'La Terrasse',
|
207
|
+
:creator => 'Yann Tiersen',
|
208
|
+
:tracknum => '8',
|
209
|
+
:album => 'Tout est calme',
|
210
|
+
:meta_rel => 'http://www.example.org/key',
|
211
|
+
:meta_content => 'value'
|
212
|
+
} )
|
213
|
+
|
214
|
+
track9 = XSPF::Track.new( {
|
215
|
+
:location => 'http://some.nifty.locati.on/file9.ogg',
|
216
|
+
:identifier => 'http://musicbrainz.org/track/6e937503-9d01-428c-84b5-1200bab9d1c6',
|
217
|
+
:title => "L''Étal",
|
218
|
+
:creator => 'Yann Tiersen',
|
219
|
+
:tracknum => '9',
|
220
|
+
:album => 'Tout est calme',
|
221
|
+
:meta_rel => 'http://www.example.org/key',
|
222
|
+
:meta_content => 'value'
|
223
|
+
} )
|
224
|
+
|
225
|
+
track10 = XSPF::Track.new( {
|
226
|
+
:location => 'http://some.nifty.locati.on/file10.ogg',
|
227
|
+
:identifier => 'http://musicbrainz.org/track/2c4c845c-907a-4d96-940a-bbe8b2d0f126',
|
228
|
+
:title => 'La Découverte',
|
229
|
+
:creator => 'Yann Tiersen',
|
230
|
+
:tracknum => '10',
|
231
|
+
:album => 'Tout est calme',
|
232
|
+
:meta_rel => 'http://www.example.org/key',
|
233
|
+
:meta_content => 'value'
|
234
|
+
} )
|
235
|
+
|
236
|
+
tracklist = XSPF::Tracklist.new
|
237
|
+
|
238
|
+
tracklist << track1
|
239
|
+
tracklist << track2
|
240
|
+
tracklist << track3
|
241
|
+
tracklist << track4
|
242
|
+
tracklist << track5
|
243
|
+
tracklist << track6
|
244
|
+
tracklist << track7
|
245
|
+
tracklist << track8
|
246
|
+
tracklist << track9
|
247
|
+
tracklist << track10
|
248
|
+
|
249
|
+
playlist = XSPF::Playlist.new( {
|
250
|
+
:xmlns => 'http://xspf.org/ns/0/',
|
251
|
+
:title => 'Tout est calme',
|
252
|
+
:creator => 'Yann Tiersen',
|
253
|
+
:license => 'Redistribution or sharing not allowed',
|
254
|
+
:info => 'http://www.yanntiersen.com/',
|
255
|
+
:tracklist => tracklist,
|
256
|
+
:meta_rel => 'http://www.example.org/key',
|
257
|
+
:meta_content => 'value'
|
258
|
+
} )
|
259
|
+
|
260
|
+
xspf = XSPF.new( { :playlist => playlist } )
|
261
|
+
|
262
|
+
f = File.open('playlist.xspf', 'w')
|
263
|
+
f.write(xspf.to_xml)
|
264
|
+
f.close
|
265
|
+
|
266
|
+
==== Parse and generate
|
267
|
+
|
268
|
+
Say you want to modify an existing XSPF document. What would you do?
|
269
|
+
|
270
|
+
There are two ways to do it: the right way and the wrong way. The best way to do it is:
|
271
|
+
|
272
|
+
require 'xspf'
|
273
|
+
|
274
|
+
f = File.new("playlist.xspf")
|
275
|
+
x = XSPF.new(f)
|
276
|
+
pl = x.playlist
|
277
|
+
tl = pl.tracklist
|
278
|
+
|
279
|
+
some_other_track = XSPF::Track.new( {
|
280
|
+
:location => 'http://some.nifty.locati.on/file1.ogg',
|
281
|
+
:identifier => 'http://musicbrainz.org/track/9f342af1-982d-4c26-9f61-3ac258957a83',
|
282
|
+
:title => 'Plus au sud',
|
283
|
+
:creator => 'Yann Tiersen',
|
284
|
+
:tracknum => '1',
|
285
|
+
:album => 'Tout est calme',
|
286
|
+
:meta_rel => 'http://www.example.org/key',
|
287
|
+
:meta_content => 'value'
|
288
|
+
} )
|
289
|
+
|
290
|
+
tl << some_other_track
|
291
|
+
pl.title = 'My modified playlist'
|
292
|
+
f = File.open('playlist.xspf', 'w')
|
293
|
+
f.write(x.to_xml)
|
294
|
+
f.close
|
295
|
+
|
296
|
+
Of course this would also work, but it means more work:
|
297
|
+
|
298
|
+
require 'xspf'
|
299
|
+
|
300
|
+
f = File.new("playlist.xspf")
|
301
|
+
x = XSPF.new(f)
|
302
|
+
pl = XSPF::Playlist.new(x)
|
303
|
+
tl = XSPF::Tracklist.new(pl)
|
304
|
+
|
305
|
+
some_other_track = XSPF::Track.new( {
|
306
|
+
:location => 'http://some.nifty.locati.on/file1.ogg',
|
307
|
+
:identifier => 'http://musicbrainz.org/track/9f342af1-982d-4c26-9f61-3ac258957a83',
|
308
|
+
:title => 'Plus au sud',
|
309
|
+
:creator => 'Yann Tiersen',
|
310
|
+
:tracknum => '1',
|
311
|
+
:album => 'Tout est calme',
|
312
|
+
:meta_rel => 'http://www.example.org/key',
|
313
|
+
:meta_content => 'value'
|
314
|
+
} )
|
315
|
+
|
316
|
+
tl << some_other_track
|
317
|
+
pl.title = 'My modified playlist'
|
318
|
+
pl.tracklist = tl
|
319
|
+
x.playlist = pl
|
320
|
+
f = File.open('playlist.xspf', 'w')
|
321
|
+
f.write(x.to_xml)
|
322
|
+
f.close
|
323
|
+
|
324
|
+
This way, which may seem intuitive, is wrong:
|
325
|
+
|
326
|
+
require 'xspf'
|
327
|
+
|
328
|
+
f = File.new("playlist.xspf")
|
329
|
+
x = XSPF.new(f)
|
330
|
+
pl = XSPF::Playlist.new(x)
|
331
|
+
tl = XSPF::Tracklist.new(pl)
|
332
|
+
|
333
|
+
some_other_track = XSPF::Track.new( {
|
334
|
+
:location => 'http://some.nifty.locati.on/file1.ogg',
|
335
|
+
:identifier => 'http://musicbrainz.org/track/9f342af1-982d-4c26-9f61-3ac258957a83',
|
336
|
+
:title => 'Plus au sud',
|
337
|
+
:creator => 'Yann Tiersen',
|
338
|
+
:tracknum => '1',
|
339
|
+
:album => 'Tout est calme',
|
340
|
+
:meta_rel => 'http://www.example.org/key',
|
341
|
+
:meta_content => 'value'
|
342
|
+
} )
|
343
|
+
|
344
|
+
tl << some_other_track
|
345
|
+
pl.title = 'My modified playlist'
|
346
|
+
f = File.open('playlist.xspf', 'w')
|
347
|
+
f.write(x.to_xml)
|
348
|
+
f.close
|
349
|
+
|
350
|
+
That will not work because 'pl' is a new object, unrelated to 'x'; and 'tl' is a new object, unrelated to 'pl'.
|
data/coverage/index.html
CHANGED
@@ -149,7 +149,7 @@ table.report tr.dark {
|
|
149
149
|
</head>
|
150
150
|
<body>
|
151
151
|
<h3>C0 code coverage information</h3>
|
152
|
-
<p>Generated on
|
152
|
+
<p>Generated on Mon Oct 30 22:55:21 CET 2006 with <a href='http://eigenclass.org/hiki.rb?rcov'>rcov 0.7.0</a>
|
153
153
|
</p>
|
154
154
|
<hr /> <table class='report'>
|
155
155
|
<thead>
|
@@ -165,21 +165,21 @@ table.report tr.dark {
|
|
165
165
|
<tr class='light'>
|
166
166
|
<td>TOTAL</td>
|
167
167
|
<td class='value'>
|
168
|
-
<tt>
|
168
|
+
<tt>480</tt>
|
169
169
|
</td>
|
170
170
|
<td class='value'>
|
171
|
-
<tt>
|
171
|
+
<tt>321</tt>
|
172
172
|
</td>
|
173
173
|
<td>
|
174
174
|
<table cellspacing='0' cellpadding='0' align='right'>
|
175
175
|
<tr>
|
176
176
|
<td>
|
177
|
-
<tt>
|
177
|
+
<tt>100.0%</tt> </td>
|
178
178
|
<td>
|
179
179
|
<table cellspacing='0' class='percent_graph' cellpadding='0' width='100'>
|
180
180
|
<tr>
|
181
|
-
<td class='covered' width='
|
182
|
-
<td class='uncovered' width='
|
181
|
+
<td class='covered' width='100' />
|
182
|
+
<td class='uncovered' width='0' />
|
183
183
|
</tr>
|
184
184
|
</table>
|
185
185
|
</td>
|
@@ -190,12 +190,12 @@ table.report tr.dark {
|
|
190
190
|
<table cellspacing='0' cellpadding='0' align='right'>
|
191
191
|
<tr>
|
192
192
|
<td>
|
193
|
-
<tt>
|
193
|
+
<tt>100.0%</tt> </td>
|
194
194
|
<td>
|
195
195
|
<table cellspacing='0' class='percent_graph' cellpadding='0' width='100'>
|
196
196
|
<tr>
|
197
|
-
<td class='covered' width='
|
198
|
-
<td class='uncovered' width='
|
197
|
+
<td class='covered' width='100' />
|
198
|
+
<td class='uncovered' width='0' />
|
199
199
|
</tr>
|
200
200
|
</table>
|
201
201
|
</td>
|
@@ -208,21 +208,21 @@ table.report tr.dark {
|
|
208
208
|
<a href='lib-xspf_rb.html'>lib/xspf.rb</a>
|
209
209
|
</td>
|
210
210
|
<td class='value'>
|
211
|
-
<tt>
|
211
|
+
<tt>480</tt>
|
212
212
|
</td>
|
213
213
|
<td class='value'>
|
214
|
-
<tt>
|
214
|
+
<tt>321</tt>
|
215
215
|
</td>
|
216
216
|
<td>
|
217
217
|
<table cellspacing='0' cellpadding='0' align='right'>
|
218
218
|
<tr>
|
219
219
|
<td>
|
220
|
-
<tt>
|
220
|
+
<tt>100.0%</tt> </td>
|
221
221
|
<td>
|
222
222
|
<table cellspacing='0' class='percent_graph' cellpadding='0' width='100'>
|
223
223
|
<tr>
|
224
|
-
<td class='covered' width='
|
225
|
-
<td class='uncovered' width='
|
224
|
+
<td class='covered' width='100' />
|
225
|
+
<td class='uncovered' width='0' />
|
226
226
|
</tr>
|
227
227
|
</table>
|
228
228
|
</td>
|
@@ -233,12 +233,12 @@ table.report tr.dark {
|
|
233
233
|
<table cellspacing='0' cellpadding='0' align='right'>
|
234
234
|
<tr>
|
235
235
|
<td>
|
236
|
-
<tt>
|
236
|
+
<tt>100.0%</tt> </td>
|
237
237
|
<td>
|
238
238
|
<table cellspacing='0' class='percent_graph' cellpadding='0' width='100'>
|
239
239
|
<tr>
|
240
|
-
<td class='covered' width='
|
241
|
-
<td class='uncovered' width='
|
240
|
+
<td class='covered' width='100' />
|
241
|
+
<td class='uncovered' width='0' />
|
242
242
|
</tr>
|
243
243
|
</table>
|
244
244
|
</td>
|