class AozoraZip::Core

Attributes

dirname[R]
text_file[R]

Public Class Methods

new(dirname = nil) click to toggle source
# File lib/aozora_zip/core.rb, line 18
def initialize(dirname = nil)
  @dirname = dirname

  if @dirname
    unless File.directory?(@dirname)
      raise AozoraZip::Error, "No such directory '#{dirname}'"
    end

    @text_file = find_text_file(@dirname)
  end
end
unzip(filename, dirname, **kargs) click to toggle source
# File lib/aozora_zip/core.rb, line 14
def self.unzip(filename, dirname, **kargs)
  self.new.unzip(filename, dirname, **kargs)
end
zip(filename, dirname, **kargs) click to toggle source
# File lib/aozora_zip/core.rb, line 10
def self.zip(filename, dirname, **kargs)
  self.new(dirname).zip(filename, **kargs)
end

Public Instance Methods

find_text_file(dir) click to toggle source
# File lib/aozora_zip/core.rb, line 30
def find_text_file(dir)
  path = Pathname.new(Dir.glob("#{dir}/*.txt")[0])
  path.relative_path_from(dir).to_s
end
text() click to toggle source
# File lib/aozora_zip/core.rb, line 35
def text
  AozoraZip::Text.new(text_file, self)
end
unzip(filename, dirname, force: nil, verbose: nil) click to toggle source
# File lib/aozora_zip/core.rb, line 61
def unzip(filename, dirname, force: nil, verbose: nil)
  if !File.exist?(filename)
    raise AozoraZip::Error, "No such file '#{filename}'"
  end

  if File.exist?(dirname) && !force
    raise AozoraZip::Error, "target directory '#{dirname}' already exists"
  end

  @dirname = dirname

  Zip::File.open(filename) do |f|
    f.each do |entry|
      next if (entry.directory? || entry.name.end_with?('/'))
      sep = if entry.name.start_with?('/')
              ''
            else
              '/'
            end
      filepath = dirname + sep + entry.name

      puts "extract #{filepath}" if verbose

      FileUtils.mkdir_p(File.dirname(filepath))
      entry.extract(filepath)
      FileUtils.touch(filepath, mtime: entry.time)
    end
  end

  @text_file = find_text_file(@dirname)
end
zip(filename, force: nil, verbose: nil) click to toggle source
# File lib/aozora_zip/core.rb, line 39
def zip(filename, force: nil, verbose: nil)
  if File.exist?(filename) && !force
    raise AozoraZip::Error, "target file '#{filename}' already exists"
  end

  Zip::File.open(filename, Zip::File::CREATE) do |f|
    Dir.chdir(dirname) do
      Dir.entries('.').each do |item|
        next if (item == '.' || item == '..')
        next if !File.file?(item)

        puts "add #{item}" if verbose

        fullpath = File.join(Dir.pwd, item)
        filetime = File.mtime(fullpath)
        entry = Zip::Entry.new(f, item, nil, nil, nil, nil, nil, nil, Zip::DOSTime.at(filetime))
        f.add(entry, fullpath)
      end
    end
  end
end