xspf 0.4.1 → 0.4.1.1

Sign up to get free protection for your applications and to get access to all the features.
data/ChangeLog CHANGED
@@ -1,3 +1,7 @@
1
+ 0.4.1a
2
+
3
+ * Bugfix release: ruby-xslt 0.9.3 changes the way to load the gem
4
+
1
5
  0.4.1
2
6
 
3
7
  * Added the to_rdf method to export XSPF to RDF
@@ -110,7 +110,9 @@ table.report td.heading:hover {
110
110
  table.report td.text {
111
111
  border: #d0d0d0 1px solid;
112
112
  }
113
- table.report td.value {
113
+ table.report td.value,
114
+ table.report td.lines_total,
115
+ table.report td.lines_code {
114
116
  text-align: right;
115
117
  border: #d0d0d0 1px solid;
116
118
  }
@@ -149,7 +151,7 @@ table.report tr.dark {
149
151
  </head>
150
152
  <body>
151
153
  <h3>C0 code coverage information</h3>
152
- <p>Generated on Sun Dec 03 14:34:00 CET 2006 with <a href='http://eigenclass.org/hiki.rb?rcov'>rcov 0.7.0</a>
154
+ <p>Generated on Tue Apr 10 20:52:45 +0200 2007 with <a href='http://eigenclass.org/hiki.rb?rcov'>rcov 0.8.0</a>
153
155
  </p>
154
156
  <hr /> <table class='report'>
155
157
  <thead>
@@ -164,22 +166,22 @@ table.report tr.dark {
164
166
  <tbody>
165
167
  <tr class='light'>
166
168
  <td>TOTAL</td>
167
- <td class='value'>
168
- <tt>481</tt>
169
+ <td class='lines_total'>
170
+ <tt>491</tt>
169
171
  </td>
170
- <td class='value'>
171
- <tt>322</tt>
172
+ <td class='lines_code'>
173
+ <tt>331</tt>
172
174
  </td>
173
175
  <td>
174
176
  <table cellspacing='0' cellpadding='0' align='right'>
175
177
  <tr>
176
178
  <td>
177
- <tt>100.0%</tt>&nbsp;</td>
179
+ <tt class='coverage_total'>98.4%</tt>&nbsp;</td>
178
180
  <td>
179
181
  <table cellspacing='0' class='percent_graph' cellpadding='0' width='100'>
180
182
  <tr>
181
- <td class='covered' width='100' />
182
- <td class='uncovered' width='0' />
183
+ <td class='covered' width='98' />
184
+ <td class='uncovered' width='2' />
183
185
  </tr>
184
186
  </table>
185
187
  </td>
@@ -190,12 +192,12 @@ table.report tr.dark {
190
192
  <table cellspacing='0' cellpadding='0' align='right'>
191
193
  <tr>
192
194
  <td>
193
- <tt>100.0%</tt>&nbsp;</td>
195
+ <tt class='coverage_code'>97.6%</tt>&nbsp;</td>
194
196
  <td>
195
197
  <table cellspacing='0' class='percent_graph' cellpadding='0' width='100'>
196
198
  <tr>
197
- <td class='covered' width='100' />
198
- <td class='uncovered' width='0' />
199
+ <td class='covered' width='98' />
200
+ <td class='uncovered' width='2' />
199
201
  </tr>
200
202
  </table>
201
203
  </td>
@@ -207,22 +209,22 @@ table.report tr.dark {
207
209
  <td>
208
210
  <a href='lib-xspf_rb.html'>lib/xspf.rb</a>
209
211
  </td>
210
- <td class='value'>
211
- <tt>481</tt>
212
+ <td class='lines_total'>
213
+ <tt>491</tt>
212
214
  </td>
213
- <td class='value'>
214
- <tt>322</tt>
215
+ <td class='lines_code'>
216
+ <tt>331</tt>
215
217
  </td>
216
218
  <td>
217
219
  <table cellspacing='0' cellpadding='0' align='right'>
218
220
  <tr>
219
221
  <td>
220
- <tt>100.0%</tt>&nbsp;</td>
222
+ <tt class='coverage_total'>98.4%</tt>&nbsp;</td>
221
223
  <td>
222
224
  <table cellspacing='0' class='percent_graph' cellpadding='0' width='100'>
223
225
  <tr>
224
- <td class='covered' width='100' />
225
- <td class='uncovered' width='0' />
226
+ <td class='covered' width='98' />
227
+ <td class='uncovered' width='2' />
226
228
  </tr>
227
229
  </table>
228
230
  </td>
@@ -233,12 +235,12 @@ table.report tr.dark {
233
235
  <table cellspacing='0' cellpadding='0' align='right'>
234
236
  <tr>
235
237
  <td>
236
- <tt>100.0%</tt>&nbsp;</td>
238
+ <tt class='coverage_code'>97.6%</tt>&nbsp;</td>
237
239
  <td>
238
240
  <table cellspacing='0' class='percent_graph' cellpadding='0' width='100'>
239
241
  <tr>
240
- <td class='covered' width='100' />
241
- <td class='uncovered' width='0' />
242
+ <td class='covered' width='98' />
243
+ <td class='uncovered' width='2' />
242
244
  </tr>
243
245
  </table>
244
246
  </td>
@@ -247,7 +249,7 @@ table.report tr.dark {
247
249
  </td>
248
250
  </tr>
249
251
  </tbody>
250
- </table><hr /> <p>Generated using the <a href='http://eigenclass.org/hiki.rb?rcov'>rcov code coverage analysis tool for Ruby</a> version 0.7.0.</p><p>
252
+ </table><hr /> <p>Generated using the <a href='http://eigenclass.org/hiki.rb?rcov'>rcov code coverage analysis tool for Ruby</a> version 0.8.0.</p><p>
251
253
  <a href='http://validator.w3.org/check/referer'>
252
254
  <img src='http://www.w3.org/Icons/valid-xhtml11' height='31' alt='Valid XHTML 1.1!' width='88' />
253
255
  </a>
@@ -110,7 +110,9 @@ table.report td.heading:hover {
110
110
  table.report td.text {
111
111
  border: #d0d0d0 1px solid;
112
112
  }
113
- table.report td.value {
113
+ table.report td.value,
114
+ table.report td.lines_total,
115
+ table.report td.lines_code {
114
116
  text-align: right;
115
117
  border: #d0d0d0 1px solid;
116
118
  }
@@ -554,7 +556,7 @@ span.run100 {
554
556
  </head>
555
557
  <body>
556
558
  <h3>C0 code coverage information</h3>
557
- <p>Generated on Sun Dec 03 14:34:00 CET 2006 with <a href='http://eigenclass.org/hiki.rb?rcov'>rcov 0.7.0</a>
559
+ <p>Generated on Tue Apr 10 20:52:45 +0200 2007 with <a href='http://eigenclass.org/hiki.rb?rcov'>rcov 0.8.0</a>
558
560
  </p>
559
561
  <hr /><pre><span class='marked0'>Code reported as executed by Ruby looks like this...
560
562
  </span><span class='marked1'>and this: this line is also marked as covered.
@@ -577,22 +579,22 @@ span.run100 {
577
579
  <td>
578
580
  <a href='lib-xspf_rb.html'>lib/xspf.rb</a>
579
581
  </td>
580
- <td class='value'>
581
- <tt>481</tt>
582
+ <td class='lines_total'>
583
+ <tt>491</tt>
582
584
  </td>
583
- <td class='value'>
584
- <tt>322</tt>
585
+ <td class='lines_code'>
586
+ <tt>331</tt>
585
587
  </td>
586
588
  <td>
587
589
  <table cellspacing='0' cellpadding='0' align='right'>
588
590
  <tr>
589
591
  <td>
590
- <tt>100.0%</tt>&nbsp;</td>
592
+ <tt class='coverage_total'>98.4%</tt>&nbsp;</td>
591
593
  <td>
592
594
  <table cellspacing='0' class='percent_graph' cellpadding='0' width='100'>
593
595
  <tr>
594
- <td class='covered' width='100' />
595
- <td class='uncovered' width='0' />
596
+ <td class='covered' width='98' />
597
+ <td class='uncovered' width='2' />
596
598
  </tr>
597
599
  </table>
598
600
  </td>
@@ -603,12 +605,12 @@ span.run100 {
603
605
  <table cellspacing='0' cellpadding='0' align='right'>
604
606
  <tr>
605
607
  <td>
606
- <tt>100.0%</tt>&nbsp;</td>
608
+ <tt class='coverage_code'>97.6%</tt>&nbsp;</td>
607
609
  <td>
608
610
  <table cellspacing='0' class='percent_graph' cellpadding='0' width='100'>
609
611
  <tr>
610
- <td class='covered' width='100' />
611
- <td class='uncovered' width='0' />
612
+ <td class='covered' width='98' />
613
+ <td class='uncovered' width='2' />
612
614
  </tr>
613
615
  </table>
614
616
  </td>
@@ -631,474 +633,484 @@ span.run100 {
631
633
  </span><span class="inferred0"><a name="line12" /> 12 #++
632
634
  </span><span class="inferred1"><a name="line13" /> 13
633
635
  </span><span class="marked0"><a name="line14" /> 14 require 'rexml/document'
634
- </span><span class="marked1"><a name="line15" /> 15 require 'xml/xslt'
635
- </span><span class="inferred0"><a name="line16" /> 16
636
- </span><span class="inferred1"><a name="line17" /> 17 # :include: USAGE
637
- </span><span class="inferred0"><a name="line18" /> 18 # :main: USAGE
638
- </span><span class="inferred1"><a name="line19" /> 19
639
- </span><span class="marked0"><a name="line20" /> 20 module MetaGen #:nodoc:
640
- </span><span class="inferred1"><a name="line21" /> 21
641
- </span><span class="inferred0"><a name="line22" /> 22 # define the method
642
- </span><span class="marked1"><a name="line23" /> 23 def self.add_method(klass, meth_name, body, meth_rdoc)
643
- </span><span class="marked0"><a name="line24" /> 24 code = &lt;&lt;-CODE
644
- </span><span class="inferred1"><a name="line25" /> 25 # #{meth_rdoc}
645
- </span><span class="inferred0"><a name="line26" /> 26 def #{meth_name.downcase}
646
- </span><span class="inferred1"><a name="line27" /> 27 @#{meth_name}
647
- </span><span class="inferred0"><a name="line28" /> 28 end
648
- </span><span class="inferred1"><a name="line29" /> 29
649
- </span><span class="inferred0"><a name="line30" /> 30 def #{meth_name.downcase}=(value)
650
- </span><span class="inferred1"><a name="line31" /> 31 @#{meth_name.downcase} = value
651
- </span><span class="inferred0"><a name="line32" /> 32 end
652
- </span><span class="inferred1"><a name="line33" /> 33
653
- </span><span class="inferred0"><a name="line34" /> 34 private
654
- </span><span class="inferred1"><a name="line35" /> 35 def parse_#{meth_name.downcase}
655
- </span><span class="inferred0"><a name="line36" /> 36 begin
656
- </span><span class="inferred1"><a name="line37" /> 37 #{body}
657
- </span><span class="inferred0"><a name="line38" /> 38 rescue NoMethodError
658
- </span><span class="inferred1"><a name="line39" /> 39 return nil
659
- </span><span class="inferred0"><a name="line40" /> 40 end
660
- </span><span class="inferred1"><a name="line41" /> 41 end
661
- </span><span class="inferred0"><a name="line42" /> 42 CODE
662
- </span><span class="inferred1"><a name="line43" /> 43
663
- </span><span class="marked0"><a name="line44" /> 44 klass.module_eval(code)
664
- </span><span class="inferred1"><a name="line45" /> 45
665
- </span><span class="inferred0"><a name="line46" /> 46 # hook to write klass + name attrib to a file
666
- </span><span class="marked1"><a name="line47" /> 47 if $META_RDOC
667
- </span><span class="marked0"><a name="line48" /> 48 open($META_RDOC, 'a+') do |f|
668
- </span><span class="marked1"><a name="line49" /> 49 f.puts(&quot;class #{klass}\n #{code}\n end&quot;)
636
+ </span><span class="inferred1"><a name="line15" /> 15
637
+ </span><span class="marked0"><a name="line16" /> 16 begin
638
+ </span><span class="marked1"><a name="line17" /> 17 require 'xml/xslt_lib' # For ruby-xslt 0.9.3 or newer
639
+ </span><span class="uncovered0"><a name="line18" /> 18 rescue LoadError =&gt; e
640
+ </span><span class="uncovered1"><a name="line19" /> 19 begin
641
+ </span><span class="uncovered0"><a name="line20" /> 20 require 'xml/xslt' # For ruby-xslt 0.9.2 or older
642
+ </span><span class="uncovered1"><a name="line21" /> 21 rescue LoadError =&gt; e
643
+ </span><span class="uncovered0"><a name="line22" /> 22 puts &quot;You need to install ruby-xslt to use ruby-xspf&quot;
644
+ </span><span class="uncovered1"><a name="line23" /> 23 exit
645
+ </span><span class="uncovered0"><a name="line24" /> 24 end
646
+ </span><span class="uncovered1"><a name="line25" /> 25 end
647
+ </span><span class="inferred0"><a name="line26" /> 26
648
+ </span><span class="inferred1"><a name="line27" /> 27 # :include: USAGE
649
+ </span><span class="inferred0"><a name="line28" /> 28 # :main: USAGE
650
+ </span><span class="inferred1"><a name="line29" /> 29
651
+ </span><span class="marked0"><a name="line30" /> 30 module MetaGen #:nodoc:
652
+ </span><span class="inferred1"><a name="line31" /> 31
653
+ </span><span class="inferred0"><a name="line32" /> 32 # define the method
654
+ </span><span class="marked1"><a name="line33" /> 33 def self.add_method(klass, meth_name, body, meth_rdoc)
655
+ </span><span class="marked0"><a name="line34" /> 34 code = &lt;&lt;-CODE
656
+ </span><span class="inferred1"><a name="line35" /> 35 # #{meth_rdoc}
657
+ </span><span class="inferred0"><a name="line36" /> 36 def #{meth_name.downcase}
658
+ </span><span class="inferred1"><a name="line37" /> 37 @#{meth_name}
659
+ </span><span class="inferred0"><a name="line38" /> 38 end
660
+ </span><span class="inferred1"><a name="line39" /> 39
661
+ </span><span class="inferred0"><a name="line40" /> 40 def #{meth_name.downcase}=(value)
662
+ </span><span class="inferred1"><a name="line41" /> 41 @#{meth_name.downcase} = value
663
+ </span><span class="inferred0"><a name="line42" /> 42 end
664
+ </span><span class="inferred1"><a name="line43" /> 43
665
+ </span><span class="inferred0"><a name="line44" /> 44 private
666
+ </span><span class="inferred1"><a name="line45" /> 45 def parse_#{meth_name.downcase}
667
+ </span><span class="inferred0"><a name="line46" /> 46 begin
668
+ </span><span class="inferred1"><a name="line47" /> 47 #{body}
669
+ </span><span class="inferred0"><a name="line48" /> 48 rescue NoMethodError
670
+ </span><span class="inferred1"><a name="line49" /> 49 return nil
669
671
  </span><span class="inferred0"><a name="line50" /> 50 end
670
672
  </span><span class="inferred1"><a name="line51" /> 51 end
671
- </span><span class="inferred0"><a name="line52" /> 52
672
- </span><span class="inferred1"><a name="line53" /> 53 end
673
- </span><span class="inferred0"><a name="line54" /> 54
674
- </span><span class="inferred1"><a name="line55" /> 55 # output in different formats
675
- </span><span class="inferred0"><a name="line56" /> 56 # FIXME Only works in parse mode, not in generation mode.
676
- </span><span class="marked1"><a name="line57" /> 57 def self.add_output_format(klass, format, meth_rdoc)
677
- </span><span class="marked0"><a name="line58" /> 58 xslt_path = &quot;'#{File.join( File.dirname(__FILE__), %Q{xspf2#{format}.xsl} )}'&quot;
678
- </span><span class="marked1"><a name="line59" /> 59 code = &lt;&lt;-CODE
679
- </span><span class="inferred0"><a name="line60" /> 60 # #{meth_rdoc}
680
- </span><span class="inferred1"><a name="line61" /> 61 def to_#{format}
681
- </span><span class="inferred0"><a name="line62" /> 62 xslt = XML::XSLT.new
682
- </span><span class="inferred1"><a name="line63" /> 63 xslt.xml = self.to_xml
683
- </span><span class="inferred0"><a name="line64" /> 64 xslt.xsl = REXML::Document.new( File.new( #{xslt_path} ) )
684
- </span><span class="inferred1"><a name="line65" /> 65 xslt.serve
685
- </span><span class="inferred0"><a name="line66" /> 66 end
686
- </span><span class="inferred1"><a name="line67" /> 67 CODE
687
- </span><span class="inferred0"><a name="line68" /> 68
688
- </span><span class="marked1"><a name="line69" /> 69 klass.module_eval(code)
689
- </span><span class="inferred0"><a name="line70" /> 70
690
- </span><span class="marked1"><a name="line71" /> 71 if $META_RDOC
691
- </span><span class="marked0"><a name="line72" /> 72 open($META_RDOC, 'a+') do |f|
692
- </span><span class="marked1"><a name="line73" /> 73 f.puts(&quot;class #{klass}\n #{code}\n end&quot;)
693
- </span><span class="inferred0"><a name="line74" /> 74 end
694
- </span><span class="inferred1"><a name="line75" /> 75 end
695
- </span><span class="inferred0"><a name="line76" /> 76
696
- </span><span class="inferred1"><a name="line77" /> 77 end
697
- </span><span class="inferred0"><a name="line78" /> 78
698
- </span><span class="inferred1"><a name="line79" /> 79 end
699
- </span><span class="inferred0"><a name="line80" /> 80
700
- </span><span class="marked1"><a name="line81" /> 81 class XSPF
701
- </span><span class="inferred0"><a name="line82" /> 82
702
- </span><span class="marked1"><a name="line83" /> 83 attr_reader :xspf
703
- </span><span class="inferred0"><a name="line84" /> 84
704
- </span><span class="inferred1"><a name="line85" /> 85 #:stopdoc:
705
- </span><span class="marked0"><a name="line86" /> 86 ATTRIBUTES = %w{ version encoding }
706
- </span><span class="marked1"><a name="line87" /> 87 VERSION_RDOC = 'Version for the XML document or _nil_ if not defined'
707
- </span><span class="marked0"><a name="line88" /> 88 ENCODING_RDOC = 'Encoding of the XML document or _nil_ if not defined'
708
- </span><span class="inferred1"><a name="line89" /> 89
709
- </span><span class="marked0"><a name="line90" /> 90 OUTPUT_FORMATS = %w{ m3u html smil rdf soundblox }
710
- </span><span class="marked1"><a name="line91" /> 91 M3U_RDOC = 'Creates a .m3u playlist from the XSPF document. This method makes use of the official XSPF to M3U XSLT transformation by Lucas Gonze.'
711
- </span><span class="marked0"><a name="line92" /> 92 HTML_RDOC = 'Outputs the playlist as an HTML page. This method makes use of the official XSPF to HTML XSLT transformation by Lucas Gonze.'
712
- </span><span class="marked1"><a name="line93" /> 93 SMIL_RDOC = 'Creates a .smil playlist from the XSPF document. This method makes use of the official XSPF to SMIL XSLT transformation by Lucas Gonze.'
713
- </span><span class="marked0"><a name="line94" /> 94 SOUNDBLOX_RDOC = 'Creates a SoundBlox playlist from the XSPF document. This method makes use of the official XSPF to SoundBlox XSLT tranformation by Lucas Gonze.'
714
- </span><span class="marked1"><a name="line95" /> 95 RDF_RDOC = 'Creates a RDF feed from the XSPF document. This method makes use of the XSPF to RDF XSLT transformation by Libby Miller.'
715
- </span><span class="inferred0"><a name="line96" /> 96
716
- </span><span class="marked1"><a name="line97" /> 97 ATTRIBUTES.each do |attrib|
717
- </span><span class="marked0"><a name="line98" /> 98 MetaGen.add_method(self, attrib, &quot;@xspf.#{attrib}&quot;, eval(attrib.upcase + '_RDOC').to_s )
718
- </span><span class="inferred1"><a name="line99" /> 99 end
719
- </span><span class="inferred0"><a name="line100" />100
720
- </span><span class="marked1"><a name="line101" />101 OUTPUT_FORMATS.each do |format|
721
- </span><span class="marked0"><a name="line102" />102 MetaGen.add_output_format(self, format, eval(format.upcase + '_RDOC').to_s )
722
- </span><span class="inferred1"><a name="line103" />103 end
723
- </span><span class="inferred0"><a name="line104" />104
724
- </span><span class="inferred1"><a name="line105" />105 #:startdoc:
725
- </span><span class="inferred0"><a name="line106" />106
726
- </span><span class="inferred1"><a name="line107" />107 # Creates a XSPF object from a file or string (parse mode) or from a hash or nil (generation mode).
727
- </span><span class="inferred0"><a name="line108" />108 #
728
- </span><span class="inferred1"><a name="line109" />109 # Possible keys in the hash: :version, :encoding
729
- </span><span class="marked0"><a name="line110" />110 def initialize(source = nil)
730
- </span><span class="marked1"><a name="line111" />111 if ( source.nil? || source.instance_of?(Hash) ) then
731
- </span><span class="marked0"><a name="line112" />112 @version = if source.nil? || !source.has_key?(:version)
732
- </span><span class="marked1"><a name="line113" />113 '1.0'
733
- </span><span class="inferred0"><a name="line114" />114 else
734
- </span><span class="marked1"><a name="line115" />115 source[:version]
735
- </span><span class="inferred0"><a name="line116" />116 end
736
- </span><span class="marked1"><a name="line117" />117 @encoding = if source.nil? || !source.has_key?(:encoding)
737
- </span><span class="marked0"><a name="line118" />118 'UTF-8'
738
- </span><span class="inferred1"><a name="line119" />119 else
739
- </span><span class="marked0"><a name="line120" />120 source[:encoding]
740
- </span><span class="inferred1"><a name="line121" />121 end
741
- </span><span class="marked0"><a name="line122" />122 @playlist = nil
742
- </span><span class="marked1"><a name="line123" />123 @playlist = if !source.nil? &amp;&amp; source.has_key?(:playlist) then
743
- </span><span class="marked0"><a name="line124" />124 if source[:playlist].instance_of?(XSPF::Playlist)
744
- </span><span class="marked1"><a name="line125" />125 source[:playlist]
745
- </span><span class="inferred0"><a name="line126" />126 else
746
- </span><span class="marked1"><a name="line127" />127 raise(TypeError, 'You must pass a file/string (parsing mode) or a hash/nothing (generator mode) as argument to XSPF#new')
747
- </span><span class="inferred0"><a name="line128" />128 end
748
- </span><span class="inferred1"><a name="line129" />129 end
749
- </span><span class="inferred0"><a name="line130" />130
750
- </span><span class="marked1"><a name="line131" />131 elsif ( source.instance_of?(File) || source.instance_of?(String) ) then
751
- </span><span class="marked0"><a name="line132" />132 @xspf = REXML::Document.new(source)
752
- </span><span class="marked1"><a name="line133" />133 ATTRIBUTES.each do |attrib|
753
- </span><span class="marked0"><a name="line134" />134 eval('@' + attrib + '= parse_' + attrib)
754
- </span><span class="inferred1"><a name="line135" />135 end
755
- </span><span class="inferred0"><a name="line136" />136
756
- </span><span class="marked1"><a name="line137" />137 @playlist = XSPF::Playlist.new(self)
757
- </span><span class="inferred0"><a name="line138" />138
758
- </span><span class="inferred1"><a name="line139" />139 else
759
- </span><span class="marked0"><a name="line140" />140 raise(TypeError, 'You must pass a file/string (parsing mode) or a hash/nothing (generator mode) as argument to XSPF#new')
760
- </span><span class="inferred1"><a name="line141" />141 end
761
- </span><span class="marked0"><a name="line142" />142 end
762
- </span><span class="inferred1"><a name="line143" />143
763
- </span><span class="inferred0"><a name="line144" />144 # A XSPF::Playlist object
764
- </span><span class="marked1"><a name="line145" />145 def playlist
765
- </span><span class="marked0"><a name="line146" />146 @playlist
766
- </span><span class="marked1"><a name="line147" />147 end
767
- </span><span class="inferred0"><a name="line148" />148
768
- </span><span class="marked1"><a name="line149" />149 def playlist=(value)
769
- </span><span class="marked0"><a name="line150" />150 raise(TypeError, 'The playlist must be an instance of XSPF::Playlist') unless value.instance_of?(XSPF::Playlist)
770
- </span><span class="marked1"><a name="line151" />151 @playlist = value
771
- </span><span class="inferred0"><a name="line152" />152 end
673
+ </span><span class="inferred0"><a name="line52" /> 52 CODE
674
+ </span><span class="inferred1"><a name="line53" /> 53
675
+ </span><span class="marked0"><a name="line54" /> 54 klass.module_eval(code)
676
+ </span><span class="inferred1"><a name="line55" /> 55
677
+ </span><span class="inferred0"><a name="line56" /> 56 # hook to write klass + name attrib to a file
678
+ </span><span class="marked1"><a name="line57" /> 57 if $META_RDOC
679
+ </span><span class="marked0"><a name="line58" /> 58 open($META_RDOC, 'a+') do |f|
680
+ </span><span class="marked1"><a name="line59" /> 59 f.puts(&quot;class #{klass}\n #{code}\n end&quot;)
681
+ </span><span class="inferred0"><a name="line60" /> 60 end
682
+ </span><span class="inferred1"><a name="line61" /> 61 end
683
+ </span><span class="inferred0"><a name="line62" /> 62
684
+ </span><span class="inferred1"><a name="line63" /> 63 end
685
+ </span><span class="inferred0"><a name="line64" /> 64
686
+ </span><span class="inferred1"><a name="line65" /> 65 # output in different formats
687
+ </span><span class="inferred0"><a name="line66" /> 66 # FIXME Only works in parse mode, not in generation mode.
688
+ </span><span class="marked1"><a name="line67" /> 67 def self.add_output_format(klass, format, meth_rdoc)
689
+ </span><span class="marked0"><a name="line68" /> 68 xslt_path = &quot;'#{File.join( File.dirname(__FILE__), %Q{xspf2#{format}.xsl} )}'&quot;
690
+ </span><span class="marked1"><a name="line69" /> 69 code = &lt;&lt;-CODE
691
+ </span><span class="inferred0"><a name="line70" /> 70 # #{meth_rdoc}
692
+ </span><span class="inferred1"><a name="line71" /> 71 def to_#{format}
693
+ </span><span class="inferred0"><a name="line72" /> 72 xslt = XML::XSLT.new
694
+ </span><span class="inferred1"><a name="line73" /> 73 xslt.xml = self.to_xml
695
+ </span><span class="inferred0"><a name="line74" /> 74 xslt.xsl = REXML::Document.new( File.new( #{xslt_path} ) )
696
+ </span><span class="inferred1"><a name="line75" /> 75 xslt.serve
697
+ </span><span class="inferred0"><a name="line76" /> 76 end
698
+ </span><span class="inferred1"><a name="line77" /> 77 CODE
699
+ </span><span class="inferred0"><a name="line78" /> 78
700
+ </span><span class="marked1"><a name="line79" /> 79 klass.module_eval(code)
701
+ </span><span class="inferred0"><a name="line80" /> 80
702
+ </span><span class="marked1"><a name="line81" /> 81 if $META_RDOC
703
+ </span><span class="marked0"><a name="line82" /> 82 open($META_RDOC, 'a+') do |f|
704
+ </span><span class="marked1"><a name="line83" /> 83 f.puts(&quot;class #{klass}\n #{code}\n end&quot;)
705
+ </span><span class="inferred0"><a name="line84" /> 84 end
706
+ </span><span class="inferred1"><a name="line85" /> 85 end
707
+ </span><span class="inferred0"><a name="line86" /> 86
708
+ </span><span class="inferred1"><a name="line87" /> 87 end
709
+ </span><span class="inferred0"><a name="line88" /> 88
710
+ </span><span class="inferred1"><a name="line89" /> 89 end
711
+ </span><span class="inferred0"><a name="line90" /> 90
712
+ </span><span class="marked1"><a name="line91" /> 91 class XSPF
713
+ </span><span class="inferred0"><a name="line92" /> 92
714
+ </span><span class="marked1"><a name="line93" /> 93 attr_reader :xspf
715
+ </span><span class="inferred0"><a name="line94" /> 94
716
+ </span><span class="inferred1"><a name="line95" /> 95 #:stopdoc:
717
+ </span><span class="marked0"><a name="line96" /> 96 ATTRIBUTES = %w{ version encoding }
718
+ </span><span class="marked1"><a name="line97" /> 97 VERSION_RDOC = 'Version for the XML document or _nil_ if not defined'
719
+ </span><span class="marked0"><a name="line98" /> 98 ENCODING_RDOC = 'Encoding of the XML document or _nil_ if not defined'
720
+ </span><span class="inferred1"><a name="line99" /> 99
721
+ </span><span class="marked0"><a name="line100" />100 OUTPUT_FORMATS = %w{ m3u html smil rdf soundblox }
722
+ </span><span class="marked1"><a name="line101" />101 M3U_RDOC = 'Creates a .m3u playlist from the XSPF document. This method makes use of the official XSPF to M3U XSLT transformation by Lucas Gonze.'
723
+ </span><span class="marked0"><a name="line102" />102 HTML_RDOC = 'Outputs the playlist as an HTML page. This method makes use of the official XSPF to HTML XSLT transformation by Lucas Gonze.'
724
+ </span><span class="marked1"><a name="line103" />103 SMIL_RDOC = 'Creates a .smil playlist from the XSPF document. This method makes use of the official XSPF to SMIL XSLT transformation by Lucas Gonze.'
725
+ </span><span class="marked0"><a name="line104" />104 SOUNDBLOX_RDOC = 'Creates a SoundBlox playlist from the XSPF document. This method makes use of the official XSPF to SoundBlox XSLT tranformation by Lucas Gonze.'
726
+ </span><span class="marked1"><a name="line105" />105 RDF_RDOC = 'Creates a RDF feed from the XSPF document. This method makes use of the XSPF to RDF XSLT transformation by Libby Miller.'
727
+ </span><span class="inferred0"><a name="line106" />106
728
+ </span><span class="marked1"><a name="line107" />107 ATTRIBUTES.each do |attrib|
729
+ </span><span class="marked0"><a name="line108" />108 MetaGen.add_method(self, attrib, &quot;@xspf.#{attrib}&quot;, eval(attrib.upcase + '_RDOC').to_s )
730
+ </span><span class="inferred1"><a name="line109" />109 end
731
+ </span><span class="inferred0"><a name="line110" />110
732
+ </span><span class="marked1"><a name="line111" />111 OUTPUT_FORMATS.each do |format|
733
+ </span><span class="marked0"><a name="line112" />112 MetaGen.add_output_format(self, format, eval(format.upcase + '_RDOC').to_s )
734
+ </span><span class="inferred1"><a name="line113" />113 end
735
+ </span><span class="inferred0"><a name="line114" />114
736
+ </span><span class="inferred1"><a name="line115" />115 #:startdoc:
737
+ </span><span class="inferred0"><a name="line116" />116
738
+ </span><span class="inferred1"><a name="line117" />117 # Creates a XSPF object from a file or string (parse mode) or from a hash or nil (generation mode).
739
+ </span><span class="inferred0"><a name="line118" />118 #
740
+ </span><span class="inferred1"><a name="line119" />119 # Possible keys in the hash: :version, :encoding
741
+ </span><span class="marked0"><a name="line120" />120 def initialize(source = nil)
742
+ </span><span class="marked1"><a name="line121" />121 if ( source.nil? || source.instance_of?(Hash) ) then
743
+ </span><span class="marked0"><a name="line122" />122 @version = if source.nil? || !source.has_key?(:version)
744
+ </span><span class="marked1"><a name="line123" />123 '1.0'
745
+ </span><span class="inferred0"><a name="line124" />124 else
746
+ </span><span class="marked1"><a name="line125" />125 source[:version]
747
+ </span><span class="inferred0"><a name="line126" />126 end
748
+ </span><span class="marked1"><a name="line127" />127 @encoding = if source.nil? || !source.has_key?(:encoding)
749
+ </span><span class="marked0"><a name="line128" />128 'UTF-8'
750
+ </span><span class="inferred1"><a name="line129" />129 else
751
+ </span><span class="marked0"><a name="line130" />130 source[:encoding]
752
+ </span><span class="inferred1"><a name="line131" />131 end
753
+ </span><span class="marked0"><a name="line132" />132 @playlist = nil
754
+ </span><span class="marked1"><a name="line133" />133 @playlist = if !source.nil? &amp;&amp; source.has_key?(:playlist) then
755
+ </span><span class="marked0"><a name="line134" />134 if source[:playlist].instance_of?(XSPF::Playlist)
756
+ </span><span class="marked1"><a name="line135" />135 source[:playlist]
757
+ </span><span class="inferred0"><a name="line136" />136 else
758
+ </span><span class="marked1"><a name="line137" />137 raise(TypeError, 'You must pass a file/string (parsing mode) or a hash/nothing (generator mode) as argument to XSPF#new')
759
+ </span><span class="inferred0"><a name="line138" />138 end
760
+ </span><span class="inferred1"><a name="line139" />139 end
761
+ </span><span class="inferred0"><a name="line140" />140
762
+ </span><span class="marked1"><a name="line141" />141 elsif ( source.instance_of?(File) || source.instance_of?(String) ) then
763
+ </span><span class="marked0"><a name="line142" />142 @xspf = REXML::Document.new(source)
764
+ </span><span class="marked1"><a name="line143" />143 ATTRIBUTES.each do |attrib|
765
+ </span><span class="marked0"><a name="line144" />144 eval('@' + attrib + '= parse_' + attrib)
766
+ </span><span class="inferred1"><a name="line145" />145 end
767
+ </span><span class="inferred0"><a name="line146" />146
768
+ </span><span class="marked1"><a name="line147" />147 @playlist = XSPF::Playlist.new(self)
769
+ </span><span class="inferred0"><a name="line148" />148
770
+ </span><span class="inferred1"><a name="line149" />149 else
771
+ </span><span class="marked0"><a name="line150" />150 raise(TypeError, 'You must pass a file/string (parsing mode) or a hash/nothing (generator mode) as argument to XSPF#new')
772
+ </span><span class="inferred1"><a name="line151" />151 end
773
+ </span><span class="marked0"><a name="line152" />152 end
772
774
  </span><span class="inferred1"><a name="line153" />153
773
- </span><span class="inferred0"><a name="line154" />154 # Exports the XSPF object to XML
774
- </span><span class="marked1"><a name="line155" />155 def to_xml
775
- </span><span class="marked0"><a name="line156" />156 xml = REXML::Document.new
776
- </span><span class="marked1"><a name="line157" />157 xml &lt;&lt; REXML::XMLDecl.new(@version, @encoding)
777
- </span><span class="marked0"><a name="line158" />158 xml &lt;&lt; REXML::Document.new(@playlist.to_xml) unless @playlist.nil?
778
- </span><span class="marked1"><a name="line159" />159 xml.to_s
779
- </span><span class="inferred0"><a name="line160" />160 end
780
- </span><span class="inferred1"><a name="line161" />161
781
- </span><span class="inferred0"><a name="line162" />162 # The &lt;playlist&gt; section of the XSPF document (outputs XML code). This method is only used while parsing.
782
- </span><span class="marked1"><a name="line163" />163 protected
783
- </span><span class="marked0"><a name="line164" />164 def playlist_xml
784
- </span><span class="marked1"><a name="line165" />165 @xspf.root
785
- </span><span class="marked0"><a name="line166" />166 end
786
- </span><span class="inferred1"><a name="line167" />167
787
- </span><span class="inferred0"><a name="line168" />168 end
788
- </span><span class="inferred1"><a name="line169" />169
789
- </span><span class="marked0"><a name="line170" />170 class XSPF::Playlist &lt; XSPF
775
+ </span><span class="inferred0"><a name="line154" />154 # A XSPF::Playlist object
776
+ </span><span class="marked1"><a name="line155" />155 def playlist
777
+ </span><span class="marked0"><a name="line156" />156 @playlist
778
+ </span><span class="marked1"><a name="line157" />157 end
779
+ </span><span class="inferred0"><a name="line158" />158
780
+ </span><span class="marked1"><a name="line159" />159 def playlist=(value)
781
+ </span><span class="marked0"><a name="line160" />160 raise(TypeError, 'The playlist must be an instance of XSPF::Playlist') unless value.instance_of?(XSPF::Playlist)
782
+ </span><span class="marked1"><a name="line161" />161 @playlist = value
783
+ </span><span class="inferred0"><a name="line162" />162 end
784
+ </span><span class="inferred1"><a name="line163" />163
785
+ </span><span class="inferred0"><a name="line164" />164 # Exports the XSPF object to XML
786
+ </span><span class="marked1"><a name="line165" />165 def to_xml
787
+ </span><span class="marked0"><a name="line166" />166 xml = REXML::Document.new
788
+ </span><span class="marked1"><a name="line167" />167 xml &lt;&lt; REXML::XMLDecl.new(@version, @encoding)
789
+ </span><span class="marked0"><a name="line168" />168 xml &lt;&lt; REXML::Document.new(@playlist.to_xml) unless @playlist.nil?
790
+ </span><span class="marked1"><a name="line169" />169 xml.to_s
791
+ </span><span class="inferred0"><a name="line170" />170 end
790
792
  </span><span class="inferred1"><a name="line171" />171
791
- </span><span class="marked0"><a name="line172" />172 attr_reader :playlist
792
- </span><span class="inferred1"><a name="line173" />173
793
- </span><span class="inferred0"><a name="line174" />174 #:stopdoc:
794
- </span><span class="marked1"><a name="line175" />175 ATTRIBUTES = %w{ xmlns version }
795
- </span><span class="marked0"><a name="line176" />176 ELEMENTS = %w{ title creator annotation info location identifier image date license attribution extension }
796
- </span><span class="marked1"><a name="line177" />177 ATTRIBUTE_AND_ELEMENT = %w{ link meta }
797
- </span><span class="marked0"><a name="line178" />178 ATTRIBUTION_CHILD_ELEMENTS = %w{ location identifier }
798
- </span><span class="marked1"><a name="line179" />179 EXTENSION_CHILD_ELEMENTS = %w{ application content }
799
- </span><span class="inferred0"><a name="line180" />180
800
- </span><span class="marked1"><a name="line181" />181 XMLNS_RDOC = 'The XML namespace. It must be http://xspf.org/ns/0/ for a valid XSPF document.'
801
- </span><span class="marked0"><a name="line182" />182 XMLNS_DEFAULT = 'http://xspf.org/ns/0/'
802
- </span><span class="marked1"><a name="line183" />183 VERSION_RDOC = 'The XSPF version. It may be 0 or 1, although 1 is strongly advised.'
803
- </span><span class="marked0"><a name="line184" />184 VERSION_DEFAULT = '1'
804
- </span><span class="marked1"><a name="line185" />185 TITLE_RDOC = 'A human-readable title for the playlist. xspf:playlist elements MAY contain exactly one.'
805
- </span><span class="marked0"><a name="line186" />186 CREATOR_RDOC = 'Human-readable name of the entity (author, authors, group, company, etc) that authored the playlist. XSPF::Playlist objects MAY contain exactly one.'
806
- </span><span class="marked1"><a name="line187" />187 ANNOTATION_RDOC = 'A human-readable comment on the playlist. This is character data, not HTML, and it may not contain markup. XSPF::Playlist objects elements MAY contain exactly one.'
807
- </span><span class="marked0"><a name="line188" />188 INFO_RDOC = 'URL of a web page to find out more about this playlist. Likely to be homepage of the author, and would be used to find out more about the author and to find more playlists by the author. XSPF::Playlist objects MAY contain exactly one.'
808
- </span><span class="marked1"><a name="line189" />189 LOCATION_RDOC = 'Source URL for this playlist. XSPF::Playlist objects MAY contain exactly one.'
809
- </span><span class="marked0"><a name="line190" />190 IDENTIFIER_RDOC = 'Canonical ID for this playlist. Likely to be a hash or other location-independent name. MUST be a legal URN. XSPF::Playlist objects MAY contain exactly one.'
810
- </span><span class="marked1"><a name="line191" />191 IMAGE_RDOC = 'URL of an image to display if XSPF::Playlist#image return nil. XSPF::Playlist objects MAY contain exactly one.'
811
- </span><span class="marked0"><a name="line192" />192 DATE_RDOC = 'Creation date (not last-modified date) of the playlist, formatted as a XML schema dateTime. XSPF::Playlist objects MAY contain exactly one.'
812
- </span><span class="marked1"><a name="line193" />193 LICENSE_RDOC = 'URL of a resource that describes the license under which this playlist was released. XSPF::Playlist objects MAY contain zero or one license element.'
813
- </span><span class="marked0"><a name="line194" />194 ATTRIBUTION_RDOC = 'An ordered list of URIs. The purpose is to satisfy licenses allowing modification but requiring attribution. If you modify such a playlist, move its XSPF::Playlist#location or XSPF::Playlist#identifier element to the top of the items in the XSPF::Playlist#attribution element. XSPF::Playlist objects MAY contain exactly one attribution element. Please note that currently XSPF for Ruby does not parse the contents of XSPF::Playlist#attribution.'
814
- </span><span class="marked1"><a name="line195" />195 EXTENSION_RDOC = 'The extension element allows non-XSPF XML to be included in XSPF documents without breaking XSPF validation. The purpose is to allow nested XML, which the meta and link elements do not. XSPF::Playlist objects MAY contain zero or more extension elements but currently XSPF for Ruby returns only the first one.'
815
- </span><span class="marked0"><a name="line196" />196 LINK_REL_RDOC = 'The link element allows non-XSPF web resources to be included in XSPF documents without breaking XSPF validation. A valid _link_ element has a _rel_ attribute and a _content_ element, obtained with XSPF::Playlist#link_rel and XSPF::Playlist#link_content respectively. XSPF::Playlist objects MAY contain zero or more link elements, but currently XSPF for Ruby returns only the first one.'
816
- </span><span class="marked1"><a name="line197" />197 LINK_CONTENT_RDOC = 'The link element allows non-XSPF web resources to be included in XSPF documents without breaking XSPF validation. A valid _link_ element has a _rel_ attribute and a _content_ element, obtained with XSPF::Playlist#link_rel and XSPF::Playlist#link_content respectively. XSPF::Playlist objects MAY contain zero or more meta elements, but currently XSPF for Ruby returns only the first one.'
817
- </span><span class="marked0"><a name="line198" />198 META_REL_RDOC = 'The meta element allows non-XSPF metadata to be included in XSPF documents without breaking XSPF validation. A valid _meta_ element has a _rel_ attribute and a _content_ element, obtained with XSPF::Playlist#meta_rel and XSPF::Playlist#meta_content respectively. XSPF::Playlist objects MAY contain zero or more meta elements, but currently XSPF for Ruby returns only the first one.'
818
- </span><span class="marked1"><a name="line199" />199 META_CONTENT_RDOC = 'The meta element allows non-XSPF metadata to be included in XSPF documents without breaking XSPF validation. A valid _meta_ element has a _rel_ attribute and a _content_ element, obtained with XSPF::Playlist#meta_rel and XSPF::Playlist#meta_content respectively. XSPF::Playlist objects MAY contain zero or more meta elements, but currently XSPF for Ruby returns only the first one.'
819
- </span><span class="inferred0"><a name="line200" />200
820
- </span><span class="inferred1"><a name="line201" />201 # FIXME Currently we only return the first &quot;link&quot;
821
- </span><span class="inferred0"><a name="line202" />202 # FIXME Currently we only return the first &quot;meta&quot;
822
- </span><span class="inferred1"><a name="line203" />203 # FIXME Currently we only return the first &quot;extension&quot;
823
- </span><span class="inferred0"><a name="line204" />204 # TODO Parse &quot;attribution&quot;
824
- </span><span class="inferred1"><a name="line205" />205 # TODO Parse &quot;extension&quot;
825
- </span><span class="inferred0"><a name="line206" />206
826
- </span><span class="inferred1"><a name="line207" />207 # Returns the value of the attribute or nil if the attribute is not present
827
- </span><span class="marked0"><a name="line208" />208 ATTRIBUTES.each do |attrib|
828
- </span><span class="marked1"><a name="line209" />209 MetaGen.add_method( self, attrib, &quot;@playlist.root.attributes['#{attrib}']&quot;, eval(attrib.upcase + '_RDOC').to_s )
829
- </span><span class="inferred0"><a name="line210" />210 end
830
- </span><span class="inferred1"><a name="line211" />211
831
- </span><span class="marked0"><a name="line212" />212 ELEMENTS.each do |element|
832
- </span><span class="marked1"><a name="line213" />213 MetaGen.add_method( self, element, &quot;@playlist.elements['#{element}'].text&quot;, eval(element.upcase + '_RDOC').to_s )
833
- </span><span class="inferred0"><a name="line214" />214 end
834
- </span><span class="inferred1"><a name="line215" />215
835
- </span><span class="marked0"><a name="line216" />216 ATTRIBUTE_AND_ELEMENT.each do |ae|
836
- </span><span class="marked1"><a name="line217" />217 MetaGen.add_method( self, &quot;#{ae}_content&quot;, &quot;@playlist.elements['#{ae}'].text&quot;, eval(ae.upcase + '_CONTENT_RDOC').to_s )
837
- </span><span class="marked0"><a name="line218" />218 MetaGen.add_method( self, &quot;#{ae}_rel&quot;, &quot;@playlist.elements['#{ae}'].attributes['rel']&quot;, eval(ae.upcase + '_REL_RDOC').to_s )
838
- </span><span class="inferred1"><a name="line219" />219 end
839
- </span><span class="inferred0"><a name="line220" />220
840
- </span><span class="inferred1"><a name="line221" />221 #:startdoc:
841
- </span><span class="inferred0"><a name="line222" />222
842
- </span><span class="inferred1"><a name="line223" />223 # Creates a XSPF::Playlist from a XSPF document (parse mode) or from a hash of values (generation mode)
843
- </span><span class="inferred0"><a name="line224" />224 #
844
- </span><span class="inferred1"><a name="line225" />225 # Possible keys in the hash: :xmlns, :version, :title, :creator, :annotation, :info, :location, :identifier, :image, :date, :license, :attribution, :extension, :link_rel, :link_content, :meta_rel, :meta_content
845
- </span><span class="marked0"><a name="line226" />226 def initialize(source = nil)
846
- </span><span class="inferred1"><a name="line227" />227
847
- </span><span class="marked0"><a name="line228" />228 if ( source.instance_of?(Hash) || source.nil? ) then
848
- </span><span class="inferred1"><a name="line229" />229
849
- </span><span class="marked0"><a name="line230" />230 ATTRIBUTES.each do |attrib|
850
- </span><span class="marked1"><a name="line231" />231 add_instance_variable(source, attrib)
851
- </span><span class="inferred0"><a name="line232" />232 end
852
- </span><span class="inferred1"><a name="line233" />233
853
- </span><span class="marked0"><a name="line234" />234 ELEMENTS.each do |element|
854
- </span><span class="marked1"><a name="line235" />235 add_instance_variable(source, element)
855
- </span><span class="inferred0"><a name="line236" />236 end
793
+ </span><span class="inferred0"><a name="line172" />172 # The &lt;playlist&gt; section of the XSPF document (outputs XML code). This method is only used while parsing.
794
+ </span><span class="marked1"><a name="line173" />173 protected
795
+ </span><span class="marked0"><a name="line174" />174 def playlist_xml
796
+ </span><span class="marked1"><a name="line175" />175 @xspf.root
797
+ </span><span class="marked0"><a name="line176" />176 end
798
+ </span><span class="inferred1"><a name="line177" />177
799
+ </span><span class="inferred0"><a name="line178" />178 end
800
+ </span><span class="inferred1"><a name="line179" />179
801
+ </span><span class="marked0"><a name="line180" />180 class XSPF::Playlist &lt; XSPF
802
+ </span><span class="inferred1"><a name="line181" />181
803
+ </span><span class="marked0"><a name="line182" />182 attr_reader :playlist
804
+ </span><span class="inferred1"><a name="line183" />183
805
+ </span><span class="inferred0"><a name="line184" />184 #:stopdoc:
806
+ </span><span class="marked1"><a name="line185" />185 ATTRIBUTES = %w{ xmlns version }
807
+ </span><span class="marked0"><a name="line186" />186 ELEMENTS = %w{ title creator annotation info location identifier image date license attribution extension }
808
+ </span><span class="marked1"><a name="line187" />187 ATTRIBUTE_AND_ELEMENT = %w{ link meta }
809
+ </span><span class="marked0"><a name="line188" />188 ATTRIBUTION_CHILD_ELEMENTS = %w{ location identifier }
810
+ </span><span class="marked1"><a name="line189" />189 EXTENSION_CHILD_ELEMENTS = %w{ application content }
811
+ </span><span class="inferred0"><a name="line190" />190
812
+ </span><span class="marked1"><a name="line191" />191 XMLNS_RDOC = 'The XML namespace. It must be http://xspf.org/ns/0/ for a valid XSPF document.'
813
+ </span><span class="marked0"><a name="line192" />192 XMLNS_DEFAULT = 'http://xspf.org/ns/0/'
814
+ </span><span class="marked1"><a name="line193" />193 VERSION_RDOC = 'The XSPF version. It may be 0 or 1, although 1 is strongly advised.'
815
+ </span><span class="marked0"><a name="line194" />194 VERSION_DEFAULT = '1'
816
+ </span><span class="marked1"><a name="line195" />195 TITLE_RDOC = 'A human-readable title for the playlist. xspf:playlist elements MAY contain exactly one.'
817
+ </span><span class="marked0"><a name="line196" />196 CREATOR_RDOC = 'Human-readable name of the entity (author, authors, group, company, etc) that authored the playlist. XSPF::Playlist objects MAY contain exactly one.'
818
+ </span><span class="marked1"><a name="line197" />197 ANNOTATION_RDOC = 'A human-readable comment on the playlist. This is character data, not HTML, and it may not contain markup. XSPF::Playlist objects elements MAY contain exactly one.'
819
+ </span><span class="marked0"><a name="line198" />198 INFO_RDOC = 'URL of a web page to find out more about this playlist. Likely to be homepage of the author, and would be used to find out more about the author and to find more playlists by the author. XSPF::Playlist objects MAY contain exactly one.'
820
+ </span><span class="marked1"><a name="line199" />199 LOCATION_RDOC = 'Source URL for this playlist. XSPF::Playlist objects MAY contain exactly one.'
821
+ </span><span class="marked0"><a name="line200" />200 IDENTIFIER_RDOC = 'Canonical ID for this playlist. Likely to be a hash or other location-independent name. MUST be a legal URN. XSPF::Playlist objects MAY contain exactly one.'
822
+ </span><span class="marked1"><a name="line201" />201 IMAGE_RDOC = 'URL of an image to display if XSPF::Playlist#image return nil. XSPF::Playlist objects MAY contain exactly one.'
823
+ </span><span class="marked0"><a name="line202" />202 DATE_RDOC = 'Creation date (not last-modified date) of the playlist, formatted as a XML schema dateTime. XSPF::Playlist objects MAY contain exactly one.'
824
+ </span><span class="marked1"><a name="line203" />203 LICENSE_RDOC = 'URL of a resource that describes the license under which this playlist was released. XSPF::Playlist objects MAY contain zero or one license element.'
825
+ </span><span class="marked0"><a name="line204" />204 ATTRIBUTION_RDOC = 'An ordered list of URIs. The purpose is to satisfy licenses allowing modification but requiring attribution. If you modify such a playlist, move its XSPF::Playlist#location or XSPF::Playlist#identifier element to the top of the items in the XSPF::Playlist#attribution element. XSPF::Playlist objects MAY contain exactly one attribution element. Please note that currently XSPF for Ruby does not parse the contents of XSPF::Playlist#attribution.'
826
+ </span><span class="marked1"><a name="line205" />205 EXTENSION_RDOC = 'The extension element allows non-XSPF XML to be included in XSPF documents without breaking XSPF validation. The purpose is to allow nested XML, which the meta and link elements do not. XSPF::Playlist objects MAY contain zero or more extension elements but currently XSPF for Ruby returns only the first one.'
827
+ </span><span class="marked0"><a name="line206" />206 LINK_REL_RDOC = 'The link element allows non-XSPF web resources to be included in XSPF documents without breaking XSPF validation. A valid _link_ element has a _rel_ attribute and a _content_ element, obtained with XSPF::Playlist#link_rel and XSPF::Playlist#link_content respectively. XSPF::Playlist objects MAY contain zero or more link elements, but currently XSPF for Ruby returns only the first one.'
828
+ </span><span class="marked1"><a name="line207" />207 LINK_CONTENT_RDOC = 'The link element allows non-XSPF web resources to be included in XSPF documents without breaking XSPF validation. A valid _link_ element has a _rel_ attribute and a _content_ element, obtained with XSPF::Playlist#link_rel and XSPF::Playlist#link_content respectively. XSPF::Playlist objects MAY contain zero or more meta elements, but currently XSPF for Ruby returns only the first one.'
829
+ </span><span class="marked0"><a name="line208" />208 META_REL_RDOC = 'The meta element allows non-XSPF metadata to be included in XSPF documents without breaking XSPF validation. A valid _meta_ element has a _rel_ attribute and a _content_ element, obtained with XSPF::Playlist#meta_rel and XSPF::Playlist#meta_content respectively. XSPF::Playlist objects MAY contain zero or more meta elements, but currently XSPF for Ruby returns only the first one.'
830
+ </span><span class="marked1"><a name="line209" />209 META_CONTENT_RDOC = 'The meta element allows non-XSPF metadata to be included in XSPF documents without breaking XSPF validation. A valid _meta_ element has a _rel_ attribute and a _content_ element, obtained with XSPF::Playlist#meta_rel and XSPF::Playlist#meta_content respectively. XSPF::Playlist objects MAY contain zero or more meta elements, but currently XSPF for Ruby returns only the first one.'
831
+ </span><span class="inferred0"><a name="line210" />210
832
+ </span><span class="inferred1"><a name="line211" />211 # FIXME Currently we only return the first &quot;link&quot;
833
+ </span><span class="inferred0"><a name="line212" />212 # FIXME Currently we only return the first &quot;meta&quot;
834
+ </span><span class="inferred1"><a name="line213" />213 # FIXME Currently we only return the first &quot;extension&quot;
835
+ </span><span class="inferred0"><a name="line214" />214 # TODO Parse &quot;attribution&quot;
836
+ </span><span class="inferred1"><a name="line215" />215 # TODO Parse &quot;extension&quot;
837
+ </span><span class="inferred0"><a name="line216" />216
838
+ </span><span class="inferred1"><a name="line217" />217 # Returns the value of the attribute or nil if the attribute is not present
839
+ </span><span class="marked0"><a name="line218" />218 ATTRIBUTES.each do |attrib|
840
+ </span><span class="marked1"><a name="line219" />219 MetaGen.add_method( self, attrib, &quot;@playlist.root.attributes['#{attrib}']&quot;, eval(attrib.upcase + '_RDOC').to_s )
841
+ </span><span class="inferred0"><a name="line220" />220 end
842
+ </span><span class="inferred1"><a name="line221" />221
843
+ </span><span class="marked0"><a name="line222" />222 ELEMENTS.each do |element|
844
+ </span><span class="marked1"><a name="line223" />223 MetaGen.add_method( self, element, &quot;@playlist.elements['#{element}'].text&quot;, eval(element.upcase + '_RDOC').to_s )
845
+ </span><span class="inferred0"><a name="line224" />224 end
846
+ </span><span class="inferred1"><a name="line225" />225
847
+ </span><span class="marked0"><a name="line226" />226 ATTRIBUTE_AND_ELEMENT.each do |ae|
848
+ </span><span class="marked1"><a name="line227" />227 MetaGen.add_method( self, &quot;#{ae}_content&quot;, &quot;@playlist.elements['#{ae}'].text&quot;, eval(ae.upcase + '_CONTENT_RDOC').to_s )
849
+ </span><span class="marked0"><a name="line228" />228 MetaGen.add_method( self, &quot;#{ae}_rel&quot;, &quot;@playlist.elements['#{ae}'].attributes['rel']&quot;, eval(ae.upcase + '_REL_RDOC').to_s )
850
+ </span><span class="inferred1"><a name="line229" />229 end
851
+ </span><span class="inferred0"><a name="line230" />230
852
+ </span><span class="inferred1"><a name="line231" />231 #:startdoc:
853
+ </span><span class="inferred0"><a name="line232" />232
854
+ </span><span class="inferred1"><a name="line233" />233 # Creates a XSPF::Playlist from a XSPF document (parse mode) or from a hash of values (generation mode)
855
+ </span><span class="inferred0"><a name="line234" />234 #
856
+ </span><span class="inferred1"><a name="line235" />235 # Possible keys in the hash: :xmlns, :version, :title, :creator, :annotation, :info, :location, :identifier, :image, :date, :license, :attribution, :extension, :link_rel, :link_content, :meta_rel, :meta_content
857
+ </span><span class="marked0"><a name="line236" />236 def initialize(source = nil)
856
858
  </span><span class="inferred1"><a name="line237" />237
857
- </span><span class="marked0"><a name="line238" />238 ATTRIBUTE_AND_ELEMENT.each do |ae|
858
- </span><span class="marked1"><a name="line239" />239 add_instance_variable(source, &quot;#{ae}_content&quot; )
859
- </span><span class="marked0"><a name="line240" />240 add_instance_variable(source, &quot;#{ae}_rel&quot; )
860
- </span><span class="inferred1"><a name="line241" />241 end
861
- </span><span class="inferred0"><a name="line242" />242
862
- </span><span class="marked1"><a name="line243" />243 @tracklist = if ( !source.nil? &amp;&amp; source.has_key?(:tracklist) &amp;&amp; source[:tracklist].instance_of?(XSPF::Tracklist) )
863
- </span><span class="marked0"><a name="line244" />244 source[:tracklist]
864
- </span><span class="inferred1"><a name="line245" />245 else
865
- </span><span class="marked0"><a name="line246" />246 nil
866
- </span><span class="inferred1"><a name="line247" />247 end
867
- </span><span class="inferred0"><a name="line248" />248
868
- </span><span class="marked1"><a name="line249" />249 elsif source.instance_of?(XSPF) then
869
- </span><span class="inferred0"><a name="line250" />250
870
- </span><span class="marked1"><a name="line251" />251 @playlist = source.playlist_xml
859
+ </span><span class="marked0"><a name="line238" />238 if ( source.instance_of?(Hash) || source.nil? ) then
860
+ </span><span class="inferred1"><a name="line239" />239
861
+ </span><span class="marked0"><a name="line240" />240 ATTRIBUTES.each do |attrib|
862
+ </span><span class="marked1"><a name="line241" />241 add_instance_variable(source, attrib)
863
+ </span><span class="inferred0"><a name="line242" />242 end
864
+ </span><span class="inferred1"><a name="line243" />243
865
+ </span><span class="marked0"><a name="line244" />244 ELEMENTS.each do |element|
866
+ </span><span class="marked1"><a name="line245" />245 add_instance_variable(source, element)
867
+ </span><span class="inferred0"><a name="line246" />246 end
868
+ </span><span class="inferred1"><a name="line247" />247
869
+ </span><span class="marked0"><a name="line248" />248 ATTRIBUTE_AND_ELEMENT.each do |ae|
870
+ </span><span class="marked1"><a name="line249" />249 add_instance_variable(source, &quot;#{ae}_content&quot; )
871
+ </span><span class="marked0"><a name="line250" />250 add_instance_variable(source, &quot;#{ae}_rel&quot; )
872
+ </span><span class="inferred1"><a name="line251" />251 end
871
873
  </span><span class="inferred0"><a name="line252" />252
872
- </span><span class="marked1"><a name="line253" />253 ATTRIBUTES.each do |attrib|
873
- </span><span class="marked0"><a name="line254" />254 eval('@' + attrib.downcase + '= parse_' + attrib.downcase)
874
- </span><span class="inferred1"><a name="line255" />255 end
875
- </span><span class="inferred0"><a name="line256" />256
876
- </span><span class="marked1"><a name="line257" />257 ELEMENTS.each do |element|
877
- </span><span class="marked0"><a name="line258" />258 eval('@' + element.downcase + '= parse_' + element.downcase)
878
- </span><span class="inferred1"><a name="line259" />259 end
874
+ </span><span class="marked1"><a name="line253" />253 @tracklist = if ( !source.nil? &amp;&amp; source.has_key?(:tracklist) &amp;&amp; source[:tracklist].instance_of?(XSPF::Tracklist) )
875
+ </span><span class="marked0"><a name="line254" />254 source[:tracklist]
876
+ </span><span class="inferred1"><a name="line255" />255 else
877
+ </span><span class="marked0"><a name="line256" />256 nil
878
+ </span><span class="inferred1"><a name="line257" />257 end
879
+ </span><span class="inferred0"><a name="line258" />258
880
+ </span><span class="marked1"><a name="line259" />259 elsif source.instance_of?(XSPF) then
879
881
  </span><span class="inferred0"><a name="line260" />260
880
- </span><span class="marked1"><a name="line261" />261 ATTRIBUTE_AND_ELEMENT.each do |ae|
881
- </span><span class="marked0"><a name="line262" />262 eval('@' + ae.downcase + '_content = parse_' + ae.downcase + '_content')
882
- </span><span class="marked1"><a name="line263" />263 eval('@' + ae.downcase + '_rel = parse_' + ae.downcase + '_rel')
883
- </span><span class="inferred0"><a name="line264" />264 end
884
- </span><span class="inferred1"><a name="line265" />265
885
- </span><span class="marked0"><a name="line266" />266 @tracklist = XSPF::Tracklist.new(self)
886
- </span><span class="inferred1"><a name="line267" />267
887
- </span><span class="inferred0"><a name="line268" />268 else
888
- </span><span class="marked1"><a name="line269" />269 raise(TypeError, 'You must pass a XSPF object (parsing mode) or a hash (generator mode) as argument to XSPF::Playlist#new')
889
- </span><span class="inferred0"><a name="line270" />270 end
890
- </span><span class="inferred1"><a name="line271" />271
891
- </span><span class="marked0"><a name="line272" />272 end
892
- </span><span class="inferred1"><a name="line273" />273
893
- </span><span class="inferred0"><a name="line274" />274 # A XSPF::Tracklist object
894
- </span><span class="marked1"><a name="line275" />275 def tracklist
895
- </span><span class="marked0"><a name="line276" />276 @tracklist
896
- </span><span class="marked1"><a name="line277" />277 end
897
- </span><span class="inferred0"><a name="line278" />278
898
- </span><span class="marked1"><a name="line279" />279 def tracklist=(value)
899
- </span><span class="marked0"><a name="line280" />280 raise(TypeError, 'The tracklist must be an instance of XSPF::Tracklist') unless value.instance_of?(XSPF::Tracklist)
900
- </span><span class="marked1"><a name="line281" />281 @tracklist = value
901
- </span><span class="inferred0"><a name="line282" />282 end
882
+ </span><span class="marked1"><a name="line261" />261 @playlist = source.playlist_xml
883
+ </span><span class="inferred0"><a name="line262" />262
884
+ </span><span class="marked1"><a name="line263" />263 ATTRIBUTES.each do |attrib|
885
+ </span><span class="marked0"><a name="line264" />264 eval('@' + attrib.downcase + '= parse_' + attrib.downcase)
886
+ </span><span class="inferred1"><a name="line265" />265 end
887
+ </span><span class="inferred0"><a name="line266" />266
888
+ </span><span class="marked1"><a name="line267" />267 ELEMENTS.each do |element|
889
+ </span><span class="marked0"><a name="line268" />268 eval('@' + element.downcase + '= parse_' + element.downcase)
890
+ </span><span class="inferred1"><a name="line269" />269 end
891
+ </span><span class="inferred0"><a name="line270" />270
892
+ </span><span class="marked1"><a name="line271" />271 ATTRIBUTE_AND_ELEMENT.each do |ae|
893
+ </span><span class="marked0"><a name="line272" />272 eval('@' + ae.downcase + '_content = parse_' + ae.downcase + '_content')
894
+ </span><span class="marked1"><a name="line273" />273 eval('@' + ae.downcase + '_rel = parse_' + ae.downcase + '_rel')
895
+ </span><span class="inferred0"><a name="line274" />274 end
896
+ </span><span class="inferred1"><a name="line275" />275
897
+ </span><span class="marked0"><a name="line276" />276 @tracklist = XSPF::Tracklist.new(self)
898
+ </span><span class="inferred1"><a name="line277" />277
899
+ </span><span class="inferred0"><a name="line278" />278 else
900
+ </span><span class="marked1"><a name="line279" />279 raise(TypeError, 'You must pass a XSPF object (parsing mode) or a hash (generator mode) as argument to XSPF::Playlist#new')
901
+ </span><span class="inferred0"><a name="line280" />280 end
902
+ </span><span class="inferred1"><a name="line281" />281
903
+ </span><span class="marked0"><a name="line282" />282 end
902
904
  </span><span class="inferred1"><a name="line283" />283
903
- </span><span class="marked0"><a name="line284" />284 alias :&lt;&lt; :tracklist=
904
- </span><span class="inferred1"><a name="line285" />285
905
- </span><span class="inferred0"><a name="line286" />286 # Exports the XSPF::Playlist to XML (only the &lt;playlist&gt; section)
906
- </span><span class="marked1"><a name="line287" />287 def to_xml
907
- </span><span class="inferred0"><a name="line288" />288
908
- </span><span class="marked1"><a name="line289" />289 xml = REXML::Element.new('playlist')
909
- </span><span class="inferred0"><a name="line290" />290
910
- </span><span class="marked1"><a name="line291" />291 ATTRIBUTES.each do |attrib|
911
- </span><span class="inferred0"><a name="line292" />292 # TODO Sure there is a nicer way to do evaluate this condition...
912
- </span><span class="marked1"><a name="line293" />293 unless eval('@' + attrib.downcase + '.nil?')
913
- </span><span class="marked0"><a name="line294" />294 xml.attributes[attrib] = eval('@' + attrib.downcase)
914
- </span><span class="inferred1"><a name="line295" />295 end
915
- </span><span class="inferred0"><a name="line296" />296 end
916
- </span><span class="inferred1"><a name="line297" />297
917
- </span><span class="marked0"><a name="line298" />298 ELEMENTS.each do |element|
918
- </span><span class="inferred1"><a name="line299" />299 # TODO Sure there is a nicer way to do evaluate this condition...
919
- </span><span class="marked0"><a name="line300" />300 unless eval('@' + element.downcase + '.nil?')
920
- </span><span class="marked1"><a name="line301" />301 el = REXML::Element.new(element)
921
- </span><span class="marked0"><a name="line302" />302 el.add_text( eval('@' + element.downcase) )
922
- </span><span class="marked1"><a name="line303" />303 xml.add_element(el)
923
- </span><span class="inferred0"><a name="line304" />304 end
924
- </span><span class="inferred1"><a name="line305" />305 end
925
- </span><span class="inferred0"><a name="line306" />306
926
- </span><span class="marked1"><a name="line307" />307 ATTRIBUTE_AND_ELEMENT.each do |ae|
927
- </span><span class="inferred0"><a name="line308" />308 # TODO Sure there is a nicer way to do evaluate this condition...
928
- </span><span class="marked1"><a name="line309" />309 unless eval('@' + ae.downcase + '_rel.nil? &amp;&amp; @'+ ae.downcase + '_content.nil?')
929
- </span><span class="marked0"><a name="line310" />310 el = REXML::Element.new(ae.downcase)
930
- </span><span class="marked1"><a name="line311" />311 el.add_attribute('rel', eval('@' + ae.downcase + '_rel') )
931
- </span><span class="marked0"><a name="line312" />312 el.add_text( eval('@' + ae.downcase + '_content') )
905
+ </span><span class="inferred0"><a name="line284" />284 # A XSPF::Tracklist object
906
+ </span><span class="marked1"><a name="line285" />285 def tracklist
907
+ </span><span class="marked0"><a name="line286" />286 @tracklist
908
+ </span><span class="marked1"><a name="line287" />287 end
909
+ </span><span class="inferred0"><a name="line288" />288
910
+ </span><span class="marked1"><a name="line289" />289 def tracklist=(value)
911
+ </span><span class="marked0"><a name="line290" />290 raise(TypeError, 'The tracklist must be an instance of XSPF::Tracklist') unless value.instance_of?(XSPF::Tracklist)
912
+ </span><span class="marked1"><a name="line291" />291 @tracklist = value
913
+ </span><span class="inferred0"><a name="line292" />292 end
914
+ </span><span class="inferred1"><a name="line293" />293
915
+ </span><span class="marked0"><a name="line294" />294 alias :&lt;&lt; :tracklist=
916
+ </span><span class="inferred1"><a name="line295" />295
917
+ </span><span class="inferred0"><a name="line296" />296 # Exports the XSPF::Playlist to XML (only the &lt;playlist&gt; section)
918
+ </span><span class="marked1"><a name="line297" />297 def to_xml
919
+ </span><span class="inferred0"><a name="line298" />298
920
+ </span><span class="marked1"><a name="line299" />299 xml = REXML::Element.new('playlist')
921
+ </span><span class="inferred0"><a name="line300" />300
922
+ </span><span class="marked1"><a name="line301" />301 ATTRIBUTES.each do |attrib|
923
+ </span><span class="inferred0"><a name="line302" />302 # TODO Sure there is a nicer way to do evaluate this condition...
924
+ </span><span class="marked1"><a name="line303" />303 unless eval('@' + attrib.downcase + '.nil?')
925
+ </span><span class="marked0"><a name="line304" />304 xml.attributes[attrib] = eval('@' + attrib.downcase)
926
+ </span><span class="inferred1"><a name="line305" />305 end
927
+ </span><span class="inferred0"><a name="line306" />306 end
928
+ </span><span class="inferred1"><a name="line307" />307
929
+ </span><span class="marked0"><a name="line308" />308 ELEMENTS.each do |element|
930
+ </span><span class="inferred1"><a name="line309" />309 # TODO Sure there is a nicer way to do evaluate this condition...
931
+ </span><span class="marked0"><a name="line310" />310 unless eval('@' + element.downcase + '.nil?')
932
+ </span><span class="marked1"><a name="line311" />311 el = REXML::Element.new(element)
933
+ </span><span class="marked0"><a name="line312" />312 el.add_text( eval('@' + element.downcase) )
932
934
  </span><span class="marked1"><a name="line313" />313 xml.add_element(el)
933
935
  </span><span class="inferred0"><a name="line314" />314 end
934
936
  </span><span class="inferred1"><a name="line315" />315 end
935
937
  </span><span class="inferred0"><a name="line316" />316
936
- </span><span class="marked1"><a name="line317" />317 xml &lt;&lt; REXML::Document.new(@tracklist.to_xml)
937
- </span><span class="inferred0"><a name="line318" />318
938
- </span><span class="marked1"><a name="line319" />319 xml.to_s
939
- </span><span class="inferred0"><a name="line320" />320
940
- </span><span class="inferred1"><a name="line321" />321 end
941
- </span><span class="inferred0"><a name="line322" />322
942
- </span><span class="inferred1"><a name="line323" />323 # The &lt;trackList&gt; section of the XSPF document (outputs XML code). This method is only used while parsing.
943
- </span><span class="marked0"><a name="line324" />324 protected
944
- </span><span class="marked1"><a name="line325" />325 def tracklist_xml
945
- </span><span class="marked0"><a name="line326" />326 @playlist.elements['trackList']
946
- </span><span class="marked1"><a name="line327" />327 end
947
- </span><span class="inferred0"><a name="line328" />328
948
- </span><span class="marked1"><a name="line329" />329 private
949
- </span><span class="marked0"><a name="line330" />330 def add_instance_variable(hash, var)
950
- </span><span class="inferred1"><a name="line331" />331
951
- </span><span class="marked0"><a name="line332" />332 if !hash.nil? &amp;&amp; hash.has_key?(var.downcase.to_sym)
952
- </span><span class="marked1"><a name="line333" />333 eval('@' + var.downcase + ' = \'' + hash[var.downcase.to_sym] + '\'')
953
- </span><span class="inferred0"><a name="line334" />334 else
954
- </span><span class="marked1"><a name="line335" />335 eval('@' + var.downcase + ' = defined?(' + var.upcase + '_DEFAULT) ? ' + var.upcase + '_DEFAULT : nil')
955
- </span><span class="inferred0"><a name="line336" />336 end
956
- </span><span class="inferred1"><a name="line337" />337
957
- </span><span class="marked0"><a name="line338" />338 end
958
- </span><span class="inferred1"><a name="line339" />339
959
- </span><span class="inferred0"><a name="line340" />340 end
938
+ </span><span class="marked1"><a name="line317" />317 ATTRIBUTE_AND_ELEMENT.each do |ae|
939
+ </span><span class="inferred0"><a name="line318" />318 # TODO Sure there is a nicer way to do evaluate this condition...
940
+ </span><span class="marked1"><a name="line319" />319 unless eval('@' + ae.downcase + '_rel.nil? &amp;&amp; @'+ ae.downcase + '_content.nil?')
941
+ </span><span class="marked0"><a name="line320" />320 el = REXML::Element.new(ae.downcase)
942
+ </span><span class="marked1"><a name="line321" />321 el.add_attribute('rel', eval('@' + ae.downcase + '_rel') )
943
+ </span><span class="marked0"><a name="line322" />322 el.add_text( eval('@' + ae.downcase + '_content') )
944
+ </span><span class="marked1"><a name="line323" />323 xml.add_element(el)
945
+ </span><span class="inferred0"><a name="line324" />324 end
946
+ </span><span class="inferred1"><a name="line325" />325 end
947
+ </span><span class="inferred0"><a name="line326" />326
948
+ </span><span class="marked1"><a name="line327" />327 xml &lt;&lt; REXML::Document.new(@tracklist.to_xml)
949
+ </span><span class="inferred0"><a name="line328" />328
950
+ </span><span class="marked1"><a name="line329" />329 xml.to_s
951
+ </span><span class="inferred0"><a name="line330" />330
952
+ </span><span class="inferred1"><a name="line331" />331 end
953
+ </span><span class="inferred0"><a name="line332" />332
954
+ </span><span class="inferred1"><a name="line333" />333 # The &lt;trackList&gt; section of the XSPF document (outputs XML code). This method is only used while parsing.
955
+ </span><span class="marked0"><a name="line334" />334 protected
956
+ </span><span class="marked1"><a name="line335" />335 def tracklist_xml
957
+ </span><span class="marked0"><a name="line336" />336 @playlist.elements['trackList']
958
+ </span><span class="marked1"><a name="line337" />337 end
959
+ </span><span class="inferred0"><a name="line338" />338
960
+ </span><span class="marked1"><a name="line339" />339 private
961
+ </span><span class="marked0"><a name="line340" />340 def add_instance_variable(hash, var)
960
962
  </span><span class="inferred1"><a name="line341" />341
961
- </span><span class="marked0"><a name="line342" />342 class XSPF::Tracklist &lt; XSPF::Playlist
962
- </span><span class="inferred1"><a name="line343" />343
963
- </span><span class="marked0"><a name="line344" />344 attr_reader :tracklist
964
- </span><span class="inferred1"><a name="line345" />345
965
- </span><span class="inferred0"><a name="line346" />346 # Creates a XSPF::Tracklist from a XSPF::Playlist (parse mode) or without parameters (generation mode)
966
- </span><span class="marked1"><a name="line347" />347 def initialize(playlist=nil)
967
- </span><span class="marked0"><a name="line348" />348 if (playlist.instance_of?(Hash) || playlist.nil?) then
968
- </span><span class="marked1"><a name="line349" />349 @tracklist = ''
969
- </span><span class="marked0"><a name="line350" />350 @tracks = []
970
- </span><span class="inferred1"><a name="line351" />351 else
971
- </span><span class="marked0"><a name="line352" />352 @tracklist = playlist.tracklist_xml
972
- </span><span class="marked1"><a name="line353" />353 @tracks = @tracklist.elements.collect { |track| XSPF::Track.new(track) }
973
- </span><span class="inferred0"><a name="line354" />354 end
974
- </span><span class="marked1"><a name="line355" />355 end
975
- </span><span class="inferred0"><a name="line356" />356
976
- </span><span class="inferred1"><a name="line357" />357 # Returns an array XSPF::Track objects
977
- </span><span class="marked0"><a name="line358" />358 def tracks
978
- </span><span class="marked1"><a name="line359" />359 @tracks
979
- </span><span class="marked0"><a name="line360" />360 end
980
- </span><span class="inferred1"><a name="line361" />361
981
- </span><span class="inferred0"><a name="line362" />362 # Adds a new XSPF::Track to the XSPF::Tracklist
982
- </span><span class="marked1"><a name="line363" />363 def &lt;&lt;(track)
983
- </span><span class="marked0"><a name="line364" />364 @tracks &lt;&lt; track
963
+ </span><span class="marked0"><a name="line342" />342 if !hash.nil? &amp;&amp; hash.has_key?(var.downcase.to_sym)
964
+ </span><span class="marked1"><a name="line343" />343 eval('@' + var.downcase + ' = \'' + hash[var.downcase.to_sym] + '\'')
965
+ </span><span class="inferred0"><a name="line344" />344 else
966
+ </span><span class="marked1"><a name="line345" />345 eval('@' + var.downcase + ' = defined?(' + var.upcase + '_DEFAULT) ? ' + var.upcase + '_DEFAULT : nil')
967
+ </span><span class="inferred0"><a name="line346" />346 end
968
+ </span><span class="inferred1"><a name="line347" />347
969
+ </span><span class="marked0"><a name="line348" />348 end
970
+ </span><span class="inferred1"><a name="line349" />349
971
+ </span><span class="inferred0"><a name="line350" />350 end
972
+ </span><span class="inferred1"><a name="line351" />351
973
+ </span><span class="marked0"><a name="line352" />352 class XSPF::Tracklist &lt; XSPF::Playlist
974
+ </span><span class="inferred1"><a name="line353" />353
975
+ </span><span class="marked0"><a name="line354" />354 attr_reader :tracklist
976
+ </span><span class="inferred1"><a name="line355" />355
977
+ </span><span class="inferred0"><a name="line356" />356 # Creates a XSPF::Tracklist from a XSPF::Playlist (parse mode) or without parameters (generation mode)
978
+ </span><span class="marked1"><a name="line357" />357 def initialize(playlist=nil)
979
+ </span><span class="marked0"><a name="line358" />358 if (playlist.instance_of?(Hash) || playlist.nil?) then
980
+ </span><span class="marked1"><a name="line359" />359 @tracklist = ''
981
+ </span><span class="marked0"><a name="line360" />360 @tracks = []
982
+ </span><span class="inferred1"><a name="line361" />361 else
983
+ </span><span class="marked0"><a name="line362" />362 @tracklist = playlist.tracklist_xml
984
+ </span><span class="marked1"><a name="line363" />363 @tracks = @tracklist.elements.collect { |track| XSPF::Track.new(track) }
985
+ </span><span class="inferred0"><a name="line364" />364 end
984
986
  </span><span class="marked1"><a name="line365" />365 end
985
987
  </span><span class="inferred0"><a name="line366" />366
986
- </span><span class="inferred1"><a name="line367" />367 # Exports the XSPF::Tracklist to XML (only the &lt;trackList&gt; section)
987
- </span><span class="marked0"><a name="line368" />368 def to_xml
988
- </span><span class="marked1"><a name="line369" />369 xml = REXML::Element.new('trackList')
989
- </span><span class="marked0"><a name="line370" />370 @tracks.each { |t| xml &lt;&lt; REXML::Document.new(t.to_xml) }
990
- </span><span class="marked1"><a name="line371" />371 xml.to_s
991
- </span><span class="inferred0"><a name="line372" />372 end
992
- </span><span class="inferred1"><a name="line373" />373
993
- </span><span class="inferred0"><a name="line374" />374 end
994
- </span><span class="inferred1"><a name="line375" />375
995
- </span><span class="marked0"><a name="line376" />376 class XSPF::Track
996
- </span><span class="inferred1"><a name="line377" />377
997
- </span><span class="marked0"><a name="line378" />378 attr_reader :track
998
- </span><span class="inferred1"><a name="line379" />379
999
- </span><span class="inferred0"><a name="line380" />380 #:stopdoc:
1000
- </span><span class="marked1"><a name="line381" />381 ELEMENTS = %w{ location identifier title creator annotation info image album trackNum duration extension }
1001
- </span><span class="marked0"><a name="line382" />382 ATTRIBUTE_AND_ELEMENT = %w{ link meta }
1002
- </span><span class="inferred1"><a name="line383" />383
1003
- </span><span class="marked0"><a name="line384" />384 LOCATION_RDOC = 'URL of resource to be rendered. Probably an audio resource, but MAY be any type of resource with a well-known duration, such as video, a SMIL document, or an XSPF document. The duration of the resource defined in this element defines the duration of rendering. XSPF::Track objects MAY contain zero or more location elements, but a user-agent MUST NOT render more than one of the named resources. Currently, XSPF for Ruby returns only the first location.'
1004
- </span><span class="marked1"><a name="line385" />385 IDENTIFIER_RDOC = 'Canonical ID for this resource. Likely to be a hash or other location-independent name, such as a MusicBrainz identifier or isbn URN (if there existed isbn numbers for audio). MUST be a legal URN. XSPF::Track objects elements MAY contain zero or more identifier elements, but currently XSPF for Ruby returns only the first one.'
1005
- </span><span class="marked0"><a name="line386" />386 TITLE_RDOC = 'Human-readable name of the track that authored the resource which defines the duration of track rendering. This value is primarily for fuzzy lookups, though a user-agent may display it. XSPF::Track objects MAY contain exactly one.'
1006
- </span><span class="marked1"><a name="line387" />387 CREATOR_RDOC = 'Human-readable name of the entity (author, authors, group, company, etc) that authored the resource which defines the duration of track rendering. This value is primarily for fuzzy lookups, though a user-agent may display it. XSPF::Track objects MAY contain exactly one.'
1007
- </span><span class="marked0"><a name="line388" />388 ANNOTATION_RDOC = 'A human-readable comment on the track. This is character data, not HTML, and it may not contain markup. XSPF::Track objects MAY contain exactly one.'
1008
- </span><span class="marked1"><a name="line389" />389 INFO_RDOC = 'URL of a place where this resource can be bought or more info can be found.'
1009
- </span><span class="marked0"><a name="line390" />390 IMAGE_RDOC = 'URL of an image to display for the duration of the track. XSPF::Track objects MAY contain exactly one.'
1010
- </span><span class="marked1"><a name="line391" />391 ALBUM_RDOC = 'Human-readable name of the collection from which the resource which defines the duration of track rendering comes. For a song originally published as a part of a CD or LP, this would be the title of the original release. This value is primarily for fuzzy lookups, though a user-agent may display it. XSPF::Track objects MAY contain exactly one.'
1011
- </span><span class="marked0"><a name="line392" />392 TRACKNUM_RDOC = 'Integer with value greater than zero giving the ordinal position of the media on the XSPF::Track#album. This value is primarily for fuzzy lookups, though a user-agent may display it. XSPF::Track objects MAY contain exactly one. It MUST be a valid XML Schema nonNegativeInteger.'
1012
- </span><span class="marked1"><a name="line393" />393 DURATION_RDOC = 'The time to render a resource, in milliseconds. It MUST be a valid XML Schema nonNegativeInteger. This value is only a hint -- different XSPF generators will generate slightly different values. A user-agent MUST NOT use this value to determine the rendering duration, since the data will likely be low quality. XSPF::Track objects MAY contain exactly one duration element.'
1013
- </span><span class="marked0"><a name="line394" />394 EXTENSION_RDOC = 'The extension element allows non-XSPF XML to be included in XSPF documents without breaking XSPF validation. The purpose is to allow nested XML, which the meta and link elements do not. XSPF::Track objects MAY contain zero or more extension elements, but currently XSPF for Ruby returns only the first one.'
1014
- </span><span class="marked1"><a name="line395" />395 LINK_REL_RDOC = 'The link element allows non-XSPF web resources to be included in XSPF documents without breaking XSPF validation. A valid _link_ element has a _rel_ attribute and a _content_ element, obtained with XSPF::Track#link_rel and XSPF::Track#link_content respectively. XSPF::Track objects MAY contain zero or more link elements, but currently XSPF for Ruby returns only the first one.'
1015
- </span><span class="marked0"><a name="line396" />396 LINK_CONTENT_RDOC = 'The link element allows non-XSPF web resources to be included in XSPF documents without breaking XSPF validation. A valid _link_ element has a _rel_ attribute and a _content_ element, obtained with XSPF::Track#link_rel and XSPF::Track#link_content respectively. XSPF::Track objects MAY contain zero or more meta elements, but currently XSPF for Ruby returns only the first one.'
1016
- </span><span class="marked1"><a name="line397" />397 META_REL_RDOC = 'The meta element allows non-XSPF metadata to be included in XSPF documents without breaking XSPF validation. A valid _meta_ element has a _rel_ attribute and a _content_ element, obtained with XSPF::Track#meta_rel and XSPF::Track#meta_content respectively. XSPF::Track objects MAY contain zero or more meta elements, but currently XSPF for Ruby returns only the first one.'
1017
- </span><span class="marked0"><a name="line398" />398 META_CONTENT_RDOC = 'The meta element allows non-XSPF metadata to be included in XSPF documents without breaking XSPF validation. A valid _meta_ element has a _rel_ attribute and a _content_ element, obtained with XSPF::Track#meta_rel and XSPF::Track#meta_content respectively. XSPF::Track objects MAY contain zero or more meta elements, but currently XSPF for Ruby returns only the first one.'
1018
- </span><span class="inferred1"><a name="line399" />399
1019
- </span><span class="marked0"><a name="line400" />400 ELEMENTS.each do |element|
1020
- </span><span class="marked1"><a name="line401" />401 MetaGen.add_method( self, element, &quot;@track.elements['#{element}'].text&quot;, eval(element.upcase + '_RDOC').to_s )
1021
- </span><span class="inferred0"><a name="line402" />402 end
1022
- </span><span class="inferred1"><a name="line403" />403
1023
- </span><span class="marked0"><a name="line404" />404 ATTRIBUTE_AND_ELEMENT.each do |ae|
1024
- </span><span class="marked1"><a name="line405" />405 MetaGen.add_method( self, &quot;#{ae}_content&quot;, &quot;@track.elements['#{ae}'].text&quot;, eval(ae.upcase + '_CONTENT_RDOC').to_s )
1025
- </span><span class="marked0"><a name="line406" />406 MetaGen.add_method( self, &quot;#{ae}_rel&quot;, &quot;@track.elements['#{ae}'].attributes['rel']&quot;, eval(ae.upcase + '_REL_RDOC').to_s )
1026
- </span><span class="inferred1"><a name="line407" />407 end
1027
- </span><span class="inferred0"><a name="line408" />408
1028
- </span><span class="inferred1"><a name="line409" />409 # :startdoc:
1029
- </span><span class="inferred0"><a name="line410" />410
1030
- </span><span class="inferred1"><a name="line411" />411 # Creates a XSPF::Track object from a &lt;track&gt; section of the XSPF document or from a hash of values
1031
- </span><span class="inferred0"><a name="line412" />412 #
1032
- </span><span class="inferred1"><a name="line413" />413 # Possible keys in the hash in generation mode: :location, :identifier, :title, :creator, :annotation, :info, :image, :album, :tracknum, :duration, :extension, :link_rel, :link_content, :meta_rel, :meta_content)
1033
- </span><span class="marked0"><a name="line414" />414 def initialize(tr)
1034
- </span><span class="inferred1"><a name="line415" />415
1035
- </span><span class="marked0"><a name="line416" />416 if tr.instance_of?(Hash)
1036
- </span><span class="inferred1"><a name="line417" />417
1037
- </span><span class="marked0"><a name="line418" />418 ELEMENTS.each do |element|
1038
- </span><span class="marked1"><a name="line419" />419 add_instance_variable(tr, element.downcase)
1039
- </span><span class="inferred0"><a name="line420" />420 end
1040
- </span><span class="inferred1"><a name="line421" />421
1041
- </span><span class="marked0"><a name="line422" />422 ATTRIBUTE_AND_ELEMENT.each do |ae|
1042
- </span><span class="marked1"><a name="line423" />423 add_instance_variable(tr, &quot;#{ae.downcase}_content&quot; )
1043
- </span><span class="marked0"><a name="line424" />424 add_instance_variable(tr, &quot;#{ae.downcase}_rel&quot; )
1044
- </span><span class="inferred1"><a name="line425" />425 end
1045
- </span><span class="inferred0"><a name="line426" />426
1046
- </span><span class="inferred1"><a name="line427" />427 else
1047
- </span><span class="marked0"><a name="line428" />428 @track = tr
1048
- </span><span class="inferred1"><a name="line429" />429
1049
- </span><span class="marked0"><a name="line430" />430 ELEMENTS.each do |element|
1050
- </span><span class="marked1"><a name="line431" />431 eval('@' + element.downcase + '= parse_' + element.downcase)
1051
- </span><span class="inferred0"><a name="line432" />432 end
1052
- </span><span class="inferred1"><a name="line433" />433
1053
- </span><span class="marked0"><a name="line434" />434 ATTRIBUTE_AND_ELEMENT.each do |ae|
1054
- </span><span class="marked1"><a name="line435" />435 eval('@' + ae.downcase + '_content = parse_' + ae.downcase + '_content')
1055
- </span><span class="marked0"><a name="line436" />436 eval('@' + ae.downcase + '_rel = parse_' + ae.downcase + '_rel')
1056
- </span><span class="inferred1"><a name="line437" />437 end
1057
- </span><span class="inferred0"><a name="line438" />438 end
1058
- </span><span class="inferred1"><a name="line439" />439
1059
- </span><span class="marked0"><a name="line440" />440 end
1060
- </span><span class="inferred1"><a name="line441" />441
1061
- </span><span class="inferred0"><a name="line442" />442 # Exports the XSPF::Track to XML (only the &lt;track&gt; section)
1062
- </span><span class="marked1"><a name="line443" />443 def to_xml
1063
- </span><span class="inferred0"><a name="line444" />444
1064
- </span><span class="marked1"><a name="line445" />445 xml = REXML::Element.new('track')
1065
- </span><span class="inferred0"><a name="line446" />446
1066
- </span><span class="marked1"><a name="line447" />447 ELEMENTS.each do |element|
1067
- </span><span class="inferred0"><a name="line448" />448 # TODO Sure there is a nicer way to do evaluate this condition...
1068
- </span><span class="marked1"><a name="line449" />449 unless eval('@' + element.downcase + '.nil?')
1069
- </span><span class="marked0"><a name="line450" />450 el = REXML::Element.new(element)
1070
- </span><span class="marked1"><a name="line451" />451 el.add_text( eval('@' + element.downcase) )
1071
- </span><span class="marked0"><a name="line452" />452 xml.add_element(el)
1072
- </span><span class="inferred1"><a name="line453" />453 end
1073
- </span><span class="inferred0"><a name="line454" />454 end
1074
- </span><span class="inferred1"><a name="line455" />455
1075
- </span><span class="marked0"><a name="line456" />456 ATTRIBUTE_AND_ELEMENT.each do |ae|
1076
- </span><span class="inferred1"><a name="line457" />457 # TODO Sure there is a nicer way to do evaluate this condition...
1077
- </span><span class="marked0"><a name="line458" />458 unless eval('@' + ae.downcase + '_rel.nil? &amp;&amp; @'+ ae.downcase + '_content.nil?')
1078
- </span><span class="marked1"><a name="line459" />459 el = REXML::Element.new(ae.downcase)
1079
- </span><span class="marked0"><a name="line460" />460 el.add_attribute('rel', eval('@' + ae.downcase + '_rel') )
1080
- </span><span class="marked1"><a name="line461" />461 el.add_text( eval('@' + ae.downcase + '_content') )
988
+ </span><span class="inferred1"><a name="line367" />367 # Returns an array XSPF::Track objects
989
+ </span><span class="marked0"><a name="line368" />368 def tracks
990
+ </span><span class="marked1"><a name="line369" />369 @tracks
991
+ </span><span class="marked0"><a name="line370" />370 end
992
+ </span><span class="inferred1"><a name="line371" />371
993
+ </span><span class="inferred0"><a name="line372" />372 # Adds a new XSPF::Track to the XSPF::Tracklist
994
+ </span><span class="marked1"><a name="line373" />373 def &lt;&lt;(track)
995
+ </span><span class="marked0"><a name="line374" />374 @tracks &lt;&lt; track
996
+ </span><span class="marked1"><a name="line375" />375 end
997
+ </span><span class="inferred0"><a name="line376" />376
998
+ </span><span class="inferred1"><a name="line377" />377 # Exports the XSPF::Tracklist to XML (only the &lt;trackList&gt; section)
999
+ </span><span class="marked0"><a name="line378" />378 def to_xml
1000
+ </span><span class="marked1"><a name="line379" />379 xml = REXML::Element.new('trackList')
1001
+ </span><span class="marked0"><a name="line380" />380 @tracks.each { |t| xml &lt;&lt; REXML::Document.new(t.to_xml) }
1002
+ </span><span class="marked1"><a name="line381" />381 xml.to_s
1003
+ </span><span class="inferred0"><a name="line382" />382 end
1004
+ </span><span class="inferred1"><a name="line383" />383
1005
+ </span><span class="inferred0"><a name="line384" />384 end
1006
+ </span><span class="inferred1"><a name="line385" />385
1007
+ </span><span class="marked0"><a name="line386" />386 class XSPF::Track
1008
+ </span><span class="inferred1"><a name="line387" />387
1009
+ </span><span class="marked0"><a name="line388" />388 attr_reader :track
1010
+ </span><span class="inferred1"><a name="line389" />389
1011
+ </span><span class="inferred0"><a name="line390" />390 #:stopdoc:
1012
+ </span><span class="marked1"><a name="line391" />391 ELEMENTS = %w{ location identifier title creator annotation info image album trackNum duration extension }
1013
+ </span><span class="marked0"><a name="line392" />392 ATTRIBUTE_AND_ELEMENT = %w{ link meta }
1014
+ </span><span class="inferred1"><a name="line393" />393
1015
+ </span><span class="marked0"><a name="line394" />394 LOCATION_RDOC = 'URL of resource to be rendered. Probably an audio resource, but MAY be any type of resource with a well-known duration, such as video, a SMIL document, or an XSPF document. The duration of the resource defined in this element defines the duration of rendering. XSPF::Track objects MAY contain zero or more location elements, but a user-agent MUST NOT render more than one of the named resources. Currently, XSPF for Ruby returns only the first location.'
1016
+ </span><span class="marked1"><a name="line395" />395 IDENTIFIER_RDOC = 'Canonical ID for this resource. Likely to be a hash or other location-independent name, such as a MusicBrainz identifier or isbn URN (if there existed isbn numbers for audio). MUST be a legal URN. XSPF::Track objects elements MAY contain zero or more identifier elements, but currently XSPF for Ruby returns only the first one.'
1017
+ </span><span class="marked0"><a name="line396" />396 TITLE_RDOC = 'Human-readable name of the track that authored the resource which defines the duration of track rendering. This value is primarily for fuzzy lookups, though a user-agent may display it. XSPF::Track objects MAY contain exactly one.'
1018
+ </span><span class="marked1"><a name="line397" />397 CREATOR_RDOC = 'Human-readable name of the entity (author, authors, group, company, etc) that authored the resource which defines the duration of track rendering. This value is primarily for fuzzy lookups, though a user-agent may display it. XSPF::Track objects MAY contain exactly one.'
1019
+ </span><span class="marked0"><a name="line398" />398 ANNOTATION_RDOC = 'A human-readable comment on the track. This is character data, not HTML, and it may not contain markup. XSPF::Track objects MAY contain exactly one.'
1020
+ </span><span class="marked1"><a name="line399" />399 INFO_RDOC = 'URL of a place where this resource can be bought or more info can be found.'
1021
+ </span><span class="marked0"><a name="line400" />400 IMAGE_RDOC = 'URL of an image to display for the duration of the track. XSPF::Track objects MAY contain exactly one.'
1022
+ </span><span class="marked1"><a name="line401" />401 ALBUM_RDOC = 'Human-readable name of the collection from which the resource which defines the duration of track rendering comes. For a song originally published as a part of a CD or LP, this would be the title of the original release. This value is primarily for fuzzy lookups, though a user-agent may display it. XSPF::Track objects MAY contain exactly one.'
1023
+ </span><span class="marked0"><a name="line402" />402 TRACKNUM_RDOC = 'Integer with value greater than zero giving the ordinal position of the media on the XSPF::Track#album. This value is primarily for fuzzy lookups, though a user-agent may display it. XSPF::Track objects MAY contain exactly one. It MUST be a valid XML Schema nonNegativeInteger.'
1024
+ </span><span class="marked1"><a name="line403" />403 DURATION_RDOC = 'The time to render a resource, in milliseconds. It MUST be a valid XML Schema nonNegativeInteger. This value is only a hint -- different XSPF generators will generate slightly different values. A user-agent MUST NOT use this value to determine the rendering duration, since the data will likely be low quality. XSPF::Track objects MAY contain exactly one duration element.'
1025
+ </span><span class="marked0"><a name="line404" />404 EXTENSION_RDOC = 'The extension element allows non-XSPF XML to be included in XSPF documents without breaking XSPF validation. The purpose is to allow nested XML, which the meta and link elements do not. XSPF::Track objects MAY contain zero or more extension elements, but currently XSPF for Ruby returns only the first one.'
1026
+ </span><span class="marked1"><a name="line405" />405 LINK_REL_RDOC = 'The link element allows non-XSPF web resources to be included in XSPF documents without breaking XSPF validation. A valid _link_ element has a _rel_ attribute and a _content_ element, obtained with XSPF::Track#link_rel and XSPF::Track#link_content respectively. XSPF::Track objects MAY contain zero or more link elements, but currently XSPF for Ruby returns only the first one.'
1027
+ </span><span class="marked0"><a name="line406" />406 LINK_CONTENT_RDOC = 'The link element allows non-XSPF web resources to be included in XSPF documents without breaking XSPF validation. A valid _link_ element has a _rel_ attribute and a _content_ element, obtained with XSPF::Track#link_rel and XSPF::Track#link_content respectively. XSPF::Track objects MAY contain zero or more meta elements, but currently XSPF for Ruby returns only the first one.'
1028
+ </span><span class="marked1"><a name="line407" />407 META_REL_RDOC = 'The meta element allows non-XSPF metadata to be included in XSPF documents without breaking XSPF validation. A valid _meta_ element has a _rel_ attribute and a _content_ element, obtained with XSPF::Track#meta_rel and XSPF::Track#meta_content respectively. XSPF::Track objects MAY contain zero or more meta elements, but currently XSPF for Ruby returns only the first one.'
1029
+ </span><span class="marked0"><a name="line408" />408 META_CONTENT_RDOC = 'The meta element allows non-XSPF metadata to be included in XSPF documents without breaking XSPF validation. A valid _meta_ element has a _rel_ attribute and a _content_ element, obtained with XSPF::Track#meta_rel and XSPF::Track#meta_content respectively. XSPF::Track objects MAY contain zero or more meta elements, but currently XSPF for Ruby returns only the first one.'
1030
+ </span><span class="inferred1"><a name="line409" />409
1031
+ </span><span class="marked0"><a name="line410" />410 ELEMENTS.each do |element|
1032
+ </span><span class="marked1"><a name="line411" />411 MetaGen.add_method( self, element, &quot;@track.elements['#{element}'].text&quot;, eval(element.upcase + '_RDOC').to_s )
1033
+ </span><span class="inferred0"><a name="line412" />412 end
1034
+ </span><span class="inferred1"><a name="line413" />413
1035
+ </span><span class="marked0"><a name="line414" />414 ATTRIBUTE_AND_ELEMENT.each do |ae|
1036
+ </span><span class="marked1"><a name="line415" />415 MetaGen.add_method( self, &quot;#{ae}_content&quot;, &quot;@track.elements['#{ae}'].text&quot;, eval(ae.upcase + '_CONTENT_RDOC').to_s )
1037
+ </span><span class="marked0"><a name="line416" />416 MetaGen.add_method( self, &quot;#{ae}_rel&quot;, &quot;@track.elements['#{ae}'].attributes['rel']&quot;, eval(ae.upcase + '_REL_RDOC').to_s )
1038
+ </span><span class="inferred1"><a name="line417" />417 end
1039
+ </span><span class="inferred0"><a name="line418" />418
1040
+ </span><span class="inferred1"><a name="line419" />419 # :startdoc:
1041
+ </span><span class="inferred0"><a name="line420" />420
1042
+ </span><span class="inferred1"><a name="line421" />421 # Creates a XSPF::Track object from a &lt;track&gt; section of the XSPF document or from a hash of values
1043
+ </span><span class="inferred0"><a name="line422" />422 #
1044
+ </span><span class="inferred1"><a name="line423" />423 # Possible keys in the hash in generation mode: :location, :identifier, :title, :creator, :annotation, :info, :image, :album, :tracknum, :duration, :extension, :link_rel, :link_content, :meta_rel, :meta_content)
1045
+ </span><span class="marked0"><a name="line424" />424 def initialize(tr)
1046
+ </span><span class="inferred1"><a name="line425" />425
1047
+ </span><span class="marked0"><a name="line426" />426 if tr.instance_of?(Hash)
1048
+ </span><span class="inferred1"><a name="line427" />427
1049
+ </span><span class="marked0"><a name="line428" />428 ELEMENTS.each do |element|
1050
+ </span><span class="marked1"><a name="line429" />429 add_instance_variable(tr, element.downcase)
1051
+ </span><span class="inferred0"><a name="line430" />430 end
1052
+ </span><span class="inferred1"><a name="line431" />431
1053
+ </span><span class="marked0"><a name="line432" />432 ATTRIBUTE_AND_ELEMENT.each do |ae|
1054
+ </span><span class="marked1"><a name="line433" />433 add_instance_variable(tr, &quot;#{ae.downcase}_content&quot; )
1055
+ </span><span class="marked0"><a name="line434" />434 add_instance_variable(tr, &quot;#{ae.downcase}_rel&quot; )
1056
+ </span><span class="inferred1"><a name="line435" />435 end
1057
+ </span><span class="inferred0"><a name="line436" />436
1058
+ </span><span class="inferred1"><a name="line437" />437 else
1059
+ </span><span class="marked0"><a name="line438" />438 @track = tr
1060
+ </span><span class="inferred1"><a name="line439" />439
1061
+ </span><span class="marked0"><a name="line440" />440 ELEMENTS.each do |element|
1062
+ </span><span class="marked1"><a name="line441" />441 eval('@' + element.downcase + '= parse_' + element.downcase)
1063
+ </span><span class="inferred0"><a name="line442" />442 end
1064
+ </span><span class="inferred1"><a name="line443" />443
1065
+ </span><span class="marked0"><a name="line444" />444 ATTRIBUTE_AND_ELEMENT.each do |ae|
1066
+ </span><span class="marked1"><a name="line445" />445 eval('@' + ae.downcase + '_content = parse_' + ae.downcase + '_content')
1067
+ </span><span class="marked0"><a name="line446" />446 eval('@' + ae.downcase + '_rel = parse_' + ae.downcase + '_rel')
1068
+ </span><span class="inferred1"><a name="line447" />447 end
1069
+ </span><span class="inferred0"><a name="line448" />448 end
1070
+ </span><span class="inferred1"><a name="line449" />449
1071
+ </span><span class="marked0"><a name="line450" />450 end
1072
+ </span><span class="inferred1"><a name="line451" />451
1073
+ </span><span class="inferred0"><a name="line452" />452 # Exports the XSPF::Track to XML (only the &lt;track&gt; section)
1074
+ </span><span class="marked1"><a name="line453" />453 def to_xml
1075
+ </span><span class="inferred0"><a name="line454" />454
1076
+ </span><span class="marked1"><a name="line455" />455 xml = REXML::Element.new('track')
1077
+ </span><span class="inferred0"><a name="line456" />456
1078
+ </span><span class="marked1"><a name="line457" />457 ELEMENTS.each do |element|
1079
+ </span><span class="inferred0"><a name="line458" />458 # TODO Sure there is a nicer way to do evaluate this condition...
1080
+ </span><span class="marked1"><a name="line459" />459 unless eval('@' + element.downcase + '.nil?')
1081
+ </span><span class="marked0"><a name="line460" />460 el = REXML::Element.new(element)
1082
+ </span><span class="marked1"><a name="line461" />461 el.add_text( eval('@' + element.downcase) )
1081
1083
  </span><span class="marked0"><a name="line462" />462 xml.add_element(el)
1082
1084
  </span><span class="inferred1"><a name="line463" />463 end
1083
1085
  </span><span class="inferred0"><a name="line464" />464 end
1084
1086
  </span><span class="inferred1"><a name="line465" />465
1085
- </span><span class="marked0"><a name="line466" />466 xml.to_s
1086
- </span><span class="inferred1"><a name="line467" />467
1087
- </span><span class="inferred0"><a name="line468" />468 end
1088
- </span><span class="inferred1"><a name="line469" />469
1089
- </span><span class="marked0"><a name="line470" />470 private
1090
- </span><span class="marked1"><a name="line471" />471 def add_instance_variable(hash, var)
1091
- </span><span class="inferred0"><a name="line472" />472
1092
- </span><span class="marked1"><a name="line473" />473 if hash.has_key?(var.downcase.to_sym)
1093
- </span><span class="marked0"><a name="line474" />474 eval('@' + var.downcase + ' = \'' + hash[var.downcase.to_sym] + '\'')
1094
- </span><span class="inferred1"><a name="line475" />475 else
1095
- </span><span class="marked0"><a name="line476" />476 eval('@' + var.downcase + ' = defined?(' + var.upcase + '_DEFAULT) ? ' + var.upcase + '_DEFAULT : nil')
1096
- </span><span class="inferred1"><a name="line477" />477 end
1097
- </span><span class="inferred0"><a name="line478" />478
1098
- </span><span class="marked1"><a name="line479" />479 end
1099
- </span><span class="inferred0"><a name="line480" />480
1100
- </span><span class="inferred1"><a name="line481" />481 end
1101
- </span></pre><hr /> <p>Generated using the <a href='http://eigenclass.org/hiki.rb?rcov'>rcov code coverage analysis tool for Ruby</a> version 0.7.0.</p><p>
1087
+ </span><span class="marked0"><a name="line466" />466 ATTRIBUTE_AND_ELEMENT.each do |ae|
1088
+ </span><span class="inferred1"><a name="line467" />467 # TODO Sure there is a nicer way to do evaluate this condition...
1089
+ </span><span class="marked0"><a name="line468" />468 unless eval('@' + ae.downcase + '_rel.nil? &amp;&amp; @'+ ae.downcase + '_content.nil?')
1090
+ </span><span class="marked1"><a name="line469" />469 el = REXML::Element.new(ae.downcase)
1091
+ </span><span class="marked0"><a name="line470" />470 el.add_attribute('rel', eval('@' + ae.downcase + '_rel') )
1092
+ </span><span class="marked1"><a name="line471" />471 el.add_text( eval('@' + ae.downcase + '_content') )
1093
+ </span><span class="marked0"><a name="line472" />472 xml.add_element(el)
1094
+ </span><span class="inferred1"><a name="line473" />473 end
1095
+ </span><span class="inferred0"><a name="line474" />474 end
1096
+ </span><span class="inferred1"><a name="line475" />475
1097
+ </span><span class="marked0"><a name="line476" />476 xml.to_s
1098
+ </span><span class="inferred1"><a name="line477" />477
1099
+ </span><span class="inferred0"><a name="line478" />478 end
1100
+ </span><span class="inferred1"><a name="line479" />479
1101
+ </span><span class="marked0"><a name="line480" />480 private
1102
+ </span><span class="marked1"><a name="line481" />481 def add_instance_variable(hash, var)
1103
+ </span><span class="inferred0"><a name="line482" />482
1104
+ </span><span class="marked1"><a name="line483" />483 if hash.has_key?(var.downcase.to_sym)
1105
+ </span><span class="marked0"><a name="line484" />484 eval('@' + var.downcase + ' = \'' + hash[var.downcase.to_sym] + '\'')
1106
+ </span><span class="inferred1"><a name="line485" />485 else
1107
+ </span><span class="marked0"><a name="line486" />486 eval('@' + var.downcase + ' = defined?(' + var.upcase + '_DEFAULT) ? ' + var.upcase + '_DEFAULT : nil')
1108
+ </span><span class="inferred1"><a name="line487" />487 end
1109
+ </span><span class="inferred0"><a name="line488" />488
1110
+ </span><span class="marked1"><a name="line489" />489 end
1111
+ </span><span class="inferred0"><a name="line490" />490
1112
+ </span><span class="inferred1"><a name="line491" />491 end
1113
+ </span></pre><hr /> <p>Generated using the <a href='http://eigenclass.org/hiki.rb?rcov'>rcov code coverage analysis tool for Ruby</a> version 0.8.0.</p><p>
1102
1114
  <a href='http://validator.w3.org/check/referer'>
1103
1115
  <img src='http://www.w3.org/Icons/valid-xhtml10' height='31' alt='Valid XHTML 1.0!' width='88' />
1104
1116
  </a>