Class: Rfd::Item

Inherits:
Object
  • Object
show all
Includes:
Comparable
Defined in:
lib/rfd/item.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(path: nil, dir: nil, name: nil, stat: nil, window_width: nil) ⇒ Item

Returns a new instance of Item.



8
9
10
11
# File 'lib/rfd/item.rb', line 8

def initialize(path: nil, dir: nil, name: nil, stat: nil, window_width: nil)
  @path, @dir, @name, @stat, @window_width, @marked = path, dir || File.dirname(path), name || File.basename(path), stat, window_width, false
  @stat = File.lstat self.path unless stat
end

Instance Attribute Details

#dirObject (readonly)

Returns the value of attribute dir.



5
6
7
# File 'lib/rfd/item.rb', line 5

def dir
  @dir
end

#indexObject

Returns the value of attribute index.



6
7
8
# File 'lib/rfd/item.rb', line 6

def index
  @index
end

#nameObject (readonly)

Returns the value of attribute name.



5
6
7
# File 'lib/rfd/item.rb', line 5

def name
  @name
end

#statObject (readonly)

Returns the value of attribute stat.



5
6
7
# File 'lib/rfd/item.rb', line 5

def stat
  @stat
end

Instance Method Details

#<=>(o) ⇒ Object



204
205
206
207
208
209
210
211
212
# File 'lib/rfd/item.rb', line 204

def <=>(o)
  if directory? && !o.directory?
    1
  elsif !directory? && o.directory?
    -1
  else
    name <=> o.name
  end
end

#atimeObject



72
73
74
# File 'lib/rfd/item.rb', line 72

def atime
  stat.atime.strftime('%Y-%m-%d %H:%M:%S')
end

#basenameObject



17
18
19
# File 'lib/rfd/item.rb', line 17

def basename
  @basename ||= File.basename name, extname
end

#colorObject



50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/rfd/item.rb', line 50

def color
  if symlink?
    Curses::COLOR_MAGENTA
  elsif hidden?
    Curses::COLOR_GREEN
  elsif directory?
    Curses::COLOR_CYAN
  elsif executable?
    Curses::COLOR_RED
  else
    Curses::COLOR_WHITE
  end
end

#ctimeObject



76
77
78
# File 'lib/rfd/item.rb', line 76

def ctime
  stat.ctime.strftime('%Y-%m-%d %H:%M:%S')
end

#current_markObject



171
172
173
# File 'lib/rfd/item.rb', line 171

def current_mark
  marked? ? '*' : ' '
end

#directory?Boolean

Returns:

  • (Boolean)


104
105
106
107
108
109
110
111
112
113
114
# File 'lib/rfd/item.rb', line 104

def directory?
  @directory ||= if symlink?
    begin
      File.stat(path).directory?
    rescue Errno::ENOENT
      false
    end
  else
    stat.directory?
  end
end

#display_nameObject



35
36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/rfd/item.rb', line 35

def display_name
  @display_name ||= begin
    n = full_display_name
    if mb_size(n) <= @window_width - 15
      n
    else
      if symlink?
        mb_left n, @window_width - 16
      else
        "#{mb_left(basename, @window_width - 16 - extname.size)}#{extname}"
      end
    end
  end
end

#executable?Boolean

Returns:

  • (Boolean)


124
125
126
# File 'lib/rfd/item.rb', line 124

def executable?
  stat.executable?
end

#extnameObject



21
22
23
# File 'lib/rfd/item.rb', line 21

def extname
  @extname ||= File.extname name
end

#full_display_nameObject



29
30
31
32
33
# File 'lib/rfd/item.rb', line 29

def full_display_name
  n = @name.dup
  n << " -> #{target}" if symlink?
  n
end

#gz?Boolean

Returns:

  • (Boolean)


140
141
142
143
144
145
146
147
148
149
150
# File 'lib/rfd/item.rb', line 140

def gz?
  @gz_ ||= begin
    if directory?
      false
    else
      File.binread(realpath, 2).unpack('n').first == 0x1f8b
    end
  rescue
    false
  end
end

#hidden?Boolean

Returns:

  • (Boolean)


