diff options
Diffstat (limited to 'code/extensions.rb')
-rw-r--r-- | code/extensions.rb | 176 |
1 files changed, 176 insertions, 0 deletions
diff --git a/code/extensions.rb b/code/extensions.rb new file mode 100644 index 00000000..db238614 --- /dev/null +++ b/code/extensions.rb @@ -0,0 +1,176 @@ +class Directory + def initialize(path) + @path = path + @pos = 0 + @pointed_file = '' + @width = 0 + refresh + end + + attr_reader(:path, :files, :pos, :width, :infos) + + def pos=(x) + @pos = x + @pointed_file = @files[x] + resize + end + + def pointed_file=(x) + if @files.include?(x) + @pointed_file = x + @pos = @files.index(x) + else + self.pos = 0 + end + resize + end + + def size() @files.size end + + def resize() + pos = Fm.get_offset(self, lines) + if @files.empty? + @width = 0 + else + @width = 0 + @files[pos, lines-2].each_with_index do |fn, ix| + ix += pos +# log File.basename(fn) + @infos[ix] + sz = File.basename(fn).size + @infos[ix].size + 2 + @width = sz if @width < sz + end +# @width = @files[pos,lines-2].map{|x| File.basename(x).size}.max + end + end + + def get_file_infos() + @infos = [] + @files.each do |fn| + if File.directory?(fn) + begin + sz = Dir.entries(fn).size - 2 + rescue + sz = "?" + end + @infos << "#{sz}" + else + if File.size?(fn) + @infos << " #{File.size(fn).bytes 2}" + else + @infos << "" + end + end + end + end + + def refresh() + glob = Dir.new(@path).to_a.sort! + if OPTIONS['hidden'] + glob -= ['.', '..', 'lost+found'] + else + glob.reject!{|x| x[0] == ?. or x == 'lost+found'} + end + if glob.empty? + glob = ['.'] + end + glob.map!{|x| File.join(@path, x)} + dirs = glob.select{|x| File.directory?(x)} + @files = dirs + (glob - dirs) + + get_file_infos + resize + + if @pos >= @files.size + @pos = @files.size - 1 + elsif @files.include?(@pointed_file) + @pos = @files.index(@pointed_file) + end + end +end + + +class File + MODES_HASH = { + '0' => '---', + '1' => '--x', + '2' => '-w-', + '3' => '-wx', + '4' => 'r--', + '5' => 'r-x', + '6' => 'rw-', + '7' => 'rwx' + } + def self.modestr(f) + unless exists?(f) + return '----------' + end + + if symlink?(f) + result = 'l' + elsif directory?(f) + result = 'd' + else + result = '-' + end + + s = ("%o" % File.stat(f).mode)[-3..-1] + for m in s.each_char + result << MODES_HASH[m] + end + + result + end +end + +class Numeric + def limit(max, min = 0) + self < min ? min : (self > max ? max : self) + end + + def bytes n_round = 2 + n = 1024 + a = %w(B K M G T Y) + + i = 0 + flt = self.to_f + + while flt > n and i < a.length - 1 + flt /= n + i += 1 + end + +# flt = flt.round(n_round) + r = 10 ** n_round + flt *= r + flt = flt.round.to_f / r + int = flt.to_i + flt = int if int == flt + + return flt.to_s + ' ' + a[i] + end +end + +class Array + def wrap(n) + n.times { push shift } + end +end + +class String + def clear + replace String.new + end + def sh + res = dup + res.gsub!('\\\\', "\000") + res.gsub!(' ', '\\ ') + res.gsub!('(', '\\(') + res.gsub!(')', '\\)') + res.gsub!('*', '\\*') + res.gsub!('\'', '\\\'') + res.gsub!('"', '\\"') + res.gsub!("\000", '\\\\') + return res + end +end + |