Sha256: 02f9eaf6bf09639c42fef09275689a7f1d70e3c0553075ccf9d0f3692397a0c6

Contents?: true

Size: 1.37 KB

Versions: 1

Compression:

Stored size: 1.37 KB

Contents

require 'archive/zip'

module EPUB
  class OCF
    class PhysicalContainer
      class ArchiveZip < self
        def initialize(container_path)
          super
          @entries = {}
          @last_iterated_entry_index = 0
        end

        def open
          Archive::Zip.open @container_path do |archive|
            @archive = archive
            begin
              yield self
            ensure
              @archive = nil
            end
          end
        end

        def read(path_name)
          if @archive
            target_index = @entries[path_name]
            @archive.each.with_index do |entry, index|
              if target_index
                if target_index == index
                  return entry.file_data.read
                else
                  next
                end
              end
              next if index < @last_iterated_entry_index
              # We can force encoding UTF-8 becase EPUB spec allows only UTF-8 filenames
              entry_path = entry.zip_path.force_encoding('UTF-8')
              @entries[entry_path] = index
              @last_iterated_entry_index = index
              if entry_path == path_name
                return entry.file_data.read
              end
            end

            raise NoEntry
          else
            open {|container| container.read(path_name)}
          end
        end
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
epub-parser-0.2.5 lib/epub/ocf/physical_container/archive_zip.rb