module Milkode::Util

Public Instance Methods

divide_shortpath(shortpath) click to toggle source

'package/to/a.txt' #=> 'package', 'to/a.txt' 'package' #=> 'package', nil

# File lib/milkode/common/util.rb, line 176
def divide_shortpath(shortpath)
  shortpath = shortpath[1..-1] if shortpath[0..0] == '/' # 先頭の'/'はカット
  a = shortpath.split('/')

  if (a.size >= 2)
    return a[0], a[1..-1].join('/')
  else
    return a[0], nil
  end
end
downcase?(str) click to toggle source
# File lib/milkode/common/util.rb, line 112
def downcase?(str)
  str == str.downcase
end
exist_command?(command) click to toggle source

指定したコマンドが存在するか?

# File lib/milkode/common/util.rb, line 235
def exist_command?(command)
  # open3 : Not working on Pure Windows
  # begin
  #   Open3.capture3('type', command)[2].exited?
  # rescue Errno::ENOENT
  #   false
  # end

  # whichr
  !(RubyWhich.new.which(command).empty?)
end
filename_to_utf8(str_from_file) click to toggle source
# File lib/milkode/common/util.rb, line 84
def filename_to_utf8(str_from_file)
  if platform_osx?
    if (ruby19?)
      str_from_file.encode('UTF-8', 'UTF8-MAC')
    else
      str_from_file
    end
  else
    Kconv.kconv(str_from_file, Kconv::UTF8)
  end
end
fuzzy_gotoline_keyword?(keyword) click to toggle source
# File lib/milkode/common/util.rb, line 124
def fuzzy_gotoline_keyword?(keyword)
  keyword =~ /\A.*:\d+\Z/
end
gem_version_more?(name, version) click to toggle source

gem_version_more?('rroonga', '2.1.0') #=> rroonga >= '2.1.0'

# File lib/milkode/common/util.rb, line 221
def gem_version_more?(name, version)
  Gem.loaded_specs[name].version >= Gem::Version.new(version)
end
git_url?(src) click to toggle source
# File lib/milkode/common/util.rb, line 187
def git_url?(src)
  (src =~ /^(?:git[:@])|(?:ssh:)|(?:\.git\Z)/) != nil
end
github_repo(src) click to toggle source
# File lib/milkode/common/util.rb, line 301
def github_repo(src)
  if src.match(/\Agit@github\.com:(.*)\.git\Z/)
    $1
  elsif src.match(/\A\w+:\/\/github\.com\/(.*)\.git\Z/)
    $1
  else
    nil
  end
end
gotoline_keyword?(keyword) click to toggle source
# File lib/milkode/common/util.rb, line 120
def gotoline_keyword?(keyword)
  keyword =~ /\A\/.*:\d+\Z/
end
gotoline_multi?(words) click to toggle source
# File lib/milkode/common/util.rb, line 166
def gotoline_multi?(words)
  if (words.join(" ") =~ /:\d+/)
    true
  else
    false
  end
end
groonga_table_sort(table, keys, options = {}) click to toggle source

互換性保持のため

# File lib/milkode/common/util.rb, line 226
def groonga_table_sort(table, keys, options = {})
  if gem_version_more?('rroonga', '2.1.0')
    table.sort(keys, options).map{|r| r.value}
  else
    table.sort(keys, options)
  end
