Welcome to mirror list, hosted at ThFree Co, Russian Federation.

dev.gajim.org/gajim/gajim-plugins.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorwurstsalat <mailtrash@posteo.de>2021-10-26 23:19:35 +0300
committerwurstsalat <mailtrash@posteo.de>2021-10-26 23:19:35 +0300
commit8fae06e5417456d6f1c0a7d7bed5376b6550f0ee (patch)
treec664ea3d5822723cb0ff5ef376ebf8d92c79a771
parentab723504dc06998e76aa07774b26fe3d03623def (diff)
[latex] Remove plugin (may be ported later)
-rw-r--r--latex/__init__.py1
-rw-r--r--latex/config_dialog.py53
-rw-r--r--latex/latex.pngbin694 -> 0 bytes
-rw-r--r--latex/latex.py190
-rw-r--r--latex/latex_renderer.py175
-rw-r--r--latex/manifest.ini10
-rw-r--r--latex/util.py115
7 files changed, 0 insertions, 544 deletions
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 <http://www.gnu.org/licenses/>.
-
-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
--- a/latex/latex.png
+++ /dev/null
Binary files 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 <yvesf AT xapek.org>
-# Copyright (C) 2011 Yann Leboulanger <asterix AT lagaule.org>
-#
-# 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 <http://www.gnu.org/licenses/>.
-
-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 <yvesf AT xapek.org>
-# Copyright (C) 2011 Yann Leboulanger <asterix AT lagaule.org>
-#
-# 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 <http://www.gnu.org/licenses/>.
-
-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 <yvesf@xapek.org>
- Yann Leboulanger <asterix@lagaule.org>
-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 <http://www.gnu.org/licenses/>.
-
-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