Files
gajim-plugins/syntax_highlight/syntax_highlight.py
Florian Münchbach 1b7442fc20 [syntax_highlight] Integrate with master branch
This commit contains all changes starting with the first integration of
the plugin into the gajim_1.1 branch (76dabe2) until the current plugin
version V3 (42b9aeb).
The manifest.ini is updated for compatibility with upcoming Gajim
versions.
2019-02-24 17:49:35 +01:00

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.plugin_system.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