118 lines
4.2 KiB
Python
118 lines
4.2 KiB
Python
import logging
|
|
import sys
|
|
|
|
if sys.version_info >= (3, 4):
|
|
from importlib.util import find_spec as find_module
|
|
else:
|
|
from importlib import find_loader as find_module
|
|
|
|
|
|
from gajim.plugins.helpers import log_calls, log
|
|
from gajim.plugins import GajimPlugin
|
|
|
|
from .types import MatchType, LineBreakOptions, CodeMarkerOptions, \
|
|
PLUGIN_INTERNAL_NONE_LEXER_ID
|
|
|
|
log = logging.getLogger('gajim.p.syntax_highlight')
|
|
|
|
def try_loading_pygments():
|
|
success = find_module('pygments') is not None
|
|
if success:
|
|
try:
|
|
from .chat_syntax_highlighter import ChatSyntaxHighlighter
|
|
from .plugin_config_dialog import SyntaxHighlighterPluginConfiguration
|
|
from .plugin_config import SyntaxHighlighterConfig
|
|
global SyntaxHighlighterPluginConfiguration, ChatSyntaxHighlighter, \
|
|
SyntaxHighlighterConfig
|
|
success = True
|
|
log.debug("pygments loaded.")
|
|
except Exception as exception:
|
|
log.error("Import Error: %s.", exception)
|
|
success = False
|
|
|
|
return success
|
|
|
|
PYGMENTS_MISSING = 'You are missing Python-Pygments.'
|
|
|
|
|
|
|
|
class SyntaxHighlighterPlugin(GajimPlugin):
|
|
@log_calls('SyntaxHighlighterPlugin')
|
|
def on_connect_with_chat_control(self, chat_control):
|
|
account = chat_control.contact.account.name
|
|
jid = chat_control.contact.jid
|
|
if account not in self.ccontrol:
|
|
self.ccontrol[account] = {}
|
|
self.ccontrol[account][jid] = ChatSyntaxHighlighter(
|
|
self.conf, chat_control.conv_textview)
|
|
|
|
@log_calls('SyntaxHighlighterPlugin')
|
|
def on_disconnect_from_chat_control(self, chat_control):
|
|
account = chat_control.contact.account.name
|
|
jid = chat_control.contact.jid
|
|
del self.ccontrol[account][jid]
|
|
|
|
@log_calls('SyntaxHighlighterPlugin')
|
|
def on_print_real_text(self, text_view, real_text, other_tags, graphics,
|
|
iterator, additional):
|
|
account = text_view.account
|
|
for jid in self.ccontrol[account]:
|
|
if self.ccontrol[account][jid].textview != text_view:
|
|
continue
|
|
self.ccontrol[account][jid].process_text(
|
|
real_text, other_tags, graphics, iterator, additional)
|
|
return
|
|
|
|
def try_init(self):
|
|
"""
|
|
Separating this part of the initialization from the init() method
|
|
allows repeating this step again, without reloading the plugin,
|
|
i.e. restarting Gajim for instance.
|
|
Doing so allows resolving the dependency issues without restart :)
|
|
"""
|
|
pygments_loaded = try_loading_pygments()
|
|
if not pygments_loaded:
|
|
return False
|
|
|
|
self.activatable = True
|
|
self.available_text = None
|
|
self.config_dialog = SyntaxHighlighterPluginConfiguration(self)
|
|
|
|
self.conf = SyntaxHighlighterConfig(self.config)
|
|
# The following initialization requires pygments to be available.
|
|
self.conf.init_pygments()
|
|
|
|
self.config_dialog = SyntaxHighlighterPluginConfiguration(self)
|
|
self.config_dialog.set_config(self.conf)
|
|
|
|
self.gui_extension_points = {
|
|
'chat_control_base': (
|
|
self.on_connect_with_chat_control,
|
|
self.on_disconnect_from_chat_control
|
|
),
|
|
'print_real_text': (self.on_print_real_text, None),
|
|
}
|
|
return True
|
|
|
|
@log_calls('SyntaxHighlighterPlugin')
|
|
def init(self):
|
|
self.ccontrol = {}
|
|
|
|
self.config_default_values = {
|
|
'default_lexer' : (PLUGIN_INTERNAL_NONE_LEXER_ID, ''),
|
|
'line_break' : (LineBreakOptions.MULTILINE, ''),
|
|
'style' : ('default', ''),
|
|
'font' : ('Monospace 10', ''),
|
|
'bgcolor' : ('#ccc', ''),
|
|
'bgcolor_override' : (True, ''),
|
|
'code_marker' : (CodeMarkerOptions.AS_COMMENT, ''),
|
|
'pygments_path' : (None, ''),
|
|
}
|
|
|
|
is_initialized = self.try_init()
|
|
|
|
if not is_initialized:
|
|
self.activatable = False
|
|
self.available_text = PYGMENTS_MISSING
|
|
self.config_dialog = None
|