tkregreplace 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. data/README.txt +18 -8
  2. data/tkregreplace.rb +299 -232
  3. metadata +4 -4
data/README.txt CHANGED
@@ -1,16 +1,17 @@
1
- This program is currently in alpha status. It works pretty well at present
2
- as a visualization tool, however crucial features are still missing from the program
3
- like the ability to save the text file back to disk. Also there may be somewhat unexpected
4
- behavior from the UI, not so much becuase of bugs, but more as a reflection of how the
5
- program attacks the problem. Before the final release of this program I would like to
6
- implement the following
1
+ This program is currently in alpha status. It works pretty well at present as a
2
+ visualization tool, however crucial features are still missing from the program
3
+ like the ability to save the text file back to disk. Also there may be somewhat
4
+ unexpected behavior from the UI, not so much becuase of bugs, but more as a
5
+ reflection of how the program attacks the problem. Before the final release of
6
+ this program I would like to implement the following
7
7
 
8
8
  saving files back to the disk
9
9
 
10
10
  a proper about dialog
11
11
 
12
- having all the search buttons obey symantics that the user would expect, like say perhaps searching starting from the current cursor
13
- position rather than from the top and other minor refinements
12
+ having all the search buttons obey symantics that the user would expect, like
13
+ say perhaps searching starting from the current cursor position rather than from
14
+ the top and other minor refinements
14
15
 
15
16
  cutting copying and pasting
16
17
 
@@ -18,3 +19,12 @@ an undo facility, preferably a multi level undo
18
19
 
19
20
 
20
21
  I think If I can implement these features, this program could actually be useful to somebody.
22
+
23
+ changlog
24
+
25
+ version 0.1.1
26
+ Added rdoc documentation to the source and changed the gem so that it
27
+ will autogenerate this documentation.
28
+
29
+ version 0.1.0
30
+ Initial version, partial functionality, needs work
@@ -1,272 +1,339 @@
1
+ # This is a simple ruby script which uses the tk widget set for it's GUI
2
+ # environment. The program currently accepts no arguments.
3
+ #
4
+ # The purpose of this program are as follows:
5
+ # * to function as a tool for crafting regular expressions by showing a visual
6
+ # representation of the match.
7
+ # * to be able to perform replacement operations on the matched text using all
8
+ # the power that ruby regular expressions can provide, including the ability
9
+ # to use \1 \2 in the replacement string referring to groups captured by
10
+ # capturing parentheses.
11
+ # * to function as a light weight text editor. This last goal has sortof come
12
+ # about as a bi-product of the implementation.
13
+
1
14
  require 'tk'
15
+ require 'optparse'
16
+ require 'rdoc/usage'
2
17
 
18
+ # This Class represents the TkRegReplace Program. Instantiating an object of
19
+ # this class will effectively start the GUI. You should not instantiate more
20
+ # than one instance of this class as once the TK environment is destroyed by
21
+ # the first instantiated object, it cannot be recreated again.
3
22
  class TkRegReplace
23
+ private
24
+ # This method constructs a new instance of the TkRegReplace object
25
+ # in effect starting the GUI. It takes no parameters. The return value
26
+ # should not be used because by the time this function returns, the program
27
+ # should have ended and the object will be in an invalid state
28
+ def initialize
29
+ @root = TkRoot.new
4
30
 
5
- def initialize
6
- @root = TkRoot.new
31
+ @text = TkText.new(@root) do
32
+ font '-Adobe-Courier-Medium-R-Normal--*-120-*-*-*-*-*-*'
33
+ end
7
34
 
8
- @text = TkText.new(@root) do
9
- font '-Adobe-Courier-Medium-R-Normal--*-120-*-*-*-*-*-*'
10
- end
35
+ @text.wrap = 'none'
11
36
 
12
- @text.wrap = 'none'
37
+ menu_spec =
38
+ [
39
+ [
40
+ ['File', 0],
41
+ ['Open', proc {open_file}, 0, 'Ctrl+O'],
42
+ '---',
43
+ ['Quit', proc{exit}, 0, 'Ctrl+Q']
44
+ ],
45
+ [
46
+ ['Edit', 0],
47
+ ['Cut', proc{puts('Cut clicked')}, 2, 'Ctrl+X'],
48
+ ['Copy', proc{puts('Copy clicked')}, 0, 'Ctrl+C'],
49
+ ['Paste', proc{puts('Paste clicked')}, 0, 'Ctrl+V']
50
+ ],
51
+ [
52
+ ['Help', 0, {:menu_name=>'help'}],
53
+ ['About This', proc{puts('xregexsearch&replace ruby script')}, 6]
54
+ ]
55
+ ]
13
56
 
