Module: Manipulation

Included in:
Twirb::TextEdit
Defined in:
lib/twirb/manipulation.rb

Instance Method Summary collapse

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(method, *args) ⇒ Object



21
22
23
24
25
26
27
28
29
# File 'lib/twirb/manipulation.rb', line 21

def method_missing(method, *args)
  end_array = {"literal_array" => "}", "literal_array_square" => "]", "literal_array_parenthesis" => ")"}
  if args[0] == end_array[method.to_s] && @interpolation.empty?
    @keywords[args[0]].call(args[0], args[1], args[2])
  else
    add(args[0], 'violet') {@literal_array_parenthesis << args[0] if args[0] == "(" and @interpolation.empty? and method.to_s == "literal_array_parenthesis"}
    interpolate(args[0])
  end
end

Instance Method Details

#add(word, color = "no color") ⇒ Object



3
4
5
6
# File 'lib/twirb/manipulation.rb', line 3

def add(word, color = "no color")
  @entry.send("insert", 'end', word, color) 
  yield if block_given?
end

#add_text(text_for_indentation_and_syntax_highlight) ⇒ Object



216
217
218
219
220
221
222
223
224
225
226
227
# File 'lib/twirb/manipulation.rb', line 216

def add_text(text_for_indentation_and_syntax_highlight)
  @text = text_for_indentation_and_syntax_highlight
  @num_lin = @text.split(/\n/).length 
  total_delete 
  @text.gsub(/^\d*\)/, "").each_line.with_index(1) do |line, i| 
    add("\n") unless i == 1 
    start_indentation_and_number(i)
    line.sub(/^\s+/, "").gsub(/\n/, "").split(/(\s+)/).each_with_index do |word, i|
      other_word(word, i)
    end 
  end
end

#analyze(word, i) ⇒ Object



161
162
163
164
165
166
# File 'lib/twirb/manipulation.rb', line 161

