epub-parser 0.0.7 → 0.0.8
Sign up to get free protection for your applications and to get access to all the features.
- data/README.markdown +22 -2
- data/bin/epubinfo +12 -5
- data/epub-parser.gemspec +2 -0
- data/lib/epub.rb +6 -0
- data/lib/epub/constants.rb +7 -7
- data/lib/epub/parser.rb +1 -1
- data/lib/epub/parser/ocf.rb +1 -1
- data/lib/epub/parser/publication.rb +59 -4
- data/lib/epub/parser/version.rb +1 -1
- data/lib/epub/publication/package.rb +6 -2
- data/lib/epub/publication/package/metadata.rb +86 -8
- data/man/epubinfo.1.ronn +19 -0
- data/test/fixtures/book.epub +0 -0
- data/test/fixtures/book/OPS//343/203/253/343/203/274/343/203/210/343/203/225/343/202/241/343/202/244/343/203/253.opf +7 -2
- metadata +59 -36
data/README.markdown
CHANGED
@@ -1,15 +1,26 @@
|
|
1
1
|
EPUB Parser
|
2
2
|
===========
|
3
3
|
|
4
|
-
|
4
|
+
INSTALLATION
|
5
5
|
-------
|
6
6
|
gem install epub-parser
|
7
7
|
|
8
8
|
USAGE
|
9
9
|
-----
|
10
|
+
|
11
|
+
### As a command line tool
|
12
|
+
|
13
|
+
epubinfo path/to/book.epub
|
14
|
+
|
15
|
+
For more info:
|
16
|
+
|
17
|
+
epubinfo -h
|
18
|
+
|
19
|
+
### As a library
|
20
|
+
|
10
21
|
require 'epub/parser'
|
11
22
|
|
12
|
-
book = EPUB::Parser.parse 'book.epub', '
|
23
|
+
book = EPUB::Parser.parse 'book.epub', 'working/directory'
|
13
24
|
book.each_page_on_spine do |page|
|
14
25
|
# do somethong...
|
15
26
|
end
|
@@ -23,6 +34,15 @@ REQUIREMENTS
|
|
23
34
|
* UNIX like `unzip` command
|
24
35
|
* libxml2 and libxslt for Nokogiri gem
|
25
36
|
|
37
|
+
TODOS
|
38
|
+
-----
|
39
|
+
* Adding tests
|
40
|
+
* Implementing metadata/link, navigation document and so on
|
41
|
+
* Using zip library instead of `unzip` command, which has security issue
|
42
|
+
* Using SAX on parsing
|
43
|
+
* Extracting and organizing common behavior from some classes to modules
|
44
|
+
* Abstraction of XML parser(making it possible to use REXML, standard bundled XML library of Ruby)
|
45
|
+
|
26
46
|
LICENSE
|
27
47
|
-------
|
28
48
|
This library is distribuetd under the term of the MIT License.
|
data/bin/epubinfo
CHANGED
@@ -6,22 +6,29 @@ Version = EPUB::Parser::VERSION
|
|
6
6
|
|
7
7
|
options = {:format => :line}
|
8
8
|
opt = OptionParser.new do |opt|
|
9
|
-
opt.banner =
|
10
|
-
|
9
|
+
opt.banner = <<EOB
|
10
|
+
Show metadata of an EPUB file
|
11
|
+
|
12
|
+
Usage: epubinfo [options] EPUBFILE
|
13
|
+
|
14
|
+
EOB
|
15
|
+
opt.on '-f', '--format=FORMAT', [:line, :json, :yaml], 'format of output(line, json or yaml), defaults to line(for console)' do |format|
|
11
16
|
options[:format] = format
|
12
17
|
end
|
13
18
|
end
|
14
19
|
opt.parse!(ARGV)
|
15
20
|
|
16
|
-
file = ARGV
|
21
|
+
file = ARGV.shift
|
17
22
|
unless file
|
23
|
+
$stdout.puts "error: you must supply an EPUB file name"
|
18
24
|
$stdout.puts opt.help
|
19
|
-
exit
|
25
|
+
exit!
|
20
26
|
end
|
21
27
|
|
22
28
|
Dir.mktmpdir('epub-parser') do |dir|
|
23
29
|
book = EPUB::Parser.parse file, dir
|
24
|
-
data = book.
|
30
|
+
data = {'Title' => [book.title]}
|
31
|
+
data.merge!(book.package.metadata.to_hash)
|
25
32
|
data['Unique identifier'] = [book.package.metadata.unique_identifier]
|
26
33
|
data['EPUB Version'] = [book.package.version]
|
27
34
|
if options[:format] == :line
|
data/epub-parser.gemspec
CHANGED
@@ -28,6 +28,8 @@ Gem::Specification.new do |s|
|
|
28
28
|
s.add_development_dependency 'simplecov'
|
29
29
|
s.add_development_dependency 'thin'
|
30
30
|
s.add_development_dependency 'yard'
|
31
|
+
s.add_development_dependency 'gem-man'
|
32
|
+
s.add_development_dependency 'ronn'
|
31
33
|
s.add_development_dependency 'epzip'
|
32
34
|
s.add_development_dependency 'epubcheck'
|
33
35
|
s.add_development_dependency 'epub_validator'
|
data/lib/epub.rb
CHANGED
@@ -19,6 +19,12 @@ module EPUB
|
|
19
19
|
end
|
20
20
|
module_function :parse
|
21
21
|
|
22
|
+
%w[ title main_title subtitle short_title collection_title edition_title extended_title ].each do |met|
|
23
|
+
define_method met do
|
24
|
+
@package.metadata.__send__(met)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
22
28
|
def each_page_on_spine(&blk)
|
23
29
|
enum = @package.spine.items
|
24
30
|
if block_given?
|
data/lib/epub/constants.rb
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
module EPUB
|
2
2
|
module Constants
|
3
3
|
NAMESPACES = {
|
4
|
-
'dc'
|
5
|
-
'
|
6
|
-
'opf'
|
7
|
-
'xhtml'
|
8
|
-
'epub'
|
9
|
-
'm'
|
10
|
-
'svg'
|
4
|
+
'dc' => 'http://purl.org/dc/elements/1.1/',
|
5
|
+
'ocf' => 'urn:oasis:names:tc:opendocument:xmlns:container',
|
6
|
+
'opf' => 'http://www.idpf.org/2007/opf',
|
7
|
+
'xhtml' => 'http://www.w3.org/1999/xhtml',
|
8
|
+
'epub' => 'http://www.idpf.org/2007/ops',
|
9
|
+
'm' => 'http://www.w3.org/1998/Math/MathML',
|
10
|
+
'svg' => 'http://www.w3.org/2000/svg'
|
11
11
|
}
|
12
12
|
|
13
13
|
module Type
|
data/lib/epub/parser.rb
CHANGED
@@ -25,7 +25,7 @@ module EPUB
|
|
25
25
|
@book = create_book options
|
26
26
|
|
27
27
|
unzip_cmd = options['unzip-command'] || 'unzip'
|
28
|
-
unzip_cmd << " #{@filepath.to_s.shellescape} -d #{@dir.to_s.shellescape}"
|
28
|
+
unzip_cmd << " #{@filepath.to_s.shellescape} -d #{@dir.to_s.shellescape} 1>/dev/null"
|
29
29
|
system unzip_cmd
|
30
30
|
end
|
31
31
|
|
data/lib/epub/parser/ocf.rb
CHANGED
@@ -30,7 +30,7 @@ module EPUB
|
|
30
30
|
container = EPUB::OCF::Container.new
|
31
31
|
doc = Nokogiri.XML open(File.join @dir, DIRECTORY, CONTAINER_FILE)
|
32
32
|
|
33
|
-
doc.xpath('/
|
33
|
+
doc.xpath('/ocf:container/ocf:rootfiles/ocf:rootfile', EPUB::NAMESPACES).each do |elem|
|
34
34
|
rootfile = EPUB::OCF::Container::Rootfile.new
|
35
35
|
%w[full-path media-type].each do |attr|
|
36
36
|
rootfile.__send__(attr.gsub(/-/, '_') + '=', elem[attr])
|
@@ -32,7 +32,7 @@ module EPUB
|
|
32
32
|
def parse_package
|
33
33
|
elem = @doc.root
|
34
34
|
@package.version = elem['version']
|
35
|
-
@package.
|
35
|
+
@package.unique_identifier_id = elem['unique-identifier']
|
36
36
|
|
37
37
|
@package
|
38
38
|
end
|
@@ -40,29 +40,84 @@ module EPUB
|
|
40
40
|
def parse_metadata
|
41
41
|
metadata = @package.metadata = EPUB::Publication::Package::Metadata.new
|
42
42
|
elem = @doc.xpath('/opf:package/opf:metadata', EPUB::NAMESPACES).first
|
43
|
+
id_map = {}
|
43
44
|
|
44
45
|
metadata.identifiers = elem.xpath('./dc:identifier', EPUB::NAMESPACES).collect do |e|
|
45
46
|
identifier = EPUB::Publication::Package::Metadata::Identifier.new
|
46
47
|
identifier.content = e.content
|
47
48
|
identifier.id = id = e['id']
|
48
|
-
metadata.unique_identifier = identifier if id == @package.
|
49
|
+
metadata.unique_identifier = identifier if id == @package.unique_identifier_id
|
50
|
+
|
49
51
|
identifier
|
50
52
|
end
|
53
|
+
metadata.identifiers.each {|i| id_map[i.id] = {metadata: i} if i.respond_to?(:id) && i.id}
|
51
54
|
|
52
|
-
metadata.titles =
|
55
|
+
metadata.titles = elem.xpath('./dc:title', EPUB::NAMESPACES).collect do |e|
|
56
|
+
title = EPUB::Publication::Package::Metadata::Title.new
|
57
|
+
%w[ id lang dir ].each do |attr|
|
58
|
+
title.__send__("#{attr}=", e[attr])
|
59
|
+
end
|
53
60
|
title.content = e.content
|
61
|
+
|
62
|
+
title
|
54
63
|
end
|
64
|
+
# metadata.titles = collect_dcmes(elem, './dc:title') do |title, e|
|
65
|
+
# title.content = e.content
|
66
|
+
# end
|
67
|
+
metadata.titles.each {|t| id_map[t.id] = {metadata: t} if t.respond_to?(:id) && t.id}
|
55
68
|
|
56
69
|
metadata.languages = elem.xpath('./dc:language', EPUB::NAMESPACES).collect do |e|
|
57
70
|
e.content
|
58
71
|
end
|
72
|
+
metadata.languages.each {|l| id_map[l.id] = {metadata: l} if l.respond_to?(:id) && l.id}
|
59
73
|
|
60
74
|
%w[ contributor coverage creator date description format publisher relation source subject type ].each do |dcmes|
|
61
75
|
metadata.__send__ "#{dcmes}s=", collect_dcmes(elem, "./dc:#{dcmes}")
|
76
|
+
metadata.__send__("#{dcmes}s").each {|d| id_map[d.id] = {metadata: d} if d.respond_to?(:id) && d.id}
|
62
77
|
end
|
78
|
+
|
63
79
|
metadata.rights = collect_dcmes(elem, './dc:rights')
|
80
|
+
metadata.rights.each {|r| id_map[r.id] = {metadata: r} if r.respond_to?(:id) && r.id}
|
81
|
+
|
82
|
+
metadata.metas = elem.xpath('./opf:meta', EPUB::NAMESPACES).collect do |e|
|
83
|
+
meta = EPUB::Publication::Package::Metadata::Meta.new
|
84
|
+
%w[ property id scheme ].each { |attr| meta.__send__("#{attr}=", e[attr]) }
|
85
|
+
meta.content = e.content
|
86
|
+
if (refines = e['refines']) && refines[0] == '#'
|
87
|
+
id = refines[1..-1]
|
88
|
+
id_map[id] ||= {}
|
89
|
+
id_map[id][:refiners] ||= []
|
90
|
+
id_map[id][:refiners] << meta
|
91
|
+
end
|
92
|
+
|
93
|
+
meta
|
94
|
+
end
|
95
|
+
metadata.metas.each {|m| id_map[m.id] = {metadata: m} if m.respond_to?(:id) && m.id}
|
96
|
+
|
97
|
+
metadata.links = elem.xpath('./opf:link', EPUB::NAMESPACES).collect do |e|
|
98
|
+
link = EPUB::Publication::Package::Metadata::Link.new
|
99
|
+
%w[ href id media-type ].each do |attr|
|
100
|
+
link.__send__(attr.gsub(/-/, '_') + '=', e[attr])
|
101
|
+
end
|
102
|
+
link.iri = Addressable::URI.parse(e['href'])
|
103
|
+
link.rel = e['rel'].strip.split
|
104
|
+
if (refines = e['refines']) && refines[0] == '#'
|
105
|
+
id = refines[1..-1]
|
106
|
+
id_map[id] ||= {}
|
107
|
+
id_map[id][:refiners] ||= []
|
108
|
+
id_map[id][:refiners] << link
|
109
|
+
end
|
64
110
|
|
65
|
-
|
111
|
+
link
|
112
|
+
end
|
113
|
+
metadata.links.each {|l| id_map[l.id] = {metadata: l} if l.respond_to?(:id) && l.id}
|
114
|
+
|
115
|
+
id_map.values.each do |hsh|
|
116
|
+
next unless hsh[:refiners]
|
117
|
+
next unless hsh[:metadata]
|
118
|
+
hsh[:metadata].refiners = hsh[:refiners]
|
119
|
+
hsh[:refiners].each {|meta| meta.refines = hsh[:metadata]}
|
120
|
+
end
|
66
121
|
|
67
122
|
metadata
|
68
123
|
end
|
data/lib/epub/parser/version.rb
CHANGED
@@ -4,8 +4,8 @@ module EPUB
|
|
4
4
|
module Publication
|
5
5
|
class Package
|
6
6
|
attr_accessor :book,
|
7
|
-
:version, :
|
8
|
-
attr_reader :metadata, :manifest, :spine, :guide
|
7
|
+
:version, :unique_identifier_id, :prefix, :xml_lang, :dir, :id
|
8
|
+
attr_reader :metadata, :manifest, :spine, :guide, :unique_identifier
|
9
9
|
alias lang xml_lang
|
10
10
|
alias lang= xml_lang=
|
11
11
|
|
@@ -28,6 +28,10 @@ module EPUB
|
|
28
28
|
guide.package = self
|
29
29
|
@guide = guide
|
30
30
|
end
|
31
|
+
|
32
|
+
def unique_identifier
|
33
|
+
@metadata.unique_identifier
|
34
|
+
end
|
31
35
|
end
|
32
36
|
end
|
33
37
|
end
|
@@ -2,25 +2,65 @@ module EPUB
|
|
2
2
|
module Publication
|
3
3
|
class Package
|
4
4
|
class Metadata
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
attr_accessor :package, :unique_identifier,
|
9
|
-
*(
|
10
|
-
|
5
|
+
DC_ELEMS = [:identifiers, :titles, :languages] +
|
6
|
+
[:contributors, :coverages, :creators, :dates, :descriptions, :formats, :publishers,
|
7
|
+
:relations, :rights, :sources, :subjects, :types]
|
8
|
+
attr_accessor :package, :unique_identifier, :metas, :links,
|
9
|
+
*(DC_ELEMS.collect {|elem| "dc_#{elem}"})
|
10
|
+
DC_ELEMS.each do |elem|
|
11
11
|
alias_method elem, "dc_#{elem}"
|
12
12
|
alias_method "#{elem}=", "dc_#{elem}="
|
13
13
|
end
|
14
|
-
|
14
|
+
|
15
|
+
def title
|
16
|
+
return extended_title unless extended_title.empty?
|
17
|
+
compositted = titles.select {|title| title.display_seq}.sort.join("\n")
|
18
|
+
return compositted unless compositted.empty?
|
19
|
+
return main_title unless main_title.empty?
|
20
|
+
titles.sort.join("\n")
|
21
|
+
end
|
22
|
+
|
23
|
+
%w[ main short collection edition extended ].each do |type|
|
24
|
+
define_method "#{type}_title" do
|
25
|
+
titles.select {|title| title.title_type.to_s == type}.sort.join(' ')
|
26
|
+
end
|
27
|
+
end
|
28
|
+
def subtitle
|
29
|
+
titles.select {|title| title.title_type.to_s == 'subtitle'}.sort.join(' ')
|
30
|
+
end
|
15
31
|
|
16
32
|
def to_hash
|
17
|
-
|
33
|
+
DC_ELEMS.inject({}) do |hsh, elem|
|
18
34
|
hsh[elem] = __send__(elem)
|
19
35
|
hsh
|
20
36
|
end
|
21
37
|
end
|
22
38
|
|
39
|
+
def primary_metas
|
40
|
+
metas.select {|meta| meta.primary_expression?}
|
41
|
+
end
|
42
|
+
|
43
|
+
module Refinable
|
44
|
+
PROPERTIES = %w[ alternate-script display-seq file-as group-position identifier-type meta-auth role title-type ]
|
45
|
+
|
46
|
+
PROPERTIES.each do |voc|
|
47
|
+
met = voc.gsub(/-/, '_')
|
48
|
+
attr_accessor met
|
49
|
+
define_method met do
|
50
|
+
@refiners.select {|refiner| refiner.property == voc}.first
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
attr_accessor :refiners
|
55
|
+
|
56
|
+
def initialize
|
57
|
+
@refiners = []
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
23
61
|
class Identifier
|
62
|
+
include Refinable
|
63
|
+
|
24
64
|
attr_accessor :content, :id
|
25
65
|
|
26
66
|
def to_s
|
@@ -29,20 +69,58 @@ module EPUB
|
|
29
69
|
end
|
30
70
|
|
31
71
|
class Title
|
72
|
+
include Refinable
|
73
|
+
include Comparable
|
74
|
+
|
32
75
|
attr_accessor :content, :id, :lang, :dir
|
33
76
|
|
77
|
+
def <=>(other)
|
78
|
+
return 1 if other.display_seq.nil?
|
79
|
+
return -1 if display_seq.nil?
|
80
|
+
display_seq.to_s.to_i <=> other.display_seq.to_s.to_i
|
81
|
+
end
|
82
|
+
|
34
83
|
def to_s
|
35
84
|
content
|
36
85
|
end
|
37
86
|
end
|
38
87
|
|
39
88
|
class DCMES
|
89
|
+
include Refinable
|
90
|
+
|
40
91
|
attr_accessor :content, :id, :lang, :dir
|
41
92
|
|
42
93
|
def to_s
|
43
94
|
content
|
44
95
|
end
|
45
96
|
end
|
97
|
+
|
98
|
+
class Meta
|
99
|
+
include Refinable
|
100
|
+
|
101
|
+
attr_accessor :property, :refines, :id, :scheme, :content
|
102
|
+
|
103
|
+
def refines?
|
104
|
+
! refines.nil?
|
105
|
+
end
|
106
|
+
|
107
|
+
alias subexpression? refines?
|
108
|
+
|
109
|
+
def primary_expression?
|
110
|
+
! subexpression?
|
111
|
+
end
|
112
|
+
|
113
|
+
def to_s
|
114
|
+
content
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
class Link
|
119
|
+
include Refinable
|
120
|
+
|
121
|
+
attr_accessor :href, :rel, :id, :refines, :media_type,
|
122
|
+
:iri
|
123
|
+
end
|
46
124
|
end
|
47
125
|
end
|
48
126
|
end
|
data/man/epubinfo.1.ronn
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
epubinfo(1) -- show metadata of an EPUB book
|
2
|
+
============================================
|
3
|
+
|
4
|
+
SYNOPSIS
|
5
|
+
--------
|
6
|
+
|
7
|
+
`epubinfo` <filename><br>
|
8
|
+
`epubinfo` `-f`|`--format=<formnt>` <filename>
|
9
|
+
|
10
|
+
DESCRIPTION
|
11
|
+
-----------
|
12
|
+
|
13
|
+
**epubinfo** shows metadata of an EPUB book.
|
14
|
+
|
15
|
+
OPTIONS
|
16
|
+
-------
|
17
|
+
|
18
|
+
* `-f`, `--format`:
|
19
|
+
Output format; currently "line", "json" and "yaml" are acceptable
|
data/test/fixtures/book.epub
CHANGED
Binary file
|
@@ -1,7 +1,7 @@
|
|
1
1
|
<?xml version="1.0"?>
|
2
2
|
<package version="3.0"
|
3
|
-
|
4
|
-
|
3
|
+
unique-identifier="pub-id"
|
4
|
+
xmlns="http://www.idpf.org/2007/opf">
|
5
5
|
<metadata xmlns:dc="http://purl.org/dc/elements/1.1/">
|
6
6
|
<dc:identifier id="pub-id">da265185-8da8-462d-a146-17dd388f61fc</dc:identifier>
|
7
7
|
|
@@ -38,6 +38,11 @@
|
|
38
38
|
<dc:creator id="creator02">John Tenniel</dc:creator>
|
39
39
|
<meta refines="#creator02" property="role" scheme="marc:relators">ill</meta>
|
40
40
|
<meta refines="#creator02" property="display-seq">2</meta>
|
41
|
+
|
42
|
+
|
43
|
+
<link rel="onix-record" href="http://example.org/onix/12389347" refines="#pub-id"/>
|
44
|
+
<link rel="xmp-record" href="http://example.org/xmp/12389347"/>
|
45
|
+
<link rel="foaf:homepage" href="http://example.org/book-info/12389347" />
|
41
46
|
</metadata>
|
42
47
|
<manifest id="manifest-id">
|
43
48
|
<item id="nav"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: epub-parser
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.8
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-03-11 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rubygems-test
|
16
|
-
requirement: &
|
16
|
+
requirement: &11201540 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *11201540
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: rake
|
27
|
-
requirement: &
|
27
|
+
requirement: &11189400 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :development
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *11189400
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: pry
|
38
|
-
requirement: &
|
38
|
+
requirement: &11186320 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *11186320
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: pry-doc
|
49
|
-
requirement: &
|
49
|
+
requirement: &11185640 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: '0'
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *11185640
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: test-unit
|
60
|
-
requirement: &
|
60
|
+
requirement: &11184560 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ~>
|
@@ -65,10 +65,10 @@ dependencies:
|
|
65
65
|
version: '2'
|
66
66
|
type: :development
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *11184560
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: simplecov
|
71
|
-
requirement: &
|
71
|
+
requirement: &11183620 !ruby/object:Gem::Requirement
|
72
72
|
none: false
|
73
73
|
requirements:
|
74
74
|
- - ! '>='
|
@@ -76,10 +76,10 @@ dependencies:
|
|
76
76
|
version: '0'
|
77
77
|
type: :development
|
78
78
|
prerelease: false
|
79
|
-
version_requirements: *
|
79
|
+
version_requirements: *11183620
|
80
80
|
- !ruby/object:Gem::Dependency
|
81
81
|
name: thin
|
82
|
-
requirement: &
|
82
|
+
requirement: &11182540 !ruby/object:Gem::Requirement
|
83
83
|
none: false
|
84
84
|
requirements:
|
85
85
|
- - ! '>='
|
@@ -87,10 +87,10 @@ dependencies:
|
|
87
87
|
version: '0'
|
88
88
|
type: :development
|
89
89
|
prerelease: false
|
90
|
-
version_requirements: *
|
90
|
+
version_requirements: *11182540
|
91
91
|
- !ruby/object:Gem::Dependency
|
92
92
|
name: yard
|
93
|
-
requirement: &
|
93
|
+
requirement: &11181840 !ruby/object:Gem::Requirement
|
94
94
|
none: false
|
95
95
|
requirements:
|
96
96
|
- - ! '>='
|
@@ -98,10 +98,32 @@ dependencies:
|
|
98
98
|
version: '0'
|
99
99
|
type: :development
|
100
100
|
prerelease: false
|
101
|
-
version_requirements: *
|
101
|
+
version_requirements: *11181840
|
102
|
+
- !ruby/object:Gem::Dependency
|
103
|
+
name: gem-man
|
104
|
+
requirement: &11122520 !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ! '>='
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
110
|
+
type: :development
|
111
|
+
prerelease: false
|
112
|
+
version_requirements: *11122520
|
113
|
+
- !ruby/object:Gem::Dependency
|
114
|
+
name: ronn
|
115
|
+
requirement: &11120840 !ruby/object:Gem::Requirement
|
116
|
+
none: false
|
117
|
+
requirements:
|
118
|
+
- - ! '>='
|
119
|
+
- !ruby/object:Gem::Version
|
120
|
+
version: '0'
|
121
|
+
type: :development
|
122
|
+
prerelease: false
|
123
|
+
version_requirements: *11120840
|
102
124
|
- !ruby/object:Gem::Dependency
|
103
125
|
name: epzip
|
104
|
-
requirement: &
|
126
|
+
requirement: &11119120 !ruby/object:Gem::Requirement
|
105
127
|
none: false
|
106
128
|
requirements:
|
107
129
|
- - ! '>='
|
@@ -109,10 +131,10 @@ dependencies:
|
|
109
131
|
version: '0'
|
110
132
|
type: :development
|
111
133
|
prerelease: false
|
112
|
-
version_requirements: *
|
134
|
+
version_requirements: *11119120
|
113
135
|
- !ruby/object:Gem::Dependency
|
114
136
|
name: epubcheck
|
115
|
-
requirement: &
|
137
|
+
requirement: &12151080 !ruby/object:Gem::Requirement
|
116
138
|
none: false
|
117
139
|
requirements:
|
118
140
|
- - ! '>='
|
@@ -120,10 +142,10 @@ dependencies:
|
|
120
142
|
version: '0'
|
121
143
|
type: :development
|
122
144
|
prerelease: false
|
123
|
-
version_requirements: *
|
145
|
+
version_requirements: *12151080
|
124
146
|
- !ruby/object:Gem::Dependency
|
125
147
|
name: epub_validator
|
126
|
-
requirement: &
|
148
|
+
requirement: &12148200 !ruby/object:Gem::Requirement
|
127
149
|
none: false
|
128
150
|
requirements:
|
129
151
|
- - ! '>='
|
@@ -131,10 +153,10 @@ dependencies:
|
|
131
153
|
version: '0'
|
132
154
|
type: :development
|
133
155
|
prerelease: false
|
134
|
-
version_requirements: *
|
156
|
+
version_requirements: *12148200
|
135
157
|
- !ruby/object:Gem::Dependency
|
136
158
|
name: zipruby
|
137
|
-
requirement: &
|
159
|
+
requirement: &11234320 !ruby/object:Gem::Requirement
|
138
160
|
none: false
|
139
161
|
requirements:
|
140
162
|
- - ! '>='
|
@@ -142,10 +164,10 @@ dependencies:
|
|
142
164
|
version: '0'
|
143
165
|
type: :development
|
144
166
|
prerelease: false
|
145
|
-
version_requirements: *
|
167
|
+
version_requirements: *11234320
|
146
168
|
- !ruby/object:Gem::Dependency
|
147
169
|
name: rubyzip
|
148
|
-
requirement: &
|
170
|
+
requirement: &11232240 !ruby/object:Gem::Requirement
|
149
171
|
none: false
|
150
172
|
requirements:
|
151
173
|
- - ! '>='
|
@@ -153,10 +175,10 @@ dependencies:
|
|
153
175
|
version: '0'
|
154
176
|
type: :development
|
155
177
|
prerelease: false
|
156
|
-
version_requirements: *
|
178
|
+
version_requirements: *11232240
|
157
179
|
- !ruby/object:Gem::Dependency
|
158
180
|
name: enumerabler
|
159
|
-
requirement: &
|
181
|
+
requirement: &11227260 !ruby/object:Gem::Requirement
|
160
182
|
none: false
|
161
183
|
requirements:
|
162
184
|
- - ! '>='
|
@@ -164,10 +186,10 @@ dependencies:
|
|
164
186
|
version: '0'
|
165
187
|
type: :runtime
|
166
188
|
prerelease: false
|
167
|
-
version_requirements: *
|
189
|
+
version_requirements: *11227260
|
168
190
|
- !ruby/object:Gem::Dependency
|
169
191
|
name: nokogiri
|
170
|
-
requirement: &
|
192
|
+
requirement: &11365900 !ruby/object:Gem::Requirement
|
171
193
|
none: false
|
172
194
|
requirements:
|
173
195
|
- - ! '>='
|
@@ -175,10 +197,10 @@ dependencies:
|
|
175
197
|
version: '0'
|
176
198
|
type: :runtime
|
177
199
|
prerelease: false
|
178
|
-
version_requirements: *
|
200
|
+
version_requirements: *11365900
|
179
201
|
- !ruby/object:Gem::Dependency
|
180
202
|
name: addressable
|
181
|
-
requirement: &
|
203
|
+
requirement: &11363620 !ruby/object:Gem::Requirement
|
182
204
|
none: false
|
183
205
|
requirements:
|
184
206
|
- - ! '>='
|
@@ -186,7 +208,7 @@ dependencies:
|
|
186
208
|
version: '0'
|
187
209
|
type: :runtime
|
188
210
|
prerelease: false
|
189
|
-
version_requirements: *
|
211
|
+
version_requirements: *11363620
|
190
212
|
description: Parse EPUB 3 book loosely
|
191
213
|
email:
|
192
214
|
- KitaitiMakoto@gmail.com
|
@@ -227,6 +249,7 @@ files:
|
|
227
249
|
- lib/epub/publication/package/manifest.rb
|
228
250
|
- lib/epub/publication/package/metadata.rb
|
229
251
|
- lib/epub/publication/package/spine.rb
|
252
|
+
- man/epubinfo.1.ronn
|
230
253
|
- schemas/epub-nav-30.rnc
|
231
254
|
- schemas/epub-nav-30.sch
|
232
255
|
- schemas/epub-xhtml-30.sch
|
@@ -256,7 +279,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
256
279
|
version: '0'
|
257
280
|
segments:
|
258
281
|
- 0
|
259
|
-
hash: -
|
282
|
+
hash: -1773548056502971517
|
260
283
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
261
284
|
none: false
|
262
285
|
requirements:
|
@@ -265,7 +288,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
265
288
|
version: '0'
|
266
289
|
segments:
|
267
290
|
- 0
|
268
|
-
hash: -
|
291
|
+
hash: -1773548056502971517
|
269
292
|
requirements: []
|
270
293
|
rubyforge_project:
|
271
294
|
rubygems_version: 1.8.8
|