14
- menu_spec =
15
- [
16
- [
17
- ['File', 0],
18
- ['Open', proc {open_file}, 0, 'Ctrl+O'],
19
- '---',
20
- ['Quit', proc{exit}, 0, 'Ctrl+Q']
21
- ],
22
- [
23
- ['Edit', 0],
24
- ['Cut', proc{puts('Cut clicked')}, 2, 'Ctrl+X'],
25
- ['Copy', proc{puts('Copy clicked')}, 0, 'Ctrl+C'],
26
- ['Paste', proc{puts('Paste clicked')}, 0, 'Ctrl+V']
27
- ],
28
- [
29
- ['Help', 0, {:menu_name=>'help'}],
30
- ['About This', proc{puts('xregexsearch&replace ruby script')}, 6]
31
- ]
32
- ]
57
+ @mbar = Tk.root.add_menubar(menu_spec)
58
+ @root.bind('Control-o', proc {open_file})
59
+ @root.bind('Control-q', proc {exit})
60
+
61
+ @frame1 = TkFrame.new(@root)
62
+ @frame2 = TkFrame.new(@root)
63
+ @frame3 = TkFrame.new(@root)
33
64
 
34
- @mbar = Tk.root.add_menubar(menu_spec)
35
- @root.bind('Control-o', proc {open_file})
36
- @root.bind('Control-q', proc {exit})
37
-
38
- @frame1 = TkFrame.new(@root)
39
- @frame2 = TkFrame.new(@root)
40
- @frame3 = TkFrame.new(@root)
65
+ @entry1 = TkEntry.new(@frame2)
66
+ @entry1.bind('Return', proc {match})
67
+ @entry2 = TkEntry.new(@frame2)
41
68
 
42
- @entry1 = TkEntry.new(@frame2)
43
- @entry1.bind('Return', proc {match})
44
- @entry2 = TkEntry.new(@frame2)
69
+ @dmn = TkVariable.new(0)
70
+ @checkbox1 = TkCheckButton.new(@frame3,
71
+ 'text' => "Dot matches newline mode",
72
+ 'variable' => @dmn
73
+ )
45
74
 
46
- @dmn = TkVariable.new(0)
47
- @checkbox1 = TkCheckButton.new(@frame3,
48
- 'text' => "Dot matches newline mode",
49
- 'variable' => @dmn
50
- )
75
+ @ic = TkVariable.new(1)
76
+ @checkbox2 = TkCheckButton.new(@frame3,
77
+ 'text' => "Ignore Case",
78
+ 'variable' => @ic
79
+ )
80
+
81
+ @tags = TkTextTag.new(@text, 'background' => 'red')
82
+ @tag = TkTextTag.new(@text, 'background' => 'blue')
51
83
 
52
- @ic = TkVariable.new(1)
53
- @checkbox2 = TkCheckButton.new(@frame3,
54
- 'text' => "Ignore Case",
55
- 'variable' => @ic
56
- )
57
-
58
- @tags = TkTextTag.new(@text, 'background' => 'red')
59
- @tag = TkTextTag.new(@text, 'background' => 'blue')
60
-
61
- @button1 = TkButton.new(@frame1,
62
- 'text' => 'Match',
63
- 'command' => proc {@text.focus; match}
64
- )
84
+ @button1 = TkButton.new(@frame1,
85
+ 'text' => 'Match',
86
+ 'command' => proc {@text.focus; match}
87
+ )
65
88
 
66
- @button2 = TkButton.new(@frame1,
67
- 'text' => 'Match again',
68
- 'command' => proc {@text.focus; match_again}
69
- )
70
-
71
- @button3 = TkButton.new(@frame1,
72
- 'text' => "Match again reverse",
73
- 'command' => proc {@text.focus; match_again_backwards}
74
- )
89
+ @button2 = TkButton.new(@frame1,
90
+ 'text' => 'Match again',
91
+ 'command' => proc {@text.focus; match_again}
92
+ )
93
+
94
+ @button3 = TkButton.new(@frame1,
95
+ 'text' => "Match again reverse",
96
+ 'command' => proc {@text.focus; match_again_backwards}
97
+ )
75
98
 