120
121
122
# File 'lib/rfd/item.rb', line 120

def hidden?
  name.start_with?('.') && (name != '.') && (name != '..')
end

#join(*ary) ⇒ Object



25
26
27
# File 'lib/rfd/item.rb', line 25

def join(*ary)
  File.join path, ary
end

#marked?Boolean

Returns:

  • (Boolean)


167
168
169
# File 'lib/rfd/item.rb', line 167

def marked?
  @marked
end

#mb_char_size(c) ⇒ Object



184
185
186
# File 'lib/rfd/item.rb', line 184

def mb_char_size(c)
  c == '' ? 1 : c.bytesize == 1 ? 1 : 2
end

#mb_left(str, size) ⇒ Object



175
176
177
178
179
180
181
182
# File 'lib/rfd/item.rb', line 175

def mb_left(str, size)
  len = 0
  index = str.each_char.with_index do |c, i|
    break i if len + mb_char_size(c) > size
    len += mb_size c
  end
  str[0, index]
end

#mb_ljust(str, size) ⇒ Object



192
193
194
# File 'lib/rfd/item.rb', line 192

def mb_ljust(str, size)
  "#{str}#{' ' * [0, size - mb_size(str)].max}"
end

#mb_size(str) ⇒ Object



188
189
190
# File 'lib/rfd/item.rb', line 188

def mb_size(str)
  str.each_char.inject(0) {|l, c| l += mb_char_size(c)}
end

#modeObject



84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# File 'lib/rfd/item.rb', line 84

def mode
  @mode ||= begin
    m = stat.mode
    ft = directory? ? 'd' : symlink? ? 'l' : '-'
    ret = [(m & 0700) / 64, (m & 070) / 8, m & 07].inject(ft) do |str, s|
      str += "#{s & 4 == 4 ? 'r' : '-'}#{s & 2 == 2 ? 'w' : '-'}#{s & 1 == 1 ? 'x' : '-'}"
    end
    if m & 04000 != 0
      ret[3] = directory? ? 's' : 'S'
    end
    if m & 02000 != 0
      ret[6] = directory? ? 's' : 'S'
    end
    if m & 01000 == 512
      ret[-1] = directory? ? 't' : 'T'
    end
    ret
  end
end

#mtimeObject



80
81
82
# File 'lib/rfd/item.rb', line 80

def mtime
  stat.mtime.strftime('%Y-%m-%d %H:%M:%S')
end

#pathObject



13
14
15
# File 'lib/rfd/item.rb', line 13

def path
  @path ||= File.join @dir, @name
end

#realpathObject



156
157
158
# File 'lib/rfd/item.rb', line 156

def realpath
  @realpath ||= File.realpath path
end

#sizeObject



64
65
66
# File 'lib/rfd/item.rb', line 64

def size
  directory? ? 0 : stat.size
end

#size_or_dirObject



68
69
70
# File 'lib/rfd/item.rb', line 68

def size_or_dir
  directory? ? '<DIR>' : size.to_s
end

#symlink?Boolean

Returns:

  • (Boolean)


116
117
118
# File 'lib/rfd/item.rb', line 116

def symlink?
  stat.symlink?
end

#targetObject



152
153
154
# File 'lib/rfd/item.rb', line 152

def target
  File.readlink path if symlink?
end

#to_sObject



196
197
198
# File 'lib/rfd/item.rb', line 196

def to_s
  "#{current_mark}#{mb_ljust(display_name, @window_width - 15)}#{size_or_dir.rjust(13)}"
end

#to_strObject



200
201
202
# File 'lib/rfd/item.rb', line 200

def to_str
  path
end

#toggle_markObject



160
161
162
163
164
165
# File 'lib/rfd/item.rb', line 160

def toggle_mark
  unless %w(. ..).include? name
    @marked = !@marked
    true
  end
end

#zip?Boolean

Returns:

  • (Boolean)


128
129
130
131
132
133
134
135
136
137
138
# File 'lib/rfd/item.rb', line 128

def zip?
  @zip_ ||= begin
    if directory?
      false
    else
      File.binread(realpath, 4).unpack('V').first == 0x04034b50
    end
  rescue
    false
  end
end