141 lines
4.0 KiB
Python
141 lines
4.0 KiB
Python
import sublime
|
|
from os.path import normpath, join
|
|
import imp
|
|
from collections import namedtuple
|
|
import sys
|
|
import traceback
|
|
import warnings
|
|
|
|
|
|
class BracketRegion (namedtuple('BracketRegion', ['begin', 'end'], verbose=False)):
|
|
"""
|
|
Bracket Regions for plugins
|
|
"""
|
|
|
|
def move(self, begin, end):
|
|
"""
|
|
Move bracket region to different points
|
|
"""
|
|
|
|
return self._replace(begin=begin, end=end)
|
|
|
|
def size(self):
|
|
"""
|
|
Get the size of the region
|
|
"""
|
|
|
|
return abs(self.begin - self.end)
|
|
|
|
def toregion(self):
|
|
"""
|
|
Convert to sublime region
|
|
"""
|
|
|
|
return sublime.Region(self.begin, self.end)
|
|
|
|
|
|
def is_bracket_region(obj):
|
|
"""
|
|
Check if object is a BracketRegion
|
|
"""
|
|
|
|
return isinstance(obj, BracketRegion)
|
|
|
|
|
|
class ImportModule(object):
|
|
@classmethod
|
|
def import_module(cls, module_name, loaded=None):
|
|
# Pull in built-in and custom plugin directory
|
|
if module_name.startswith("bh_modules."):
|
|
path_name = join(sublime.packages_path(), "BracketHighlighter", normpath(module_name.replace('.', '/')))
|
|
else:
|
|
path_name = join(sublime.packages_path(), normpath(module_name.replace('.', '/')))
|
|
path_name += ".py"
|
|
if loaded is not None and module_name in loaded:
|
|
module = sys.modules[module_name]
|
|
else:
|
|
with warnings.catch_warnings(record=True) as w:
|
|
# Ignore warnings about plugin folder not being a python package
|
|
warnings.simplefilter("always")
|
|
module = imp.new_module(module_name)
|
|
sys.modules[module_name] = module
|
|
source = None
|
|
with open(path_name) as f:
|
|
source = f.read().replace('\r', '')
|
|
cls.__execute_module(source, module_name)
|
|
w = filter(lambda i: issubclass(i.category, UserWarning), w)
|
|
return module
|
|
|
|
@classmethod
|
|
def __execute_module(cls, source, module_name):
|
|
exec(compile(source, module_name, 'exec'), sys.modules[module_name].__dict__)
|
|
|
|
@classmethod
|
|
def import_from(cls, module_name, attribute):
|
|
return getattr(cls.import_module(module_name), attribute)
|
|
|
|
|
|
class BracketPlugin(object):
|
|
"""
|
|
Class for preparing and running plugins
|
|
"""
|
|
|
|
def __init__(self, plugin, loaded):
|
|
"""
|
|
Load plugin module
|
|
"""
|
|
|
|
self.enabled = False
|
|
self.args = plugin['args'] if ("args" in plugin) else {}
|
|
self.plugin = None
|
|
if 'command' in plugin:
|
|
plib = plugin['command']
|
|
try:
|
|
module = ImportModule.import_module(plib, loaded)
|
|
self.plugin = getattr(module, 'plugin')()
|
|
loaded.add(plib)
|
|
self.enabled = True
|
|
except Exception:
|
|
print 'BracketHighlighter: Load Plugin Error: %s\n%s' % (plugin['command'], traceback.format_exc())
|
|
|
|
def is_enabled(self):
|
|
"""
|
|
Check if plugin is enabled
|
|
"""
|
|
|
|
return self.enabled
|
|
|
|
def run_command(self, view, name, left, right, selection):
|
|
"""
|
|
Load arguments into plugin and run
|
|
"""
|
|
|
|
plugin = self.plugin()
|
|
setattr(plugin, "left", left)
|
|
setattr(plugin, "right", right)
|
|
setattr(plugin, "view", view)
|
|
setattr(plugin, "selection", selection)
|
|
edit = view.begin_edit()
|
|
self.args["edit"] = edit
|
|
self.args["name"] = name
|
|
try:
|
|
plugin.run(**self.args)
|
|
left, right, selection = plugin.left, plugin.right, plugin.selection
|
|
except Exception:
|
|
print "BracketHighlighter: Plugin Run Error:\n%s" % str(traceback.format_exc())
|
|
view.end_edit(edit)
|
|
return left, right, selection
|
|
|
|
|
|
class BracketPluginCommand(object):
|
|
"""
|
|
Bracket Plugin base class
|
|
"""
|
|
|
|
def run(self, bracket, content, selection):
|
|
"""
|
|
Runs the plugin class
|
|
"""
|
|
|
|
pass
|