Class | Clio::String |
In: |
lib/clio/string.rb
|
Parent: | Object |
marks | [R] | |
text | [R] |
# File lib/clio/string.rb, line 26 def initialize(text=nil, marks=nil) @text = text || '' @marks = marks || Hash.new{ |h,k| h[k]=[] } end
# File lib/clio/string.rb, line 53 def +(other) case other when String ntext = text + other.text nmarks = marks.dup omarks = shift_marks(0, text.size, other.marks) omarks.each{ |i, c| nmarks[i].concat(c) } else ntext = text + other.to_s nmarks = marks.dup end self.class.new(ntext, nmarks) end
# File lib/clio/string.rb, line 158 def ansi(code) m = marks.dup m[0] << code m[size] << :clear self.class.new(text, m) end
# File lib/clio/string.rb, line 153 def gsub(pattern_replacement) dup.gsub(pattern, replacement) end
# File lib/clio/string.rb, line 135 def gsub!(pattern,replacement) mark_changes = [] text = @text.gsub(pattern) do |s| index = $~.begin(0) delta = (replacement.size - s.size) mark_changes << [index, delta] replacement end marks = @marks mark_changes.each do |index, delta| marks = shift_marks(index, delta, marks) end @text = text @marks = marks self end
# File lib/clio/string.rb, line 76 def slice(*args) if args.size == 2 index, len = *args endex = index+len new_text = text[index, len] new_marks = {} marks.each do |i, v| new_marks[i] = v if i >= index && i < endex end self.class.new(new_text, new_marks) elsif args.size == 1 rng = args.first case rng when Range index, endex = rng.begin, rng.end new_text = text[rng] new_marks = {} marks.each do |i, v| new_marks[i] = v if i >= index && i < endex end self.class.new(new_text, new_marks) else self.class.new(text[rng,1], {rng=>marks[rng]}) end else raise ArgumentError end end
This is more limited than the normal String method. It does not yet support a block, and replacement won‘t substitue for \1, \2, etc.
TODO: block support.
# File lib/clio/string.rb, line 112 def sub!(pattern,replacement) mark_changes = [] text = @text.sub(pattern) do |s| index = $~.begin(0) delta = (replacement.size - s.size) mark_changes << [index, delta] replacement end marks = @marks mark_changes.each do |index, delta| marks = shift_marks(index, delta, marks) end @text = text @marks = marks self end
# File lib/clio/string.rb, line 31 def to_s s = text.dup m = marks.sort{ |a,b| b[0] <=> a[0] } m.each do |index, codes| codes.reverse_each do |code| s.insert(index, ANSICode.__send__(code)) end end s end