summary refs log tree commit diff stats
path: root/code/extensions.rb
diff options
context:
space:
mode:
Diffstat (limited to 'code/extensions.rb')
-rw-r--r--code/extensions.rb176
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
+