epub-parser 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
data/README.markdown CHANGED
@@ -37,6 +37,8 @@ REQUIREMENTS
37
37
 
38
38
  CHANGELOG
39
39
  ---------
40
+ ### 0.1.2
41
+ * Fix a bug that `Item#read` couldn't read file when `href` is percent-encoded(Thanks, gambhiro!)
40
42
 
41
43
  ### 0.1.1
42
44
  * Parse package@prefix and attach it as `Package#prefix`
data/Rakefile CHANGED
@@ -12,18 +12,22 @@ task :test => 'test:default'
12
12
  namespace :test do
13
13
  task :default => [:build, :test]
14
14
 
15
+ desc 'Run all tests'
16
+ task :all => [:build, :test, :cucumber]
17
+
18
+ desc 'Build test fixture EPUB file'
19
+ task :build => :clean do
20
+ input_dir = 'test/fixtures/book'
21
+ sh "epzip #{input_dir}"
22
+ end
23
+
15
24
  Rake::TestTask.new do |task|
16
25
  task.test_files = FileList['test/**/test_*.rb']
17
26
  task.warning = true
18
27
  task.options = '--no-show-detail-immediately --verbose'
19
28
  end
20
29
 
21
- desc 'Build the test fixture EPUB'
22
- task :build do
23
- input_dir = 'test/fixtures/book'
24
- FileList["#{input_dir}/**/*"]
25
- sh "epzip #{input_dir}"
26
- end
30
+ Cucumber::Rake::Task.new
27
31
  end
28
32
 
29
33
 
