module Lingo::TextUtils

Constants

DEFAULT_MODE
GZIP_RE
STDIN_EXT
STDOUT_EXT

Private Instance Methods

_require_lib(lib) click to toggle source
# File lib/lingo/text_utils.rb, line 174
def _require_lib(lib)
  respond_to?(:require_lib, true) ? require_lib(lib) : require(lib)
end
_yield_obj(obj) { |obj| ... } click to toggle source
# File lib/lingo/text_utils.rb, line 178
def _yield_obj(obj)
  !block_given? ? obj : begin
    yield obj
  ensure
    obj.close
  end
end
agree?(msg) click to toggle source
# File lib/lingo/text_utils.rb, line 58
def agree?(msg)
  print "#{msg} (y/n) [n]: "

  case stdin.gets.chomp
    when /\Ano?\z/i, ''  then nil
    when /\Ay(?:es)?\z/i then true
    else puts 'Please enter "yes" or "no".'; agree?(msg)
  end
rescue Interrupt
  abort ''
end
bom_encoding(mode = 'r', encoding = nil) click to toggle source
# File lib/lingo/text_utils.rb, line 165
def bom_encoding(mode = 'r', encoding = nil)
  encoding = get_encoding(encoding)

  encoding && (mode.include?('r') || mode.include?('+')) &&
    encoding.name.start_with?('UTF-') ? "BOM|#{encoding}" : encoding
end
foreach(path, encoding = nil) { |line| ... } click to toggle source
# File lib/lingo/text_utils.rb, line 132
def foreach(path, encoding = nil)
  open(path, nil, encoding) { |io|
    io.each { |line| line.chomp!; yield line } }
end
foreach_csv(path, options = {}, encoding = nil, &block) click to toggle source
# File lib/lingo/text_utils.rb, line 137
def foreach_csv(path, options = {}, encoding = nil, &block)
  open_csv(path, nil, options, encoding) { |csv| csv.each(&block) }
end
get_encoding(encoding = nil, iv = :@encoding) click to toggle source
# File lib/lingo/text_utils.rb, line 160
def get_encoding(encoding = nil, iv = :@encoding)
  encoding ||
    (instance_variable_defined?(iv) ? instance_variable_get(iv) : nil)
end
get_path(path, ext) click to toggle source
# File lib/lingo/text_utils.rb, line 141
def get_path(path, ext)
  set_ext(path, ext).format { |directive|
    case directive
      when 'd', t = 't' then Time.now.strftime(t ? '%H%M%S' : '%Y%m%d')
      when 'c', l = 'l' then File.chomp_ext(File.basename(
        lingo.config.send("#{l ? :lang : :config}_file")))
    end
  }
end
open(path, mode = nil, encoding = nil, &block) click to toggle source
# File lib/lingo/text_utils.rb, line 78
def open(path, mode = nil, encoding = nil, &block)
  mode ||= DEFAULT_MODE

  _yield_obj(case mode
    when /r/ then stdin?(path) ? open_stdin(encoding) : File.exist?(path) ?
      open_path(path, mode, encoding) : raise(FileNotFoundError.new(path))
    when /w/ then stdout?(path) ? open_stdout(encoding) : overwrite?(path) ?
      open_path(path, mode, encoding) : raise(FileExistsError.new(path))
  end, &block)
end
open_csv(path, mode = nil, options = {}, encoding = nil, &block) click to toggle source
# File lib/lingo/text_utils.rb, line 89
def open_csv(path, mode = nil, options = {}, encoding = nil, &block)
  _require_lib('csv')

  open(path, mode, encoding) { |io|
    _yield_obj(CSV.new(io, options), &block) }
end
open_file(path, mode = nil, encoding = nil) click to toggle source
# File lib/lingo/text_utils.rb, line 113
def open_file(path, mode = nil, encoding = nil)
  File.open(path, mode ||= DEFAULT_MODE,
    encoding: bom_encoding(mode, encoding))
end
open_gzip(path, mode = nil, encoding = nil) click to toggle source
# File lib/lingo/text_utils.rb, line 118
def open_gzip(path, mode = nil, encoding = nil)
  _require_lib('zlib')

  case mode ||= DEFAULT_MODE
    when 'r', 'rb'
      @progress = false
      Zlib::GzipReader
    when 'w', 'wb'
      Zlib::GzipWriter
    else
      raise ArgumentError, 'invalid access mode %s' % mode
  end.open(path, encoding: get_encoding(encoding))
end
open_path(path, mode = nil, encoding = nil) click to toggle source
# File lib/lingo/text_utils.rb, line 105
def open_path(path, mode = nil, encoding = nil)
  mode ||= DEFAULT_MODE

  path =~ GZIP_RE ?
    open_gzip(path, mode, encoding) :
    open_file(path, mode, encoding)
end
open_stdin(encoding = nil) click to toggle source
# File lib/lingo/text_utils.rb, line 96
def open_stdin(encoding = nil)
  io = set_encoding(stdin, encoding)
  @progress ? StringIO.new(io.read) : io
end
open_stdout(encoding = nil) click to toggle source
# File lib/lingo/text_utils.rb, line 101
def open_stdout(encoding = nil)
  set_encoding(stdout, encoding)
end
overwrite?(path, unlink = false) click to toggle source
# File lib/lingo/text_utils.rb, line 51
def overwrite?(path, unlink = false)
  !File.exist?(path) || if agree?("#{path} already exists. Overwrite?")
    File.unlink(path) if unlink
    true
  end
end
set_encoding(io, encoding = nil) click to toggle source
# File lib/lingo/text_utils.rb, line 155
def set_encoding(io, encoding = nil)
  io.set_encoding(get_encoding(encoding))
  io
end
set_ext(path, ext) click to toggle source
# File lib/lingo/text_utils.rb, line 151
def set_ext(path, ext)
  File.set_ext(path.sub(GZIP_RE, ''), ".#{ext}")
end
stdin() click to toggle source
# File lib/lingo/text_utils.rb, line 70
def stdin
  respond_to?(:lingo, true) ? lingo.config.stdin : $stdin
end
stdin?(path) click to toggle source
# File lib/lingo/text_utils.rb, line 43
def stdin?(path)
  STDIN_EXT.include?(path)
end
stdout() click to toggle source
# File lib/lingo/text_utils.rb, line 74
def stdout
  respond_to?(:lingo, true) ? lingo.config.stdout : $stdout
end
stdout?(path) click to toggle source
# File lib/lingo/text_utils.rb, line 47
def stdout?(path)
  STDOUT_EXT.include?(path)
end