-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathnanobots_plugin.py
100 lines (77 loc) · 3.23 KB
/
nanobots_plugin.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
import sublime
import sublime_plugin
from .sublime_helpers import SublimeHelpers
from .nanobot_helpers import NanoBotHelpers
class NanoBotsCommand(sublime_plugin.TextCommand):
def run(
self, edit,
action, mode='replace', prefix='', format='[prompt]: [input]',
state='-', cartridge=None, input=None
):
environment = {'command': self, 'edit': edit}
params = {
'action': action, 'mode': mode, 'prefix': prefix, 'format': format,
'state': state, 'cartridge': cartridge, 'input': input}
NanoBotsDispatcher.run(environment, params, 0)
class NanoBotsDispatcher:
@staticmethod
def run(environment, params, counter):
if counter > 2:
sublime.error_message(
'Too many input requests: {}'.format(counter))
return
if params['action'] == 'stop':
NanoBotHelpers.stop()
return
if params['cartridge'] is None:
NanoBotsDispatcher.ask_for_cartridge(environment, params, counter)
return
if params['action'] == 'evaluate':
selection = SublimeHelpers.selection()
if selection['text'] == '':
return
NanoBotHelpers.evaluate(
params['cartridge'], params['state'],
selection['text'], params['mode'], params['prefix'])
if params['action'] == 'prompt':
if params['input'] is None or params['input'] == '':
NanoBotsDispatcher.ask_for_input(environment, params, counter)
return
NanoBotHelpers.evaluate(
params['cartridge'], params['state'],
params['input'], params['mode'], params['prefix'])
if params['action'] == 'apply':
selection = SublimeHelpers.selection()
if selection['text'] == '':
return
if params['input'] is None or params['input'] == '':
NanoBotsDispatcher.ask_for_input(environment, params, counter)
return
text_input = params['format'].replace(
'[prompt]', params['input']
).replace('[input]', selection['text'])
NanoBotHelpers.evaluate(
params['cartridge'], params['state'],
text_input, params['mode'], params['prefix'])
@staticmethod
def ask_for_cartridge(environment, params, counter):
def on_done(options, index):
if index == -1:
return
params['cartridge'] = options[index][1]['system']['id']
NanoBotsDispatcher.run(environment, params, counter + 1)
def open(options):
environment['command'].view.window().show_quick_panel(
list(map(lambda option: option[0], options)),
lambda index:
on_done(options, index)
)
NanoBotHelpers.cartridges_as_menu(open)
@staticmethod
def ask_for_input(environment, params, counter):
def on_done(input):
params['input'] = input
NanoBotsDispatcher.run(environment, params, counter + 1)
environment['command'].view.window().show_input_panel(
'Prompt', '', on_done, None, None
)