epub-parser 0.3.3 → 0.3.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.markdown +8 -0
- data/README.markdown +14 -14
- data/lib/epub/parser/content_document.rb +3 -1
- data/lib/epub/parser/version.rb +1 -1
- data/lib/epub/publication/package.rb +12 -0
- data/lib/epub/publication/package/manifest.rb +1 -2
- data/test/fixtures/book/META-INF/container.xml +1 -0
- data/test/fixtures/book/nested/dir/content.opf +31 -0
- data/test/fixtures/book/nested/dir/text/2_chapter-1.xhtml +8 -0
- data/test/fixtures/book/nested/dir/text/toc.xhtml +20 -0
- data/test/test_content_document.rb +16 -0
- data/test/test_parser_content_document.rb +2 -0
- data/test/test_parser_ocf.rb +2 -2
- data/test/test_publication.rb +17 -0
- data/test/test_searcher.rb +1 -0
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0d7e6e2104c4c77f435607cc2b05936b405dad9e18d29d316c98633f9e7df35e
|
4
|
+
data.tar.gz: 03b8c36a39101d777fa0e6026436898f4136df2bd4acfa83f173da7baa750ca1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2f3d5ce0f4d7847cb0e171dfc7741bb0b1899e9e4300746b8e447f0ba2cc5be2eb6700ace854aac6b39b7cddab069e4f83d14f1a930dcb0becbcb5b32c955105
|
7
|
+
data.tar.gz: 96a793271073777e2ae68666018d0e627b7b59edc108a8ed08c085bd0d09cfe4a808f5cc787bdbc8dba28d978e29af92d2e2bd222b2b049d6b4a28b1747f10dc
|
data/CHANGELOG.markdown
CHANGED
@@ -1,6 +1,14 @@
|
|
1
1
|
CHANGELOG
|
2
2
|
=========
|
3
3
|
|
4
|
+
0.3.4
|
5
|
+
-----
|
6
|
+
|
7
|
+
* Add {EPUB::Publication::Package#full_path} and {EPUB::Publication::Package#rootfile}
|
8
|
+
* [BUG FIX]Fix a bug that {EPUB::ContentDocument::Navigation::Item#item} doesn't return correct {EPUB::Publication::Package::Manifest::Item Item}(Thanks [aelkiss][]!)
|
9
|
+
|
10
|
+
[aelkiss]: https://gitlab.com/aelkiss
|
11
|
+
|
4
12
|
0.3.3
|
5
13
|
-----
|
6
14
|
|
data/README.markdown
CHANGED
@@ -5,6 +5,12 @@ EPUB Parser
|
|
5
5
|
[![Gem Version](https://badge.fury.io/rb/epub-parser.svg)](http://badge.fury.io/rb/epub-parser)
|
6
6
|
[![coverage report](https://gitlab.com/KitaitiMakoto/epub-parser/badges/master/coverage.svg)](https://gitlab.com/KitaitiMakoto/epub-parser/commits/master)
|
7
7
|
|
8
|
+
* [Homepage][homepage]
|
9
|
+
* [Documentation][rubydoc]
|
10
|
+
* [Source Code][]
|
11
|
+
|
12
|
+
[Source Code]: https://gitlab.com/KitaitiMakoto/epub-parser
|
13
|
+
|
8
14
|
INSTALLATION
|
9
15
|
-------
|
10
16
|
|
@@ -153,6 +159,13 @@ If you find other gems, please tell me or request a pull request.
|
|
153
159
|
RECENT CHANGES
|
154
160
|
--------------
|
155
161
|
|
162
|
+
### 0.3.4
|
163
|
+
|
164
|
+
* Add {EPUB::Publication::Package#full_path} and {EPUB::Publication::Package#rootfile}
|
165
|
+
* [BUG FIX]Fix a bug that {EPUB::ContentDocument::Navigation::Item#item} doesn't return correct {EPUB::Publication::Package::Manifest::Item Item}(Thanks [aelkiss][]!)
|
166
|
+
|
167
|
+
[aelkiss]: https://gitlab.com/aelkiss
|
168
|
+
|
156
169
|
### 0.3.3
|
157
170
|
|
158
171
|
* [BUG FIX]Use UnpackedURI adapter for URI
|
@@ -163,25 +176,12 @@ RECENT CHANGES
|
|
163
176
|
|
164
177
|
* Use epub-cfi gem for EPUB CFI
|
165
178
|
|
166
|
-
### 0.3.1
|
167
|
-
|
168
|
-
* Make `CFI` comparable. Now can call `CFI#==`
|
169
|
-
* Include `Publication::Package::Spine::Itemref` in `Searcher.search_element`'s result
|
170
|
-
|
171
|
-
### 0.3.0
|
172
|
-
|
173
|
-
* Wrong release. I'm sorry.
|
174
|
-
|
175
|
-
### 0.2.9
|
176
|
-
|
177
|
-
* Fix a bug that `Searcher.search_element` returns wrong CFI
|
178
|
-
* Add `Searcher.search_by_cfi`
|
179
|
-
|
180
179
|
See {file:CHANGELOG.markdown} for older changelogs and details.
|
181
180
|
|
182
181
|
TODOS
|
183
182
|
-----
|
184
183
|
* EPUB 3.0.1
|
184
|
+
* EPUB 3.1
|
185
185
|
* Help features for `epub-open` tool
|
186
186
|
* Vocabulary Association Mechanisms
|
187
187
|
* Implementing navigation document and so on
|
@@ -82,7 +82,9 @@ module EPUB
|
|
82
82
|
item.text = extract_attribute(a_or_span, 'title').to_s if item.text.nil? || item.text.empty?
|
83
83
|
end
|
84
84
|
item.href = extract_attribute(a_or_span, 'href')
|
85
|
-
item.item = @item.manifest.items.find {|it|
|
85
|
+
item.item = @item.manifest.items.find {|it|
|
86
|
+
it.full_path == @item.full_path + item.href.request_uri
|
87
|
+
}
|
86
88
|
end
|
87
89
|
item.items = element.xpath('./xhtml:ol[1]/xhtml:li', EPUB::NAMESPACES).map {|li| parse_navigation_item(li)}
|
88
90
|
|
data/lib/epub/parser/version.rb
CHANGED
@@ -43,6 +43,18 @@ module EPUB
|
|
43
43
|
@metadata.unique_identifier
|
44
44
|
end
|
45
45
|
|
46
|
+
# Corresponding {Rootfile}
|
47
|
+
# @return [OCF::Container::Rootfile]
|
48
|
+
def rootfile
|
49
|
+
@book.ocf.container.rootfiles.find {|rf| rf.package == self}
|
50
|
+
end
|
51
|
+
|
52
|
+
# Full path in EPUB archive
|
53
|
+
# @return [Addressable::URI]
|
54
|
+
def full_path
|
55
|
+
rootfile.full_path if rootfile
|
56
|
+
end
|
57
|
+
|
46
58
|
def inspect
|
47
59
|
"#<%{class}:%{object_id} %{attributes} %{models}>" % {
|
48
60
|
:class => self.class,
|
@@ -121,8 +121,7 @@ module EPUB
|
|
121
121
|
# @return [Addressable::URI]
|
122
122
|
def full_path
|
123
123
|
return @full_path if @full_path
|
124
|
-
|
125
|
-
path = DUMMY_ROOT_IRI + rootfile + href
|
124
|
+
path = DUMMY_ROOT_IRI + manifest.package.full_path + href
|
126
125
|
path.scheme = nil
|
127
126
|
path.host = nil
|
128
127
|
path.path = path.path[1..-1]
|
@@ -2,5 +2,6 @@
|
|
2
2
|
<container version="1.0" xmlns="urn:oasis:names:tc:opendocument:xmlns:container">
|
3
3
|
<rootfiles>
|
4
4
|
<rootfile full-path="OPS/ルートファイル.opf" media-type="application/oebps-package+xml" />
|
5
|
+
<rootfile full-path="nested/dir/content.opf" media-type="application/oebps-package+xml" />
|
5
6
|
</rootfiles>
|
6
7
|
</container>
|
@@ -0,0 +1,31 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<package xmlns="http://www.idpf.org/2007/opf" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:media="http://www.idpf.org/epub/vocab/overlays/#" version="3.0" unique-identifier="BookId" xml:lang="en" prefix="ibooks: http://vocabulary.itunes.apple.com/rdf/ibooks/vocabulary-extensions-1.0/">
|
3
|
+
<metadata xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:opf="http://www.idpf.org/2007/opf">
|
4
|
+
<dc:identifier id="BookId">af6e04ec-ca74-4951-a5cd-f0572885a7f9</dc:identifier>
|
5
|
+
<meta refines="#BookId" property="identifier-type" scheme="onix:codelist5">22</meta>
|
6
|
+
<meta property="dcterms:identifier" id="meta-identifier">BookId</meta>
|
7
|
+
<dc:title>Test</dc:title>
|
8
|
+
<meta property="dcterms:title" id="meta-title">Test</meta>
|
9
|
+
<dc:language>en</dc:language>
|
10
|
+
<meta property="dcterms:language" id="meta-language">en</meta>
|
11
|
+
<meta property="dcterms:modified">2017-12-05T20:55:41Z</meta>
|
12
|
+
<dc:creator id="creator">anonymous</dc:creator>
|
13
|
+
<meta refines="#creator" property="file-as">anonymous</meta>
|
14
|
+
<meta property="dcterms:publisher">anonymous</meta>
|
15
|
+
<dc:publisher>anonymous</dc:publisher>
|
16
|
+
<meta property="dcterms:date">2017-12-5</meta>
|
17
|
+
<dc:date>2017-12-5</dc:date>
|
18
|
+
<meta property="dcterms:rights">see MIT-LICENSE</meta>
|
19
|
+
<dc:rights>see MIT-LICENSE</dc:rights>
|
20
|
+
<meta name="cover" content="image_cover"/>
|
21
|
+
</metadata>
|
22
|
+
<manifest>
|
23
|
+
<item id="ncx" href="toc.ncx" media-type="application/x-dtbncx+xml"/>
|
24
|
+
<item id="toc" href="text/toc.xhtml" media-type="application/xhtml+xml" properties="nav"/>
|
25
|
+
<item id="content_2_chapter-1" href="text/2_chapter-1.xhtml" media-type="application/xhtml+xml"/>
|
26
|
+
</manifest>
|
27
|
+
<spine toc="ncx">
|
28
|
+
<itemref idref="toc"/>
|
29
|
+
<itemref idref="content_2_chapter-1"/>
|
30
|
+
</spine>
|
31
|
+
</package>
|
@@ -0,0 +1,8 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<!DOCTYPE html>
|
3
|
+
<html xmlns="http://www.w3.org/1999/xhtml" lang="en">
|
4
|
+
<head>
|
5
|
+
<meta charset="UTF-8" />
|
6
|
+
<title>Chapter 1</title>
|
7
|
+
</head>
|
8
|
+
<body><div class="chapter-heading"> <h1 class="chapter-number">1</h1> <h1 class="chapter-title">Chapter 1</h1> </div> <div class="chapter-content"><p class="no-indent">This is the first sentence. This is the next sentence. This is all for Chapter 1.</p> <p><br/></p> </div> </body></html>
|
@@ -0,0 +1,20 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:epub="http://www.idpf.org/2007/ops" xml:lang="en" lang="en">
|
3
|
+
<head>
|
4
|
+
<title>Test</title>
|
5
|
+
<meta charset="UTF-8"/>
|
6
|
+
</head>
|
7
|
+
<body>
|
8
|
+
<h1 class="chapter-title">Contents</h1>
|
9
|
+
<nav id="toc" epub:type="toc">
|
10
|
+
<ol class="toc">
|
11
|
+
<li class="toc-chapter">
|
12
|
+
<a href="2_chapter-1.xhtml" epub:type="bodymatter">Chapter 1</a>
|
13
|
+
<ol class="toc">
|
14
|
+
|
15
|
+
</ol>
|
16
|
+
</li>
|
17
|
+
</ol>
|
18
|
+
</nav>
|
19
|
+
</body>
|
20
|
+
</html>
|
@@ -62,6 +62,8 @@ class TestContentDocument < Test::Unit::TestCase
|
|
62
62
|
|
63
63
|
def test_contents_returns_items_of_toc
|
64
64
|
manifest = EPUB::Publication::Package::Manifest.new
|
65
|
+
manifest.package = Object.new
|
66
|
+
stub(manifest.package).full_path {Addressable::URI.parse("")}
|
65
67
|
item = EPUB::Publication::Package::Manifest::Item.new
|
66
68
|
item.media_type = 'application/xhtml+xml'
|
67
69
|
item.properties = %w[nav]
|
@@ -109,5 +111,19 @@ class TestContentDocument < Test::Unit::TestCase
|
|
109
111
|
end
|
110
112
|
end
|
111
113
|
end
|
114
|
+
|
115
|
+
def test_rexml_returns_rexml_document
|
116
|
+
content_doc = XHTML.new
|
117
|
+
stub(content_doc).raw_document {File.read(File.join(File.dirname(__FILE__), 'fixtures', 'book', 'OPS', '日本語.xhtml'))}
|
118
|
+
doc = content_doc.rexml
|
119
|
+
assert_instance_of REXML::Document, doc
|
120
|
+
end
|
121
|
+
|
122
|
+
def test_navigation_item
|
123
|
+
book = EPUB::Parser.parse("test/fixtures/book.epub")
|
124
|
+
package = book.packages[1]
|
125
|
+
|
126
|
+
assert_equal "nested/dir/text/2_chapter-1.xhtml", package.manifest.nav.content_document.navigation.items.first.item.full_path.path
|
127
|
+
end
|
112
128
|
end
|
113
129
|
end
|
@@ -10,6 +10,8 @@ class TestParserContentDocument < Test::Unit::TestCase
|
|
10
10
|
item.href = href
|
11
11
|
@manifest << item
|
12
12
|
end
|
13
|
+
@manifest.package = Object.new
|
14
|
+
stub(@manifest.package).full_path {"OPS/ルートファイル.opf"}
|
13
15
|
|
14
16
|
@dir = 'test/fixtures/book'
|
15
17
|
@parser = EPUB::Parser::ContentDocument.new(@manifest.items.last)
|
data/test/test_parser_ocf.rb
CHANGED
@@ -16,8 +16,8 @@ class TestParserOCF < Test::Unit::TestCase
|
|
16
16
|
}
|
17
17
|
end
|
18
18
|
|
19
|
-
def
|
20
|
-
assert_equal
|
19
|
+
def test_parsed_container_has_two_rootfiles
|
20
|
+
assert_equal 2, @parser.parse_container(@container_xml).rootfiles.length
|
21
21
|
end
|
22
22
|
|
23
23
|
def test_parse_container_can_find_primary_rootfile
|
data/test/test_publication.rb
CHANGED
@@ -18,6 +18,23 @@ class TestPublication < Test::Unit::TestCase
|
|
18
18
|
assert_nil metadata.package
|
19
19
|
end
|
20
20
|
|
21
|
+
def test_full_path_equals_to_corresponding_rootfiles_one
|
22
|
+
full_path = Addressable::URI.parse("OPS/content.opf")
|
23
|
+
ocf = EPUB::OCF.new
|
24
|
+
ocf.container = EPUB::OCF::Container.new
|
25
|
+
rootfile = EPUB::OCF::Container::Rootfile.new(full_path)
|
26
|
+
rootfile.package = @package
|
27
|
+
another_rootfile = Object.new
|
28
|
+
stub(another_rootfile).package
|
29
|
+
ocf.container.rootfiles << another_rootfile
|
30
|
+
ocf.container.rootfiles << rootfile
|
31
|
+
book = Object.new
|
32
|
+
stub(book).ocf {ocf}
|
33
|
+
@package.book = book
|
34
|
+
|
35
|
+
assert_equal full_path, @package.full_path
|
36
|
+
end
|
37
|
+
|
21
38
|
class TestMetadata < TestPublication
|
22
39
|
def setup
|
23
40
|
@metadata = Package::Metadata.new
|
data/test/test_searcher.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: epub-parser
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- KITAITI Makoto
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-03-
|
11
|
+
date: 2018-03-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -371,6 +371,9 @@ files:
|
|
371
371
|
- test/fixtures/book/OPS/ルートファイル.opf
|
372
372
|
- test/fixtures/book/OPS/日本語.xhtml
|
373
373
|
- test/fixtures/book/mimetype
|
374
|
+
- test/fixtures/book/nested/dir/content.opf
|
375
|
+
- test/fixtures/book/nested/dir/text/2_chapter-1.xhtml
|
376
|
+
- test/fixtures/book/nested/dir/text/toc.xhtml
|
374
377
|
- test/helper.rb
|
375
378
|
- test/test_content_document.rb
|
376
379
|
- test/test_epub.rb
|