forked from Thom1729/Sublime-JS-Custom
/
build_js_custom_syntaxes.py
106 lines (81 loc) · 3.2 KB
/
build_js_custom_syntaxes.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
101
102
103
104
105
106
import sublime
import sublime_plugin
import os
from os import path
import re
from package_control import events
from sublime_lib.output_panel import OutputPanel
from sublime_lib.settings_dict import NamedSettingsDict
SOURCE_PATH = 'Packages/JSCustom/src/JS Custom.sublime-syntax.yaml-macros'
SUBSCRIPTION_KEY = None
def plugin_loaded():
global SYNTAXES_PATH
SYNTAXES_PATH = path.join(sublime.packages_path(), 'User', 'JS Custom', 'Syntaxes')
global SETTINGS
SETTINGS = NamedSettingsDict('JS Custom.sublime-settings')
if events.install("JSCustom") or events.post_upgrade("JSCustom"):
def build():
sublime.active_window().run_command('build_js_custom_syntaxes')
sublime.set_timeout_async(build, 500)
global SUBSCRIPTION_KEY
SUBSCRIPTION_KEY = SETTINGS.subscribe(get_configurations, auto_build)
def plugin_unloaded():
global SUBSCRIPTION_KEY
if SUBSCRIPTION_KEY:
SETTINGS.unsubscribe(SUBSCRIPTION_KEY)
def merge(*dicts):
ret = {}
for d in dicts:
ret.update(d)
return ret
def get_configurations(settings):
configs = settings['configurations']
if settings['embed_configuration']:
configs = merge(
{ '~embed': settings['embed_configuration'] },
settings['configurations']
)
return {
name: merge(settings['defaults'], config)
for name, config in configs.items()
}
def auto_build(new_configurations, old_configurations):
if not SETTINGS['auto_build']: return
changed = [
name
for name in ( set(old_configurations) | set(new_configurations) )
if old_configurations.get(name, None) != new_configurations.get(name, None)
]
if changed:
sublime.active_window().run_command('build_js_custom_syntaxes', { 'versions': changed })
class BuildJsCustomSyntaxesCommand(sublime_plugin.WindowCommand):
def run(self, versions=None):
from yamlmacros import build
panel = OutputPanel.create(self.window, 'YAMLMacros')
panel.show()
os.makedirs(SYNTAXES_PATH, exist_ok=True)
source_text = sublime.load_resource('Packages/JSCustom/src/JS Custom.sublime-syntax.yaml-macros')
configurations = get_configurations(SETTINGS)
config_names = set(configurations)
old_syntaxes = [
file for file in os.listdir(SYNTAXES_PATH)
if path.splitext(file)[0] not in config_names
and path.splitext(file)[1] == '.sublime-syntax'
]
for file in old_syntaxes:
file_path = path.join(SYNTAXES_PATH, file)
os.remove(file_path)
panel.print("Removed %s (%s)." % (file, file_path))
if versions:
config_names = config_names & set(versions)
for name in config_names:
build(
source_text=source_text,
destination_path=path.join(SYNTAXES_PATH, name + '.sublime-syntax'),
arguments=merge({
'name': 'JS Custom - %s' % name,
'scope': 'source.js.%s' % re.sub(r'[^\w-]', '', name.lower()),
'file_path': SOURCE_PATH,
}, configurations[name]),
error_stream=panel,
)