annotate Lib/idlelib/SearchEngine.py @ 80661:94de77bd0b4b 2.7

Issue #16194: document imp.load_dynamic problems when read several extension modules from the same binary object file.
author Andrew Svetlov <andrew.svetlov@gmail.com>
date Thu, 29 Nov 2012 19:51:28 +0200
parents b53604fad54b
children aa1350c7d196
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1 import re
47183
b53604fad54b Tkinter rename reversal: remove tkinter package, adapt imports and docs.
Georg Brandl <georg@python.org>
parents: 47101
diff changeset
2 from Tkinter import *
b53604fad54b Tkinter rename reversal: remove tkinter package, adapt imports and docs.
Georg Brandl <georg@python.org>
parents: 47101
diff changeset
3 import tkMessageBox
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
4
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
5 def get(root):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
6 if not hasattr(root, "_searchengine"):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
7 root._searchengine = SearchEngine(root)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
8 # XXX This will never garbage-collect -- who cares
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
9 return root._searchengine
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
10
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
11 class SearchEngine:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
12
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
13 def __init__(self, root):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
14 self.root = root
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
15 # State shared by search, replace, and grep;
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
16 # the search dialogs bind these to UI elements.
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
17 self.patvar = StringVar(root) # search pattern
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
18 self.revar = BooleanVar(root) # regular expression?
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
19 self.casevar = BooleanVar(root) # match case?
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
20 self.wordvar = BooleanVar(root) # match whole word?
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
21 self.wrapvar = BooleanVar(root) # wrap around buffer?
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
22 self.wrapvar.set(1) # (on by default)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
23 self.backvar = BooleanVar(root) # search backwards?
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
24
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
25 # Access methods
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
26
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
27 def getpat(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
28 return self.patvar.get()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
29
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
30 def setpat(self, pat):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
31 self.patvar.set(pat)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
32
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
33 def isre(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
34 return self.revar.get()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
35
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
36 def iscase(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
37 return self.casevar.get()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
38
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
39 def isword(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
40 return self.wordvar.get()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
41
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
42 def iswrap(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
43 return self.wrapvar.get()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
44
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
45 def isback(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
46 return self.backvar.get()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
47
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
48 # Higher level access methods
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
49
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
50 def getcookedpat(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
51 pat = self.getpat()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
52 if not self.isre():
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
53 pat = re.escape(pat)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
54 if self.isword():
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
55 pat = r"\b%s\b" % pat
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
56 return pat
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
57
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
58 def getprog(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
59 pat = self.getpat()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
60 if not pat:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
61 self.report_error(pat, "Empty regular expression")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
62 return None
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
63 pat = self.getcookedpat()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
64 flags = 0
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
65 if not self.iscase():
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
66 flags = flags | re.IGNORECASE
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
67 try:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
68 prog = re.compile(pat, flags)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
69 except re.error, what:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
70 try:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
71 msg, col = what
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
72 except:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
73 msg = str(what)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
74 col = -1
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
75 self.report_error(pat, msg, col)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
76 return None
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
77 return prog
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
78
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
79 def report_error(self, pat, msg, col=-1):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
80 # Derived class could overrid this with something fancier
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
81 msg = "Error: " + str(msg)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
82 if pat:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
83 msg = msg + "\np\Pattern: " + str(pat)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
84 if col >= 0:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
85 msg = msg + "\nOffset: " + str(col)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
86 tkMessageBox.showerror("Regular expression error",
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
87 msg, master=self.root)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
88
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
89 def setcookedpat(self, pat):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
90 if self.isre():
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
91 pat = re.escape(pat)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
92 self.setpat(pat)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
93
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
94 def search_text(self, text, prog=None, ok=0):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
95 """Search a text widget for the pattern.
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
96
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
97 If prog is given, it should be the precompiled pattern.
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
98 Return a tuple (lineno, matchobj); None if not found.
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
99
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
100 This obeys the wrap and direction (back) settings.
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
101
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
102 The search starts at the selection (if there is one) or
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
103 at the insert mark (otherwise). If the search is forward,
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
104 it starts at the right of the selection; for a backward
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
105 search, it starts at the left end. An empty match exactly
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
106 at either end of the selection (or at the insert mark if
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
107 there is no selection) is ignored unless the ok flag is true
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
108 -- this is done to guarantee progress.
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
109
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
110 If the search is allowed to wrap around, it will return the
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
111 original selection if (and only if) it is the only match.
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
112
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
113 """
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
114 if not prog:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
115 prog = self.getprog()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
116 if not prog:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
117 return None # Compilation failed -- stop
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
118 wrap = self.wrapvar.get()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
119 first, last = get_selection(text)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
120 if self.isback():
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
121 if ok:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
122 start = last
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
123 else:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
124 start = first
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
125 line, col = get_line_col(start)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
126 res = self.search_backward(text, prog, line, col, wrap, ok)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
127 else:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
128 if ok:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
129 start = first
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
130 else:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
131 start = last
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
132 line, col = get_line_col(start)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
133 res = self.search_forward(text, prog, line, col, wrap, ok)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
134 return res
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
135
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
136 def search_forward(self, text, prog, line, col, wrap, ok=0):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
137 wrapped = 0
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
138 startline = line
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
139 chars = text.get("%d.0" % line, "%d.0" % (line+1))
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
140 while chars:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
141 m = prog.search(chars[:-1], col)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
142 if m:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
143 if ok or m.end() > col:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
144 return line, m
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
145 line = line + 1
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
146 if wrapped and line > startline:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
147 break
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
148 col = 0
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
149 ok = 1
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
150 chars = text.get("%d.0" % line, "%d.0" % (line+1))
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
151 if not chars and wrap:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
152 wrapped = 1
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
153 wrap = 0
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
154 line = 1
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
155 chars = text.get("1.0", "2.0")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
156 return None
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
157
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
158 def search_backward(self, text, prog, line, col, wrap, ok=0):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
159 wrapped = 0
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
160 startline = line
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
161 chars = text.get("%d.0" % line, "%d.0" % (line+1))
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
162 while 1:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
163 m = search_reverse(prog, chars[:-1], col)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
164 if m:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
165 if ok or m.start() < col:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
166 return line, m
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
167 line = line - 1
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
168 if wrapped and line < startline:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
169 break
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
170 ok = 1
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
171 if line <= 0:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
172 if not wrap:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
173 break
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
174 wrapped = 1
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
175 wrap = 0
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
176 pos = text.index("end-1c")
25315
b968f038235e Merge PyIdle changes:
Kurt B. Kaiser <kbk@shore.net>
parents: 13975
diff changeset
177 line, col = map(int, pos.split("."))
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
178 chars = text.get("%d.0" % line, "%d.0" % (line+1))
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
179 col = len(chars) - 1
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
180 return None
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
181
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
182 # Helper to search backwards in a string.
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
183 # (Optimized for the case where the pattern isn't found.)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
184
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
185 def search_reverse(prog, chars, col):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
186 m = prog.search(chars)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
187 if not m:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
188 return None
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
189 found = None
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
190 i, j = m.span()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
191 while i < col and j <= col:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
192 found = m
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
193 if i == j:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
194 j = j+1
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
195 m = prog.search(chars, j)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
196 if not m:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
197 break
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
198 i, j = m.span()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
199 return found
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
200
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
201 # Helper to get selection end points, defaulting to insert mark.
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
202 # Return a tuple of indices ("line.col" strings).
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
203
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
204 def get_selection(text):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
205 try:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
206 first = text.index("sel.first")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
207 last = text.index("sel.last")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
208 except TclError:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
209 first = last = None
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
210 if not first:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
211 first = text.index("insert")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
212 if not last:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
213 last = first
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
214 return first, last
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
215
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
216 # Helper to parse a text index into a (line, col) tuple.
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
217
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
218 def get_line_col(index):
25315
b968f038235e Merge PyIdle changes:
Kurt B. Kaiser <kbk@shore.net>
parents: 13975
diff changeset
219 line, col = map(int, index.split(".")) # Fails on invalid index
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
220 return line, col