sugar-toolkit-gtk3/services/console/lib/purk/scripts/completion.py

136 lines
4.1 KiB
Python
Raw Normal View History

2007-08-21 18:18:38 +02:00
import windows
import chaninfo
from conf import conf
def channel_completer(window, left, right, text):
if isinstance(window, windows.ChannelWindow):
yield window.id
for w in windows.get_with(wclass=windows.ChannelWindow, network=window.network):
if w is not window:
yield w.id
for w in windows.get_with(wclass=windows.ChannelWindow):
if w.network is not window.network:
yield w.id
# normal server commands
srv_commands = ('ping', 'join', 'part', 'mode', 'server', 'kick',
'quit', 'nick', 'privmsg', 'notice', 'topic')
def command_completer(window, left, right, text):
for c in srv_commands:
yield '/%s' % c
if 'CMDS' in window.network.isupport:
for c in window.network.isupport['CMDS'].split(','):
yield '/%s' % c.lower()
for c in core.events.all_events:
if c.startswith('Command') and c != 'Command':
yield '/%s' % c[7:].lower()
def nick_completer(window, left, right, text):
if type(window) == windows.QueryWindow:
yield window.id
recent_speakers = getattr(window, 'recent_speakers', ())
for nick in recent_speakers:
if chaninfo.ison(window.network, window.id, nick):
yield nick
for nick in chaninfo.nicks(window.network, window.id):
if nick not in recent_speakers:
yield nick
def script_completer(window, left, right, text):
return core.events.loaded.iterkeys()
def network_completer(window, left, right, text):
return conf.get('networks', {}).iterkeys()
def get_completer_for(window):
input = window.input
left, right = input.text[:input.cursor], input.text[input.cursor:]
text = left.split(' ')[-1]
while True:
suffix = ''
if text and text[0] in window.network.isupport.get('CHANTYPES', '#&+'):
candidates = channel_completer(window, left, right, text)
elif input.text.startswith('/reload '):
candidates = script_completer(window, left, right, text)
elif input.text.startswith('/edit '):
candidates = script_completer(window, left, right, text)
elif input.text.startswith('/server '):
candidates = network_completer(window, left, right, text)
elif text.startswith('/'):
candidates = command_completer(window, left, right, text)
suffix = ' '
else:
candidates = nick_completer(window, left, right, text)
if left == text:
suffix = ': '
else:
suffix = ' '
if text:
before = left[:-len(text)]
else:
before = left
insert_text = '%s%s%s%s' % (before, '%s', suffix, right)
cursor_pos = len(before + suffix)
original = window.input.text, window.input.cursor
for cand in candidates:
if cand.lower().startswith(text.lower()):
window.input.text, window.input.cursor = insert_text % cand, cursor_pos + len(cand)
yield None
window.input.text, window.input.cursor = original
yield None
# generator--use recent_completer.next() to continue cycling through whatever
recent_completer = None
def onKeyPress(e):
global recent_completer
if e.key == 'Tab':
if not recent_completer:
recent_completer = get_completer_for(e.window)
recent_completer.next()
else:
recent_completer = None
def onActive(e):
global recent_completer
recent_completer = None
def onText(e):
if chaninfo.ischan(e.network, e.target):
if not hasattr(e.window, 'recent_speakers'):
e.window.recent_speakers = []
for nick in e.window.recent_speakers:
if nick == e.source or not chaninfo.ison(e.network, e.target, nick):
e.window.recent_speakers.remove(nick)
e.window.recent_speakers.insert(0, e.source)
onAction = onText