summaryrefslogtreecommitdiffstats
path: root/kopete/plugins/latex
diff options
context:
space:
mode:
Diffstat (limited to 'kopete/plugins/latex')
-rw-r--r--kopete/plugins/latex/Makefile.am27
-rw-r--r--kopete/plugins/latex/icons/Makefile.am3
-rw-r--r--kopete/plugins/latex/icons/cr32-app-latex.pngbin0 -> 474 bytes
-rw-r--r--kopete/plugins/latex/kopete_latex.desktop71
-rw-r--r--kopete/plugins/latex/kopete_latex_config.desktop69
-rwxr-xr-xkopete/plugins/latex/kopete_latexconvert.sh234
-rw-r--r--kopete/plugins/latex/latexchatui.rc9
-rw-r--r--kopete/plugins/latex/latexconfig.kcfg19
-rw-r--r--kopete/plugins/latex/latexconfig.kcfgc7
-rw-r--r--kopete/plugins/latex/latexguiclient.cpp76
-rw-r--r--kopete/plugins/latex/latexguiclient.h53
-rw-r--r--kopete/plugins/latex/latexplugin.cpp259
-rw-r--r--kopete/plugins/latex/latexplugin.h77
-rw-r--r--kopete/plugins/latex/latexpreferences.cpp76
-rw-r--r--kopete/plugins/latex/latexpreferences.h48
-rw-r--r--kopete/plugins/latex/latexprefsbase.ui168
16 files changed, 1196 insertions, 0 deletions
diff --git a/kopete/plugins/latex/Makefile.am b/kopete/plugins/latex/Makefile.am
new file mode 100644
index 00000000..924da747
--- /dev/null
+++ b/kopete/plugins/latex/Makefile.am
@@ -0,0 +1,27 @@
+METASOURCES = AUTO
+
+SUBDIRS = icons
+
+AM_CPPFLAGS = $(KOPETE_INCLUDES) $(all_includes)
+
+kde_module_LTLIBRARIES = kopete_latex.la kcm_kopete_latex.la
+
+kopete_latex_la_SOURCES = latexplugin.cpp latexconfig.kcfgc latexguiclient.cpp
+kopete_latex_la_LDFLAGS = -module -no-undefined $(KDE_PLUGIN) $(all_libraries)
+kopete_latex_la_LIBADD = ../../libkopete/libkopete.la
+
+kcm_kopete_latex_la_SOURCES = latexprefsbase.ui latexpreferences.cpp latexconfig.kcfgc
+kcm_kopete_latex_la_LDFLAGS = -module -no-undefined $(KDE_PLUGIN) $(all_libraries)
+kcm_kopete_latex_la_LIBADD = $(LIB_KOPETECOMPAT) $(LIB_KUTILS)
+
+service_DATA = kopete_latex.desktop
+servicedir = $(kde_servicesdir)
+
+kcm_DATA = kopete_latex_config.desktop
+kcmdir = $(kde_servicesdir)/kconfiguredialog
+
+bin_SCRIPTS = kopete_latexconvert.sh
+kde_kcfg_DATA = latexconfig.kcfg
+
+mydatadir = $(kde_datadir)/kopete_latex
+mydata_DATA = latexchatui.rc \ No newline at end of file
diff --git a/kopete/plugins/latex/icons/Makefile.am b/kopete/plugins/latex/icons/Makefile.am
new file mode 100644
index 00000000..224eb420
--- /dev/null
+++ b/kopete/plugins/latex/icons/Makefile.am
@@ -0,0 +1,3 @@
+kopeteicondir = $(kde_datadir)/kopete/icons
+kopeteicon_ICON = AUTO
+
diff --git a/kopete/plugins/latex/icons/cr32-app-latex.png b/kopete/plugins/latex/icons/cr32-app-latex.png
new file mode 100644
index 00000000..69df3f61
--- /dev/null
+++ b/kopete/plugins/latex/icons/cr32-app-latex.png
Binary files differ
diff --git a/kopete/plugins/latex/kopete_latex.desktop b/kopete/plugins/latex/kopete_latex.desktop
new file mode 100644
index 00000000..3d957701
--- /dev/null
+++ b/kopete/plugins/latex/kopete_latex.desktop
@@ -0,0 +1,71 @@
+[Desktop Entry]
+Type=Service
+X-Kopete-Version=1000900
+Icon=latex
+ServiceTypes=Kopete/Plugin
+X-KDE-Library=kopete_latex
+X-KDE-PluginInfo-Author=Duncan Mac-Vicar
+X-KDE-PluginInfo-Email=duncan@kde.org
+X-KDE-PluginInfo-Name=kopete_latex
+X-KDE-PluginInfo-Version=0.8.0
+X-KDE-PluginInfo-Website=http://kopete.kde.org
+X-KDE-PluginInfo-Category=Plugins
+X-KDE-PluginInfo-Depends=
+X-KDE-PluginInfo-License=GPL
+X-KDE-PluginInfo-EnabledByDefault=false
+Name=KopeTeX
+Name[bn]=কপেটেক
+Name[ja]=KopeTex
+Name[ne]=कोपेटेक्स
+Name[sv]=Kopetex
+Comment=Render Latex formulas in the chatwindow
+Comment[be]=Паказваць формулы Latex у вакне гутаркі
+Comment[bg]=Показване на формули на Latex в прозореца за чат
+Comment[bn]=চ্যাট উইন্ডোতে লেটেক ফর্মূলা প্রদর্শন করে
+Comment[bs]=Iscrtava Latex formule u chat prozoru
+Comment[ca]=Representa fórmules Latex a la finestra de xat
+Comment[cs]=Vykresluje vzorce LaTeXu v okně rozhovoru
+Comment[da]=Viser Latex-formler i chat-vinduet
+Comment[de]=Latex-Formeln in einem Chat-Fenster anzeigen
+Comment[el]=Εξισώσεις Latex στο παράθυρο συνομιλίας
+Comment[es]=Muestra fórmulas LaTeX en la ventana de charla
+Comment[et]=LaTeXi valemite renderdamine vestlusaknas
+Comment[eu]=Elkarrizketa leihoaetan Latex formulak marrazten ditu
+Comment[fa]=نمایش فرمولهای Latex در پنجرۀ گفتگو
+Comment[fi]=Renderöi Latex-kaavoja keskusteluikkunaan
+Comment[fr]=Affichage de formules LaTeX dans la fenêtre de discussion
+Comment[gl]=Debuxar as fórmulas de Laxtex na fiestra de conversa
+Comment[he]=מציג נוסחאות של Latex בחלון השיחה
+Comment[hu]=Latex-es képletek megjelenítése a csevegési ablakban
+Comment[is]=Teikna Latex formúlur í spjallglugganum
+Comment[it]=Visualizza formule latex nella finestra di chat
+Comment[ja]=チャットウィンドウで LaTeX の数式を表示
+Comment[ka]=Latex ფორმულების საუბრის ფანჯარაში რენდერი
+Comment[kk]=Latex формулаларын әңгіме терезесінде келтіру
+Comment[km]=បង្ហាញ​រូបមន្ត Latex នៅ​ក្នុង​បង្អួច​ជជែក​កំសាន្ដ
+Comment[lt]=Vykdyti Latex formules pokalbių lange
+Comment[mk]=Исцртува Latex формули во прозорецот за разговори
+Comment[nb]=Tegn LaTeX-formler i pratevinduet
+Comment[nds]=Latex-Formeln binnen dat Klöönfinster wiesen
+Comment[ne]=कुराकानी सञ्झ्यालमा ल्याटेक्स सूत्र रेन्डर गर्नुहोस्
+Comment[nl]=Latex-formules renderen in het gespreksvenster
+Comment[nn]=Vis Latex-formlar i pratevindauget
+Comment[pl]=Wyświetla wyrażenia Latexa w oknie rozmowy
+Comment[pt]=Mostrar formulas de Latex na janela de conversação
+Comment[pt_BR]=Renderiza fórmulas do Latex em uma janela de bate-papo
+Comment[ro]=Randează formule LaTeX în fereastra de discuţii
+Comment[ru]=Вставка и вывод формул Latex в окнах разговоров Kopete
+Comment[se]=Sárggo LaTeX-hámuid čáttenláses
+Comment[sk]=Zobrazovanie výrazov Latex v okne rozhovoru
+Comment[sl]=Izris formul LaTeX v oknu za klepet
+Comment[sr]=Приказ Latex формула у прозору за ћаскање
+Comment[sr@Latn]=Prikaz Latex formula u prozoru za ćaskanje
+Comment[sv]=Visa Latex-formler i chattfönstret
+Comment[ta]= Render Latex formulas in the chatwindow
+Comment[tg]=Формулаҳои Render Latex дар тирезаи чат
+Comment[tr]=Sohbet penceresindeki Latex formüllerini verir
+Comment[uk]=Відтворення формул Latex у вікнах розмов Kopete
+Comment[zh_CN]=在聊天窗口中渲染 Latex 公式
+Comment[zh_HK]=在聊天視窗內顯示 Latex 方程式
+Comment[zh_TW]=在聊天視窗中加入 Latex 公式
+
diff --git a/kopete/plugins/latex/kopete_latex_config.desktop b/kopete/plugins/latex/kopete_latex_config.desktop
new file mode 100644
index 00000000..a5e67a2a
--- /dev/null
+++ b/kopete/plugins/latex/kopete_latex_config.desktop
@@ -0,0 +1,69 @@
+[Desktop Entry]
+Icon=latex
+Type=Service
+ServiceTypes=KCModule
+
+X-KDE-ModuleType=Library
+X-KDE-Library=kopete_latex
+X-KDE-FactoryName=LatexConfigFactory
+X-KDE-ParentApp=kopete_latex
+X-KDE-ParentComponents=kopete_latex
+
+Name=Highlight
+Name[ar]=تمييز
+Name[bg]=Открояване
+Name[bn]=গুরুত্বপূর্ণ
+Name[br]=Splannadur
+Name[bs]=Isticanje
+Name[ca]=Ressaltat
+Name[cs]=Zvýraznění
+Name[cy]=Amlygu
+Name[da]=Fremhæv
+Name[de]=Hervorhebung
+Name[el]=Τονισμός
+Name[eo]=Lumaĵo
+Name[es]=Resaltar
+Name[et]=Esiletõstmine
+Name[eu]=Nabarmendu
+Name[fa]=مشخص
+Name[fi]=Korostus
+Name[fr]=Surlignement
+Name[ga]=Aibhsiú
+Name[gl]=Resaltar
+Name[he]=מודגש
+Name[hi]=उभारें
+Name[hr]=Isticanje
+Name[hu]=Kiemelés
+Name[is]=Merkja
+Name[it]=Evidenziazione
+Name[ja]=強調
+Name[ka]=მარკირებული
+Name[kk]=Ерекше
+Name[km]=សំខាន់
+Name[lt]=Paryškinti
+Name[mk]=Осветлување
+Name[nb]=Marker
+Name[nds]=Rutheven
+Name[ne]=हाइलाइट
+Name[nl]=Aanwijzen
+Name[nn]=Marker
+Name[pa]=ਉਘਾੜਨ
+Name[pl]=Podświetlenie
+Name[pt]=Realce
+Name[pt_BR]=Destaque
+Name[ro]=Evidenţiat
+Name[ru]=Выделение
+Name[se]=Merke
+Name[sk]=Zvýrazniť
+Name[sl]=Poudarjeno sporočilo
+Name[sr]=Истицање
+Name[sr@Latn]=Isticanje
+Name[sv]=Markera
+Name[ta]=முனைப்புறுத்தல்
+Name[tg]=Равшаннамоӣ
+Name[tr]=Vurgu
+Name[uk]=Підсвічування
+Name[wa]=E sorbiyance
+Name[zh_CN]=突出显示
+Name[zh_HK]=加強顯示
+Name[zh_TW]=高亮度
diff --git a/kopete/plugins/latex/kopete_latexconvert.sh b/kopete/plugins/latex/kopete_latexconvert.sh
new file mode 100755
index 00000000..b7f92263
--- /dev/null
+++ b/kopete/plugins/latex/kopete_latexconvert.sh
@@ -0,0 +1,234 @@
+#!/bin/sh
+#############################################################
+# TEX2IM: Converts LaTeX formulas to pixel graphics which #
+# can be easily included in Text-Processors like #
+# M$ or Staroffice. #
+# #
+# Required software: latex, convert (image magic) #
+# to get color, the latex color package is required #
+#############################################################
+# Version 1.8 (http://www.nought.de/tex2im.html) #
+# published under the GNU public licence (GPL) #
+# (c) 14. May 2004 by Andreas Reigber #
+# Email: anderl@nought.de #
+#############################################################
+
+#
+# Default values
+#
+
+resolution="150x150"
+format="png"
+color1="white"
+color2="black"
+trans=1
+noformula=0
+aa=1
+extra_header="$HOME/.tex2im_header"
+
+if [ -f ~/.tex2imrc ]; then
+ source ~/.tex2imrc
+fi
+
+OPTERR=0
+
+if [ $# -lt 1 ]; then
+ echo "Usage: `basename $0` [options] file.tex, for help give option -h" 1>&2
+ exit 1
+fi
+
+while getopts hanzb:t:f:o:r:vx: Optionen; do
+ case $Optionen in
+ h) echo "tex2im [options] latex_expression
+
+The content of input file should be _plain_ latex mathmode code!
+Alternatively, a string containing the latex code can be specified.
+
+Options:
+-v show version
+-h show help
+-a change status of antialiasing
+ default is on for normal mode and
+ off for transparent mode
+-o file specifies output filename,
+ default is inputfile with new extension
+-f expr specifies output format,
+ possible examples: gif, jpg, tif......
+ all formates supported by 'convert' should work,
+ default: png
+-r expr specifies desired resolution in dpi,
+ possible examples: 100x100, 300x300, 200x150,
+ default is 150x150
+-b expr specifies the background color
+ default: white
+-t expr specifies the text color
+ default: black
+-n no-formula mode (do not wrap in eqnarray* environment)
+ default: off
+-z transparent background
+ default: off
+-x file file containing extra header lines.
+ default: ~/.tex2im_header"
+ exit 0 ;;
+ v) echo "TEX2IM Version 1.8"
+ exit 0 ;;
+ r) resolution=$OPTARG;;
+ o) outfile=$OPTARG;;
+ z) trans=1
+ aa=0;;
+ a) if [ $aa -eq 0 ]; then
+ aa=1
+ else
+ aa=0
+ fi;;
+ n) noformula=1;;
+ b) color1=$OPTARG;;
+ t) color2=$OPTARG;;
+ f) format=$OPTARG;;
+ x) extra_header=$OPTARG;;
+ esac
+done
+
+#
+# Generate temporary directory
+#
+
+if test -n "`type -p mktemp`" ; then
+ tmpdir="`mktemp /tmp/tex2imXXXXXX`"
+ rm $tmpdir
+ mkdir $tmpdir
+else
+ tmpdir=/tmp/tex2im$$
+ if [ -e $tmpdir ] ; then
+ echo "$0: Temporary directory $tmpdir already exists." 1>&2
+ exit 1
+ fi
+ mkdir $tmpdir
+fi
+homedir="`pwd`" || exit 1
+
+#
+# Names for input and output files
+#
+
+while [ $OPTIND -le $# ]
+do
+
+eval infile=\$${OPTIND}
+
+if [ -z $outfile ]; then
+ if [ -e "$infile" ]; then
+ base=`basename ${infile} .tex` ;
+ outfile=${base}.$format
+ else
+ outfile=out.$format
+ fi
+fi
+
+#
+# Here we go
+#
+
+(
+cat << ENDHEADER1
+\documentclass[12pt]{article}
+\usepackage{color}
+\usepackage[dvips]{graphicx}
+\pagestyle{empty}
+ENDHEADER1
+) > $tmpdir/out.tex
+
+#
+# Do we have a file containing extra files to include into the header?
+#
+
+if [ -f $extra_header ]; then
+ (
+ cat $extra_header
+ ) >> $tmpdir/out.tex
+fi
+
+if [ $noformula -eq 1 ]; then
+(
+cat << ENDHEADER2
+\pagecolor{$color1}
+\begin{document}
+{\color{$color2}
+ENDHEADER2
+) >> $tmpdir/out.tex
+else
+(
+cat << ENDHEADER2
+\pagecolor{$color1}
+\begin{document}
+{\color{$color2}
+\begin{eqnarray*}
+ENDHEADER2
+) >> $tmpdir/out.tex
+fi
+
+# Kopete does not need to parse the content of a file.
+#if [ -e "$infile" ]; then
+# cat $infile >> $tmpdir/out.tex
+#else
+ echo "$infile" >> $tmpdir/out.tex
+#fi
+
+if [ $noformula -eq 1 ]; then
+(
+cat << ENDFOOTER
+}\end{document}
+ENDFOOTER
+) >> $tmpdir/out.tex
+else
+(
+cat << ENDFOOTER
+\end{eqnarray*}}
+\end{document}
+ENDFOOTER
+) >> $tmpdir/out.tex
+fi
+
+cd $tmpdir
+for f in $homedir/*.eps; do
+ test -f ${f##*/} || ln -s $f . # multi-processing!
+done
+latex -interaction=batchmode out.tex > /dev/null
+cd "$homedir"
+dvips -o $tmpdir/out.eps -E $tmpdir/out.dvi 2> /dev/null
+
+#
+# Transparent background
+#
+
+if [ $trans -eq 1 ]; then
+ if [ $aa -eq 1 ]; then
+ convert +adjoin -antialias -transparent $color1 -density $resolution $tmpdir/out.eps $tmpdir/out.$format
+ else
+ convert +adjoin +antialias -transparent $color1 -density $resolution $tmpdir/out.eps $tmpdir/out.$format
+ fi
+else
+ if [ $aa -eq 1 ]; then
+ convert +adjoin -antialias -density $resolution $tmpdir/out.eps $tmpdir/out.$format
+ else
+ convert +adjoin +antialias -density $resolution $tmpdir/out.eps $tmpdir/out.$format
+ fi
+fi
+
+
+if [ -e $tmpdir/out.$format ]; then
+ mv $tmpdir/out.$format $outfile
+else
+ mv $tmpdir/out.$format.0 $outfile
+fi
+
+let OPTIND=$OPTIND+1
+outfile=""
+done
+
+#
+# Cleanup
+#
+
+rm -rf $tmpdir
+exit 0
diff --git a/kopete/plugins/latex/latexchatui.rc b/kopete/plugins/latex/latexchatui.rc
new file mode 100644
index 00000000..06e8c03a
--- /dev/null
+++ b/kopete/plugins/latex/latexchatui.rc
@@ -0,0 +1,9 @@
+<!DOCTYPE kpartgui>
+<kpartgui version="1" name="kopete_latexchat">
+ <MenuBar>
+ <Menu name="tools">
+ <text>&amp;Tools</text>
+ <Action name="latexPreview" />
+ </Menu>
+ </MenuBar>
+</kpartgui>
diff --git a/kopete/plugins/latex/latexconfig.kcfg b/kopete/plugins/latex/latexconfig.kcfg
new file mode 100644
index 00000000..f6d0b335
--- /dev/null
+++ b/kopete/plugins/latex/latexconfig.kcfg
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Author: Stefan Gehn -->
+<kcfg xmlns="http://www.kde.org/standards/kcfg/1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.kde.org/standards/kcfg/1.0
+ http://www.kde.org/standards/kcfg/1.0/kcfg.xsd" >
+ <kcfgfile name="kopeterc"/>
+
+ <group name="Latex Plugin">
+ <entry name="HorizontalDPI" type="UInt">
+ <label>Horizontal Rendering Resolution (DPI).</label>
+ <default>150</default>
+ </entry>
+ <entry name="VerticalDPI" type="UInt">
+ <label>Vertical Rendering Resolution (DPI).</label>
+ <default>150</default>
+ </entry>
+ </group>
+</kcfg>
diff --git a/kopete/plugins/latex/latexconfig.kcfgc b/kopete/plugins/latex/latexconfig.kcfgc
new file mode 100644
index 00000000..9e4e4fec
--- /dev/null
+++ b/kopete/plugins/latex/latexconfig.kcfgc
@@ -0,0 +1,7 @@
+# Code generation options for kconfig_compiler
+File=latexconfig.kcfg
+ClassName=LatexConfig
+Singleton=true
+Mutators=true
+MemberVariables=private
+GlobalEnums=true
diff --git a/kopete/plugins/latex/latexguiclient.cpp b/kopete/plugins/latex/latexguiclient.cpp
new file mode 100644
index 00000000..8d7cbf3e
--- /dev/null
+++ b/kopete/plugins/latex/latexguiclient.cpp
@@ -0,0 +1,76 @@
+/*
+ latexguiclient.cpp
+
+ Kopete Latex plugin
+
+ Copyright (c) 2003-2005 by Olivier Goffart <ogoffart @ kde.org>
+
+ Kopete (c) 2003-2005 by the Kopete developers <kopete-devel@kde.org>
+
+ *************************************************************************
+ * *
+ * This program 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; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ *************************************************************************
+*/
+
+#include <qvariant.h>
+
+#include <kaction.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <qimage.h>
+#include <qregexp.h>
+#include <qstylesheet.h>
+
+#include "kopetechatsession.h"
+#include "kopeteview.h"
+#include "kopetemessage.h"
+
+#include "latexplugin.h"
+#include "latexguiclient.h"
+
+LatexGUIClient::LatexGUIClient( Kopete::ChatSession *parent, const char *name )
+: QObject( parent, name ), KXMLGUIClient( parent )
+{
+ setInstance( LatexPlugin::plugin()->instance() );
+ connect( LatexPlugin::plugin(), SIGNAL( destroyed( QObject * ) ), this, SLOT( deleteLater() ) );
+
+ m_manager = parent;
+
+ new KAction( i18n( "Preview Latex Images" ), "latex", CTRL + Key_L, this, SLOT( slotPreview() ), actionCollection(), "latexPreview" );
+
+ setXMLFile( "latexchatui.rc" );
+}
+
+LatexGUIClient::~LatexGUIClient()
+{
+}
+
+void LatexGUIClient::slotPreview()
+{
+ if ( !m_manager->view() )
+ return;
+
+ Kopete::Message msg = m_manager->view()->currentMessage();
+ QString messageText = msg.plainBody();
+ if(!messageText.contains("$$")) //we haven't found any latex strings
+ {
+ KMessageBox::sorry(reinterpret_cast<QWidget*>(m_manager->view()) , i18n("There are no latex in the message you are typing. The latex formula must be included between $$ and $$ "), i18n("No Latex Formula") );
+ return;
+ }
+
+ msg=Kopete::Message( msg.from() , msg.to() ,
+ i18n("<b>Preview of the latex message :</b> <br />%1").arg(msg.plainBody()),
+ Kopete::Message::Internal , Kopete::Message::RichText);
+ m_manager->appendMessage(msg) ;
+}
+
+
+#include "latexguiclient.moc"
+
+// vim: set noet ts=4 sts=4 sw=4:
+
diff --git a/kopete/plugins/latex/latexguiclient.h b/kopete/plugins/latex/latexguiclient.h
new file mode 100644
index 00000000..c8ca9e99
--- /dev/null
+++ b/kopete/plugins/latex/latexguiclient.h
@@ -0,0 +1,53 @@
+/*
+ latexguiclient.h
+
+ Kopete Latex Plugin
+
+ Copyright (c) 2005 by Olivier Goffart <ogoffart @ kde.org>
+
+ Kopete (c) 2005 by the Kopete developers <kopete-devel@kde.org>
+
+ *************************************************************************
+ * *
+ * This program 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; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ *************************************************************************
+*/
+
+#ifndef TRANSLATORGUICLIENT_H
+#define TRANSLATORGUICLIENT_H
+
+#include <qobject.h>
+#include <kxmlguiclient.h>
+
+#include <kio/job.h>
+
+#include "kopetemessage.h"
+#include "kopeteplugin.h"
+
+namespace Kopete { class ChatSession; }
+
+/**
+ * @author Olivier Goffart <ogoffart @ kde.org>
+ */
+
+class LatexGUIClient : public QObject , public KXMLGUIClient
+{
+ Q_OBJECT
+
+public:
+ LatexGUIClient( Kopete::ChatSession *parent, const char *name=0L);
+ ~LatexGUIClient();
+
+private slots:
+ void slotPreview();
+
+private:
+ Kopete::ChatSession *m_manager;
+};
+
+#endif
+
diff --git a/kopete/plugins/latex/latexplugin.cpp b/kopete/plugins/latex/latexplugin.cpp
new file mode 100644
index 00000000..7ceab209
--- /dev/null
+++ b/kopete/plugins/latex/latexplugin.cpp
@@ -0,0 +1,259 @@
+/*
+ Kopete Latex Plugin
+
+ Copyright (c) 2004 by Duncan Mac-Vicar Prett <duncan@kde.org>
+ Copyright (c) 2004-2005 by Olivier Goffart <ogoffart@kde. org>
+
+ Kopete (c) 2001-2004 by the Kopete developers <kopete-devel@kde.org>
+
+ *************************************************************************
+ * *
+ * This program 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; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ *************************************************************************
+*/
+
+#include <qregexp.h>
+#include <qimage.h>
+#include <qbuffer.h>
+#include <qcstring.h>
+#include <qstylesheet.h>
+#include <kgenericfactory.h>
+#include <kdebug.h>
+#include <kstandarddirs.h>
+#include <kprocess.h>
+#include <ktempfile.h>
+#include <kmdcodec.h>
+#include <kmessagebox.h>
+
+#include "kopetechatsessionmanager.h"
+#include "kopeteuiglobal.h"
+
+#include "latexplugin.h"
+#include "latexconfig.h"
+#include "latexguiclient.h"
+
+#define ENCODED_IMAGE_MODE 0
+
+typedef KGenericFactory<LatexPlugin> LatexPluginFactory;
+K_EXPORT_COMPONENT_FACTORY( kopete_latex, LatexPluginFactory( "kopete_latex" ) )
+
+LatexPlugin::LatexPlugin( QObject *parent, const char *name, const QStringList &/*args*/ )
+: Kopete::Plugin( LatexPluginFactory::instance(), parent, name )
+{
+// kdDebug() << k_funcinfo << endl;
+ if( !s_pluginStatic )
+ s_pluginStatic = this;
+
+ mMagickNotFoundShown = false;
+ connect( Kopete::ChatSessionManager::self(), SIGNAL( aboutToDisplay( Kopete::Message & ) ), SLOT( slotMessageAboutToShow( Kopete::Message & ) ) );
+ connect( Kopete::ChatSessionManager::self(), SIGNAL( aboutToSend(Kopete::Message& ) ), this, SLOT(slotMessageAboutToSend(Kopete::Message& ) ) );
+ connect ( this , SIGNAL( settingsChanged() ) , this , SLOT( slotSettingsChanged() ) );
+ connect( Kopete::ChatSessionManager::self(), SIGNAL( chatSessionCreated( Kopete::ChatSession * ) ),
+ this, SLOT( slotNewChatSession( Kopete::ChatSession * ) ) );
+
+ m_convScript = KStandardDirs::findExe("kopete_latexconvert.sh");
+ slotSettingsChanged();
+
+ //Add GUI action to all already existing kmm (if the plugin is launched when kopete already rining)
+ QValueList<Kopete::ChatSession*> sessions = Kopete::ChatSessionManager::self()->sessions();
+ for (QValueListIterator<Kopete::ChatSession*> it= sessions.begin(); it!=sessions.end() ; ++it)
+ slotNewChatSession( *it );
+}
+
+LatexPlugin::~LatexPlugin()
+{
+ s_pluginStatic = 0L;
+}
+
+LatexPlugin* LatexPlugin::plugin()
+{
+ return s_pluginStatic ;
+}
+
+LatexPlugin* LatexPlugin::s_pluginStatic = 0L;
+
+void LatexPlugin::slotNewChatSession( Kopete::ChatSession *KMM )
+{
+ new LatexGUIClient( KMM );
+}
+
+
+void LatexPlugin::slotMessageAboutToShow( Kopete::Message& msg )
+{
+ QString mMagick = KStandardDirs::findExe("convert");
+ if ( mMagick.isEmpty() )
+ {
+ // show just once
+ if ( !mMagickNotFoundShown )
+ {
+ KMessageBox::queuedMessageBox(
+ Kopete::UI::Global::mainWidget(),
+ KMessageBox::Error, i18n("I cannot find the Magick convert program.\nconvert is required to render the Latex formulas.\nPlease go to www.imagemagick.org or to your distribution site and get the right package.")
+ );
+ mMagickNotFoundShown = true;
+ }
+ // dont try to parse if convert is not installed
+ return;
+ }
+
+ QString messageText = msg.plainBody();
+ if( !messageText.contains("$$"))
+ return;
+
+ //kdDebug() << k_funcinfo << " Using converter: " << m_convScript << endl;
+
+ // /\[([^]]).*?\[/$1\]/
+ // \$\$.+?\$\$
+
+ // this searches for $$formula$$
+ QRegExp rg("\\$\\$.+\\$\\$");
+ rg.setMinimal(true);
+ // this searches for [latex]formula[/latex]
+ //QRegExp rg("\\[([^]\]).*?\\[/$1\\]");
+
+ int pos = 0;
+
+ QMap<QString, QString> replaceMap;
+ while (pos >= 0 && (unsigned int)pos < messageText.length())
+ {
+// kdDebug() << k_funcinfo << " searching pos: " << pos << endl;
+ pos = rg.search(messageText, pos);
+
+ if (pos >= 0 )
+ {
+ QString match = rg.cap(0);
+ pos += rg.matchedLength();
+
+ QString formul=match;
+ if(!securityCheck(formul))
+ continue;
+
+ QString fileName=handleLatex(formul.replace("$$",""));
+
+ // get the image and encode it with base64
+ #if ENCODED_IMAGE_MODE
+ QImage renderedImage( fileName );
+ imagePxWidth = renderedImage.width();
+ imagePxHeight = renderedImage.height();
+ if ( !renderedImage.isNull() )
+ {
+ QByteArray ba;
+ QBuffer buffer( ba );
+ buffer.open( IO_WriteOnly );
+ renderedImage.save( &buffer, "PNG" );
+ QString imageURL = QString::fromLatin1("data:image/png;base64,%1").arg( KCodecs::base64Encode( ba ) );
+ replaceMap[match] = imageURL;
+ }
+ #else
+ replaceMap[match] = fileName;
+ #endif
+ }
+ }
+
+ if(replaceMap.isEmpty()) //we haven't found any latex strings
+ return;
+
+ messageText= msg.escapedBody();
+
+ int imagePxWidth,imagePxHeight;
+ for (QMap<QString,QString>::ConstIterator it = replaceMap.begin(); it != replaceMap.end(); ++it)
+ {
+ QImage theImage(*it);
+ if(theImage.isNull())
+ continue;
+ imagePxWidth = theImage.width();
+ imagePxHeight = theImage.height();
+ QString escapedLATEX=QStyleSheet::escape(it.key()).replace("\"","&quot;"); //we need the escape quotes because that string will be in a title="" argument, but not the \n
+ messageText.replace(Kopete::Message::escape(it.key()), " <img width=\"" + QString::number(imagePxWidth) + "\" height=\"" + QString::number(imagePxHeight) + "\" src=\"" + (*it) + "\" alt=\"" + escapedLATEX +"\" title=\"" + escapedLATEX +"\" /> ");
+ }
+
+ msg.setBody( messageText, Kopete::Message::RichText );
+}
+
+
+void LatexPlugin::slotMessageAboutToSend( Kopete::Message& msg)
+{
+ Q_UNUSED(msg)
+ //disabled because to work correctly, we need to find what special has the gif we can send over MSN
+#if 0
+ KConfig *config = KGlobal::config();
+ config->setGroup("Latex Plugin");
+
+ if(!config->readBoolEntry("ParseOutgoing", false))
+ return;
+
+ QString messageText = msg.plainBody();
+ if( !messageText.contains("$$"))
+ return;
+/* if( msg.from()->protocol()->pluginId()!="MSNProtocol" )
+ return;*/
+
+ // this searches for $$formula$$
+ QRegExp rg("^\\s*\\$\\$([^$]+)\\$\\$\\s*$");
+
+ if( rg.search(messageText) != -1 )
+ {
+ QString latexFormula = rg.cap(1);
+ if(!securityCheck( latexFormula ))
+ return;
+
+ QString url = handleLatex(latexFormula);
+
+
+ if(!url.isNull())
+ {
+ QString escapedLATEX= QStyleSheet::escape(messageText).replace("\"","&quot;");
+ QString messageText="<img src=\"" + url + "\" alt=\"" + escapedLATEX + "\" title=\"" + escapedLATEX +"\" />";
+ msg.setBody( messageText, Kopete::Message::RichText );
+ }
+ }
+#endif
+}
+
+QString LatexPlugin::handleLatex(const QString &latexFormula)
+{
+ KTempFile *tempFile=new KTempFile( locateLocal( "tmp", "kopetelatex-" ), ".png" );
+ tempFile->setAutoDelete(true);
+ m_tempFiles.append(tempFile);
+ m_tempFiles.setAutoDelete(true);
+ QString fileName = tempFile->name();
+
+ KProcess p;
+
+ QString argumentRes = "-r %1x%2";
+ QString argumentOut = "-o %1";
+ //QString argumentFormat = "-fgif"; //we uses gif format because MSN only handle gif
+ int hDPI, vDPI;
+ hDPI = LatexConfig::self()->horizontalDPI();
+ vDPI = LatexConfig::self()->verticalDPI();
+ p << m_convScript << argumentRes.arg(QString::number(hDPI), QString::number(vDPI)) << argumentOut.arg(fileName) /*<< argumentFormat*/ << latexFormula ;
+
+ kdDebug() << k_funcinfo << " Rendering " << m_convScript << " " << argumentRes.arg(QString::number(hDPI), QString::number(vDPI)) << " " << argumentOut.arg(fileName) << endl;
+
+ // FIXME our sucky sync filter API limitations :-)
+ p.start(KProcess::Block);
+ return fileName;
+}
+
+bool LatexPlugin::securityCheck(const QString &latexFormula)
+{
+ return !latexFormula.contains(QRegExp("\\\\(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)[^a-zA-Z]"));
+
+}
+
+void LatexPlugin::slotSettingsChanged()
+{
+ LatexConfig::self()->readConfig();
+}
+
+#include "latexplugin.moc"
+
+// vim: set noet ts=4 sts=4 sw=4:
+
diff --git a/kopete/plugins/latex/latexplugin.h b/kopete/plugins/latex/latexplugin.h
new file mode 100644
index 00000000..a0fcd7fd
--- /dev/null
+++ b/kopete/plugins/latex/latexplugin.h
@@ -0,0 +1,77 @@
+/*
+ latexplugin.h
+
+ Kopete Latex Plugin
+
+ Copyright (c) 2004 by Duncan Mac-Vicar Prett <duncan@kde.org>
+ Copyright (c) 2004-2005 by Olivier Goffart <ogoffart@kde. org>
+
+ Kopete (c) 2001-2004 by the Kopete developers <kopete-devel@kde.org>
+
+ *************************************************************************
+ * *
+ * This program 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; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ *************************************************************************
+*/
+
+#ifndef LATEXPLUGIN_H
+#define LATEXPLUGIN_H
+
+#include <qobject.h>
+#include <qstring.h>
+
+#include <ktempfile.h>
+
+#include "kopetemessage.h"
+#include "kopeteplugin.h"
+
+class QStringList;
+class QString;
+
+
+namespace Kopete { class Message; class ChatSession; }
+
+/**
+ * @author Duncan Mac-Vicar Prett
+ */
+
+class LatexPlugin : public Kopete::Plugin
+{
+ Q_OBJECT
+
+public:
+ static LatexPlugin *plugin();
+
+ LatexPlugin( QObject *parent, const char *name, const QStringList &args );
+ ~LatexPlugin();
+
+public slots:
+ void slotSettingsChanged();
+ void slotMessageAboutToShow( Kopete::Message& msg );
+ void slotMessageAboutToSend( Kopete::Message& msg );
+ void slotNewChatSession( Kopete::ChatSession *KMM);
+
+public:
+ /**
+ * gives a latex formula, and return the filename of the file where the latex is stored.
+ */
+ QString handleLatex(const QString &latex);
+
+ /**
+ * return false if the latex formula may contains malicious commands
+ */
+ bool securityCheck(const QString & formula);
+
+
+private:
+ static LatexPlugin* s_pluginStatic;
+ QString m_convScript;
+ bool mMagickNotFoundShown;
+ QPtrList<KTempFile> m_tempFiles;
+};
+
+#endif
diff --git a/kopete/plugins/latex/latexpreferences.cpp b/kopete/plugins/latex/latexpreferences.cpp
new file mode 100644
index 00000000..1727ae49
--- /dev/null
+++ b/kopete/plugins/latex/latexpreferences.cpp
@@ -0,0 +1,76 @@
+/*
+ Kopete Latex Plugin
+
+ Copyright (c) 2004 by Duncan Mac-Vicar Prett <duncan@kde.org>
+
+ Kopete (c) 2001-2004 by the Kopete developers <kopete-devel@kde.org>
+
+ *************************************************************************
+ * *
+ * This program 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; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ *************************************************************************
+*/
+
+#include <qlayout.h>
+#include <kparts/componentfactory.h>
+#include <klocale.h>
+#include <kgenericfactory.h>
+#include <kdebug.h>
+#include <knuminput.h>
+
+#include "latexplugin.h"
+#include "latexconfig.h"
+#include "latexprefsbase.h"
+#include "latexpreferences.h"
+
+typedef KGenericFactory<LatexPreferences> LatexPreferencesFactory;
+K_EXPORT_COMPONENT_FACTORY( kcm_kopete_latex, LatexPreferencesFactory( "kcm_kopete_latex" ) )
+
+LatexPreferences::LatexPreferences(QWidget *parent, const char* /*name*/, const QStringList &args)
+ : KCModule(LatexPreferencesFactory::instance(), parent, args)
+{
+ ( new QVBoxLayout( this ) )->setAutoAdd( true );
+ m_preferencesDialog = new LatexPrefsUI(this);
+ // connect widget signals here
+ m_preferencesDialog->horizontalDPI->setMinValue(1);
+ m_preferencesDialog->verticalDPI->setMinValue(1);
+
+ connect(m_preferencesDialog->horizontalDPI, SIGNAL(valueChanged(int)), this, SLOT(slotModified()));
+ connect(m_preferencesDialog->verticalDPI, SIGNAL(valueChanged(int)), this, SLOT(slotModified()));
+
+ load();
+}
+
+LatexPreferences::~LatexPreferences()
+{
+}
+
+void LatexPreferences::load()
+{
+ LatexConfig::self()->readConfig();
+ // load widgets here
+ m_preferencesDialog->horizontalDPI->setValue(LatexConfig::self()->horizontalDPI());
+ m_preferencesDialog->verticalDPI->setValue(LatexConfig::self()->verticalDPI());
+ emit KCModule::changed(false);
+}
+
+void LatexPreferences::slotModified()
+{
+ emit KCModule::changed(true);
+}
+
+void LatexPreferences::save()
+{
+ LatexConfig::self()->setHorizontalDPI(m_preferencesDialog->horizontalDPI->value());
+ LatexConfig::self()->setVerticalDPI(m_preferencesDialog->verticalDPI->value());
+ LatexConfig::self()->writeConfig();
+ emit KCModule::changed(false);
+}
+
+#include "latexpreferences.moc"
+
+// vim: set noet ts=4 sts=4 sw=4:
diff --git a/kopete/plugins/latex/latexpreferences.h b/kopete/plugins/latex/latexpreferences.h
new file mode 100644
index 00000000..c08b35b5
--- /dev/null
+++ b/kopete/plugins/latex/latexpreferences.h
@@ -0,0 +1,48 @@
+/*
+ Kopete Latex Plugin
+
+ Copyright (c) 2004 by Duncan Mac-Vicar Prett <duncan@kde.org>
+
+ Kopete (c) 2001-2004 by the Kopete developers <kopete-devel@kde.org>
+
+ *************************************************************************
+ * *
+ * This program 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; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ *************************************************************************
+*/
+
+#ifndef LatexPREFERENCES_H
+#define LatexPREFERENCES_H
+
+#include <kcmodule.h>
+#include <qstring.h>
+
+class LatexPrefsUI;
+class QListViewItem;
+
+/**
+ *@author Duncan Mac-Vicar Prett
+ */
+
+class LatexPreferences : public KCModule
+{
+ Q_OBJECT
+public:
+
+ LatexPreferences(QWidget *parent = 0, const char* name = 0, const QStringList &args = QStringList());
+ ~LatexPreferences();
+
+ virtual void save();
+ virtual void load();
+
+private:
+ LatexPrefsUI *m_preferencesDialog;
+private slots:
+ void slotModified();
+};
+
+#endif
diff --git a/kopete/plugins/latex/latexprefsbase.ui b/kopete/plugins/latex/latexprefsbase.ui
new file mode 100644
index 00000000..fbb11a21
--- /dev/null
+++ b/kopete/plugins/latex/latexprefsbase.ui
@@ -0,0 +1,168 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>LatexPrefsUI</class>
+<author>Duncan Mac-Vicar</author>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>LatexPrefsUI</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>513</width>
+ <height>232</height>
+ </rect>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>Box</enum>
+ </property>
+ <property name="text">
+ <string>&lt;p&gt;The &lt;font size="+1"&gt;KopeTeX&lt;/font&gt; plugin allows &lt;font size="+1"&gt;Kopet&lt;/font&gt;e to render Latex formulas in the chat window. The sender must enclose the formula between two $ signs. ie: $$formula$$&lt;/p&gt;
+&lt;p&gt;This plugin requires ImageMagick convert program installed in order to work.&lt;/p&gt;</string>
+ </property>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox1</cstring>
+ </property>
+ <property name="title">
+ <string>Options</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer row="2" column="0">
+ <property name="name">
+ <cstring>spacer5</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>30</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLayoutWidget" row="0" column="0">
+ <property name="name">
+ <cstring>layout1</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>Rendering resolution (DPI):</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>280</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget" row="1" column="0">
+ <property name="name">
+ <cstring>layout2</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="KIntNumInput">
+ <property name="name">
+ <cstring>horizontalDPI</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel3</cstring>
+ </property>
+ <property name="text">
+ <string>x</string>
+ </property>
+ </widget>
+ <widget class="KIntNumInput">
+ <property name="name">
+ <cstring>verticalDPI</cstring>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer4</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>220</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ </grid>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer6</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+</widget>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>knuminput.h</includehint>
+ <includehint>knuminput.h</includehint>
+ <includehint>knuminput.h</includehint>
+ <includehint>knuminput.h</includehint>
+</includehints>
+</UI>