• Restructure test

  • Restructure Rake tasks


  • Add Rubyzip adapter


  • [BUG FIX]Fix a bug that epubinfo doesn’t handle navigation properly


  • [BUG FIX]Prevent epubinfo tool raise exception when no nav elements

  • Tiny modifcation on Zip archive manipulation

  • Remove version specification from Nokogiri to migrate to Ruby 3.1


  • [BUG FIX]Handle the case EPUB path is a Pathname


  • [BUG FIX]Fix navigation type check bug

  • Add feature to show navigations to epubinfo command-line tool


  • Encode file name passed from file system on Unix


  • [BUG FIX]Fix a bug that epub-cover refers out of scope variable

  • [BUG FIX]Fix a bug that epubinfo command with --words or --chars option causes load error if there is not Nokogiri in environment

  • [BUG FIX]Fix a bug that REXML::Element#content ignores descendant nodes


  • Add Oga backend for XML document


  • [REFACTORING]Make submodules for XMLDocument::Refinements

  • [BUG FIX]Make epub:type a Set



  • [REFACTORING]Add EPUB::Parser::NokogiriAttributeWithPrefix and use Nokogiri::XML::Node#attribute_with_prefix instead of EPUB::Parser::Utils#extract_attribute

  • Set default value for detect_encoding argument for EPUB::Publication::Package::Manifest::Item#read to false

  • Make XML library switchable between REXML and Nokogiri

  • Make REXML a default XML backend



  • [BUG FIX]Ignore fragment when find item by relative IRI

  • Enable PrettyBacktrace only when specified by env var for testing performance



  • [BUG FIX]Use UnpackedURI adapter for URI

  • [BREAKING CHANGE]Remove deprecated second argument from EPUB::Parser::Publication#initialize

  • Add detect_encoding keyword argument to Publication::Package::Manifest::Item#read and ContentDocument::XHTML#read


  • Use epub-cfi gem for EPUB CFI


  • Load epub/parser.rb in epub/parser/cfi.rb to allow to use Parser::CFI independently

  • Make CFI comparable. Now can call CFI#==

  • Include Publication::Package::Spine::Itemref in `Searcher.search_element’s result


  • Wrong release. I’m sorry.


  • Fix a bug that Searcher.search_element returns wrong CFI

  • Add Searcher.search_by_cfi


  • Change Searcher API: #search → #search_text

  • Add Searcher.search_element


  • Add EPUB::Metadata#children to keep all child emements to count them on CFI search

  • Allow class including EPUB to intialize with extra arguments(Thanks, skukx!)


  • Add EPUB::Publication::Package::Metadata#package_identifier as alias of #release_identifier, which is defined in EPUB Publication 3.0 spec

  • [BUG FIX]Metadata#modified returns modified with no refiners

  • Make second argument for EPUB::Parser::Publication.new deprecated

  • Add META-INF/metadata.xml support defined in [EPUB Multiple-Rendition Publications 1.0][multi-rendition]

  • Add EPUB::Book::Features#packages and #default_rendition

  • [BUG FIX]Don’t raise error when using Zipruby container adapter


  • [BUG FIX]Don’t load Zip/Ruby if unneccessary

  • Raise error when PhysicalContainer::ArchiveZip fails find entry

  • Remove unused files in schemas directory

  • Add EPUB::CFI::PhysicalContainer.find_adapter


  • Bug fix for EPUB::CFI::Location#<⇒

  • Change default physical container adapter from EPUB::OCF::PhysicalContainer::ZipRuby to EPUB::OCF::PhysicalContainer::ArchiveZip

  • Add EPUB::CFI::Step#element? and #character_data?

  • Change attribute name: EPUB::CFI::Step#stepEPUB::CFI::Step#value, EPUB::CFI::CharacterOffset#offsetEPUB::CFI::CharacterOffset#value

  • Show modified on epubinfo command


  • Change the name of physical container adapter for file system: :File → :UnpackedDirectory

  • Add EPUB::Publication::Package::Manifest::Item#full_path

  • Make #href= acceptable String

  • Implement EPUB::CFI and EPUB::Parser::CFI

  • Remove nokogumbo from dependencies. It ommits head and body elements

  • Remove Cucumber and Cucumber features

  • Add EPUB::Publication::Package::Metadata#modified and EPUB::Book::Features#modified

  • Add EPUB::Book::Features#release_identifier


  • [BUGFIX]Item#entry_name returns normalized IRI


  • Remove deprecated EPUB::Constants::MediaType::UnsupportedError. Use UnsupportedMediatType instead.

  • Make it possible to use archive-zip gem to extract contents from EPUB package via EPUB::OCF::PhysicalContainer::ArchiveZip

  • Add warning about default physical container adapter change

  • Make it possible to extract contents from the web via EPUB::OCF::PhysicalContainer::UnpackedURI. See ExtractContentsFromWeb for details.


  • Introduce abstraction layer for OCF physical container

  • Add EPUB::OCF::PhysicalContainer::File and make it possible to parse file system directory as an EPUB file. See UnpackedArchive for details.

  • Remove EPUB::Parser::OCF::CONTAINER_FILE and other constants


  • Introduce Nokogumbo for XHTML Content Documents

  • Stop support for Ruby 1.9

  • Remove EPUB.included method. Now including EPUB module empowers nothing of EPUB features. Include EPUB::Book::Features instead.

  • Add EPUB::Searcher::XHTML::Seamless and make it default searcher

  • Add EPUB::Publication::Package::Manifest#each_nav

  • Stop to use enumerabler gem


  • Explicity #close each zip member file that has been opened via #fopen(Thanks, xunker!)

  • Don’t set encoding when content is not text


  • [Experimental]Add EPUB::Searcher module. See Searcher for details

  • Detect and set character encoding in EPUB::Publication::Package::Item#read


  • Remove EPUB.parse method

  • Remove EPUB::Publication::Package::Metadata#to_hash

  • Add EPUB::Publication::Package::Metadata::Identifier for ad-hoc scheme attribute and #isbn? method

  • Remove MethodDecorators::Deprecated

  • Make EPUB::Parser::OCF::CONTAINER_FILE and other constants deprecated

  • Make EPUB::Publication::Package::Metadata::Link#rel a Set

  • Add exception class EPUB::Constants::MediaType::UnsupportedMediaType

  • Make EPUB::Constants::MediaType::UnsupportedError deprecated. Use UnsupportedMediatType instead

  • Add EPUB::Publication::Package::Item#cover_image?

  • Add EPUB::Book::Features module and move methods of EPUB module to it(Thanks, takahashim!)

  • Make including EPUB deprecated

  • Parse hidden attribute of nav elements

  • [Experimental]Add EPUB::ContentDocument::Navigation::Item#traverse


  • Add ContentDocument::XHTML#title

  • Add Manifest::Item#xhtml?

  • Add --words and --chars options to epubinfo command which count words and charactors of XHTMLs in EPUB file

  • API change: OCF::Container::Rootfile#full_path became Addressable::URI object rather than String. EPUB#rootfile_path still returns String

  • Add ContentDocument::XHTML#rexml which returns document as REXML::Document object

  • Add ContentDocument::XHTML#nokogiri which returns document as Nokogiri::XML::Document object

  • Inspect more readbly


  • Fixed-Layout Documents support

  • Define ContentDocument::XHTML#top_level?

  • Define Spine::Itemref#page_spread and #page_spread=

  • Define some utility methods around Manifest::Item and Spine::Itemref

  • Manifest::Item#itemref

  • Spine::Itemref#item=


  • Add EPUB::Parser::Utils module

  • Add a command-line tool epub-open

  • Add support for XHTML Navigation Document

  • Make EPUB::Publication::Package::Metadata#to_hash obsolete. Use #to_h instead

  • Add utility methods EPUB#description, EPUB#date and EPUB#unique_identifier


  • Fix a bug that Item#read couldn’t read file when href is percent-encoded(Thanks, gambhiro!)


  • Parse package@prefix and attach it as Package#prefix

  • Manifest::Item#iri was removed. It have existed for files in unzipped epub books but now EPUB Parser retrieves files from zip archive directly. #href now returns Addressable::URI object.

  • Metadata::Link#iri: ditto.

  • Guide::Reference#iri: ditto.