76
99
 
77
- @button4 = TkButton.new(@frame1,
78
- 'text' => "Replace",
79
- 'command' => proc {replace}
80
- )
100
+ @button4 = TkButton.new(@frame1,
101
+ 'text' => "Replace",
102
+ 'command' => proc {replace}
103
+ )
81
104
 
82
- @button5 = TkButton.new(@frame1,
83
- 'text' => "Replace All (from here downward)",
84
- 'command' => proc {replace_all}
85
- )
105
+ @button5 = TkButton.new(@frame1,
106
+ 'text' => "Replace All (from here downward)",
107
+ 'command' => proc {replace_all}
108
+ )
86
109
 
87
- @label1 = TkLabel.new(@frame2,
88
- 'text' => "Search String"
89
- )
110
+ @label1 = TkLabel.new(@frame2,
111
+ 'text' => "Search String"
112
+ )
90
113
 
91
- @label2 = TkLabel.new(@frame2,
92
- 'text' => "Replace String"
93
- )
114
+ @label2 = TkLabel.new(@frame2,
115
+ 'text' => "Replace String"
116
+ )
94
117
 
95
118
 
96
- @scrollBar = TkScrollbar.new(@root,
97
- 'command' => proc {|*args| @text.yview(*args)}
98
- )
119
+ @scrollBar = TkScrollbar.new(@root,
120
+ 'command' => proc {|*args| @text.yview(*args)}
121
+ )
99
122
 
100
- @scrollBar2 = TkScrollbar.new(@root,
101
- 'orient' => "horizontal",
102
- 'command' => proc {|*args| @text.xview(*args)}
103
- )
123
+ @scrollBar2 = TkScrollbar.new(@root,
124
+ 'orient' => "horizontal",
125
+ 'command' => proc {|*args| @text.xview(*args)}
126
+ )
104
127
 
105
- @text.yscrollcommand(proc { |first, last| @scrollBar.set(first, last)})
106
- @text.xscrollcommand(proc { |first, last| @scrollBar2.set(first, last)})
128
+ @text.yscrollcommand(proc { |first, last| @scrollBar.set(first, last)})
129
+ @text.xscrollcommand(proc { |first, last| @scrollBar2.set(first, last)})
107
130
 
108
- @frame1.pack('side' => 'bottom', 'fill' => 'x')
109
- @frame2.pack('side' => 'bottom', 'fill' => 'x', 'pady' => 10)
110
- @frame3.pack('side' => 'bottom', 'fill' => 'x')
111
- @checkbox1.pack('side' => 'left', 'fill' => 'x')
112
- @checkbox2.pack('side' => 'left', 'fill' => 'x')
113
- @label1.pack('side' => 'left', 'fill' => 'x')
114
- @entry1.pack('side' => 'left', 'fill' => 'x', 'expand' => true)
115
- @label2.pack('side' => 'left', 'fill' => 'x')
116
- @entry2.pack('side' => 'left', 'fill' => 'x', 'expand' => true)
117
- @button1.pack('side' => 'left', 'fill' => 'x', 'expand' => true)
118
- @button2.pack('side' => 'left', 'fill' => 'x', 'expand' => true)
119
- @button3.pack('side' => 'left', 'fill' => 'x', 'expand' => true)
120
- @button4.pack('side' => 'left', 'fill' => 'x', 'expand' => true)
121
- @button5.pack('side' => 'left', 'fill' => 'x', 'expand' => true)
122
- @scrollBar.pack('side' => 'right', 'fill' => 'y')
123
- @scrollBar2.pack('side' => 'bottom', 'fill' => 'x')
124
- @text.pack('side' => 'right', 'fill' => 'both', 'expand' => true)
131
+ @frame1.pack('side' => 'bottom', 'fill' => 'x')
132
+ @frame2.pack('side' => 'bottom', 'fill' => 'x', 'pady' => 10)
133
+ @frame3.pack('side' => 'bottom', 'fill' => 'x')
134
+ @checkbox1.pack('side' => 'left', 'fill' => 'x')
135
+ @checkbox2.pack('side' => 'left', 'fill' => 'x')
136
+ @label1.pack('side' => 'left', 'fill' => 'x')
137
+ @entry1.pack('side' => 'left', 'fill' => 'x', 'expand' => true)
138
+ @label2.pack('side' => 'left', 'fill' => 'x')
139
+ @entry2.pack('side' => 'left', 'fill' => 'x', 'expand' => true)
140
+ @button1.pack('side' => 'left', 'fill' => 'x', 'expand' => true)
141
+ @button2.pack('side' => 'left', 'fill' => 'x', 'expand' => true)
142
+ @button3.pack('side' => 'left', 'fill' => 'x', 'expand' => true)
143
+ @button4.pack('side' => 'left', 'fill' => 'x', 'expand' => true)
144
+ @button5.pack('side' => 'left', 'fill' => 'x', 'expand' => true)
145
+ @scrollBar.pack('side' => 'right', 'fill' => 'y')
146
+ @scrollBar2.pack('side' => 'bottom', 'fill' => 'x')
147
+ @text.pack('side' => 'right', 'fill' => 'both', 'expand' => true)
125
148
 