end
highlight_keywords(src, keywords, css_class) click to toggle source
# File lib/milkode/common/util.rb, line 247
def highlight_keywords(src, keywords, css_class)
  # Init highlight_map
  hightlight_map = Array.new(src.length, nil)

  keywords.each do |keyword|
    pos = 0

    loop do 
      r = src.match(/#{Regexp.escape(keyword)}/i, pos) do |m|
        s = m.begin(0)
        l = keyword.length
        e = s+l
        (s...e).each {|i| hightlight_map[i] = 1 }
        pos = e
      end

      break if r.nil?
    end
  end

  # Delete html tag
  index = 0
  in_tag = false
  src.each_char do |char|
    in_tag = true               if char == '<'
    hightlight_map[index] = nil if in_tag
    in_tag = false              if char == '>'
    index += 1
  end

  # Output
  result = ""

  index = 0
  prev = nil
  src.each_char do |char|
    current = hightlight_map[index]

    if prev.nil? && current
      result += "<span class='#{css_class}'>"
    elsif prev && current.nil?
      result += "</span>"
    end

    result += char

    index += 1
    prev = current
  end
  result += "</span>" if prev

  result
end
ignore_case?(pattens, is_sensitive) click to toggle source
# File lib/milkode/common/util.rb, line 116
def ignore_case?(pattens, is_sensitive)
  !is_sensitive && (pattens.all? {|v| Util.downcase? v})
end
larger_than_oneline(content) click to toggle source
# File lib/milkode/common/util.rb, line 96
def larger_than_oneline(content)
  begin
    content && content.count($/) > 1      
  rescue ArgumentError
    true
  end
end
load_content(out, filename) click to toggle source
# File lib/milkode/common/util.rb, line 204
def load_content(out, filename)
  str = File.read(filename)
  begin
    Kconv.kconv(str, Kconv::UTF8)
  rescue ArgumentError
    warning_alert(out, "skip kconv. file size too big (or negative string size) : #{filename}.")
    str
  end
end
normalize_filename(str) click to toggle source
# File lib/milkode/common/util.rb, line 104
def normalize_filename(str)
  if platform_win?
    str.gsub(/\A([a-z]):/) { "#{$1.upcase}:" }
  else
    str
  end
end
parse_gotoline(words) click to toggle source

parse_gotoline(['a', '123', 'b']) #=> [['a', 'b'], 123]] parse_gotoline(['a', '123', 'b', 55]) #=> [['a', 'b', '123'], 55]] parse_gotoline() #=> [['a'], 55]]

# File lib/milkode/common/util.rb, line 131
def parse_gotoline(words)
  if gotoline_multi?(words)
    parse_gotoline_multi(words)
  else
    [parse_gotoline_single(words)]
  end
end
parse_gotoline_multi(words) click to toggle source
# File lib/milkode/common/util.rb, line 159
def parse_gotoline_multi(words)
  words.map do |v|
    a = v.split(':')
    [[a[0..-2].join(':')], a[-1].to_i]
  end
end
parse_gotoline_single(words) click to toggle source
# File lib/milkode/common/util.rb, line 139
def parse_gotoline_single(words)
  lineno = -1
  index = -1

  words.each_with_index do |v, idx|
    n = v.to_i
    if (n != 0)
      lineno = n
      index = idx
    end
  end

  if (lineno == -1)
    [words, 1]              # 行番号らしきものは見つからなかった
  else
    words.delete_at(index)
    [words, lineno]        
  end
end
pipe?(io) click to toggle source

StringIO patch

# File lib/milkode/common/util.rb, line 196
def pipe?(io)
  !io.instance_of?(IO) || !File.pipe?(io) 
end
platform_osx?() click to toggle source
# File lib/milkode/common/util.rb, line 72
def platform_osx?
  RUBY_PLATFORM =~ /darwin/
end
platform_win?() click to toggle source
# File lib/milkode/common/util.rb, line 68
def platform_win?
  RUBY_PLATFORM =~ /mswin(?!ce)|mingw|cygwin|bccwin/
end
relative_path(path, basedir) click to toggle source
# File lib/milkode/common/util.rb, line 50
def relative_path(path, basedir)
  path = Pathname.new(normalize_filename path)
  basedir = Pathname.new(normalize_filename basedir)
  begin
    path.relative_path_from(basedir)
  rescue ArgumentError
    path
  end
end
root_entrylist(filename) click to toggle source
# File lib/milkode/common/util.rb, line 38
def root_entrylist(filename)
  list = []
  
  Archive::Zip.open(filename) do |archive|
    archive.each do |entry|
      list << entry.zip_path if entry.zip_path.split('/').size == 1
    end
  end

  list
end
ruby19?() click to toggle source
# File lib/milkode/common/util.rb, line 64
def ruby19?
  RUBY_VERSION >= '1.9.0'
end
ruby20?() click to toggle source
# File lib/milkode/common/util.rb, line 60
def ruby20?
  RUBY_VERSION >= '2.0.0'
end
shell_kcode() click to toggle source
# File lib/milkode/common/util.rb, line 76
def shell_kcode
  if platform_win?
    Kconv::SJIS             # win7? cygwin utf8?
  else
    Kconv::UTF8
  end
end
str2kcode(str) click to toggle source
# File lib/milkode/common/util.rb, line 311
def str2kcode(str)
  case str.downcase
  when 'none'
    Kconv::NOCONV
  when 'jis'
    Kconv::JIS
  when 'sjis'
    Kconv::SJIS
  when 'euc'
    Kconv::EUC
  when 'ascii'
    Kconv::ASCII
  when 'utf8'
    Kconv::UTF8
  when 'utf16'
    Kconv::UTF16
  else
    nil
  end
end
svn_url?(src) click to toggle source
# File lib/milkode/common/util.rb, line 191
def svn_url?(src)
  (src =~ /^(?:svn|svn\+ssh):\/\//) != nil
end
truncate_nsec(t) click to toggle source

Timeからnsecを切り捨てる

rroongaのTimeカラムはマイクロ秒までしか格納出来ない
# File lib/milkode/common/util.rb, line 216
def truncate_nsec(t)
  Time.at(t.to_i, t.usec) 
end
warning_alert(out, msg) click to toggle source
# File lib/milkode/common/util.rb, line 200
def warning_alert(out, msg)
  out.puts "[warning] #{msg}"
end
zip_extract(filename, dst_dir) click to toggle source

zipファイルを展開し、展開フォルダ名を返す ファイルが見つからなかった時はnilを返す

# File lib/milkode/common/util.rb, line 18
def zip_extract(filename, dst_dir)
  require 'archive/zip'

  raise ZipfileNotFound unless File.exist?(filename)
  
  root_list = root_entrylist(filename)
  
  if (root_list.size == 1)
    # そのまま展開
    Archive::Zip.extract filename, dst_dir
    return root_list[0].gsub("/", "")
  else
    # ディレクトリを作ってその先で展開
    dir = File.basename(filename).sub(/#{File.extname(filename)}$/, "")
    FileUtils.mkdir_p File.join(dst_dir, dir)
    Archive::Zip.extract filename, File.join(dst_dir, dir)
    return dir
  end
end