lyrics-ebook 0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (106) hide show
  1. data/LICENSE +340 -0
  2. data/README +46 -0
  3. data/bin/lyrics-ebook +47 -0
  4. data/lib/eeepub/LICENSE +20 -0
  5. data/lib/eeepub/README.md +77 -0
  6. data/lib/eeepub/Rakefile +49 -0
  7. data/lib/eeepub/VERSION +1 -0
  8. data/lib/eeepub/examples/files/bar.html +42 -0
  9. data/lib/eeepub/examples/files/foo.html +42 -0
  10. data/lib/eeepub/examples/simple_epub.rb +25 -0
  11. data/lib/eeepub/lib/eeepub.rb +17 -0
  12. data/lib/eeepub/lib/eeepub/container_item.rb +108 -0
  13. data/lib/eeepub/lib/eeepub/easy.rb +100 -0
  14. data/lib/eeepub/lib/eeepub/maker.rb +127 -0
  15. data/lib/eeepub/lib/eeepub/ncx.rb +68 -0
  16. data/lib/eeepub/lib/eeepub/ocf.rb +112 -0
  17. data/lib/eeepub/lib/eeepub/opf.rb +148 -0
  18. data/lib/eeepub/spec/eeepub/easy_spec.rb +66 -0
  19. data/lib/eeepub/spec/eeepub/maker_spec.rb +124 -0
  20. data/lib/eeepub/spec/eeepub/ncx_spec.rb +80 -0
  21. data/lib/eeepub/spec/eeepub/ocf_spec.rb +43 -0
  22. data/lib/eeepub/spec/eeepub/opf_spec.rb +262 -0
  23. data/lib/eeepub/spec/eeepub_spec.rb +4 -0
  24. data/lib/eeepub/spec/spec_helper.rb +12 -0
  25. data/lib/lyrics_ebook.rb +71 -0
  26. data/lib/lyrics_ebook/cache2html.rb +33 -0
  27. data/lib/lyrics_ebook/cache_manager.rb +77 -0
  28. data/lib/lyrics_ebook/lyric.rb +32 -0
  29. data/lib/lyrics_ebook/lyric_download.rb +50 -0
  30. data/lib/lyrics_ebook/lyrics2html.rb +106 -0
  31. data/lib/lyrics_ebook/mini_lyrics_parser.rb +26 -0
  32. data/lib/lyrics_ebook/mp3_parser.rb +37 -0
  33. data/lib/wiki_lyrics/amarok/COPYING +340 -0
  34. data/lib/wiki_lyrics/amarok/README +51 -0
  35. data/lib/wiki_lyrics/amarok/amarok.rb +355 -0
  36. data/lib/wiki_lyrics/amarok/pluginadapter.rb +113 -0
  37. data/lib/wiki_lyrics/amarok/plugins.rb +95 -0
  38. data/lib/wiki_lyrics/amarok/wikilyrics.rb +578 -0
  39. data/lib/wiki_lyrics/amarok/wikilyrics.spec +4 -0
  40. data/lib/wiki_lyrics/amarok/wikipluginadapter.rb +392 -0
  41. data/lib/wiki_lyrics/cli/optionsparser.rb +228 -0
  42. data/lib/wiki_lyrics/cli/pluginadapter.rb +56 -0
  43. data/lib/wiki_lyrics/cli/plugins.rb +79 -0
  44. data/lib/wiki_lyrics/cli/wikilyrics.rb +178 -0
  45. data/lib/wiki_lyrics/cli/wikipluginadapter.rb +140 -0
  46. data/lib/wiki_lyrics/docs/COPYING +340 -0
  47. data/lib/wiki_lyrics/docs/ChangeLog +293 -0
  48. data/lib/wiki_lyrics/docs/HOWTO.pdf +0 -0
  49. data/lib/wiki_lyrics/docs/HOWTO.tex +151 -0
  50. data/lib/wiki_lyrics/docs/HOWTO.txt +139 -0
  51. data/lib/wiki_lyrics/docs/README +45 -0
  52. data/lib/wiki_lyrics/docs/TODO +12 -0
  53. data/lib/wiki_lyrics/gui/gui-gtk.rb +945 -0
  54. data/lib/wiki_lyrics/gui/gui-qt3.rb +785 -0
  55. data/lib/wiki_lyrics/gui/gui-qt4.rb +845 -0
  56. data/lib/wiki_lyrics/gui/gui-tk.rb +1104 -0
  57. data/lib/wiki_lyrics/gui/gui.rb +268 -0
  58. data/lib/wiki_lyrics/gui/test.rb +74 -0
  59. data/lib/wiki_lyrics/i18n/README +1 -0
  60. data/lib/wiki_lyrics/i18n/en.rb +181 -0
  61. data/lib/wiki_lyrics/i18n/es.rb +181 -0
  62. data/lib/wiki_lyrics/i18n/i18n.rb +126 -0
  63. data/lib/wiki_lyrics/i18n/sk.rb +174 -0
  64. data/lib/wiki_lyrics/itrans/COPYRIGHT +31 -0
  65. data/lib/wiki_lyrics/itrans/itrans +0 -0
  66. data/lib/wiki_lyrics/itrans/itrans.txt +8 -0
  67. data/lib/wiki_lyrics/itrans/lyric.txt +23 -0
  68. data/lib/wiki_lyrics/itrans/udvng.ifm +206 -0
  69. data/lib/wiki_lyrics/lyrics.rb +567 -0
  70. data/lib/wiki_lyrics/lyrics_AZLyrics.rb +113 -0
  71. data/lib/wiki_lyrics/lyrics_DarkLyrics.rb +124 -0
  72. data/lib/wiki_lyrics/lyrics_Giitaayan.rb +124 -0
  73. data/lib/wiki_lyrics/lyrics_Jamendo.rb +166 -0
  74. data/lib/wiki_lyrics/lyrics_LeosLyrics.rb +142 -0
  75. data/lib/wiki_lyrics/lyrics_LoudSongs.rb +135 -0
  76. data/lib/wiki_lyrics/lyrics_LyricWiki.rb +329 -0
  77. data/lib/wiki_lyrics/lyrics_LyricsDownload.rb +118 -0
  78. data/lib/wiki_lyrics/lyrics_LyricsMania.rb +141 -0
  79. data/lib/wiki_lyrics/lyrics_Lyriki.rb +287 -0
  80. data/lib/wiki_lyrics/lyrics_SeekLyrics.rb +108 -0
  81. data/lib/wiki_lyrics/lyrics_Sing365.rb +103 -0
  82. data/lib/wiki_lyrics/lyrics_TerraLetras.rb +126 -0
  83. data/lib/wiki_lyrics/mediawikilyrics.rb +1464 -0
  84. data/lib/wiki_lyrics/tests/plugin_tests.rb +161 -0
  85. data/lib/wiki_lyrics/tests/tests.rb +74 -0
  86. data/lib/wiki_lyrics/utils/formdata.rb +56 -0
  87. data/lib/wiki_lyrics/utils/htmlentities.rb +291 -0
  88. data/lib/wiki_lyrics/utils/http.rb +198 -0
  89. data/lib/wiki_lyrics/utils/itrans.rb +160 -0
  90. data/lib/wiki_lyrics/utils/kde.rb +88 -0
  91. data/lib/wiki_lyrics/utils/logger.rb +123 -0
  92. data/lib/wiki_lyrics/utils/strings.rb +378 -0
  93. data/lib/wiki_lyrics/utils/xmlhash.rb +111 -0
  94. data/lib/wiki_lyrics/wikilyrics.kdevelop +152 -0
  95. data/lib/wiki_lyrics/wikilyrics.kdevses +18 -0
  96. data/lib/wiki_lyrics/win/gtk_fix.bat +3 -0
  97. data/lib/wiki_lyrics/win/tk_fix.bat +3 -0
  98. data/lib/wiki_lyrics/win/wikilyrics.bat +4 -0
  99. data/lib/wiki_lyrics/win/win_fix.rb +52 -0
  100. data/templates/art_.erb.xhtml +29 -0
  101. data/templates/artists.erb.xhtml +19 -0
  102. data/templates/cover.erb.xhtml +22 -0
  103. data/test/cache_manager_test.rb +73 -0
  104. data/test/data/artist name/title name.lyric +6 -0
  105. data/test/lyric_test.rb +41 -0
  106. metadata +194 -0