@@ -31,21 +35,19 @@ YARD::Rake::YardocTask.new do |task|
31
35
  task.files = %w[- wiki/*.md]
32
36
  end
33
37
 
34
- gem_helper = Bundler::GemHelper.new
35
-
36
- desc "Build epub-parser-#{EPUB::Parser::VERSION}.gem into the pkg directory."
37
- task :build => :yard do
38
- gem_helper.build_gem
39
- end
38
+ namespace :gem do
39
+ desc "Build epub-parser-#{EPUB::Parser::VERSION}.gem into the pkg directory."
40
+ task :build => :yard do
41
+ Bundler::GemHelper.new.build_gem
42
+ end
40
43
 
41
- desc "Build and install epub-parser-#{EPUB::Parser::VERSION}.gem into system gems."
42
- task :install => :yard do
43
- gem_helper.install_gem
44
- end
44
+ desc "Build and install epub-parser-#{EPUB::Parser::VERSION}.gem into system gems."
45
+ task :install => :yard do
46
+ Bundler::GemHelper.new.install_gem
47
+ end
45
48
 
46
- desc "Create tag v#{EPUB::Parser::VERSION} and build and push epub-parser-#{EPUB::Parser::VERSION}.gem to Rubygems"
47
- task :release => :yard do
48
- gem_helper.release_gem
49
+ desc "Create tag v#{EPUB::Parser::VERSION} and build and push epub-parser-#{EPUB::Parser::VERSION}.gem to Rubygems"
50
+ task :release => :yard do
51
+ Bundler::GemHelper.new.release_gem
52
+ end
49
53
  end
50
-
51
- Cucumber::Rake::Task.new
data/bin/epubinfo CHANGED
@@ -26,10 +26,10 @@ unless file
26
26
  abort
27
27
  end
28
28
 
29
- book = EPUB::Parser.parse file
29
+ book = EPUB::Parser.parse(file)
30
30
  data = {'Title' => [book.title]}
31
- data.merge!(book.package.metadata.to_hash)
32
- data['Unique identifier'] = [book.package.metadata.unique_identifier]
31
+ data.merge!(book.metadata.to_hash)
32
+ data['Unique identifier'] = [book.metadata.unique_identifier]
33
33
  data['EPUB Version'] = [book.package.version]
34
34
  if options[:format] == :line
35
35
  key_width = data.keys.map {|k| k.length}.max + 3
data/epub-parser.gemspec CHANGED
@@ -16,9 +16,13 @@ Gem::Specification.new do |s|
16
16
 
17
17
  s.files = `git ls-files`.split("\n")
18
18
  .push('test/fixtures/book/OPS/ルートファイル.opf')
19
+ .push('test/fixtures/book/OPS/日本語.xhtml')
20
+ .push(Dir['wiki/*.md'])
19
21
  .push(Dir['doc/*'])
20
- s.files.delete('"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"')
21
- s.test_files = `git ls-files -- {test,spec,features}/**/*.rb`.split("\n")
22
+ s.files.reject! do |fn|
23
+ ['"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"', '"test/fixtures/book/OPS/\346\227\245\346\234\254\350\252\236.xhtml"'].include? fn
24
+ end
25
+ s.test_files = s.files & Dir['{test,spec,features}/**/*.{rb,feature}']
22
26
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
23
27
  s.require_paths = ["lib"]
24
28
  s.has_rdoc = 'yard'
@@ -0,0 +1,6 @@
1
+ Feature: We can see information about EPUB file
2
+
3
+ Scenario: See info about existing EPUB file
4
+ Given the file "test/fixtures/book.epub" exists
5
+ When I successfully run `bundle exec epubinfo /home/ikeda/ruby/projects/epub-parser/test/fixtures/book.epub`
6
+ Then the stdout should contain "The New French Cuisine Masters"
@@ -0,0 +1,5 @@
1
+ Given /^the file "([^"]*)" exists$/ do |file_name|
2
+ unless File.exist? File.join(File.dirname(__FILE__), '..', '..', file_name)
3
+ raise "File #{file_name} does not exist"
4
+ end
5
+ end
@@ -0,0 +1 @@
1
+ require 'aruba/cucumber'
@@ -21,7 +21,7 @@ module EPUB
21
21
  document.search('/xhtml:html/xhtml:body//xhtml:nav', EPUB::NAMESPACES).collect {|elem| parse_navigation elem}
22
22
  end
23
23
 
24
- # @param [Nokogiri::XML::Element] nav nav element
24
+ # @param [Nokogiri::XML::Element] element nav element
25
25
  # @return [EPUB::ContentDocument::Navigation::Nav] nav Nav object
26
26
  def parse_navigation(element)
27
27
  nav = EPUB::ContentDocument::Navigation::Nav.new
@@ -33,7 +33,7 @@ module EPUB
33
33
 
34
34
  private
35
35
 
36
- # @param [Nokogiri::XML::Element] nav nav element
36
+ # @param [Nokogiri::XML::Element] element nav element
37
37
  # @return [String] heading heading text
38
38
  def find_heading(element)
39
39
  heading = element.xpath('./xhtml:h1|xhtml:h2|xhtml:h3|xhtml:h4|xhtml:h5|xhtml:h6|xhtml:hgroup', EPUB::NAMESPACES).first
@@ -119,7 +119,6 @@ module EPUB
119
119
  id_map.values.each do |hsh|
120
120
  next unless hsh[:refiners]
121
121
  next unless hsh[:metadata]
122
- hsh[:metadata].refiners = hsh[:refiners]
123
122
  hsh[:refiners].each {|meta| meta.refines = hsh[:metadata]}
124
123
  end
125
124
 
@@ -1,5 +1,5 @@
1
1
  module EPUB
2
2
  class Parser
3
- VERSION = "0.1.1"
3
+ VERSION = "0.1.2"
4
4
  end
5
5
  end
@@ -61,7 +61,7 @@ module EPUB
61
61
  def read
62
62
  rootfile = Addressable::URI.parse(manifest.package.book.ocf.container.rootfile.full_path)
63
63
  Zip::Archive.open(manifest.package.book.epub_file) {|zip|
64
- path = rootfile + href.request_uri
64
+ path = Addressable::URI.unescape(rootfile + href.normalize.request_uri)
65
65
  zip.fopen(path.to_s).read
66
66
  }
67
67
  end
@@ -46,7 +46,7 @@ module EPUB
46
46
  metas.select {|meta| meta.primary_expression?}
47
47
  end
48
48
 
49
- module Refinable
49
+ module Refinee
50
50
  PROPERTIES = %w[ alternate-script display-seq file-as group-position identifier-type meta-auth role title-type ]
51
51
 
52
52
  attr_writer :refiners
@@ -59,13 +59,13 @@ module EPUB
59
59
  met = voc.gsub(/-/, '_')
60
60
  attr_writer met
61
61
  define_method met do
62
- refiners.select {|refiner| refiner.property == voc}.first
62
+ refiners.selector {|refiner| refiner.property == voc}.first
63
63
  end
64
64
  end
65
65
  end
66
66
 
67
67
  class DCMES
68
- include Refinable
68
+ include Refinee
69
69
 
70
70
  attr_accessor :content, :id, :lang, :dir
71
71
 
@@ -85,14 +85,19 @@ module EPUB
85
85
  end
86
86
 
87
87
  class Meta
88
- include Refinable
88
+ include Refinee
89
89
 
90
- attr_accessor :property, :refines, :id, :scheme, :content
90
+ attr_accessor :property, :id, :scheme, :content
91
+ attr_reader :refines
92
+
93
+ def refines=(refinee)
94
+ @refines = refinee
95
+ refinee.refiners << self
96
+ end
91
97
 
92
98
  def refines?
93
99
  ! refines.nil?
94
100
  end
95
-
96
101
  alias subexpression? refines?
97
102
 
98
103
  def primary_expression?
@@ -105,9 +110,15 @@ module EPUB
105
110
  end
106
111
 
107
112
  class Link
108
- include Refinable
113
+ include Refinee
109
114
 
110
- attr_accessor :href, :rel, :id, :refines, :media_type
115
+ attr_accessor :href, :rel, :id, :media_type
116
+ attr_reader :refines
117
+
118
+ def refines=(refinee)
119
+ @refines = refinee
120
+ refinee.refiners << self
121
+ end
111
122
  end
112
123
  end
113
124
  end
@@ -0,0 +1,10 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE html>
3
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
4
+ <head>
5
+ <title>エンコード済み日本語</title>
6
+ </head>
7
+ <body>
8
+ <p>これはパーセントエンコードされた日本語ファイル名のドキュメントです。</p>
9
+ </body>
10
+ </html>
@@ -0,0 +1,10 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE html>
3
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
4
+ <head>
5
+ <title>Containing Space</title>
6
+ </head>
7
+ <body>
8
+ <p>This document contains space in file name.</p>
9
+ </body>
10
+ </html>
@@ -0,0 +1,10 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE html>
3
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
4
+ <head>
5
+ <title>Containing%20Space</title>
6
+ </head>
7
+ <body>
8
+ <p>This document contains "%20" in file name.</p>
9
+ </body>
10
+ </html>
@@ -88,11 +88,25 @@
88
88
  <item id="external-css"
89
89
  href="http://example.net/stylesheets/common.css"
90
90
  media-type="text/css"/>
91
+ <item id="containing-space"
92
+ href="containing space.xhtml"
93
+ media-type="application/xhtml+xml"/>
94
+ <item id="containing-encoded-space"
95
+ href="containing%20space.xhtml"
96
+ media-type="application/xhtml+xml"/>
97
+ <item id="japanese-filename"
98
+ href="日本語.xhtml"
99
+ media-type="application/xhtml+xml"/>
100
+ <item id="encoded-japanese-filename"
101
+ href="%E6%97%A5%E6%9C%AC%E8%AA%9E.xhtml"
102
+ media-type="application/xhtml+xml"/>
91
103
  </manifest>
92
104
  <spine>
93
105
  <itemref idref="nav"/>
94
106
  <itemref idref="manifest-item-1"/>
95
107
  <itemref idref="manifest-item-2"/>
108
+ <itemref idref="containing-encoded-space"/>
109
+ <itemref idref="encoded-japanese-filename"/>
96
110
  </spine>
97
111
  <guide>
98
112
  <reference type="cover" href="cover.xhtml#start" title="カバー"/>
@@ -0,0 +1,10 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE html>
3
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
4
+ <head>
5
+ <title>日本語</title>
6
+ </head>
7
+ <body>
8
+ <p>これは日本語文字のファイル名です。</p>
9
+ </body>
10
+ </html>
@@ -27,8 +27,15 @@ class TestParserPublication < Test::Unit::TestCase
27
27
  end
28
28
 
29
29
  def test_has_prefixes_for_vocabulary
30
- assert_equal ({'foaf' => 'http://xmlns.com/foaf/spec/', 'dbp' => 'http://dbpedia.org/ontology/'}),
31
- @package.prefix
30
+ expected = {'foaf' => 'http://xmlns.com/foaf/spec/',
31
+ 'dbp' => 'http://dbpedia.org/ontology/'}
32
+ assert_equal expected, @package.prefix
33
+ end
34
+
35
+ def test_has_empty_hash_as_prefix_when_no_prefix_attribute
36
+ parser = EPUB::Parser::Publication.new('<package></package>', '')
37
+ package = parser.parse_package
38
+ assert_empty package.prefix
32
39
  end
33
40
 
34
41
  class TestParseMetadata < TestParserPublication
@@ -71,8 +78,8 @@ class TestParserPublication < Test::Unit::TestCase
71
78
  @manifest = @parser.parse_manifest
72
79
  end
73
80
 
74
- def test_manifest_has_12_items
75
- assert_equal 12, @manifest.items.length
81
+ def test_manifest_has_16_items
82
+ assert_equal 16, @manifest.items.length
76
83
  end
77
84
 
78
85
  def test_item_has_relative_path_as_href_attribute
@@ -93,6 +100,12 @@ class TestParserPublication < Test::Unit::TestCase
93
100
  assert_equal 'html', doc.root.name
94
101
  end
95
102
 
103
+ def test_item_unescape_href_when_reading_file
104
+ item = EPUB::Parser.parse('test/fixtures/book.epub').package.manifest['containing-encoded-space']
105
+ doc = Nokogiri.HTML(item.read)
106
+ assert_equal 'Containing Space', (doc/'title').first.content
107
+ end
108
+
96
109
  def test_iri_of_item_is_case_sensitive
97
110
  manifest = EPUB::Parser.parse('test/fixtures/book.epub').package.manifest
98
111
 
@@ -151,8 +164,8 @@ class TestParserPublication < Test::Unit::TestCase
151
164
  @spine = @parser.parse_spine
152
165
  end
153
166
 
154
- def test_each_itemref_yields_itemref_in_order_on_spine_element
155
- expected = %w[nav manifest-item-1 manifest-item-2].map {|idref|
167
+ def atest_each_itemref_yields_itemref_in_order_on_spine_element
168
+ expected = %w[nav manifest-item-1 manifest-item-2 containing-space japanese-filename].map {|idref|
156
169
  itemref = EPUB::Publication::Package::Spine::Itemref.new
157
170
  itemref.id = nil
158
171
  itemref.spine = @spine
@@ -13,4 +13,20 @@ class TestPublication < Test::Unit::TestCase
13
13
  package.metadata = another_metadata
14
14
  assert_nil metadata.package
15
15
  end
16
+
17
+ class TestMetadata < TestPublication
18
+ def test_meta_refines_setter_connect_refinee_to_the_meta
19
+ refiner = EPUB::Publication::Package::Metadata::Meta.new
20
+ refinee = EPUB::Publication::Package::Metadata::Meta.new
21
+ refiner.refines = refinee
22
+ assert_same refinee.refiners.first, refiner
23
+ end
24
+
25
+ def test_link_refines_setter_connect_refinee_to_the_link
26
+ refiner = EPUB::Publication::Package::Metadata::Link.new
27
+ refinee = EPUB::Publication::Package::Metadata::Meta.new
28
+ refiner.refines = refinee
29
+ assert_same refinee.refiners.first, refiner
30
+ end
31
+ end
16
32
  end
data/wiki/Home.md ADDED
@@ -0,0 +1,114 @@
1
+ EPUB Parser gem parses EPUB 3 book loosely.
2
+
3
+ Installation
4
+ ============
5
+
6
+ gem install epub-parser
7
+
8
+ Usage
9
+ =====
10
+
11
+ As a command-line tool
12
+ ----------------------
13
+
14
+ epubinfo path/to/book.epub
15
+
16
+ To see help:
17
+
18
+ epubinfo -h
19
+
20
+ As a library
21
+ ------------
22
+
23
+ Use `EPUB::Parser.parse` at first:
24
+
25
+ require 'epub/parser'
26
+
27
+ book = EPUB::Parser.parse '/path/to/book.epub'
28
+
29
+ This book object can yield page by spine's order(spine defines the order to read that the author determines):
30
+
31
+ book.each_page_on_spine do |page|
32
+ # do something...
33
+ end
34
+
35
+ `page` above is a [`EPUB::Publication::Package::Manifest::Item`][1] object and you can call `#href` to see where is the page file:
36
+
37
+ [1]:http://rubydoc.info/gems/epub-parser/EPUB/Publication/Package/Manifest/Item
38
+
39
+ book.each_page_on_spine do |page|
40
+ file = page.href # => path/to/page/in/zip/archive
41
+ html = Zip::Archive.open('/path/to/book.epub') {|zip|
42
+ zip.fopen(file.to_s).read
43
+ }
44
+ end
45
+
46
+ And `Item` provides syntax suger `#read` for above:
47
+
48
+ html = page.read
49
+ doc = Nokogiri.HTML html
50
+ # do something with Nokogiri as always
51
+
52
+ For several utilities of Item, see [[Item]] page.
53
+
54
+ By the way, although `book` above is a `EPUB::Book` object, all features are provided by `EPUB` module. Therefore YourBook class can include the features of EPUB:
55
+
56
+ require 'epub'
57
+
58
+ class YourBook < ActiveRecord::Base
59
+ include EPUB
60
+ end
61
+
62
+ book = EPUB::Parser.parse(
63
+ 'uploaded-book.epub',
64
+ :class => YourBook # *************** pass YourBook class
65
+ )
66
+ book.instance_of? YourBook # => true
67
+ book.required = 'value for required field'
68
+ book.save!
69
+ book.each_page_on_spine do |epage|
70
+ page = YouBookPage.create(
71
+ :some_attr => 'some attr',
72
+ :content => epage.read,
73
+ :another_attr => 'another attr'
74
+ )
75
+ book.pages << page
76
+ end
77
+
78
+ You are also able to find YourBook object for the first:
79
+
80
+ book = YourBook.find params[:id]
81
+ ret = EPUB::Parser.parse(
82
+ 'uploaded-book.epub',
83
+ :book => book # ******************* pass your book instance
84
+ ) # => book
85
+ ret == book # => true; this API is not good I feel... Welcome suggestion!
86
+ # do something with your book
87
+
88
+ More documents comming soon..., hopefully :)
89
+
90
+ Requirements
91
+ ============
92
+
93
+ * libxml2 and libxslt for Nokogiri gem
94
+
95
+ Note
96
+ ====
97
+
98
+ This library is still in work.
99
+ Only a few features are implemented and APIs might be changed in the future.
100
+ Note that.
101
+
102
+ Currently implemented:
103
+
104
+ * container.xml of [EPUB Open Container Format (OCF) 3.0][]
105
+ * [EPUB Publications 3.0][]
106
+
107
+ [EPUB Open Container Format (OCF) 3.0]:http://idpf.org/epub/30/spec/epub30-ocf.html#sec-container-metainf-container.xml
108
+ [EPUB Publications 3.0]:http://idpf.org/epub/30/spec/epub30-publications.html
109
+
110
+ License
111
+ =======
112
+
113
+ This library is distributed under the term of the MIT Licence.
114
+ See [MIT-LICENSE](/epub/parser/blobs/master/MIT-LICENSE) file for more info.
data/wiki/Item.md ADDED
@@ -0,0 +1,80 @@
1
+ [[Home]] > **[[Item]]**
2
+
3
+ Overview
4
+ ========
5
+
6
+ When manipulating resources (XHTML, images, audio...) in EPUB, [`EPUB::Publication::Manifest::Item`](http://rubydoc.info/gems/epub-parser/EPUB/Publication/Package/Manifest/Item) object will be used.
7
+ And objects which `EPUB#each_page_on_spine` yields are also instances of this class.
8
+
9
+ Here's the tutorial of this class.
10
+
11
+ Getting Items
12
+ =============
13
+
14
+ Getting the `Item` object you want is due to other classes, mainly `EPUB` module:
15
+
16
+ book = EPUB::Parser.parse 'book.epub'
17
+ book.resouces # => all items including XHTMLs, CSSs, images, audios and so on
18
+ book.cover_image # => item representing cover image file
19
+ book.each_page_by_spine do |page|
20
+ page # => item in spine(order of "page" the author determined, often XHTML file)
21
+ end
22
+ book.package.manifest.navs # => navigation items(XHTML files including <nav> element)
23
+ book.package.manifest['item-id'] # => item referenced by the ID "item-id"
24
+
25
+ For the last two examples, knowledge for EPUB structure is required.
26
+
27
+ Using Items
28
+ ===========
29
+
30
+ Once you've got an `Item`, it provides informations about the item(file).
31
+
32
+ item.id # => the ID of the item
33
+ item.media_type # => media type like application/xhtml+xml
34
+ item.href # => Addressable::URI object which represents the IRI of the item
35
+ item.properties # => array of properties
36
+ item.fallback # => see the next section for details
37
+ item.fallback_chain # => ditto.
38
+ item.using_fallback_chain # => ditto.
39
+
40
+ And `Item` also provides some methods which helps you handle the item.
41
+
42
+ For example, for XHTML:
43
+
44
+ item.read # => content of the item
45
+ Nokogiri.HTML(item.read) #=> Nokogiri::HTML::Document object
46
+
47
+ For image:
48
+
49
+ uri = 'data:' + item.media_type + '; base64,' + Base64.encode64(item.read)
50
+ img = %Q!<img src="#{uri}" alt="#{item.id}">!
51
+
52
+ Fallback Chain
53
+ ==============
54
+
55
+ Some items have `fallback` attribute, which provides the item to be used when reading system(your app) cannot handle with given item for some reason(for example, media type not supported).
56
+
57
+ Of course, you can get it by calling `fallback` method:
58
+
59
+ item.fallback # => fallback `Item` or nil
60
+
61
+ Also you can use `use_fallback_chain` not to check if you can accept item or not for every item:
62
+
63
+ item.use_fallback_chain :supported => 'image/png' do |png|
64
+ # do something with PNG image
65
+ end
66
+
67
+ If item's media type is, for instance, 'image/x-eps', the fallback is used.
68
+ If the fallback item's media type is 'image/png', `png` variable means the item, if not, "fallback of fallback" will be checked.
69
+ Finally you can use the item you want, or `EPUB::MediaType::UnsupportedError` exception will be raised(if no item you can accept found).
70
+ Therefore, you should `rescue` clause:
71
+
72
+ # :unsupported option can also be used
73
+ # fallback chain will be followed until EPUB's Core Media Types found or UnsupportedError raised
74
+ begin
75
+ item.use_fallback_chain :unsupported => 'application/pdf' do |page|
76
+ # do something with item with core media type
77
+ end
78
+ rescue EPUB::MediaType::UnsupportedError => evar
79
+ # error handling
80
+ end
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.1.1
4
+ version: 0.1.2
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-16 00:00:00.000000000 Z
12
+ date: 2012-12-27 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rubygems-test
16
- requirement: &14987420 !ruby/object:Gem::Requirement
16
+ requirement: &11881060 !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: *14987420
24
+ version_requirements: *11881060
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: rake
27
- requirement: &14986340 !ruby/object:Gem::Requirement
27
+ requirement: &11879480 !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: *14986340
35
+ version_requirements: *11879480
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: pry
38
- requirement: &14984920 !ruby/object:Gem::Requirement
38
+ requirement: &11892900 !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: *14984920
46
+ version_requirements: *11892900
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: pry-doc
49
- requirement: &15155000 !ruby/object:Gem::Requirement
49
+ requirement: &11890900 !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: *15155000
57
+ version_requirements: *11890900
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: test-unit-full
60
- requirement: &15152760 !ruby/object:Gem::Requirement
60
+ requirement: &11888960 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: '0'
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *15152760
68
+ version_requirements: *11888960
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: simplecov
71
- requirement: &15151200 !ruby/object:Gem::Requirement
71
+ requirement: &11887240 !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: *15151200
79
+ version_requirements: *11887240
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: thin
82
- requirement: &15148720 !ruby/object:Gem::Requirement
82
+ requirement: &11919280 !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: *15148720
90
+ version_requirements: *11919280
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: yard
93
- requirement: &15163320 !ruby/object:Gem::Requirement
93
+ requirement: &11916000 !ruby/object:Gem::Requirement
94
94
  none: false
95
95
  requirements:
96
96
  - - ! '>='
@@ -98,10 +98,10 @@ dependencies:
98
98
  version: '0'
99
99
  type: :development
100
100
  prerelease: false
101
- version_requirements: *15163320
101
+ version_requirements: *11916000
102
102
  - !ruby/object:Gem::Dependency
103
103
  name: gem-man
104
- requirement: &15162500 !ruby/object:Gem::Requirement
104
+ requirement: &11914440 !ruby/object:Gem::Requirement
105
105
  none: false
106
106
  requirements:
107
107
  - - ! '>='
@@ -109,10 +109,10 @@ dependencies:
109
109
  version: '0'
110
110
  type: :development
111
111
  prerelease: false
112
- version_requirements: *15162500
112
+ version_requirements: *11914440
113
113
  - !ruby/object:Gem::Dependency
114
114
  name: ronn
115
- requirement: &15161460 !ruby/object:Gem::Requirement
115
+ requirement: &11913320 !ruby/object:Gem::Requirement
116
116
  none: false
117
117
  requirements:
118
118
  - - ! '>='
@@ -120,10 +120,10 @@ dependencies:
120
120
  version: '0'
121
121
  type: :development
122
122
  prerelease: false
123
- version_requirements: *15161460
123
+ version_requirements: *11913320
124
124
  - !ruby/object:Gem::Dependency
125
125
  name: epzip
126
- requirement: &15160700 !ruby/object:Gem::Requirement
126
+ requirement: &11936480 !ruby/object:Gem::Requirement
127
127
  none: false
128
128
  requirements:
129
129
  - - ! '>='
@@ -131,10 +131,10 @@ dependencies:
131
131
  version: '0'
132
132
  type: :development
133
133
  prerelease: false
134
- version_requirements: *15160700
134
+ version_requirements: *11936480
135
135
  - !ruby/object:Gem::Dependency
136
136
  name: epubcheck
137
- requirement: &15160160 !ruby/object:Gem::Requirement
137
+ requirement: &11935400 !ruby/object:Gem::Requirement
138
138
  none: false
139
139
  requirements:
140
140
  - - ! '>='
@@ -142,10 +142,10 @@ dependencies:
142
142
  version: '0'
143
143
  type: :development
144
144
  prerelease: false
145
- version_requirements: *15160160
145
+ version_requirements: *11935400
146
146
  - !ruby/object:Gem::Dependency
147
147
  name: epub_validator
148
- requirement: &15159440 !ruby/object:Gem::Requirement
148
+ requirement: &11934700 !ruby/object:Gem::Requirement
149
149
  none: false
150
150
  requirements:
151
151
  - - ! '>='
@@ -153,10 +153,10 @@ dependencies:
153
153
  version: '0'
154
154
  type: :development
155
155
  prerelease: false
156
- version_requirements: *15159440
156
+ version_requirements: *11934700
157
157
  - !ruby/object:Gem::Dependency
158
158
  name: aruba
159
- requirement: &15158500 !ruby/object:Gem::Requirement
159
+ requirement: &11934000 !ruby/object:Gem::Requirement
160
160
  none: false
161
161
  requirements:
162
162
  - - ! '>='
@@ -164,10 +164,10 @@ dependencies:
164
164
  version: '0'
165
165
  type: :development
166
166
  prerelease: false
167
- version_requirements: *15158500
167
+ version_requirements: *11934000
168
168
  - !ruby/object:Gem::Dependency
169
169
  name: enumerabler
170
- requirement: &15157640 !ruby/object:Gem::Requirement
170
+ requirement: &11933380 !ruby/object:Gem::Requirement
171
171
  none: false
172
172
  requirements:
173
173
  - - ! '>='
@@ -175,10 +175,10 @@ dependencies:
175
175
  version: '0'
176
176
  type: :runtime
177
177
  prerelease: false
178
- version_requirements: *15157640
178
+ version_requirements: *11933380
179
179
  - !ruby/object:Gem::Dependency
180
180
  name: zipruby
181
- requirement: &15157120 !ruby/object:Gem::Requirement
181
+ requirement: &11932600 !ruby/object:Gem::Requirement
182
182
  none: false
183
183
  requirements:
184
184
  - - ! '>='
@@ -186,10 +186,10 @@ dependencies:
186
186
  version: '0'
187
187
  type: :runtime
188
188
  prerelease: false
189
- version_requirements: *15157120
189
+ version_requirements: *11932600
190
190
  - !ruby/object:Gem::Dependency
191
191
  name: nokogiri
192
- requirement: &15156560 !ruby/object:Gem::Requirement
192
+ requirement: &11930860 !ruby/object:Gem::Requirement
193
193
  none: false
194
194
  requirements:
195
195
  - - ! '>='
@@ -197,10 +197,10 @@ dependencies:
197
197
  version: '0'
198
198
  type: :runtime
199
199
  prerelease: false
200
- version_requirements: *15156560
200
+ version_requirements: *11930860
201
201
  - !ruby/object:Gem::Dependency
202
202
  name: addressable
203
- requirement: &15155700 !ruby/object:Gem::Requirement
203
+ requirement: &11959220 !ruby/object:Gem::Requirement
204
204
  none: false
205
205
  requirements:
206
206
  - - ! '>='
@@ -208,7 +208,7 @@ dependencies:
208
208
  version: '0'
209
209
  type: :runtime
210
210
  prerelease: false
211
- version_requirements: *15155700
211
+ version_requirements: *11959220
212
212
  description: Parse EPUB 3 book loosely
213
213
  email:
214
214
  - KitaitiMakoto@gmail.com
@@ -226,6 +226,9 @@ files:
226
226
  - Rakefile
227
227
  - bin/epubinfo
228
228
  - epub-parser.gemspec
229
+ - features/epubinfo.feature
230
+ - features/step_definitions/epubinfo_steps.rb
231
+ - features/support/env.rb
229
232
  - lib/epub.rb
230
233
  - lib/epub/book.rb
231
234
  - lib/epub/constants.rb
@@ -256,8 +259,11 @@ files:
256
259
  - schemas/epub-xhtml-30.sch
257
260
  - schemas/ocf-container-30.rnc
258
261
  - test/fixtures/book/META-INF/container.xml
262
+ - test/fixtures/book/OPS/%E6%97%A5%E6%9C%AC%E8%AA%9E.xhtml
259
263
  - test/fixtures/book/OPS/CASE-SENSITIVE.xhtml
260
264
  - test/fixtures/book/OPS/case-sensitive.xhtml
265
+ - test/fixtures/book/OPS/containing space.xhtml
266
+ - test/fixtures/book/OPS/containing%20space.xhtml
261
267
  - test/fixtures/book/OPS/nav.xhtml
262
268
  - test/fixtures/book/mimetype
263
269
  - test/helper.rb
@@ -268,6 +274,9 @@ files:
268
274
  - test/test_parser_publication.rb
269
275
  - test/test_publication.rb
270
276
  - test/fixtures/book/OPS/ルートファイル.opf
277
+ - test/fixtures/book/OPS/日本語.xhtml
278
+ - wiki/Home.md
279
+ - wiki/Item.md
271
280
  - doc/method_list.html
272
281
  - doc/EPUB.html
273
282
  - doc/file.README.html
@@ -296,7 +305,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
296
305
  version: '0'
297
306
  segments:
298
307
  - 0
299
- hash: 2655157139786111314
308
+ hash: -1959705838620689710
300
309
  required_rubygems_version: !ruby/object:Gem::Requirement
301
310
  none: false
302
311
  requirements:
@@ -305,12 +314,22 @@ required_rubygems_version: !ruby/object:Gem::Requirement
305
314
  version: '0'
306
315
  segments:
307
316
  - 0
308
- hash: 2655157139786111314
317
+ hash: -1959705838620689710
309
318
  requirements: []
310
319
  rubyforge_project:
311
320
  rubygems_version: 1.8.8
312
321
  signing_key:
313
322
  specification_version: 3
314
323
  summary: EPUB 3 Parser
315
- test_files: []
324
+ test_files:
325
+ - features/epubinfo.feature
326
+ - features/step_definitions/epubinfo_steps.rb
327
+ - features/support/env.rb
328
+ - test/helper.rb
329
+ - test/test_epub.rb
330
+ - test/test_parser.rb
331
+ - test/test_parser_content_document.rb
332
+ - test/test_parser_ocf.rb
333
+ - test/test_parser_publication.rb
334
+ - test/test_publication.rb
316
335
  has_rdoc: yard