126
- Tk.mainloop
127
- end
149
+ Tk.mainloop
150
+ end
128
151
 
129
- def open_file
130
- filetypes = [["All Files", "*"], ["Text Files", "*.txt"]]
131
- filename = Tk.getOpenFile('filetypes' => filetypes, 'parent' => @root)
132
- if filename != ""
133
- @text.value=(File.read(filename))
152
+ # This is the callback that is associated with the file_open menu item
153
+ # Parameters: none
154
+ # Return Value: none
155
+ def open_file # :doc:
156
+ filetypes = [["All Files", "*"], ["Text Files", "*.txt"]]
157
+ filename = Tk.getOpenFile('filetypes' => filetypes, 'parent' => @root)
158
+ if filename != ""
159
+ @text.value=(File.read(filename))
160
+ end
134
161
  end
135
- end
136
-
137
- def match
138
- y = 1; x = 0
139
- map = Array.new
140
- string = @text.value
141
- for i in 0..string.length
142
- if (string[i] == "\n"[0])
143
- map[i] = "#{y}.#{x}"
144
- y = y+1
145
- x = 0
146
- else
147
- map[i] = "#{y}.#{x}"
148
- x = x+1
149
- end
162
+
163
+ # This is the callback that performs the match operation, if dot matches
164
+ # newline mode is selected then this method will perform it's operation in a
165
+ # while loop which can be expensive. Even disregarding the while loop for
166
+ # normal matches, this method is pretty expensive. It has to do with how
167
+ # I'm calculating the mapping between the TK coordinates which are needed by
168
+ # the TkTags and the very large string that is returned from the
169
+ # TkText#value call. This could stand improvement, but since it's
170
+ # functioning I'm probably only going to come back to it after most of the
171
+ # rest of the functionality of the program is in place.
172
+ # Parameters: none
173
+ # Return Value: none
174
+ def match # :doc:
175
+ y = 1; x = 0
176
+ map = Array.new
177
+ string = @text.value
178
+ for i in 0..string.length
179
+ if (string[i] == "\n"[0])
180
+ map[i] = "#{y}.#{x}"
181
+ y = y+1
182
+ x = 0
183
+ else
184
+ map[i] = "#{y}.#{x}"
185
+ x = x+1
186
+ end
187
+ end
188
+
189
+ @tags.destroy
190
+ @tag.destroy
191
+ @tags = TkTextTag.new(@text, 'background' => 'red')
192
+ @tag = TkTextTag.new(@text, 'background' => 'blue')
193
+
194
+ if @entry1.value != ""
195
+ if @dmn == 1 and @ic == 1
196
+ @reg = Regexp.new("(?im:#{@entry1.value})")
197
+ elsif @ic == 1
198
+ @reg = Regexp.new("(?i:#{@entry1.value})")
199
+ elsif @dmn == 1
200
+ @reg = Regexp.new("(?m:#{@entry1.value})")
201
+ else
202
+ @reg = Regexp.new("#{@entry1.value}")
203
+ end
204
+ if (@reg =~ string)
205
+ c = 0
206
+ @tag_index = 0
207
+ @tags.add("#{map[$`.size]}", "#{map[($`.size + $&.size)]}")
208
+ @tag.add(@tags.ranges[0][0],@tags.ranges[0][1])
209
+ @tags.remove(@tag.ranges[0][0], @tag.ranges[0][1])
210
+ @text.set_insert("#{map[$`.size]}")
211
+ @text.see("#{map[$`.size]}")
212
+ c = c + $&.size + $`.size
213
+ while (@reg =~ $')
214
+ if $& == ""
215
+ $' =~ /\n/
216
+ c = c + 1
217
+ else
218
+ @tags.add("#{map[c + $`.size]}", "#{map[c + $`.size + $&.size]}")
219
+ c = c + $&.size + $`.size
220
+ end
221
+ end
222
+ end
223
+ end
150
224
  end
151
225
 
152
- @tags.destroy
153
- @tag.destroy
154
- @tags = TkTextTag.new(@text, 'background' => 'red')
155
- @tag = TkTextTag.new(@text, 'background' => 'blue')
156
-
157
- if @entry1.value != ""
158
- if @dmn == 1 and @ic == 1
159
- @reg = Regexp.new("(?im:#{@entry1.value})")
160
- elsif @ic == 1
161
- @reg = Regexp.new("(?i:#{@entry1.value})")
162
- elsif @dmn == 1
163
- @reg = Regexp.new("(?m:#{@entry1.value})")
164
- else
165
- @reg = Regexp.new("#{@entry1.value}")
166
- end
167
- if (@reg =~ string)
168
- c = 0
169
- @tag_index = 0
170
- @tags.add("#{map[$`.size]}", "#{map[($`.size + $&.size)]}")
171
- @tag.add(@tags.ranges[0][0],@tags.ranges[0][1])
172
- @tags.remove(@tag.ranges[0][0], @tag.ranges[0][1])
173
- @text.set_insert("#{map[$`.size]}")
174
- @text.see("#{map[$`.size]}")
175
- c = c + $&.size + $`.size
176
- while (@reg =~ $')
177
- if $& == ""
178
- $' =~ /\n/
179
- c = c + 1
180
- else
181
- @tags.add("#{map[c + $`.size]}", "#{map[c + $`.size + $&.size]}")
182
- c = c + $&.size + $`.size
183
- end
226
+ # This callback matches the next item in the original match, it does not
227
+ # check if the user re-entered a new search string, it simply moves to
228
+ # the next tag. It wraps if you are on the last tag
229
+ # Parameters: none
230
+ # Return Value: none
231
+ def match_again # :doc:
232
+ if @tags.ranges.length > 0
233
+ @tag_index = @tag_index + 1
234
+ @tag_index = 0 if @tag_index > @tags.ranges.length
235
+ @tags.add(@tag.ranges[0][0], @tag.ranges[0][1])
236
+ @tag.remove(@tag.ranges[0][0], @tag.ranges[0][1])
237
+ @tag.add(@tags.ranges[@tag_index][0], @tags.ranges[@tag_index][1])
238
+ @tags.remove(@tag.ranges[0][0], @tag.ranges[0][1])
239
+ @text.set_insert(@tag.ranges[0][0])
240
+ @text.see(@tag.ranges[0][0])
184
241
  end
185
- end
186
242
  end
187
- end
188
-
189
- def match_again
190
- if @tags.ranges.length > 0
191
- @tag_index = @tag_index + 1
192
- @tag_index = 0 if @tag_index > @tags.ranges.length
193
- @tags.add(@tag.ranges[0][0], @tag.ranges[0][1])
194
- @tag.remove(@tag.ranges[0][0], @tag.ranges[0][1])
195
- @tag.add(@tags.ranges[@tag_index][0], @tags.ranges[@tag_index][1])
196
- @tags.remove(@tag.ranges[0][0], @tag.ranges[0][1])
197
- @text.set_insert(@tag.ranges[0][0])
198
- @text.see(@tag.ranges[0][0])
199
- end
200
- end
201
-
202
- def match_again_backwards
203
- if @tags.ranges.length > 0
204
- @tag_index = @tag_index - 1
205
- @tag_index = @tags.ranges.length if @tag_index < 0
206
- @tags.add(@tag.ranges[0][0], @tag.ranges[0][1])
207
- @tag.remove(@tag.ranges[0][0], @tag.ranges[0][1])
208
- @tag.add(@tags.ranges[@tag_index][0], @tags.ranges[@tag_index][1])
209
- @tags.remove(@tag.ranges[0][0], @tag.ranges[0][1])
210
- @text.set_insert(@tag.ranges[0][0])
211
- @text.see(@tag.ranges[0][0])
243
+
244
+ # This callback matches the previous item in the original match, it does not
245
+ # check if the user re-entered a new search string, it simply moves to the
246
+ # previous tag. It wraps if you are on the first tag
247
+ # Parameters: none
248
+ # Return Value: none
249
+ def match_again_backwards # :doc:
250
+ if @tags.ranges.length > 0
251
+ @tag_index = @tag_index - 1
252
+ @tag_index = @tags.ranges.length if @tag_index < 0
253
+ @tags.add(@tag.ranges[0][0], @tag.ranges[0][1])
254
+ @tag.remove(@tag.ranges[0][0], @tag.ranges[0][1])
255
+ @tag.add(@tags.ranges[@tag_index][0], @tags.ranges[@tag_index][1])
256
+ @tags.remove(@tag.ranges[0][0], @tag.ranges[0][1])
257
+ @text.set_insert(@tag.ranges[0][0])
258
+ @text.see(@tag.ranges[0][0])
259
+ end
212
260
  end
213
- end
214
261
 
215
- def replace
216
- if @entry1.value != ""
217
- if @dmn == 1 and @ic == 1
218
- @reg = Regexp.new("(?im:#{@entry1.value})")
219
- elsif @ic == 1
220
- @reg = Regexp.new("(?i:#{@entry1.value})")
221
- elsif @dmn == 1
222
- @reg = Regexp.new("(?m:#{@entry1.value})")
223
- else
224
- @reg = Regexp.new("#{@entry1.value}")
225
- end
226
- end
227
-
228
- if (@tag.ranges.length > 0)
229
- string = @text.get(@tag.ranges[0][0], @tag.ranges[0][1])
230
- string.sub!(@reg, @entry2.value)
231
- @text.insert(@tag.ranges[0][0], string)
232
- @text.delete(@tag.ranges[0][0], @tag.ranges[0][1])
233
- unless @tag_index > @tags.ranges.length-1
234
- @tag.add(@tags.ranges[@tag_index][0], @tags.ranges[@tag_index][1])
235
- @tags.remove(@tag.ranges[0][0], @tag.ranges[0][1])
236
- @text.set_insert(@tag.ranges[0][0])
237
- @text.see(@tag.ranges[0][0])
238
- end
262
+ # This callback is responsible for performing replacements. It will only
263
+ # carry out replacements in already highlighted areas, ie if you have typed
264
+ # some text into the text box, and it has text that would have been matched
265
+ # by the match command, but you haven't re-executed the match callback
266
+ # function, that text will not be a part of the replacement.
267
+ # Parameters: none
268
+ # Return Value: none
269
+ def replace # :doc:
270
+ if @entry1.value != ""
271
+ if @dmn == 1 and @ic == 1
272
+ @reg = Regexp.new("(?im:#{@entry1.value})")
273
+ elsif @ic == 1
274
+ @reg = Regexp.new("(?i:#{@entry1.value})")
275
+ elsif @dmn == 1
276
+ @reg = Regexp.new("(?m:#{@entry1.value})")
277
+ else
278
+ @reg = Regexp.new("#{@entry1.value}")
279
+ end
280
+ end
281
+
282
+ if (@tag.ranges.length > 0)
283
+ string = @text.get(@tag.ranges[0][0], @tag.ranges[0][1])
284
+ string.sub!(@reg, @entry2.value)
285
+ @text.insert(@tag.ranges[0][0], string)
286
+ @text.delete(@tag.ranges[0][0], @tag.ranges[0][1])
287
+ unless @tag_index > @tags.ranges.length-1
288
+ @tag.add(@tags.ranges[@tag_index][0], @tags.ranges[@tag_index][1])
289
+ @tags.remove(@tag.ranges[0][0], @tag.ranges[0][1])
290
+ @text.set_insert(@tag.ranges[0][0])
291
+ @text.see(@tag.ranges[0][0])
292
+ end
293
+ end
239
294
  end
240
- end
241
295
 
242
- def replace_all
243
- if @entry1.value != ""
244
- if @dmn == 1 and @ic == 1
245
- @reg = Regexp.new("(?im:#{@entry1.value})")
246
- elsif @ic == 1
247
- @reg = Regexp.new("(?i:#{@entry1.value})")
248
- elsif @dmn == 1
249
- @reg = Regexp.new("(?m:#{@entry1.value})")
250
- else
251
- @reg = Regexp.new("#{@entry1.value}")
252
- end
253
- end
296
+ # This callback is responsible for performing replacements. It will only
297
+ # carry out replacements in already highlighted areas, ie if you have typed
298
+ # some text into the text box, and it has text that would have been matched
299
+ # by the match command, but you haven't re-executed the match callback
300
+ # function, that text will not be a part of the replacement. This method
301
+ # replaces all occurances in one go.
302
+ # Parameters: none
303
+ # Return Value: none
304
+ def replace_all # :doc:
305
+ if @entry1.value != ""
306
+ if @dmn == 1 and @ic == 1
307
+ @reg = Regexp.new("(?im:#{@entry1.value})")
308
+ elsif @ic == 1
309
+ @reg = Regexp.new("(?i:#{@entry1.value})")
310
+ elsif @dmn == 1
311
+ @reg = Regexp.new("(?m:#{@entry1.value})")
312
+ else
313
+ @reg = Regexp.new("#{@entry1.value}")
314
+ end
315
+ end
254
316
 
255
- while(@tag.ranges.length > 0)
256
- string = @text.get(@tag.ranges[0][0], @tag.ranges[0][1])
257
- string.sub!(@reg, @entry2.value)
258
- @text.insert(@tag.ranges[0][0], string)
259
- @text.delete(@tag.ranges[0][0], @tag.ranges[0][1])
260
- unless @tag_index > @tags.ranges.length-1
261
- @tag.add(@tags.ranges[@tag_index][0], @tags.ranges[@tag_index][1])
262
- @tags.remove(@tag.ranges[0][0], @tag.ranges[0][1])
263
- @text.set_insert(@tag.ranges[0][0])
264
- @text.see(@tag.ranges[0][0])
265
- end
317
+ while(@tag.ranges.length > 0)
318
+ string = @text.get(@tag.ranges[0][0], @tag.ranges[0][1])
319
+ string.sub!(@reg, @entry2.value)
320
+ @text.insert(@tag.ranges[0][0], string)
321
+ @text.delete(@tag.ranges[0][0], @tag.ranges[0][1])
322
+ unless @tag_index > @tags.ranges.length-1
323
+ @tag.add(@tags.ranges[@tag_index][0], @tags.ranges[@tag_index][1])
324
+ @tags.remove(@tag.ranges[0][0], @tag.ranges[0][1])
325
+ @text.set_insert(@tag.ranges[0][0])
326
+ @text.see(@tag.ranges[0][0])
327
+ end
328
+ end
266
329
  end
267
- end
268
330
  end
269
331
 
332
+ opts = OptionParser.new
333
+ opts.on("-h", "--help") {RDoc::usage}
334
+
335
+ opts.parse(ARGV)
336
+
270
337
  TkRegReplace.new
271
338
 
272
339
  # mark = TkTextMarkInsert.new(@text)
metadata CHANGED
@@ -3,11 +3,11 @@ rubygems_version: 0.8.10
3
3
  specification_version: 1
4
4
  name: tkregreplace
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.1.0
7
- date: 2005-11-09
6
+ version: 0.1.1
7
+ date: 2005-11-17
8
8
  summary: TK program which visualizes and caries out regular expression matches and or replacements on text files
9
9
  require_paths:
10
- - lib
10
+ - "."
11
11
  email: pfharlock@yahoo.com
12
12
  homepage:
13
13
  rubyforge_project:
@@ -15,7 +15,7 @@ description:
15
15
  autorequire:
16
16
  default_executable:
17
17
  bindir: "."
18
- has_rdoc: false
18
+ has_rdoc: true
19
19
  required_ruby_version: !ruby/object:Gem::Version::Requirement
20
20
  requirements:
21
21
  -