@@ -0,0 +1,66 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe "EeePub::Easy" do
4
+ before do
5
+ @easy = EeePub::Easy.new do
6
+ title 'sample'
7
+ creator 'jugyo'
8
+ identifier 'http://example.com/book/foo', :scheme => 'URL'
9
+ uid 'http://example.com/book/foo'
10
+ end
11
+
12
+ @easy.sections << ['1. foo', <<HTML]
13
+ <?xml version="1.0" encoding="UTF-8"?>
14
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
15
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja">
16
+ <head>
17
+ <title>foo</title>
18
+ </head>
19
+ <body>
20
+ <p>
21
+ foo foo foo foo foo foo
22
+ </p>
23
+ </body>
24
+ </html>
25
+ HTML
26
+
27
+ @easy.sections << ['2. bar', <<HTML]
28
+ <?xml version="1.0" encoding="UTF-8"?>
29
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
30
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja">
31
+ <head>
32
+ <title>bar</title>
33
+ </head>
34
+ <body>
35
+ <p>
36
+ bar bar bar bar bar bar
37
+ </p>
38
+ </body>
39
+ </html>
40
+ HTML
41
+
42
+ @easy.assets << 'image.png'
43
+ end
44
+
45
+ it 'spec for prepare' do
46
+ Dir.mktmpdir do |dir|
47
+ mock(FileUtils).cp('image.png', dir)
48
+
49
+ @easy.send(:prepare, dir)
50
+
51
+ file1 = File.join(dir, 'section_0.html')
52
+ file2 = File.join(dir, 'section_1.html')
53
+ File.exists?(file1).should be_true
54
+ File.exists?(file2).should be_true
55
+ File.read(file1).should == @easy.sections[0][1]
56
+ File.read(file2).should == @easy.sections[1][1]
57
+
58
+ @easy.instance_variable_get(:@nav).should == [
59
+ {:label => '1. foo', :content => 'section_0.html'},
60
+ {:label => '2. bar', :content => 'section_1.html'}
61
+ ]
62
+
63
+ @easy.instance_variable_get(:@files).should == [file1, file2, 'image.png']
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,124 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe "EeePub::Maker" do
4
+ before do
5
+ @maker = EeePub::Maker.new do
6
+ title 'sample'
7
+ creator 'jugyo'
8
+ publisher 'jugyo.org'
9
+ date "2010-05-06"
10
+ language 'en'
11
+ subject 'epub sample'
12
+ description 'this is epub sample'
13
+ rights 'xxx'
14
+ relation 'xxx'
15
+ identifier 'http://example.com/book/foo', :scheme => 'URL'
16
+ uid 'http://example.com/book/foo'
17
+ ncx_file 'toc.ncx'
18
+ opf_file 'content.opf'
19
+ files ['foo.html', 'bar.html']
20
+ nav [
21
+ {:label => '1. foo', :content => 'foo.html'},
22
+ {:label => '1. bar', :content => 'bar.html'}
23
+ ]
24
+ end
25
+ end
26
+
27
+ it { @maker.instance_variable_get(:@titles).should == ['sample'] }
28
+ it { @maker.instance_variable_get(:@creators).should == ['jugyo'] }
29
+ it { @maker.instance_variable_get(:@publishers).should == ['jugyo.org'] }
30
+ it { @maker.instance_variable_get(:@dates).should == ["2010-05-06"] }
31
+ it { @maker.instance_variable_get(:@identifiers).should == [{:value => 'http://example.com/book/foo', :scheme => 'URL'}] }
32
+ it { @maker.instance_variable_get(:@uid).should == 'http://example.com/book/foo' }
33
+ it { @maker.instance_variable_get(:@ncx_file).should == 'toc.ncx' }
34
+ it { @maker.instance_variable_get(:@opf_file).should == 'content.opf' }
35
+ it { @maker.instance_variable_get(:@files).should == ['foo.html', 'bar.html'] }
36
+ it {
37
+ @maker.instance_variable_get(:@nav).should == [
38
+ {:label => '1. foo', :content => 'foo.html'},
39
+ {:label => '1. bar', :content => 'bar.html'}
40
+ ]
41
+ }
42
+
43
+ it 'should save' do
44
+ stub(FileUtils).cp.with_any_args
45
+ mock(Dir).mktmpdir {|i| i.call('/tmp')}
46
+ mock(EeePub::NCX).new(
47
+ :title => "sample",
48
+ :nav => [
49
+ {:label => '1. foo', :content => 'foo.html'},
50
+ {:label => '1. bar', :content => 'bar.html'}
51
+ ],
52
+ :uid => "http://example.com/book/foo"
53
+ ) { stub!.save }
54
+ mock(EeePub::OPF).new(
55
+ :title => ["sample"],
56
+ :creator => ["jugyo"],
57
+ :date => ["2010-05-06"],
58
+ :language => ['en'],
59
+ :subject => ['epub sample'],
60
+ :description => ['this is epub sample'],
61
+ :rights => ['xxx'],
62
+ :relation => ['xxx'],
63
+ :ncx => "toc.ncx",
64
+ :publisher => ["jugyo.org"],
65
+ :identifier => [{:value => "http://example.com/book/foo", :scheme => "URL"}],
66
+ :manifest => ['foo.html', 'bar.html']
67
+ ) { stub!.save }
68
+ mock(EeePub::OCF).new(
69
+ :container => "content.opf",
70
+ :dir => '/tmp'
71
+ ) { stub!.save }
72
+
73
+ @maker.save('test.epub')
74
+ end
75
+
76
+ describe "files as hash" do
77
+ before do
78
+ @maker = EeePub::Maker.new do
79
+ title 'sample'
80
+ creator 'jugyo'
81
+ publisher 'jugyo.org'
82
+ date "2010-05-06"
83
+ language 'en'
84
+ subject 'epub sample'
85
+ description 'this is epub sample'
86
+ rights 'xxx'
87
+ relation 'xxx'
88
+ identifier 'http://example.com/book/foo', :scheme => 'URL'
89
+ uid 'http://example.com/book/foo'
90
+ ncx_file 'toc.ncx'
91
+ opf_file 'content.opf'
92
+ files [{'foo.html' => 'foo/bar'}, {'bar.html' => 'foo/bar/baz'}]
93
+ nav [
94
+ {:label => '1. foo', :content => 'foo.html'},
95
+ {:label => '1. bar', :content => 'bar.html'}
96
+ ]
97
+ end
98
+ end
99
+
100
+ it 'should save' do
101
+ stub(FileUtils).cp.with_any_args
102
+ stub(FileUtils).mkdir_p.with_any_args
103
+ mock(Dir).mktmpdir {|i| i.call('/tmp')}
104
+ mock(EeePub::NCX).new.with_any_args { stub!.save }
105
+ mock(EeePub::OPF).new(
106
+ :title => ["sample"],
107
+ :creator => ["jugyo"],
108
+ :date => ["2010-05-06"],
109
+ :language => ['en'],
110
+ :subject => ['epub sample'],
111
+ :description => ['this is epub sample'],
112
+ :rights => ['xxx'],
113
+ :relation => ['xxx'],
114
+ :ncx => "toc.ncx",
115
+ :publisher => ["jugyo.org"],
116
+ :identifier => [{:value => "http://example.com/book/foo", :scheme => "URL"}],
117
+ :manifest => ["foo/bar/foo.html", "foo/bar/baz/bar.html"]
118
+ ) { stub!.save }
119
+ mock(EeePub::OCF).new.with_any_args { stub!.save }
120
+
121
+ @maker.save('test.epub')
122
+ end
123
+ end
124
+ end
@@ -0,0 +1,80 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ require 'tmpdir'
4
+ require 'fileutils'
5
+
6
+ describe "EeePub::NCX" do
7
+ before do
8
+ @ncx = EeePub::NCX.new(
9
+ :uid => 'uid',
10
+ :nav_map => [
11
+ {:label => 'foo', :content => 'foo.html'},
12
+ {:label => 'bar', :content => 'bar.html'}
13
+ ]
14
+ )
15
+ end
16
+
17
+ it 'should set default values' do
18
+ @ncx.depth.should == 1
19
+ @ncx.total_page_count.should == 0
20
+ @ncx.max_page_number.should == 0
21
+ @ncx.doc_title.should == 'Untitled'
22
+ end
23
+
24
+ it 'should make xml' do
25
+ doc = Nokogiri::XML(@ncx.to_xml)
26
+ head = doc.at('head')
27
+ head.should_not be_nil
28
+
29
+ head.at("//xmlns:meta[@name='dtb:uid']")['content'].should == @ncx.uid
30
+ head.at("//xmlns:meta[@name='dtb:depth']")['content'].should == @ncx.depth.to_s
31
+ head.at("//xmlns:meta[@name='dtb:totalPageCount']")['content'].should == @ncx.total_page_count.to_s
32
+ head.at("//xmlns:meta[@name='dtb:maxPageNumber']")['content'].should == @ncx.max_page_number.to_s
33
+ head.at("//xmlns:docTitle/xmlns:text").inner_text.should == @ncx.doc_title
34
+
35
+ nav_map = doc.at('navMap')
36
+ nav_map.should_not be_nil
37
+ nav_map.search('navPoint').each_with_index do |nav_point, index|
38
+ expect = @ncx.nav_map[index]
39
+ nav_point.attribute('id').value.should == "navPoint-#{index + 1}"
40
+ nav_point.attribute('playOrder').value.should == (index + 1).to_s
41
+ nav_point.at('navLabel').at('text').inner_text.should == expect[:label]
42
+ nav_point.at('content').attribute('src').value.should == expect[:content]
43
+ end
44
+ end
45
+
46
+ context 'nested nav_map' do
47
+ before do
48
+ @ncx.nav = [
49
+ {:label => 'foo', :content => 'foo.html',
50
+ :nav => [
51
+ {:label => 'foo-1', :content => 'foo-1.html'},
52
+ {:label => 'foo-2', :content => 'foo-2.html'}
53
+ ],
54
+ },
55
+ {:label => 'bar', :content => 'bar.html'}
56
+ ]
57
+ end
58
+
59
+ it 'should make xml' do
60
+ doc = Nokogiri::XML(@ncx.to_xml)
61
+ nav_map = doc.at('navMap')
62
+
63
+ nav_map.search('navMap/navPoint').each_with_index do |nav_point, index|
64
+ expect = @ncx.nav_map[index]
65
+ nav_point.attribute('id').value.should == "navPoint-#{index + 1}"
66
+ nav_point.attribute('playOrder').value.should == (index + 1).to_s
67
+ nav_point.at('navLabel').at('text').inner_text.should == expect[:label]
68
+ nav_point.at('content').attribute('src').value.should == expect[:content]
69
+ end
70
+
71
+ nav_map.search('navPoint/navPoint').each_with_index do |nav_point, index|
72
+ expect = @ncx.nav[0][:nav][index]
73
+ nav_point.attribute('id').value.should == "navPoint-#{index + 2}"
74
+ nav_point.attribute('playOrder').value.should == (index + 2).to_s
75
+ nav_point.at('navLabel').at('text').inner_text.should == expect[:label]
76
+ nav_point.at('content').attribute('src').value.should == expect[:content]
77
+ end
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,43 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ require 'tmpdir'
4
+ require 'fileutils'
5
+
6
+ describe "EeePub::OCF" do
7
+ before do
8
+ @tmpdir = File.join(Dir.tmpdir, 'eeepub_test')
9
+ FileUtils.mkdir_p(@tmpdir)
10
+ @container = EeePub::OCF::Container.new('foo.opf')
11
+ @ocf = EeePub::OCF.new(:dir => @tmpdir, :container => @container)
12
+ end
13
+
14
+ after do
15
+ FileUtils.rm_rf(@tmpdir)
16
+ end
17
+
18
+ it 'should return rootfiles' do
19
+ @container.rootfiles.should == [{:full_path => 'foo.opf', :media_type => 'application/oebps-package+xml'}]
20
+ end
21
+
22
+ it 'should specify container as String' do
23
+ ocf = EeePub::OCF.new(:dir => @tmpdir, :container => 'foo.opf')
24
+ ocf.container.rootfiles == [{:full_path => 'foo.opf', :media_type => 'application/oebps-package+xml'}]
25
+ end
26
+
27
+ it 'should make xml' do
28
+ doc = Nokogiri::XML(@container.to_xml)
29
+ rootfiles = doc.at('rootfiles')
30
+ rootfiles.should_not be_nil
31
+ rootfiles.search('rootfile').each_with_index do |rootfile, index|
32
+ expect = @container.rootfiles[index]
33
+ rootfile.attribute('full-path').value.should == expect[:full_path]
34
+ rootfile.attribute('media-type').value.should == expect[:media_type]
35
+ end
36
+ end
37
+
38
+ it 'should make epub' do
39
+ output_path = File.join('eeepub_test.epub')
40
+ @ocf.save(output_path)
41
+ File.exists?(output_path)
42
+ end
43
+ end
@@ -0,0 +1,262 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+ require 'date'
3
+
4
+ describe "EeePub::OPF" do
5
+ before do
6
+ @opf = EeePub::OPF.new(
7
+ :identifier => {:value => '978-4-00-310101-8', :scheme => 'ISBN'},
8
+ :files => ['foo.html', 'bar.html', 'picture.png'],
9
+ :ncx => 'toc.ncx'
10
+ )
11
+ end
12
+
13
+ it 'should set default value' do
14
+ @opf.toc.should == 'ncx'
15
+ @opf.unique_identifier.should == 'BookId'
16
+ @opf.title.should == 'Untitled'
17
+ @opf.language.should == 'en'
18
+ end
19
+
20
+ it 'should export as xml' do
21
+ doc = Nokogiri::XML(@opf.to_xml)
22
+ doc.at('package').attribute('unique-identifier').value.should == @opf.unique_identifier
23
+ metadata = doc.at('metadata')
24
+ metadata.should_not be_nil
25
+ [
26
+ ['dc:title', @opf.title],
27
+ ['dc:language', @opf.language],
28
+ ['dc:date', ''],
29
+ ['dc:subject', ''],
30
+ ['dc:description', ''],
31
+ ['dc:relation', ''],
32
+ ['dc:creator', ''],
33
+ ['dc:publisher', ''],
34
+ ['dc:rights', ''],
35
+ ].each do |xpath, expect|
36
+ metadata.xpath(xpath,
37
+ 'xmlns:dc' => "http://purl.org/dc/elements/1.1/").inner_text.should == expect
38
+ end
39
+ identifier = metadata.xpath('dc:identifier', 'xmlns:dc' => "http://purl.org/dc/elements/1.1/")[0]
40
+ identifier.attribute('id').value.should == @opf.unique_identifier
41
+ identifier.attribute('scheme').value.should == @opf.identifier[0][:scheme]
42
+ identifier.inner_text.should == @opf.identifier[0][:value]
43
+
44
+ manifest = doc.at('manifest')
45
+ manifest.should_not be_nil
46
+ manifest = manifest.search('item')
47
+ manifest.size.should == 4
48
+ manifest[0..2].each_with_index do |item, index|
49
+ expect = @opf.manifest[index]
50
+ item.attribute('id').value.should == expect
51
+ item.attribute('href').value.should == expect
52
+ item.attribute('media-type').value.should == @opf.send(:guess_media_type, expect)
53
+ end
54
+ manifest[3].attribute('id').value.should == 'ncx'
55
+ manifest[3].attribute('href').value.should == @opf.ncx
56
+ manifest[3].attribute('media-type').value.should == @opf.send(:guess_media_type, @opf.ncx)
57
+
58
+ spine = doc.at('spine')
59
+ spine.should_not be_nil
60
+ spine = spine.search('itemref')
61
+ spine.size.should == 2
62
+ spine[0].attribute('idref').value.should == 'foo.html'
63
+ spine[1].attribute('idref').value.should == 'bar.html'
64
+
65
+ doc.at('guide').should be_nil
66
+ end
67
+
68
+ describe 'spec of identifier' do
69
+ context 'specify as Array' do
70
+ before { @opf.identifier = [{:scheme => 'ISBN', :value => '978-4-00-310101-8'}] }
71
+ it 'should return value' do
72
+ @opf.identifier.should == [{:scheme => 'ISBN', :value => '978-4-00-310101-8'}]
73
+ end
74
+ end
75
+
76
+ context 'specify as Hash' do
77
+ before { @opf.identifier = {:scheme => 'ISBN', :value => '978-4-00-310101-8'} }
78
+ it 'should return value' do
79
+ @opf.identifier.should == [{:scheme => 'ISBN', :value => '978-4-00-310101-8', :id => @opf.unique_identifier}]
80
+ end
81
+ end
82
+
83
+ context 'specify as String' do
84
+ before { @opf.identifier = '978-4-00-310101-8' }
85
+ it 'should return value' do
86
+ @opf.identifier.should == [{:value => '978-4-00-310101-8', :id => @opf.unique_identifier}]
87
+ end
88
+ end
89
+ end
90
+
91
+ describe 'spec of create_unique_item_id' do
92
+ it 'should return unique item id' do
93
+ id_cache = {}
94
+ @opf.create_unique_item_id('foo/bar/test.html', id_cache).should == 'test.html'
95
+ @opf.create_unique_item_id('foo/bar/test.html', id_cache).should == 'test.html-1'
96
+ @opf.create_unique_item_id('foo/bar/TEST.html', id_cache).should == 'TEST.html'
97
+ @opf.create_unique_item_id('foo/bar/test.html.1', id_cache).should == 'test.html.1'
98
+ end
99
+ end
100
+
101
+ context 'ncx is nil' do
102
+ before do
103
+ @opf.ncx = nil
104
+ end
105
+
106
+ it 'should not set ncx to manifest' do
107
+ doc = Nokogiri::XML(@opf.to_xml)
108
+ doc.search('manifest/item[id=ncx]').should be_empty
109
+ end
110
+ end
111
+
112
+ context 'set all metadata' do
113
+ before do
114
+ @opf.set_values(
115
+ :date => Date.today,
116
+ :subject => 'subject',
117
+ :description => 'description',
118
+ :relation => 'relation',
119
+ :creator => 'creator',
120
+ :publisher => 'publisher',
121
+ :rights => 'rights'
122
+ )
123
+ end
124
+
125
+ it 'should export as xml' do
126
+ doc = Nokogiri::XML(@opf.to_xml)
127
+ metadata = doc.at('metadata')
128
+ metadata.should_not be_nil
129
+ [
130
+ ['dc:title', @opf.title],
131
+ ['dc:language', @opf.language],
132
+ ['dc:date', @opf.date.to_s],
133
+ ['dc:subject', 'subject'],
134
+ ['dc:description', 'description'],
135
+ ['dc:relation', 'relation'],
136
+ ['dc:creator', 'creator'],
137
+ ['dc:publisher', 'publisher'],
138
+ ['dc:rights', 'rights'],
139
+ ].each do |xpath, expect|
140
+ metadata.xpath(xpath,
141
+ 'xmlns:dc' => "http://purl.org/dc/elements/1.1/").inner_text.should == expect
142
+ end
143
+ identifier = metadata.xpath('dc:identifier', 'xmlns:dc' => "http://purl.org/dc/elements/1.1/")[0]
144
+ identifier.attribute('id').value.should == @opf.unique_identifier
145
+ identifier.attribute('scheme').value.should == @opf.identifier[0][:scheme]
146
+ identifier.inner_text.should == @opf.identifier[0][:value]
147
+ end
148
+ end
149
+
150
+ context 'plural identifiers' do
151
+ before do
152
+ @opf.identifier = [
153
+ {:id => 'BookId', :scheme => 'ISBN', :value => '978-4-00-310101-8'},
154
+ {:id => 'BookURL', :scheme => 'URL', :value => 'http://example.com/books/foo'}
155
+ ]
156
+ end
157
+
158
+ it 'should export as xml' do
159
+ doc = Nokogiri::XML(@opf.to_xml)
160
+ elements = doc.xpath('//dc:identifier', 'xmlns:dc' => "http://purl.org/dc/elements/1.1/")
161
+ elements.size.should == 2
162
+ elements.each_with_index do |element, index|
163
+ expect = @opf.identifier[index]
164
+ element.attribute('id').value.should == expect[:id]
165
+ element.attribute('scheme').value.should == expect[:scheme]
166
+ element.inner_text.should == expect[:value]
167
+ end
168
+ end
169
+ end
170
+
171
+ context 'plural languages' do
172
+ before do
173
+ @opf.language = ['ja', 'en']
174
+ end
175
+
176
+ it 'should export as xml' do
177
+ doc = Nokogiri::XML(@opf.to_xml)
178
+ elements = doc.xpath('//dc:language', 'xmlns:dc' => "http://purl.org/dc/elements/1.1/")
179
+ elements.size.should == 2
180
+ elements.each_with_index do |element, index|
181
+ element.inner_text.should == @opf.language[index]
182
+ end
183
+ end
184
+ end
185
+
186
+ context 'specify spine' do
187
+ before do
188
+ @opf.spine = ['a', 'b']
189
+ end
190
+
191
+ it 'should export as xml' do
192
+ doc = Nokogiri::XML(@opf.to_xml)
193
+ spine = doc.at('spine')
194
+ spine.should_not be_nil
195
+ spine = spine.search('itemref')
196
+ spine.size.should == 2
197
+ spine[0].attribute('idref').value.should == 'a'
198
+ spine[1].attribute('idref').value.should == 'b'
199
+ end
200
+ end
201
+
202
+ context 'specify manifest as Hash' do
203
+ before do
204
+ @opf.manifest = [
205
+ {:id => 'foo', :href => 'foo.html', :media_type => 'application/xhtml+xml'},
206
+ {:id => 'bar', :href => 'bar.html', :media_type => 'application/xhtml+xml'},
207
+ {:id => 'picture', :href => 'picture.png', :media_type => 'image/png'}
208
+ ]
209
+ end
210
+
211
+ it 'should export as xml' do
212
+ doc = Nokogiri::XML(@opf.to_xml)
213
+ manifest = doc.at('manifest')
214
+ manifest.should_not be_nil
215
+ manifest = manifest.search('item')
216
+ manifest.size.should == 4
217
+ manifest[0..2].each_with_index do |item, index|
218
+ expect = @opf.manifest[index]
219
+ item.attribute('id').value.should == expect[:id]
220
+ item.attribute('href').value.should == expect[:href]
221
+ item.attribute('media-type').value.should == expect[:media_type]
222
+ end
223
+ manifest[3].attribute('id').value.should == 'ncx'
224
+ manifest[3].attribute('href').value.should == @opf.ncx
225
+ manifest[3].attribute('media-type').value.should == @opf.send(:guess_media_type, @opf.ncx)
226
+ end
227
+ end
228
+
229
+ context 'specify dc:date[event]' do
230
+ before do
231
+ @opf.date = {:value => Date.today, :event => 'publication'}
232
+ end
233
+
234
+ it 'should export as xml' do
235
+ doc = Nokogiri::XML(@opf.to_xml)
236
+ metadata = doc.at('metadata')
237
+ date = metadata.xpath('dc:date', 'xmlns:dc' => "http://purl.org/dc/elements/1.1/")
238
+ date.inner_text.should == @opf.date[:value].to_s
239
+ date.attribute('event').value.should == @opf.date[:event]
240
+ end
241
+ end
242
+
243
+ context 'set guide' do
244
+ before do
245
+ @opf.guide = [
246
+ {:type => 'toc', :title => 'Table of Contents', :href => 'toc.html'},
247
+ {:type => 'loi', :title => 'List Of Illustrations', :href => 'toc.html#figures'},
248
+ ]
249
+ end
250
+
251
+ it 'should export as xml' do
252
+ doc = Nokogiri::XML(@opf.to_xml)
253
+ guide = doc.at('guide')
254
+ guide.should_not be_nil
255
+ references = guide.search('reference')
256
+ references.size.should == 2
257
+ [references, @opf.guide].transpose do |element, expect|
258
+ element.attributes.should == expect
259
+ end
260
+ end
261
+ end
262
+ end