def analyze(word, i) 
  words = word.split(/(\\[\'\"\/\#{\\]|%[wWqQr]?[|\=\^!\"\$-]|\$[\']*|\^|\=begin|\=end|\||\<\<\-?["\']?\w+["\']?|\.|!|\?[\"\'\/]?|%[wWqQr]?[\{\[\(]|\/|{|}|"|\'|\+|\-|\=|\~|\*|\\|\<|\>|\[|\]|\#{|\#|\d|\:\:|\)|\;|\,|&&|\()/) 
  words.each_with_index do |w, ind| 
    str(w, i, ind)  
  end 
end

#are_not_empty?Boolean

Returns:

  • (Boolean)


111
112
113
# File 'lib/twirb/manipulation.rb', line 111

def are_not_empty?
  instances_for_different_color.any? {|kw| !instance_variable_get(kw).empty?}
end

#clear_arrayObject



198
199
200
201
# File 'lib/twirb/manipulation.rb', line 198

def clear_array
  [@comments, @def_name, @div, @reference_word, @optional_do].each {|n| n.clear}
  @multiline_str << @start_multiline_str[0] unless @start_multiline_str.empty?
end

#comments(word, i, ind) ⇒ Object



72
73
74
# File 'lib/twirb/manipulation.rb', line 72

def comments(word, i, ind) 
  @keywords["#"].call(word, i, ind) 
end

#comments_multiline(word, i, ind) ⇒ Object



31
32
33
34
35
36
37
# File 'lib/twirb/manipulation.rb', line 31

def comments_multiline(word, i, ind) 
  if word != "=end"
    @keywords["=begin"].call(word, i, ind) 
  else
    @keywords["=end"].call(word, i, ind) 
  end
end

#convertObject



153
154
155
156
157
158
159
# File 'lib/twirb/manipulation.rb', line 153

def convert 
  @auto_highlight = false 
  @a = @entry.value 
  @a.gsub!(/^\d*\)/, "") 
  @entry.delete(1.0, 'end') 
  add(@a) 
end

#delete(num1, num2) ⇒ Object



8
9
10
# File 'lib/twirb/manipulation.rb', line 8

def delete(num1, num2)
  @entry.send("delete", "end -1 lines + #{num1} chars", "end -1 lines + #{num2} chars")
end

#delimiter_multi_arr(word, i, ind) ⇒ Object



97
98
99
100
101
102
103
104
105
# File 'lib/twirb/manipulation.rb', line 97

def delimiter_multi_arr(word, i, ind) 
  @end_multi_arr = @delimiter_multi_arr[0][2]
  if word == @end_multi_arr 
    add(word, 'violet') 
    @delimiter_multi_arr.clear
  else 
    add(word, 'violet') 
  end 
end

#delimiter_multi_str(word, i, ind) ⇒ Object



87
88
89
90
91
92
93
94
95
# File 'lib/twirb/manipulation.rb', line 87

def delimiter_multi_str(word, i, ind) 
  @end_multi_str = @delimiter_multi_str[0][@delimiter_multi_str[0].length - 1]
  if word == @end_multi_str 
    add(word, 'violet') 
    @delimiter_multi_str.clear
  else 
    add(word, 'violet') 
  end 
end

#double_quote(word, i, ind) ⇒ Object



60
61
62
63
64
65
66
67
68
69
70
# File 'lib/twirb/manipulation.rb', line 60

def double_quote(word, i, ind) 
  #if /%*"/.eql?(word) and @interpolation.empty?
if word == '"' || word == '%"' || word == '?"' and @interpolation.empty?
    @double_quote.clear 
    add(word, 'violet') 
  else 
    #@keywords['"'].call(word, i, ind) 
    add(word, "violet")
    interpolate(word)
  end 
end

#empty_arrayObject



193
194
195
196
# File 'lib/twirb/manipulation.rb', line 193

def empty_array
  (%w{@list_end_words @def_name @reference_word @interpolation @optional_do @start_multiline_str} +
  instances_for_different_color).each {|inst| instance_variable_set(inst, [])}
end

#empty_list?Boolean

Returns:

  • (Boolean)


185
186
187
# File 'lib/twirb/manipulation.rb', line 185

def empty_list? 
  instances_for_different_color.all? {|inst| instance_variable_get(inst).empty?}
end

#end_method(word, i, ind) ⇒ Object



139
140
141
142
143
144
145
146
# File 'lib/twirb/manipulation.rb', line 139

def end_method(word, i, ind) 
  if @list_end_words.empty? || ind != 0 
    add(word)
  else
    @keywords[@list_end_words.last].call(word, i, ind)
    @list_end_words.pop 
  end 
end

#highlightObject



229
230
231
232
233
234
235
236
# File 'lib/twirb/manipulation.rb', line 229

def highlight 
  if @auto_highlight 
    empty_array
    add_text(@entry.value)
  else
    add(' ')  
  end 
end

#include_word_for_indentation_and_optional_do(word, i, ind) ⇒ Object



125
126
127
128
# File 'lib/twirb/manipulation.rb', line 125

def include_word_for_indentation_and_optional_do(word, i, ind)
  @list_end_words << word if words_related_to_end?(word, i, ind) && empty_list?
  @optional_do << word if optional_do?(word, i, ind) 
end

#indentObject



189
190
191
# File 'lib/twirb/manipulation.rb', line 189

def indent
  %w{module class def if case while do begin unless until for}.each {|n| add("  " * @list_end_words.count(n))} 
end

#instances_for_different_colorObject



107
108
109
# File 'lib/twirb/manipulation.rb', line 107

def instances_for_different_color
  %w{@literal_array @double_quote @single_quote @regex @comments @multiline_str @comments_multiline @delimiter_multi_str @delimiter_multi_arr @literal_array_square @literal_array_parenthesis}
end

#interpolate(word) ⇒ Object



16
17
18
19
# File 'lib/twirb/manipulation.rb', line 16

def interpolate(word) 
  @interpolation << word if word == '#{'
  @interpolation.pop if word == '}'
end

#multiline_str(word, i, ind) ⇒ Object



76
77
78
79
80
81
82
83
84
85
# File 'lib/twirb/manipulation.rb', line 76

def multiline_str(word, i, ind)
  @multiline_str[0][2] != "-" ? @end_str = @multiline_str[0][2..@multiline_str[0].length] : @end_str = @multiline_str[0][3..@multiline_str[0].length] 
  if word == @end_str.gsub(/["\']/, "") && i == 0 && ind == 0 
    add(word, 'violet') 
    @multiline_str.clear
    @start_multiline_str.shift 
  else 
    add(word, 'violet') 
  end 
end

#new_lineObject



148
149
150
151
# File 'lib/twirb/manipulation.rb', line 148

def new_line 
  highlight 
  add("\n") 
end

#optional_do?(word, i, ind) ⇒ Boolean

Returns:

  • (Boolean)


134
135
136
# File 'lib/twirb/manipulation.rb', line 134

def optional_do?(word, i, ind)
  %w{if while until}.any? {|kw| kw == word && i == 0 && ind == 0}
end

#other_word(word, i) ⇒ Object



177
178
179
180
181
182
183
# File 'lib/twirb/manipulation.rb', line 177

def other_word(word, i)
  if punctuation?(word) 
    analyze(word, i) 
  else 
    str(word, i)  
  end 
end

#punctuation?(word) ⇒ Boolean

Returns:

  • (Boolean)


168
169
170
171
# File 'lib/twirb/manipulation.rb', line 168

def punctuation?(word) 
  view = word.scan(/\\[\'\"\/\#{\\]|%[wWqQr]?[|\=\^!\"\$-]|\$[\']*|\^|\=begin|\=end|\||\<\<\-?["\']?\w+["\']?|\.|!|\?[\"\'\/]?|%[wWqQr]?[\{\[\(]|\/|\(|\)|{|}|"|\'|\[|\]|\+|\*|\\|\=|\~|\-|\<|\>|\d|\:\:|\#{|\#|\;|\,|&&/)
  return true if view.length != 0  
end

#regex(word, i, ind) ⇒ Object



49
50
51
52
53
54
55
56
57
# File 'lib/twirb/manipulation.rb', line 49

def regex(word, i, ind) 
  if word == '/' || word == "?/" and @interpolation.empty?
    @regex.clear
    add(word, 'violet') 
  else
    add(word, 'violet') 
    interpolate(word)
  end 
end

#set_number(i) ⇒ Object



203
204
205
206
207
208
# File 'lib/twirb/manipulation.rb', line 203

def set_number(i)
  num = "%03d" % i if @num_lin >= 100 
  num = "%02d" % i if @num_lin <= 99 
  add("#{num})", 'grey') 
  add("  ") 
end

#single_quote(word, i, ind) ⇒ Object



39
40
41
42
43
44
45
46
47
# File 'lib/twirb/manipulation.rb', line 39

def single_quote(word, i, ind) 
  #if /\$*\'/.eql?(word) 
if word == "'" || word == "$'" || word == "?'"
    @single_quote.clear 
    add(word, 'violet') 
  else
    @keywords["'"].call(word, i, ind) 
  end 
end

#start_indentation_and_number(i) ⇒ Object



210
211
212
213
214
# File 'lib/twirb/manipulation.rb', line 210

def start_indentation_and_number(i)
  clear_array
  set_number(i)
  indent 
end

#str(word, i, ind = 0) ⇒ Object



115
116
117
118
119
120
121
122
123
# File 'lib/twirb/manipulation.rb', line 115

def str(word, i, ind = 0) 
  if are_not_empty?
    instances_for_different_color.each {|instance| send("#{instance.sub("@", "")}", word, i, ind) unless instance_variable_get(instance).empty?}
  else
    @reference_word.clear if !word_to_indent?(word) && word !~ /\s+/
    @keywords[word].call(word, i, ind) 
  end 
  include_word_for_indentation_and_optional_do(word, i, ind) 
end

#total_deleteObject



12
13
14
# File 'lib/twirb/manipulation.rb', line 12

def total_delete
  @entry.send("delete", "1.0", "end")
end

#word_to_indent?(word) ⇒ Boolean

Returns:

  • (Boolean)


130
131
132
# File 'lib/twirb/manipulation.rb', line 130

def word_to_indent?(word)
  %w{if unless until for def class module case while begin}.any? {|kw| kw == word}
end

Returns:

  • (Boolean)


173
174
175
# File 'lib/twirb/manipulation.rb', line 173

def words_related_to_end?(word, i, ind) 
  (((i == 0 && ind == 0) || !@reference_word.empty?)  && (word_to_indent?(word))) || (word == "do" && @optional_do.empty?) 
end