From 8fae06e5417456d6f1c0a7d7bed5376b6550f0ee Mon Sep 17 00:00:00 2001 From: wurstsalat Date: Tue, 26 Oct 2021 22:19:35 +0200 Subject: [latex] Remove plugin (may be ported later) --- latex/__init__.py | 1 - latex/config_dialog.py | 53 -------------- latex/latex.png | Bin 694 -> 0 bytes latex/latex.py | 190 ------------------------------------------------ latex/latex_renderer.py | 175 -------------------------------------------- latex/manifest.ini | 10 --- latex/util.py | 115 ----------------------------- 7 files changed, 544 deletions(-) delete mode 100644 latex/__init__.py delete mode 100644 latex/config_dialog.py delete mode 100644 latex/latex.png delete mode 100644 latex/latex.py delete mode 100644 latex/latex_renderer.py delete mode 100644 latex/manifest.ini delete mode 100644 latex/util.py diff --git a/latex/__init__.py b/latex/__init__.py deleted file mode 100644 index 80925ef..0000000 --- a/latex/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from .latex import LatexPlugin diff --git a/latex/config_dialog.py b/latex/config_dialog.py deleted file mode 100644 index 4d9b54f..0000000 --- a/latex/config_dialog.py +++ /dev/null @@ -1,53 +0,0 @@ -# This file is part of Gajim. -# -# Gajim is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published -# by the Free Software Foundation; version 3 only. -# -# Gajim is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Gajim. If not, see . - -from gi.repository import GObject -from gi.repository import Gtk - -from gajim.gui.settings import SettingsDialog -from gajim.gui.settings import SpinSetting -from gajim.gui.const import Setting -from gajim.gui.const import SettingType - -from gajim.plugins.plugins_i18n import _ - - -class LatexPluginConfiguration(SettingsDialog): - def __init__(self, plugin, parent): - self.plugin = plugin - - settings = [ - Setting('LatexDPISpinSetting', _('PNG DPI'), - SettingType.VALUE, int(self.plugin.config['png_dpi']), - callback=self.on_setting, data='png_dpi', - desc=_('Scale of the rendered PNG file'), - props={'range_': (72, 300)}), - ] - - SettingsDialog.__init__(self, parent, _('Latex Configuration'), - Gtk.DialogFlags.MODAL, settings, None, - extend=[('LatexDPISpinSetting', - DPISpinSetting)]) - - def on_setting(self, value, data): - self.plugin.config[data] = value - -class DPISpinSetting(SpinSetting): - - __gproperties__ = { - "setting-value": (int, 'Size', '', 72, 300, 108, - GObject.ParamFlags.READWRITE), } - - def __init__(self, *args, **kwargs): - SpinSetting.__init__(self, *args, **kwargs) diff --git a/latex/latex.png b/latex/latex.png deleted file mode 100644 index 2251642..0000000 Binary files a/latex/latex.png and /dev/null differ diff --git a/latex/latex.py b/latex/latex.py deleted file mode 100644 index 45cc456..0000000 --- a/latex/latex.py +++ /dev/null @@ -1,190 +0,0 @@ -# Copyright (C) 2010-2011 Yves Fischer -# Copyright (C) 2011 Yann Leboulanger -# -# This file is part of Gajim. -# -# Gajim is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published -# by the Free Software Foundation; version 3 only. -# -# Gajim is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Gajim. If not, see . - -import os -import logging -from functools import partial - -from gi.repository import Gtk -from gi.repository import Gdk -from gi.repository import GLib - -from gi.repository import Pango - -from gajim.plugins import GajimPlugin -from gajim.plugins.plugins_i18n import _ - -from latex.latex_renderer import LatexRenderer -from latex.config_dialog import LatexPluginConfiguration -from latex.util import try_run - -log = logging.getLogger('gajim.p.latex') - - -class LatexPlugin(GajimPlugin): - def init(self): - self.description = _( - 'Render LaTeX markup for $$foobar$$ sourrounded LaTeX equations.') - self.config_dialog = partial(LatexPluginConfiguration, self) - - self.config_default_values = { - 'png_dpi': ('108', '') - } - self.gui_extension_points = { - 'chat_control_base': ( - self._connect_chat_control_base, - self._disconnect_chat_control_base) - } - - self._test_activatable() - self._timeout_id = None - self._last_eol_offset = -1 - - def _connect_chat_control_base(self, chat_control): - d = {} - tv = chat_control.conv_textview.tv - tb = tv.get_buffer() - - self._latex_tag = Gtk.TextTag.new('latex') - self._latex_tag.set_property('foreground', 'blue') - self._latex_tag.set_property('underline', Pango.Underline.SINGLE) - d['tag_id'] = self._latex_tag.connect('event', self._textview_event_after) - tb.get_tag_table().add(self._latex_tag) - - d['h_id'] = tb.connect('changed', self._textbuffer_live_latex_expander) - chat_control.latexs_expander_plugin_data = d - - return True - - def _disconnect_chat_control_base(self, chat_control): - d = chat_control.latexs_expander_plugin_data - tv = chat_control.conv_textview.tv - - tv.get_buffer().disconnect(d['h_id']) - self._latex_tag.disconnect(d['tag_id']) - - def _test_activatable(self): - """ - performs very simple checks (check if executable is in PATH) - """ - self.available_text = '' - exitcode = try_run(['latex', '-version'], None) - if exitcode != 0: - latex_available = False - else: - latex_available = True - - exitcode = try_run(['dvipng', '--version'], None) - if exitcode != 0: - dvipng_available = False - else: - dvipng_available = True - - exitcode = try_run(['convert', '-version'], None) - if exitcode != 0: - imagemagick_available = False - else: - imagemagick_available = True - - pkgs = '' - - if not latex_available: - if os.name == 'nt': - pkgs = 'MikTex' - else: - pkgs = 'texlive-latex-base' - self.available_text = _('LaTeX is not available') - self.activatable = False - - if not dvipng_available and not imagemagick_available: - if os.name == 'nt': - if not pkgs: - pkgs = 'MikTex' - else: - if pkgs: - pkgs += _(' and ') - pkgs += '%s or %s' % ('dvipng', 'ImageMagick') - if self.available_text: - self.available_text += ' and ' - self.available_text += _('dvipng and Imagemagick are not available') - - if self.available_text: - self.activatable = False - self.available_text += _('. Install %s') % pkgs - - def _textview_event_after(self, tag, widget, event, iter_): - """ - start rendering if clicked on a link - """ - if tag.get_property('name') != 'latex' or \ - event.type != Gdk.EventType.BUTTON_PRESS: - return - dollar_start, _iter_start = iter_.backward_search( - '$$', - Gtk.TextSearchFlags.TEXT_ONLY, None) - _iter_end, dollar_end = iter_.forward_search( - '$$', - Gtk.TextSearchFlags.TEXT_ONLY, None) - LatexRenderer(dollar_start, dollar_end, widget, self.config['png_dpi']) - - def _textbuffer_live_latex_expander(self, tb): - """ - called when conversation text widget changes - """ - def _split_list(list_): - newlist = [] - for i in range(0, len(list_)-1, 2): - newlist.append([ list_[i], list_[i+1], ]) - return newlist - - def _detect_tags(tb, start_it=None, end_it=None): - self._timeout_id = None - if not end_it: - end_it = tb.get_end_iter() - if not start_it: - eol_tag = tb.get_tag_table().lookup('eol') - start_it = end_it.copy() - start_it.backward_to_tag_toggle(eol_tag) - points = [] - tuple_found = start_it.forward_search( - '$$', - Gtk.TextSearchFlags.TEXT_ONLY, None) - while tuple_found is not None: - points.append(tuple_found) - tuple_found = tuple_found[1].forward_search( - '$$', - Gtk.TextSearchFlags.TEXT_ONLY, None) - - for pair in _split_list(points): - tb.apply_tag_by_name('latex', pair[0][1], pair[1][0]) - - end_iter = tb.get_end_iter() - eol_tag = tb.get_tag_table().lookup('eol') - it = end_iter.copy() - it.backward_to_tag_toggle(eol_tag) - if it.get_offset() == self._last_eol_offset: - if self._timeout_id: - GLib.source_remove(self._timeout_id) - self._timeout_id = GLib.timeout_add(100, _detect_tags, tb, it, end_iter) - else: - if self._timeout_id: - GLib.source_remove(self._timeout_id) - it1 = it.copy() - it1.backward_char() - it1.backward_to_tag_toggle(eol_tag) - _detect_tags(tb, it1, it) - self._last_eol_offset = it.get_offset() diff --git a/latex/latex_renderer.py b/latex/latex_renderer.py deleted file mode 100644 index 4114c5a..0000000 --- a/latex/latex_renderer.py +++ /dev/null @@ -1,175 +0,0 @@ -# Copyright (C) 2010-2011 Yves Fischer -# Copyright (C) 2011 Yann Leboulanger -# -# This file is part of Gajim. -# -# Gajim is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published -# by the Free Software Foundation; version 3 only. -# -# Gajim is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Gajim. If not, see . - -import random -import os -import logging -from tempfile import mkstemp -from tempfile import mkdtemp - -from gi.repository import Gtk -from gi.repository import GdkPixbuf -from gi.repository import GLib - -from gajim.common import app - -from gajim.plugins.plugins_i18n import _ - -from latex.util import try_run -from latex.util import write_latex -from latex.util import BLACKLIST - -log = logging.getLogger('gajim.p.latex') - - -class LatexRenderer: - def __init__(self, iter_start, iter_end, widget, png_dpi): - self.widget = widget - self.buffer = widget.get_buffer() - self.code = iter_start.get_text(iter_end) - self.mark_name = 'LatexRendererMark%s' % str(random.randint(0, 1000)) - self.mark = self.buffer.create_mark(self.mark_name, iter_start, True) - self.png_dpi = str(png_dpi) - - # delete code and show message 'processing' - self.buffer.delete(iter_start, iter_end) - self.buffer.insert(iter_start, _('Processing LaTeX')) - self._start_processing() - - def _start_processing(self): - try: - if self._check_code(): - self._show_image() - else: - self._show_error(_('There are bad commands!')) - except Exception as err: - self._show_error(_('Error processing LaTeX: %s' % err)) - finally: - self.buffer.delete_mark(self.mark) - - def _check_code(self): - for bad_cmd in BLACKLIST: - if self.code.find(bad_cmd) != -1: - # Found bad command - return False - return True - - def _show_error(self, message): - """ - String -> TextBuffer - """ - iter_mark = self.buffer.get_iter_at_mark(self.mark) - iter_end = iter_mark.copy().forward_search( - _('Processing LaTeX'), - Gtk.TextSearchFlags.TEXT_ONLY, None)[1] - self.buffer.delete(iter_mark, iter_end) - self.buffer.insert(iter_end, message) - - def _show_image(self): - """ - Latex -> PNG -> TextBuffer - """ - - def _fg_str(fmt): - try: - return [ - {'hex' : '+level-colors', 'tex' : '-fg'}[fmt], - app.interface.get_fg_color(fmt)] - except KeyError: - # interface may not be available when we test latex at startup - return [] - except AttributeError: - # interface may not be available when we test latext at startup - return {'hex': ['+level-colors', '0x000000'], - 'tex': ['-fg', 'rgb 0.0 0.0 0.0']}[fmt] - - try: - tmpdir = mkdtemp(prefix='gajim_tex') - tmpfd, tmppng = mkstemp(prefix='gajim_tex', suffix='.png') - os.close(tmpfd) - except Exception: - msg = 'Could not create temporary files for Latex plugin' - log.debug(msg) - self._show_error( - _('latex error: %(error)s\n===ORIGINAL CODE====\n' - '%(code)s') % { - 'error': msg, - 'code': self.code[2:len(self.code)-2]}) - return False - - tmpfile = os.path.join(tmpdir, 'gajim_tex') - - # build latex string - write_latex(tmpfile + '.tex', self.code[2:len(self.code)-2]) - - # convert TeX to dvi - exitcode = try_run( - ['latex', '--interaction=nonstopmode', tmpfile + '.tex'], tmpdir) - - if exitcode == 0: - # convert dvi to png - log.debug('DVI OK') - exitcode = try_run( - ['dvipng', '-bg', 'Transparent'] + _fg_str('tex') + \ - ['-T', 'tight', '-D', self.png_dpi, tmpfile + '.dvi', '-o', - tmpfile + '.png'], tmpdir) - - if exitcode: - # dvipng failed, try convert - log.debug('dvipng failed, try convert') - exitcode = try_run( - ['convert'] + _fg_str('hex') + \ - ['-trim', '-density', self.png_dpi, - tmpfile + '.dvi', tmpfile + '.png'], tmpdir) - - # remove temp files created by us and TeX - extensions = ['.tex', '.log', '.aux', '.dvi'] - for ext in extensions: - try: - os.remove(tmpfile + ext) - except Exception: - pass - - if exitcode == 0: - log.debug('PNG OK') - os.rename(tmpfile + '.png', tmppng) - else: - log.debug('PNG FAILED') - os.remove(tmppng) - os.rmdir(tmpdir) - self._show_error( - _('Convertion to image failed\n===ORIGINAL CODE====' - '\n%s') % self.code[2:len(self.code)-2]) - return False - - log.debug('Loading PNG %s', tmppng) - try: - pixbuf = GdkPixbuf.Pixbuf.new_from_file(tmppng) - log.debug('png loaded') - iter_mark = self.buffer.get_iter_at_mark(self.mark) - iter_end = iter_mark.copy().forward_search( - _('Processing LaTeX'), - Gtk.TextSearchFlags.TEXT_ONLY, None)[1] - log.debug('Delete old Text') - self.buffer.delete(iter_mark, iter_end) - log.debug('Insert pixbuf') - self.buffer.insert_pixbuf(iter_end, pixbuf) - except GLib.GError: - self._show_error(_('Cannot open %s for reading') % tmppng) - log.debug('Cant open %s for reading', tmppng) - finally: - os.remove(tmppng) diff --git a/latex/manifest.ini b/latex/manifest.ini deleted file mode 100644 index b590430..0000000 --- a/latex/manifest.ini +++ /dev/null @@ -1,10 +0,0 @@ -[info] -name: Latex -short_name: latex -version: 1.4.0 -description: Render LaTeX markup for $$foobar$$ sourrounded LaTeX equations. -authors: Yves Fischer - Yann Leboulanger -homepage: https://dev.gajim.org/gajim/gajim-plugins/wikis/LatexPlugin -min_gajim_version: 1.4.0-dev1 -max_gajim_version: 1.4.90 diff --git a/latex/util.py b/latex/util.py deleted file mode 100644 index 702cc62..0000000 --- a/latex/util.py +++ /dev/null @@ -1,115 +0,0 @@ -# This file is part of Gajim. -# -# Gajim is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published -# by the Free Software Foundation; version 3 only. -# -# Gajim is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Gajim. If not, see . - -import logging -import os -from subprocess import Popen -from subprocess import PIPE - -from gajim.plugins.plugins_i18n import _ - -log = logging.getLogger('gajim.p.latex') - -BLACKLIST = [ - '\def', - '\\let', - '\\futurelet', - '\\newcommand', - '\\renewcomment', - '\\else', - '\\fi', - '\\write', - '\\input', - '\\include', - '\\chardef', - '\\catcode', - '\\makeatletter', - '\\noexpand', - '\\toksdef', - '\\every', - '\\errhelp', - '\\errorstopmode', - '\\scrollmode', - '\\nonstopmode', - '\\batchmode', - '\\read', - '\\csname', - '\\newhelp', - '\\relax', - '\\afterground', - '\\afterassignment', - '\\expandafter', - '\\noexpand', - '\\special', - '\\command', - '\\loop', - '\\repeat', - '\\toks', - '\\output', - '\\line', - '\\mathcode', - '\\name', - '\\item', - '\\section', - '\\mbox', - '\\DeclareRobustCommand', - '\\[', - '\\]', -] - - -def try_run(argv, directory): - try: - proc = popen_nt_friendly(argv, directory) - out = proc.communicate()[0] - log.info(out) - return proc.wait() - except Exception as err: - return _('Error executing "%(command)s": %(error)s') % { - 'command': " ".join(argv), - 'error': str(err)} - - -def popen_nt_friendly(command, directory): - if os.name == 'nt': - # CREATE_NO_WINDOW - return Popen(command, creationflags=0x08000000, cwd=directory, - stdout=PIPE) - return Popen(command, cwd=directory, stdout=PIPE) - - -def write_latex(filename, string): - texstr = _get_latex_template(string) - - file_ = open(filename, 'w+') - file_.write(texstr) - file_.flush() - file_.close() - - -def _get_latex_template(code): - template = ''' - \\documentclass[12pt]{article} - \\usepackage[dvips]{graphicx} - \\usepackage{amsmath} - \\usepackage{amssymb} - \\pagestyle{empty} - \\begin{document} - \\begin{large} - \\begin{gather*} - %s - \\end{gather*} - \\end{large} - \\end{document}''' % (code) - return template -- cgit v1.2.3