Class: Kward::PromptInterface::EditorBuffer
- Inherits:
-
Object
- Object
- Kward::PromptInterface::EditorBuffer
- Defined in:
- lib/kward/prompt_interface/editor/buffer.rb
Overview
Text storage and line/offset mechanics for editor buffers.
Instance Attribute Summary collapse
-
#text ⇒ Object
Returns the value of attribute text.
Instance Method Summary collapse
- #[](range) ⇒ Object
- #after(offset) ⇒ Object
- #before(offset) ⇒ Object
- #count(*arguments) ⇒ Object
- #delete_range(start_index, end_index) ⇒ Object
- #empty? ⇒ Boolean
- #index(*arguments) ⇒ Object
-
#initialize(text = "") ⇒ EditorBuffer
constructor
A new instance of EditorBuffer.
- #insert(offset, text) ⇒ Object
- #length ⇒ Object
- #line_and_column_for(offset) ⇒ Object
- #line_range(line_index) ⇒ Object
- #line_start_offset(line_index) ⇒ Object
- #lines ⇒ Object
- #offset_for_line_and_column(line_index, column) ⇒ Object
- #replace_range(start_index, end_index, text) ⇒ Object
- #rindex(*arguments) ⇒ Object
- #slice(start_index, length = nil) ⇒ Object
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
#text ⇒ Object
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
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 |
#length ⇒ Object
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 |
#lines ⇒ Object
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 |