blob: 0d80ce8e17c0f4b011b75bda18d11be0095735b5 [file] [log] [blame]
Guido van Rossum3b4ca0d1998-10-10 18:48:31 +00001import string
2import re
3
4class AutoExpand:
5
6 wordchars = string.letters + string.digits + "_"
7
8 def __init__(self, text):
9 self.text = text
10 self.text.wordlist = None
11 self.state = None
12 self.text.bind("<<expand-word>>", self.autoexpand)
13
14 def autoexpand(self, event):
15 curinsert = self.text.index("insert")
16 curline = self.text.get("insert linestart", "insert lineend")
17 if not self.state:
18 words = self.getwords()
19 index = 0
20 else:
21 words, index, insert, line = self.state
22 if insert != curinsert or line != curline:
23 words = self.getwords()
24 index = 0
25 if not words:
26 self.text.bell()
27 return "break"
28 word = self.getprevword()
29 self.text.delete("insert - %d chars" % len(word), "insert")
30 newword = words[index]
31 index = (index + 1) % len(words)
32 if index == 0:
33 self.text.bell() # Warn we cycled around
34 self.text.insert("insert", newword)
35 curinsert = self.text.index("insert")
36 curline = self.text.get("insert linestart", "insert lineend")
37 self.state = words, index, curinsert, curline
38 return "break"
39
40 def getwords(self):
41 word = self.getprevword()
42 if not word:
43 return []
44 before = self.text.get("1.0", "insert wordstart")
45 wbefore = re.findall(r"\b" + word + r"\w+\b", before)
46 del before
47 after = self.text.get("insert wordend", "end")
48 wafter = re.findall(r"\b" + word + r"\w+\b", after)
49 del after
50 if not wbefore and not wafter:
51 return []
52 words = []
53 dict = {}
54 # search backwards through words before
55 wbefore.reverse()
56 for w in wbefore:
57 if dict.get(w):
58 continue
59 words.append(w)
60 dict[w] = w
61 # search onwards through words after
62 for w in wafter:
63 if dict.get(w):
64 continue
65 words.append(w)
66 dict[w] = w
67 words.append(word)
68 return words
69
70 def getprevword(self):
71 line = self.text.get("insert linestart", "insert")
72 i = len(line)
73 while i > 0 and line[i-1] in self.wordchars:
74 i = i-1
75 return line[i:]