RetroShare/retroshare-gui/src/gui/chat/HandleRichText.h

131 lines
3.5 KiB
C++

/****************************************************************
* This file is distributed under the following license:
*
* Copyright (c) 2010, Thomas Kister
*
* 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.
*
* This program 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 this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
****************************************************************/
/**
* This file provides helper functions and functors for translating data from/to
* rich text format and HTML. Its main goal is to facilitate decoding of chat
* messages, particularly embedding special information into HTML tags.
*/
#ifndef HANDLE_RICH_TEXT_H_
#define HANDLE_RICH_TEXT_H_
#include <QRegExp>
#include <QtXml>
/* Flags for RsHtml::formatText */
#define RSHTML_FORMATTEXT_EMBED_SMILEYS 1
#define RSHTML_FORMATTEXT_EMBED_LINKS 2
#define RSHTML_FORMATTEXT_REMOVE_FONT 4
#define RSHTML_FORMATTEXT_REMOVE_COLOR 8
#define RSHTML_FORMATTEXT_CLEANSTYLE (RSHTML_FORMATTEXT_REMOVE_FONT | RSHTML_FORMATTEXT_REMOVE_COLOR)
/* Flags for RsHtml::formatText */
#define RSHTML_OPTIMIZEHTML_REMOVE_FONT 2
#define RSHTML_OPTIMIZEHTML_REMOVE_COLOR 1
class QTextEdit;
namespace RsHtml {
/**
* The type of embedding we'd like to do
*/
enum EmbeddedType
{
Ahref, ///< into <a></a>
Img, ///< into <img/>
};
/**
* Base class for storing information about a given kind of embedding.
*
* Its only constructor is protected so it is impossible to instantiate it, and
* at the same time derived classes have to provide a type.
*/
class EmbedInHtml
{
protected:
EmbedInHtml(EmbeddedType newType) :
myType(newType)
{}
public:
const EmbeddedType myType;
QRegExp myRE;
};
/**
* This class is used to store information for embedding links into <a></a> tags.
*/
class EmbedInHtmlAhref : public EmbedInHtml
{
public:
EmbedInHtmlAhref() :
EmbedInHtml(Ahref)
{
myRE.setPattern("(\\bretroshare://[^\\s]*)|(\\bhttps?://[^\\s]*)|(\\bfile://[^\\s]*)|(\\bwww\\.[^\\s]*)");
}
};
/**
* This class is used to store information for embedding smileys into <img/> tags.
*
* By default the QRegExp the variables are empty, which means it must be
* filled at runtime, typically when the smileys set is loaded. It can be
* either done by hand or by using one of the helper methods available.
*
* Note: The QHash uses only *one* smiley per key (unlike soon-to-be-upgraded
* code out there).
*/
class EmbedInHtmlImg : public EmbedInHtml
{
public:
EmbedInHtmlImg() :
EmbedInHtml(Img)
{}
void InitFromAwkwardHash(const QHash<QString,QString>& hash);
QHash<QString,QString> smileys;
};
extern EmbedInHtmlImg defEmbedImg;
QString formatText(const QString &text, unsigned int flag);
bool findAnchors(const QString &text, QStringList& urls);
void optimizeHtml(QTextEdit *textEdit, QString &text, unsigned int flag = 0);
void optimizeHtml(QString &text, unsigned int flag = 0);
QString toHtml(QString text, bool realHtml = true);
} // namespace RsHtml
#endif // HANDLE_RICH_TEXT_H_