Skip to content
Kward Search API index

Class: Kward::PromptInterface::EditorBuffer

Inherits:
Object
  • Object
show all
Defined in:
lib/kward/prompt_interface/editor/buffer.rb

Overview

Text storage and line/offset mechanics for editor buffers.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(text = "") ⇒ EditorBuffer

Returns a new instance of EditorBuffer.



9
10
11
# File 'lib/kward/prompt_interface/editor/buffer.rb', line 9

def initialize(text = "")
  @text = text.to_s
end

Instance Attribute Details

#textObject

Returns the value of attribute text.



7
8
9
# File 'lib/kward/prompt_interface/editor/buffer.rb', line 7

def text
  @text
end

Instance Method Details

#[](range) ⇒ Object



26
27
28
# File 'lib/kward/prompt_interface/editor/buffer.rb', line 26

def [](range)
  @text[range]
end

#after(offset) ⇒ Object



38
39
40
# File 'lib/kward/prompt_interface/editor/buffer.rb', line 38

def after(offset)
  @text[offset..].to_s
end

#before(offset) ⇒ Object



34
35
36
# File 'lib/kward/prompt_interface/editor/buffer.rb', line 34

def before(offset)
  @text[0...offset].to_s
end

#count(*arguments) ⇒ Object



98
99
100
# File 'lib/kward/prompt_interface/editor/buffer.rb', line 98

def count(*arguments)
  @text.count(*arguments)
end

#delete_range(start_index, end_index) ⇒ Object



86
87
88
# File 'lib/kward/prompt_interface/editor/buffer.rb', line 86

def delete_range(start_index, end_index)
  replace_range(start_index, end_index, "")
end

#empty?Boolean

Returns:

  • (Boolean)


22
23
24
# File 'lib/kward/prompt_interface/editor/buffer.rb', line 22

def empty?
  @text.empty?
end

#index(*arguments) ⇒ Object



90
91
92
# File 'lib/kward/prompt_interface/editor/buffer.rb', line 90

def index(*arguments)
  @text.index(*arguments)
end

#insert(offset, text) ⇒ Object



82
83
84
# File 'lib/kward/prompt_interface/editor/buffer.rb', line 82

def insert(offset, text)
  replace_range(offset, offset, text)
end

#lengthObject



18
19
20
# File 'lib/kward/prompt_interface/editor/buffer.rb', line 18

def length
  @text.length
end

#line_and_column_for(offset) ⇒ Object



49
50
51
52
# File 'lib/kward/prompt_interface/editor/buffer.rb', line 49

def line_and_column_for(offset)
  before_cursor = before(offset)
  [before_cursor.count("\n"), (before_cursor.split("\n", -1).last || "").length]
end

#line_range(line_index) ⇒ Object



66
67
68
69
70
71
# File 'lib/kward/prompt_interface/editor/buffer.rb', line 66

def line_range(line_index)
  start_index = line_start_offset(line_index)
  end_index = start_index + lines[line_index].to_s.length
  end_index += 1 if end_index < @text.length
  [start_index, end_index]
end

#line_start_offset(line_index) ⇒ Object



61
62
63
64
# File 'lib/kward/prompt_interface/editor/buffer.rb', line 61

def line_start_offset(line_index)
  line_index = [[line_index.to_i, 0].max, lines.length - 1].min
  lines.first(line_index).sum { |line| line.length + 1 }
end

#linesObject



42
43
44
45
46
47
# File 'lib/kward/prompt_interface/editor/buffer.rb', line 42

def lines
  @lines_cache ||= begin
    values = @text.split("\n", -1)
    values.empty? ? [""] : values
  end
end

#offset_for_line_and_column(line_index, column) ⇒ Object



54
55
56
57
58
59
# File 'lib/kward/prompt_interface/editor/buffer.rb', line 54

def offset_for_line_and_column(line_index, column)
  values = lines
  line_index = [[line_index.to_i, 0].max, values.length - 1].min
  column = [[column.to_i, 0].max, values[line_index].length].min
  values.first(line_index).sum { |line| line.length + 1 } + column
end

#replace_range(start_index, end_index, text) ⇒ Object



73
74
75
76
77
78
79
80
# File 'lib/kward/prompt_interface/editor/buffer.rb', line 73

def replace_range(start_index, end_index, text)
  start_index, end_index = [start_index, end_index].minmax
  start_index = [[start_index, 0].max, @text.length].min
  end_index = [[end_index, 0].max, @text.length].min
  @text = @text[0...start_index].to_s + text.to_s + @text[end_index..].to_s
  invalidate_lines_cache
  [start_index, start_index + text.to_s.length]
end

#rindex(*arguments) ⇒ Object



94
95
96
# File 'lib/kward/prompt_interface/editor/buffer.rb', line 94

def rindex(*arguments)
  @text.rindex(*arguments)
end

#slice(start_index, length = nil) ⇒ Object



30
31
32
# File 'lib/kward/prompt_interface/editor/buffer.rb', line 30

def slice(start_index, length = nil)
  length.nil? ? @text[start_index] : @text[start_index, length]
end