mirror of
https://github.com/RetroShare/RetroShare.git
synced 2024-10-01 02:35:48 -04:00
Add grouped emoticons.
This commit is contained in:
parent
69f503ea05
commit
ae8365167e
@ -15,198 +15,247 @@
|
|||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, write to the Free Software
|
||||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
||||||
* Boston, MA 02110-1301, USA.
|
* Boston, MA 02110-1301, USA.
|
||||||
****************************************************************/
|
****************************************************************/
|
||||||
|
|
||||||
#include <QHash>
|
|
||||||
#include <QFile>
|
|
||||||
#include <QApplication>
|
#include <QApplication>
|
||||||
#include <QWidget>
|
|
||||||
#include <QFile>
|
|
||||||
#include <QIcon>
|
|
||||||
#include <QDesktopWidget>
|
#include <QDesktopWidget>
|
||||||
|
#include <QFile>
|
||||||
|
#include <QGridLayout>
|
||||||
|
#include <QHash>
|
||||||
|
#include <QIcon>
|
||||||
#include <QPushButton>
|
#include <QPushButton>
|
||||||
|
#include <QTabWidget>
|
||||||
|
#include <QWidget>
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
|
||||||
#include "Emoticons.h"
|
#include "Emoticons.h"
|
||||||
#include "util/HandleRichText.h"
|
#include "util/HandleRichText.h"
|
||||||
|
|
||||||
static QHash<QString, QString> Smileys;
|
static QHash<QString, QPair<QVector<QString>, QHash<QString, QString> > > Smileys;
|
||||||
static QVector<QString> order;
|
static QVector<QString> grpOrdered;
|
||||||
|
|
||||||
void Emoticons::load()
|
void Emoticons::load()
|
||||||
{
|
{
|
||||||
QString sm_codes;
|
QString sm_AllLines;
|
||||||
bool internalEmoticons = true;
|
bool internalFiles = true;
|
||||||
|
|
||||||
#if defined(Q_OS_WIN)
|
// First try external emoticons
|
||||||
// first try external emoticons
|
QFile sm_File(QApplication::applicationDirPath() + "/emoticons/emotes.acs");
|
||||||
QFile sm_file(QApplication::applicationDirPath() + "/emoticons/emotes.acs");
|
if(sm_File.open(QIODevice::ReadOnly))
|
||||||
if(sm_file.open(QIODevice::ReadOnly))
|
internalFiles = false;
|
||||||
{
|
else
|
||||||
internalEmoticons = false;
|
{
|
||||||
} else {
|
// Then embedded emotions
|
||||||
// then embedded emotions
|
sm_File.setFileName(":/emojione/emotes.acs");
|
||||||
sm_file.setFileName(":/emojione/emotes.acs");
|
if(!sm_File.open(QIODevice::ReadOnly))
|
||||||
if(!sm_file.open(QIODevice::ReadOnly))
|
{
|
||||||
{
|
std::cout << "error opening ressource file" << std::endl;
|
||||||
std::cout << "error opening ressource file" << std::endl ;
|
return;
|
||||||
return ;
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
#else
|
|
||||||
QFile sm_file(QString(":/emojione/emotes.acs"));
|
|
||||||
if(!sm_file.open(QIODevice::ReadOnly))
|
|
||||||
{
|
|
||||||
std::cout << "error opening ressource file" << std::endl ;
|
|
||||||
return ;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
sm_codes = sm_file.readAll();
|
sm_AllLines = sm_File.readAll();
|
||||||
sm_file.close();
|
sm_File.close();
|
||||||
|
|
||||||
sm_codes.remove("\n");
|
sm_AllLines.remove("\n");
|
||||||
sm_codes.remove("\r");
|
sm_AllLines.remove("\r");
|
||||||
|
|
||||||
int i = 0;
|
int i = 0 ;
|
||||||
QString smcode;
|
QString smGroup;
|
||||||
QString smfile;
|
QString smCode;
|
||||||
while(i < sm_codes.length() && sm_codes[i] != '{')
|
QString smFile;
|
||||||
{
|
while(i < sm_AllLines.length() && sm_AllLines[i] != '{')
|
||||||
++i;
|
++i ;//Ignore text before {
|
||||||
}
|
|
||||||
while (i < sm_codes.length()-2)
|
|
||||||
{
|
|
||||||
smcode = "";
|
|
||||||
smfile = "";
|
|
||||||
|
|
||||||
while(sm_codes[i] != '\"')
|
while (i < sm_AllLines.length()-2)
|
||||||
{
|
{
|
||||||
++i;
|
// Type of lines:
|
||||||
}
|
// "Group"|":code:":"emojione/file.png";
|
||||||
++i;
|
smGroup = "";
|
||||||
while (sm_codes[i] != '\"')
|
smCode = "";
|
||||||
{
|
smFile = "";
|
||||||
smcode += sm_codes[i];
|
|
||||||
++i;
|
|
||||||
}
|
|
||||||
++i;
|
|
||||||
|
|
||||||
while(sm_codes[i] != '\"')
|
//Reading Groupe (First into "")
|
||||||
{
|
while(sm_AllLines[i] != '\"')
|
||||||
++i;
|
++i; //Ignore text outside ""
|
||||||
}
|
|
||||||
++i;
|
|
||||||
while(sm_codes[i] != '\"' && sm_codes[i+1] != ';')
|
|
||||||
{
|
|
||||||
smfile += sm_codes[i];
|
|
||||||
++i;
|
|
||||||
}
|
|
||||||
++i;
|
|
||||||
if(!smcode.isEmpty() && !smfile.isEmpty()) {
|
|
||||||
while (smcode.right(1) == "|") {
|
|
||||||
smcode.remove(smcode.length() - 1, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (internalEmoticons) {
|
|
||||||
Smileys.insert(smcode, ":/"+smfile);
|
|
||||||
} else {
|
|
||||||
Smileys.insert(smcode, smfile);
|
|
||||||
}
|
|
||||||
order.append(smcode);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// init <img> embedder
|
++i; //'"'
|
||||||
RsHtml::initEmoticons(Smileys);
|
while (sm_AllLines[i] != '\"')
|
||||||
|
smGroup += sm_AllLines[i++]; //Get group char by char
|
||||||
|
|
||||||
|
++i; //'"'
|
||||||
|
|
||||||
|
if (sm_AllLines[i] == '|')
|
||||||
|
{
|
||||||
|
//File in new format with group
|
||||||
|
++i; //'|'
|
||||||
|
//Reading Code (Second into "")
|
||||||
|
while(sm_AllLines[i] != '\"')
|
||||||
|
++i; //Ignore text outside ""
|
||||||
|
|
||||||
|
++i; //'"'
|
||||||
|
while (sm_AllLines[i] != '\"')
|
||||||
|
smCode += sm_AllLines[i++]; //Get code char by char
|
||||||
|
|
||||||
|
++i; //'"'
|
||||||
|
} else {
|
||||||
|
//Old file without group
|
||||||
|
++i; //':'
|
||||||
|
smCode = smGroup;
|
||||||
|
smGroup = "NULL";
|
||||||
|
}
|
||||||
|
|
||||||
|
//Reading File (Third into "")
|
||||||
|
while(sm_AllLines[i] != '\"')
|
||||||
|
++i; //Ignore text outside ""
|
||||||
|
|
||||||
|
++i; //'"'
|
||||||
|
while(sm_AllLines[i] != '\"' && sm_AllLines[i+1] != ';')
|
||||||
|
smFile += sm_AllLines[i++]; //Get file char by char
|
||||||
|
|
||||||
|
++i; //'"'
|
||||||
|
++i; //';'
|
||||||
|
|
||||||
|
if(!smGroup.isEmpty() && !smCode.isEmpty() && !smFile.isEmpty())
|
||||||
|
{
|
||||||
|
while (smCode.right(1) == "|")
|
||||||
|
smCode.remove(smCode.length() - 1, 1);
|
||||||
|
|
||||||
|
if (internalFiles)
|
||||||
|
{
|
||||||
|
smFile = ":/" + smFile;
|
||||||
|
if (smGroup.right(4).toLower() == ".png")
|
||||||
|
smGroup = ":/" + smGroup;
|
||||||
|
}
|
||||||
|
|
||||||
|
QVector<QString> ordered;
|
||||||
|
if (Smileys.contains(smGroup)) ordered = Smileys[smGroup].first;
|
||||||
|
ordered.append(smCode);
|
||||||
|
Smileys[smGroup].first = ordered;
|
||||||
|
Smileys[smGroup].second.insert(smCode, smFile);
|
||||||
|
|
||||||
|
if (!grpOrdered.contains(smGroup)) grpOrdered.append(smGroup);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// init <img> embedder
|
||||||
|
RsHtml::initEmoticons(Smileys);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Emoticons::showSmileyWidget(QWidget *parent, QWidget *button, const char *slotAddMethod, bool above)
|
void Emoticons::showSmileyWidget(QWidget *parent, QWidget *button, const char *slotAddMethod, bool above)
|
||||||
{
|
{
|
||||||
QWidget *smWidget = new QWidget(parent, Qt::Popup);
|
QWidget *smWidget = new QWidget(parent, Qt::Popup) ;
|
||||||
|
smWidget->setAttribute(Qt::WA_DeleteOnClose) ;
|
||||||
|
smWidget->setWindowTitle("Emoticons") ;
|
||||||
|
|
||||||
const int buttonWidth = 26;
|
//QTabWidget::setTabBarAutoHide(true) is from QT5.4, no way to hide TabBar before.
|
||||||
const int buttonHeight = 26;
|
bool bOnlyOneGroup = (Smileys.count() == 1);
|
||||||
|
|
||||||
int rowCount = (int)sqrt((double)Smileys.size());
|
QTabWidget *smTab = NULL;
|
||||||
int countPerLine = (Smileys.size()/rowCount) + ((Smileys.size() % rowCount) ? 1 : 0);
|
if (! bOnlyOneGroup)
|
||||||
|
{
|
||||||
|
smTab = new QTabWidget(smWidget);
|
||||||
|
QGridLayout *smGLayout = new QGridLayout(smWidget);
|
||||||
|
smGLayout->setContentsMargins(0,0,0,0);
|
||||||
|
smGLayout->addWidget(smTab);
|
||||||
|
}
|
||||||
|
|
||||||
smWidget->setAttribute( Qt::WA_DeleteOnClose);
|
const int buttonWidth = QFontMetricsF(smWidget->font()).height()*2;
|
||||||
smWidget->setWindowTitle("Emoticons");
|
const int buttonHeight = QFontMetricsF(smWidget->font()).height()*2;
|
||||||
smWidget->setBaseSize(countPerLine*buttonWidth, rowCount*buttonHeight);
|
int maxRowCount = 0;
|
||||||
|
int maxCountPerLine = 0;
|
||||||
|
|
||||||
//Warning: this part of code was taken from kadu instant messenger;
|
QVectorIterator<QString> grp(grpOrdered);
|
||||||
// It was EmoticonSelector::alignTo(QWidget* w) function there
|
while(grp.hasNext())
|
||||||
// comments are Polish, I dont' know how does it work...
|
{
|
||||||
// oblicz pozycj<63> widgetu do kt<6B>rego r<>wnamy
|
QString groupName = grp.next();
|
||||||
// oblicz rozmiar selektora
|
QHash<QString,QString> group = Smileys.value(groupName).second;
|
||||||
QPoint pos = button->mapToGlobal(QPoint(0,0));
|
|
||||||
QSize e_size = smWidget->sizeHint();
|
|
||||||
// oblicz rozmiar pulpitu
|
|
||||||
QSize s_size = QApplication::desktop()->size();
|
|
||||||
// oblicz dystanse od widgetu do lewego brzegu i do prawego
|
|
||||||
int l_dist = pos.x();
|
|
||||||
int r_dist = s_size.width() - (pos.x() + button->width());
|
|
||||||
// oblicz pozycj<63> w zale<6C>no<6E>ci od tego czy po lewej stronie
|
|
||||||
// jest wi<77>cej miejsca czy po prawej
|
|
||||||
int x;
|
|
||||||
if (l_dist >= r_dist)
|
|
||||||
x = pos.x() - e_size.width();
|
|
||||||
else
|
|
||||||
x = pos.x() + button->width();
|
|
||||||
// oblicz pozycj<63> y - centrujemy w pionie
|
|
||||||
int y = pos.y() + button->height()/2 - e_size.height()/2;
|
|
||||||
// je<6A>li wychodzi poza doln<6C> kraw<61>d<EFBFBD> to r<>wnamy do niej
|
|
||||||
if (y + e_size.height() > s_size.height())
|
|
||||||
y = s_size.height() - e_size.height();
|
|
||||||
|
|
||||||
if (above) {
|
QWidget *tabGrpWidget = NULL;
|
||||||
y -= rowCount*buttonHeight;
|
if (! bOnlyOneGroup)
|
||||||
}
|
{
|
||||||
|
tabGrpWidget = new QWidget(smTab);
|
||||||
|
if (groupName.right(4).toLower() == ".png")
|
||||||
|
smTab->addTab( tabGrpWidget, QIcon(groupName), "");
|
||||||
|
else
|
||||||
|
smTab->addTab( tabGrpWidget, groupName);
|
||||||
|
} else {
|
||||||
|
tabGrpWidget = smWidget;
|
||||||
|
}
|
||||||
|
|
||||||
// je<6A>li wychodzi poza g<>rn<72> kraw<61>d<EFBFBD> to r<>wnamy do niej
|
QGridLayout *tabGLayout = new QGridLayout(tabGrpWidget);
|
||||||
if (y < 0)
|
tabGLayout->setContentsMargins(0,0,0,0);
|
||||||
y = 0;
|
tabGLayout->setSpacing(0);
|
||||||
// ustawiamy selektor na wyliczonej pozycji
|
|
||||||
smWidget->move(x, y);
|
|
||||||
|
|
||||||
x = 0;
|
int rowCount = (int)sqrt((double)group.size());
|
||||||
y = 0;
|
int countPerLine = (group.size()/rowCount) + ((group.size() % rowCount) ? 1 : 0);
|
||||||
|
maxRowCount = qMax(maxRowCount, rowCount);
|
||||||
|
maxCountPerLine = qMax(maxCountPerLine, countPerLine);
|
||||||
|
|
||||||
QVectorIterator<QString> i(order);
|
int lin = 0;
|
||||||
while(i.hasNext())
|
int col = 0;
|
||||||
{
|
QVector<QString> ordered = Smileys.value(groupName).first;
|
||||||
QString key = i.next();
|
QVectorIterator<QString> it(ordered);
|
||||||
QPushButton *smButton = new QPushButton("", smWidget);
|
while(it.hasNext())
|
||||||
smButton->setGeometry(x*buttonWidth, y*buttonHeight, buttonWidth, buttonHeight);
|
{
|
||||||
smButton->setIconSize(QSize(buttonWidth, buttonHeight));
|
|
||||||
smButton->setIcon(QPixmap(Smileys.value(key)));
|
|
||||||
smButton->setToolTip(key);
|
|
||||||
smButton->setStyleSheet("QPushButton:hover {border: 3px solid white; border-radius: 2px;}");
|
|
||||||
smButton->setFlat(true);
|
|
||||||
++x;
|
|
||||||
if(x >= countPerLine)
|
|
||||||
{
|
|
||||||
x = 0;
|
|
||||||
++y;
|
|
||||||
}
|
|
||||||
QObject::connect(smButton, SIGNAL(clicked()), parent, slotAddMethod);
|
|
||||||
QObject::connect(smButton, SIGNAL(clicked()), smWidget, SLOT(close()));
|
|
||||||
}
|
|
||||||
|
|
||||||
smWidget->show();
|
QString key = it.next();
|
||||||
|
QPushButton *button = new QPushButton("", tabGrpWidget);
|
||||||
|
button->setIconSize(QSize(buttonWidth, buttonHeight));
|
||||||
|
button->setFixedSize(QSize(buttonWidth, buttonHeight));
|
||||||
|
button->setIcon(QPixmap(group.value(key)));
|
||||||
|
button->setToolTip(key);
|
||||||
|
button->setStyleSheet("QPushButton:hover {border: 3px solid white; border-radius: 2px;}");
|
||||||
|
button->setFlat(true);
|
||||||
|
tabGLayout->addWidget(button,col,lin);
|
||||||
|
++lin;
|
||||||
|
if(lin >= countPerLine)
|
||||||
|
{
|
||||||
|
lin = 0;
|
||||||
|
++col;
|
||||||
|
}
|
||||||
|
QObject::connect(button, SIGNAL(clicked()), parent, slotAddMethod);
|
||||||
|
QObject::connect(button, SIGNAL(clicked()), smWidget, SLOT(close()));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//Get left up pos of button
|
||||||
|
QPoint butTopLeft = button->mapToGlobal(QPoint(0,0));
|
||||||
|
//Get widget's size
|
||||||
|
QSize sizeWidget = smWidget->sizeHint();
|
||||||
|
//Get screen's size
|
||||||
|
QSize sizeScreen = QApplication::desktop()->size();
|
||||||
|
|
||||||
|
//Calculate left distance to screen start
|
||||||
|
int distToScreenLeft = butTopLeft.x();
|
||||||
|
//Calculate right distance to screen end
|
||||||
|
int distToRightScreen = sizeScreen.width() - (butTopLeft.x() + button->width());
|
||||||
|
|
||||||
|
//Calculate left position
|
||||||
|
int x;
|
||||||
|
if (distToScreenLeft >= distToRightScreen) //More distance in left than right in screen
|
||||||
|
x = butTopLeft.x() - sizeWidget.width(); //Place widget on left of button
|
||||||
|
else
|
||||||
|
x = butTopLeft.x() + button->width(); //Place widget on right of button
|
||||||
|
|
||||||
|
//Calculate top position
|
||||||
|
int y;
|
||||||
|
if (above) //Widget must be above the button
|
||||||
|
y = butTopLeft.y() + button->height() - sizeWidget.height();
|
||||||
|
else
|
||||||
|
y = butTopLeft.y() + button->height()/2 - sizeWidget.height()/2; //Centered on button height
|
||||||
|
|
||||||
|
if (y + sizeWidget.height() > sizeScreen.height()) //Widget will be too low
|
||||||
|
y = sizeScreen.height() - sizeWidget.height(); //Place widget bottom at screen bottom
|
||||||
|
|
||||||
|
if (y < 0) //Widget will be too high
|
||||||
|
y = 0; //Place widget top at screen top
|
||||||
|
|
||||||
|
smWidget->move(x, y) ;
|
||||||
|
smWidget->show() ;
|
||||||
}
|
}
|
||||||
|
|
||||||
//void Emoticons::formatText(QString &text)
|
|
||||||
//{
|
|
||||||
// QHashIterator<QString, QString> i(Smileys);
|
|
||||||
// while(i.hasNext()) {
|
|
||||||
// i.next();
|
|
||||||
// foreach (QString code, i.key().split("|")) {
|
|
||||||
// text.replace(code, "<img src=\"" + i.value() + "\">");
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
|
@ -1,201 +1,201 @@
|
|||||||
{
|
{
|
||||||
":grinning:":"emojione/1F600.png";
|
"emojione/1F600.png"|":grinning:":"emojione/1F600.png";
|
||||||
":grin:":"emojione/1F601.png";
|
"emojione/1F600.png"|":grin:":"emojione/1F601.png";
|
||||||
":joy:|:')|:'-)":"emojione/1F602.png";
|
"emojione/1F600.png"|":joy:|:')|:'-)":"emojione/1F602.png";
|
||||||
":smile:|:-DD|:DD":"emojione/1F604.png";
|
"emojione/1F600.png"|":smile:|:-DD|:DD":"emojione/1F604.png";
|
||||||
":smiley:|:-D|:D":"emojione/1F603.png";
|
"emojione/1F600.png"|":smiley:|:-D|:D":"emojione/1F603.png";
|
||||||
":sweat_smile:|':)|':-)|'=)|':D|':-D|'=D":"emojione/1F605.png";
|
"emojione/1F600.png"|":sweat_smile:|':)|':-)|'=)|':D|':-D|'=D":"emojione/1F605.png";
|
||||||
":laughing:|:satisfied":"emojione/1F606.png";
|
"emojione/1F600.png"|":laughing:|:satisfied":"emojione/1F606.png";
|
||||||
":innocent:|O:-)|0:-3|0:3|0:-)|0:)":"emojione/1F607.png";
|
"emojione/1F600.png"|":innocent:|O:-)|0:-3|0:3|0:-)|0:)":"emojione/1F607.png";
|
||||||
":smiling_imp:":"emojione/1F608.png";
|
"emojione/1F600.png"|":smiling_imp:":"emojione/1F608.png";
|
||||||
":imp:":"emojione/1F47F.png";
|
"emojione/1F600.png"|":imp:":"emojione/1F47F.png";
|
||||||
":wink:|;-)|;)":"emojione/1F609.png";
|
"emojione/1F600.png"|":wink:|;-)|;)":"emojione/1F609.png";
|
||||||
":blush:":"emojione/1F60A.png";
|
"emojione/1F600.png"|":blush:":"emojione/1F60A.png";
|
||||||
":relaxed:":"emojione/263A.png";
|
"emojione/1F600.png"|":relaxed:":"emojione/263A.png";
|
||||||
":yum:":"emojione/1F60B.png";
|
"emojione/1F600.png"|":yum:":"emojione/1F60B.png";
|
||||||
":relieved:":"emojione/1F60C.png";
|
"emojione/1F600.png"|":relieved:":"emojione/1F60C.png";
|
||||||
":heart_eyes:":"emojione/1F60D.png";
|
"emojione/1F600.png"|":heart_eyes:":"emojione/1F60D.png";
|
||||||
":sunglasses:|B-)|B)|8)|8-)|B-D|8-D":"emojione/1F60E.png";
|
"emojione/1F600.png"|":sunglasses:|B-)|B)|8)|8-)|B-D|8-D":"emojione/1F60E.png";
|
||||||
":smirk:":"emojione/1F60F.png";
|
"emojione/1F600.png"|":smirk:":"emojione/1F60F.png";
|
||||||
":neutral_face:":"emojione/1F610.png";
|
"emojione/1F600.png"|":neutral_face:":"emojione/1F610.png";
|
||||||
":expressionless:|-_-":"emojione/1F611.png";
|
"emojione/1F600.png"|":expressionless:|-_-":"emojione/1F611.png";
|
||||||
":unamused:":"emojione/1F612.png";
|
"emojione/1F600.png"|":unamused:":"emojione/1F612.png";
|
||||||
":sweat:|':(|':-(|'=(":"emojione/1F613.png";
|
"emojione/1F600.png"|":sweat:|':(|':-(|'=(":"emojione/1F613.png";
|
||||||
":pensive:":"emojione/1F614.png";
|
"emojione/1F600.png"|":pensive:":"emojione/1F614.png";
|
||||||
":confused:|:-/|:-.|:\|=/|=\|:L|=L":"emojione/1F615.png";
|
"emojione/1F600.png"|":confused:|:-/|:-.|:\|=/|=\|:L|=L":"emojione/1F615.png";
|
||||||
":confounded:":"emojione/1F616.png";
|
"emojione/1F600.png"|":confounded:":"emojione/1F616.png";
|
||||||
":kissing:":"emojione/1F617.png";
|
"emojione/1F600.png"|":kissing:":"emojione/1F617.png";
|
||||||
":kissing_heart:|:*|:-*|=*":"emojione/1F618.png";
|
"emojione/1F600.png"|":kissing_heart:|:*|:-*|=*":"emojione/1F618.png";
|
||||||
":kissing_smiling_eyes:":"emojione/1F619.png";
|
"emojione/1F600.png"|":kissing_smiling_eyes:":"emojione/1F619.png";
|
||||||
":kissing_closed_eyes:":"emojione/1F61A.png";
|
"emojione/1F600.png"|":kissing_closed_eyes:":"emojione/1F61A.png";
|
||||||
":stuck_out_tongue:|:-P|:P|:p|:-p":"emojione/1F61B.png";
|
"emojione/1F600.png"|":stuck_out_tongue:|:-P|:P|:p|:-p":"emojione/1F61B.png";
|
||||||
":stuck_out_tongue_winking_eye:":"emojione/1F61C.png";
|
"emojione/1F600.png"|":stuck_out_tongue_winking_eye:":"emojione/1F61C.png";
|
||||||
":stuck_out_tongue_closed_eyes:":"emojione/1F61D.png";
|
"emojione/1F600.png"|":stuck_out_tongue_closed_eyes:":"emojione/1F61D.png";
|
||||||
":disappointed:|:-(|:(":"emojione/1F61E.png";
|
"emojione/1F600.png"|":disappointed:|:-(|:(":"emojione/1F61E.png";
|
||||||
":worried:":"emojione/1F61F.png";
|
"emojione/1F600.png"|":worried:":"emojione/1F61F.png";
|
||||||
":angry:|:@":"emojione/1F620.png";
|
"emojione/1F600.png"|":angry:|:@":"emojione/1F620.png";
|
||||||
":rage:":"emojione/1F621.png";
|
"emojione/1F600.png"|":rage:":"emojione/1F621.png";
|
||||||
":cry:|:'(|:'-(|;(|;-(":"emojione/1F622.png";
|
"emojione/1F600.png"|":cry:|:'(|:'-(|;(|;-(":"emojione/1F622.png";
|
||||||
":persevere:":"emojione/1F623.png";
|
"emojione/1F600.png"|":persevere:":"emojione/1F623.png";
|
||||||
":triumph:":"emojione/1F624.png";
|
"emojione/1F600.png"|":triumph:":"emojione/1F624.png";
|
||||||
":disappointed_relieved:":"emojione/1F625.png";
|
"emojione/1F600.png"|":disappointed_relieved:":"emojione/1F625.png";
|
||||||
":frowning:":"emojione/1F626.png";
|
"emojione/1F600.png"|":frowning:":"emojione/1F626.png";
|
||||||
":anguished:":"emojione/1F627.png";
|
"emojione/1F600.png"|":anguished:":"emojione/1F627.png";
|
||||||
":fearful:":"emojione/1F628.png";
|
"emojione/1F600.png"|":fearful:":"emojione/1F628.png";
|
||||||
":weary:":"emojione/1F629.png";
|
"emojione/1F600.png"|":weary:":"emojione/1F629.png";
|
||||||
":sleepy:":"emojione/1F62A.png";
|
"emojione/1F600.png"|":sleepy:":"emojione/1F62A.png";
|
||||||
":tired_face:":"emojione/1F62B.png";
|
"emojione/1F600.png"|":tired_face:":"emojione/1F62B.png";
|
||||||
":grimacing:":"emojione/1F62C.png";
|
"emojione/1F600.png"|":grimacing:":"emojione/1F62C.png";
|
||||||
":sob:":"emojione/1F62D.png";
|
"emojione/1F600.png"|":sob:":"emojione/1F62D.png";
|
||||||
":open_mouth:|:-O|:O":"emojione/1F62E.png";
|
"emojione/1F600.png"|":open_mouth:|:-O|:O":"emojione/1F62E.png";
|
||||||
":hushed:":"emojione/1F62F.png";
|
"emojione/1F600.png"|":hushed:":"emojione/1F62F.png";
|
||||||
":cold_sweat:":"emojione/1F630.png";
|
"emojione/1F600.png"|":cold_sweat:":"emojione/1F630.png";
|
||||||
":scream:":"emojione/1F631.png";
|
"emojione/1F600.png"|":scream:":"emojione/1F631.png";
|
||||||
":astonished:":"emojione/1F632.png";
|
"emojione/1F600.png"|":astonished:":"emojione/1F632.png";
|
||||||
":flushed:|=$|:$|:-$":"emojione/1F633.png";
|
"emojione/1F600.png"|":flushed:|=$|:$|:-$":"emojione/1F633.png";
|
||||||
":sleeping:":"emojione/1F634.png";
|
"emojione/1F600.png"|":sleeping:":"emojione/1F634.png";
|
||||||
":bulb:":"emojione/1F4A1.png";
|
"emojione/1F4A1.png"|":bulb:":"emojione/1F4A1.png";
|
||||||
":zzz:":"emojione/1F4A4.png";
|
"emojione/1F4A1.png"|":zzz:":"emojione/1F4A4.png";
|
||||||
":fire:|:flame:":"emojione/1F525.png";
|
"emojione/1F4A1.png"|":fire:|:flame:":"emojione/1F525.png";
|
||||||
":stars:":"emojione/1F320.png";
|
"emojione/1F4A1.png"|":stars:":"emojione/1F320.png";
|
||||||
":star:":"emojione/2B50.png";
|
"emojione/1F4A1.png"|":star:":"emojione/2B50.png";
|
||||||
":dizzy:":"emojione/1F4AB.png";
|
"emojione/1F4A1.png"|":dizzy:":"emojione/1F4AB.png";
|
||||||
":boom:":"emojione/1F4A5.png";
|
"emojione/1F4A1.png"|":boom:":"emojione/1F4A5.png";
|
||||||
":anger:":"emojione/1F4A2.png";
|
"emojione/1F4A1.png"|":anger:":"emojione/1F4A2.png";
|
||||||
":bomb:":"emojione/1F4A3.png";
|
"emojione/1F4A1.png"|":bomb:":"emojione/1F4A3.png";
|
||||||
":sweat_drops:":"emojione/1F4A6.png";
|
"emojione/1F4A1.png"|":sweat_drops:":"emojione/1F4A6.png";
|
||||||
":droplet:":"emojione/1F4A7.png";
|
"emojione/1F4A1.png"|":droplet:":"emojione/1F4A7.png";
|
||||||
":dash:":"emojione/1F4A8.png";
|
"emojione/1F4A1.png"|":dash:":"emojione/1F4A8.png";
|
||||||
":poop:|:shit:|:hankey:|:poo:":"emojione/1F4A9.png";
|
"emojione/1F4A1.png"|":poop:|:shit:|:hankey:|:poo:":"emojione/1F4A9.png";
|
||||||
":dizzy_face:|#-)|#)|%-)|%)|X)|X-)":"emojione/1F635.png";
|
"emojione/1F600.png"|":dizzy_face:|#-)|#)|%-)|%)|X)|X-)":"emojione/1F635.png";
|
||||||
":no_mouth:|:-X|:X:|-#|:#|=X|=x|:x|:-x|=#":"emojione/1F636.png";
|
"emojione/1F600.png"|":no_mouth:|:-X|:X:|-#|:#|=X|=x|:x|:-x|=#":"emojione/1F636.png";
|
||||||
":mask:":"emojione/1F637.png";
|
"emojione/1F600.png"|":mask:":"emojione/1F637.png";
|
||||||
":slight_frown:|:slightly_frowning_face:":"emojione/1F641.png";
|
"emojione/1F600.png"|":slight_frown:|:slightly_frowning_face:":"emojione/1F641.png";
|
||||||
":slight_smile:|:)|:-)|:slightly_smiling_face:":"emojione/1F642.png";
|
"emojione/1F600.png"|":slight_smile:|:)|:-)|:slightly_smiling_face:":"emojione/1F642.png";
|
||||||
":smile_cat:|(@)":"emojione/1F638.png";
|
"emojione/1F638.png"|":smile_cat:|(@)":"emojione/1F638.png";
|
||||||
":joy_cat:":"emojione/1F639.png";
|
"emojione/1F638.png"|":joy_cat:":"emojione/1F639.png";
|
||||||
":smiley_cat:":"emojione/1F63A.png";
|
"emojione/1F638.png"|":smiley_cat:":"emojione/1F63A.png";
|
||||||
":heart_eyes_cat:":"emojione/1F63B.png";
|
"emojione/1F638.png"|":heart_eyes_cat:":"emojione/1F63B.png";
|
||||||
":smirk_cat:":"emojione/1F63C.png";
|
"emojione/1F638.png"|":smirk_cat:":"emojione/1F63C.png";
|
||||||
":kissing_cat:":"emojione/1F63D.png";
|
"emojione/1F638.png"|":kissing_cat:":"emojione/1F63D.png";
|
||||||
":pouting_cat:":"emojione/1F63E.png";
|
"emojione/1F638.png"|":pouting_cat:":"emojione/1F63E.png";
|
||||||
":crying_cat_face:":"emojione/1F63F.png";
|
"emojione/1F638.png"|":crying_cat_face:":"emojione/1F63F.png";
|
||||||
":scream_cat:":"emojione/1F640.png";
|
"emojione/1F638.png"|":scream_cat:":"emojione/1F640.png";
|
||||||
":footprints:":"emojione/1F463.png";
|
"?"|":footprints:":"emojione/1F463.png";
|
||||||
":bust_in_silhouette:":"emojione/1F464.png";
|
"?"|":bust_in_silhouette:":"emojione/1F464.png";
|
||||||
":busts_in_silhouette:":"emojione/1F465.png";
|
"?"|":busts_in_silhouette:":"emojione/1F465.png";
|
||||||
":levitate:|:man_in_business_suit_levitating:":"emojione/1F574.png";
|
"emojione/1F46A.png"|":levitate:|:man_in_business_suit_levitating:":"emojione/1F574.png";
|
||||||
":spy:|:sleuth_or_spy:":"emojione/1F575.png";
|
"emojione/1F46A.png"|":spy:|:sleuth_or_spy:":"emojione/1F575.png";
|
||||||
":baby:":"emojione/1F476.png";
|
"emojione/1F46A.png"|":baby:":"emojione/1F476.png";
|
||||||
":boy:":"emojione/1F466.png";
|
"emojione/1F46A.png"|":boy:":"emojione/1F466.png";
|
||||||
":girl:":"emojione/1F467.png";
|
"emojione/1F46A.png"|":girl:":"emojione/1F467.png";
|
||||||
":man:":"emojione/1F468.png";
|
"emojione/1F46A.png"|":man:":"emojione/1F468.png";
|
||||||
":woman:":"emojione/1F469.png";
|
"emojione/1F46A.png"|":woman:":"emojione/1F469.png";
|
||||||
":family:":"emojione/1F46A.png";
|
"emojione/1F46A.png"|":family:":"emojione/1F46A.png";
|
||||||
":couple:":"emojione/1F46B.png";
|
"emojione/1F46A.png"|":couple:":"emojione/1F46B.png";
|
||||||
":dancers:":"emojione/1F46F.png";
|
"emojione/1F46A.png"|":dancers:":"emojione/1F46F.png";
|
||||||
":bride_with_veil:":"emojione/1F470.png";
|
"emojione/1F46A.png"|":bride_with_veil:":"emojione/1F470.png";
|
||||||
":person_with_blond_hair:":"emojione/1F471.png";
|
"emojione/1F46A.png"|":person_with_blond_hair:":"emojione/1F471.png";
|
||||||
":man_with_gua_pi_mao:":"emojione/1F472.png";
|
"emojione/1F46A.png"|":man_with_gua_pi_mao:":"emojione/1F472.png";
|
||||||
":man_with_turban:":"emojione/1F473.png";
|
"emojione/1F46A.png"|":man_with_turban:":"emojione/1F473.png";
|
||||||
":older_man:":"emojione/1F474.png";
|
"emojione/1F46A.png"|":older_man:":"emojione/1F474.png";
|
||||||
":older_woman:":"emojione/1F475.png";
|
"emojione/1F46A.png"|":older_woman:":"emojione/1F475.png";
|
||||||
":cop:":"emojione/1F46E.png";
|
"emojione/1F46A.png"|":cop:":"emojione/1F46E.png";
|
||||||
":construction_worker:":"emojione/1F477.png";
|
"emojione/1F46A.png"|":construction_worker:":"emojione/1F477.png";
|
||||||
":princess:":"emojione/1F478.png";
|
"emojione/1F46A.png"|":princess:":"emojione/1F478.png";
|
||||||
":guardsman:":"emojione/1F482.png";
|
"emojione/1F46A.png"|":guardsman:":"emojione/1F482.png";
|
||||||
":angel:":"emojione/1F47C.png";
|
"emojione/1F46A.png"|":angel:":"emojione/1F47C.png";
|
||||||
":santa:":"emojione/1F385.png";
|
"emojione/1F46A.png"|":santa:":"emojione/1F385.png";
|
||||||
":ghost:":"emojione/1F47B.png";
|
"emojione/1F46A.png"|":ghost:":"emojione/1F47B.png";
|
||||||
":skull:|:skeleton:":"emojione/1F480.png";
|
"emojione/1F46A.png"|":skull:|:skeleton:":"emojione/1F480.png";
|
||||||
":alien:":"emojione/1F47D.png";
|
"emojione/1F46A.png"|":alien:":"emojione/1F47D.png";
|
||||||
":space_invader:":"emojione/1F47E.png";
|
"emojione/1F46A.png"|":space_invader:":"emojione/1F47E.png";
|
||||||
":japanese_ogre:":"emojione/1F479.png";
|
"emojione/1F46A.png"|":japanese_ogre:":"emojione/1F479.png";
|
||||||
":japanese_goblin:":"emojione/1F47A.png";
|
"emojione/1F46A.png"|":japanese_goblin:":"emojione/1F47A.png";
|
||||||
":bow:":"emojione/1F647.png";
|
"emojione/1F46A.png"|":bow:":"emojione/1F647.png";
|
||||||
":information_desk_person:":"emojione/1F481.png";
|
"emojione/1F46A.png"|":information_desk_person:":"emojione/1F481.png";
|
||||||
":raised_hands:":"emojione/1F64C.png";
|
"emojione/1F44D.png"|":raised_hands:":"emojione/1F64C.png";
|
||||||
":clap:":"emojione/1F44F.png";
|
"emojione/1F44D.png"|":clap:":"emojione/1F44F.png";
|
||||||
":ear:":"emojione/1F442.png";
|
"emojione/1F442.png"|":ear:":"emojione/1F442.png";
|
||||||
":eye:":"emojione/1F441.png";
|
"emojione/1F442.png"|":eye:":"emojione/1F441.png";
|
||||||
":eyes:":"emojione/1F440.png";
|
"emojione/1F442.png"|":eyes:":"emojione/1F440.png";
|
||||||
":nose:":"emojione/1F443.png";
|
"emojione/1F442.png"|":nose:":"emojione/1F443.png";
|
||||||
":lips:":"emojione/1F444.png";
|
"emojione/1F442.png"|":lips:":"emojione/1F444.png";
|
||||||
":lips2:":"emojione/1F5E2.png";
|
"emojione/1F442.png"|":lips2:":"emojione/1F5E2.png";
|
||||||
":kiss:":"emojione/1F48B.png";
|
"emojione/1F442.png"|":kiss:":"emojione/1F48B.png";
|
||||||
":tongue:":"emojione/1F445.png";
|
"emojione/1F442.png"|":tongue:":"emojione/1F445.png";
|
||||||
":nail_care:":"emojione/1F485.png";
|
"emojione/1F442.png"|":nail_care:":"emojione/1F485.png";
|
||||||
":wave:":"emojione/1F44B.png";
|
"emojione/1F44D.png"|":wave:":"emojione/1F44B.png";
|
||||||
":thumbsup:|:+1:|(y)|(Y)":"emojione/1F44D.png";
|
"emojione/1F44D.png"|":thumbsup:|:+1:|(y)|(Y)":"emojione/1F44D.png";
|
||||||
":thumbsdown:|:-1:|(N)|(n)":"emojione/1F44E.png";
|
"emojione/1F44D.png"|":thumbsdown:|:-1:|(N)|(n)":"emojione/1F44E.png";
|
||||||
":muscle:":"emojione/1F4AA.png";
|
"emojione/1F44D.png"|":muscle:":"emojione/1F4AA.png";
|
||||||
":middle_finger:|":"emojione/1F595.png";
|
"emojione/1F44D.png"|":middle_finger:|":"emojione/1F595.png";
|
||||||
":finger_pointing_down:":"emojione/1F597.png";
|
"emojione/1F44D.png"|":finger_pointing_down:":"emojione/1F597.png";
|
||||||
":finger_pointing_left:":"emojione/1F598.png";
|
"emojione/1F44D.png"|":finger_pointing_left:":"emojione/1F598.png";
|
||||||
":finger_pointing_right:":"emojione/1F599.png";
|
"emojione/1F44D.png"|":finger_pointing_right:":"emojione/1F599.png";
|
||||||
":finger_pointing_up:":"emojione/1F59E.png";
|
"emojione/1F44D.png"|":finger_pointing_up:":"emojione/1F59E.png";
|
||||||
":coffee:|(C)|(c)":"emojione/2615.png";
|
"emojione/1F370.png"|":coffee:|(C)|(c)":"emojione/2615.png";
|
||||||
":sake:":"emojione/1F376.png";
|
"emojione/1F370.png"|":sake:":"emojione/1F376.png";
|
||||||
":tea:":"emojione/1F375.png";
|
"emojione/1F370.png"|":tea:":"emojione/1F375.png";
|
||||||
":cake:":"emojione/1F370.png";
|
"emojione/1F370.png"|":cake:":"emojione/1F370.png";
|
||||||
":egg:":"emojione/1F373.png";
|
"emojione/1F370.png"|":egg:":"emojione/1F373.png";
|
||||||
":hamburger:":"emojione/1F354.png";
|
"emojione/1F370.png"|":hamburger:":"emojione/1F354.png";
|
||||||
":doughnut:":"emojione/1F369.png";
|
"emojione/1F370.png"|":doughnut:":"emojione/1F369.png";
|
||||||
":wine_glass:":"emojione/1F377.png";
|
"emojione/1F370.png"|":wine_glass:":"emojione/1F377.png";
|
||||||
":cocktail:":"emojione/1F378.png";
|
"emojione/1F370.png"|":cocktail:":"emojione/1F378.png";
|
||||||
":tropical_drink:":"emojione/1F379.png";
|
"emojione/1F370.png"|":tropical_drink:":"emojione/1F379.png";
|
||||||
":beer:|(B)|(b)":"emojione/1F37A.png";
|
"emojione/1F370.png"|":beer:|(B)|(b)":"emojione/1F37A.png";
|
||||||
":beers:":"emojione/1F37B.png";
|
"emojione/1F370.png"|":beers:":"emojione/1F37B.png";
|
||||||
":watch:":"emojione/231A.png";
|
"?"|":watch:":"emojione/231A.png";
|
||||||
":iphone:":"emojione/1F4F1.png";
|
"?"|":iphone:":"emojione/1F4F1.png";
|
||||||
":monkey:":"emojione/1F412.png";
|
"?"|":monkey:":"emojione/1F412.png";
|
||||||
":see_no_evil:":"emojione/1F648.png";
|
"?"|":see_no_evil:":"emojione/1F648.png";
|
||||||
":hear_no_evil:":"emojione/1F649.png";
|
"?"|":hear_no_evil:":"emojione/1F649.png";
|
||||||
":speak_no_evil:":"emojione/1F64A.png";
|
"?"|":speak_no_evil:":"emojione/1F64A.png";
|
||||||
":turtle:":"emojione/1F422.png";
|
"?"|":turtle:":"emojione/1F422.png";
|
||||||
":frog:":"emojione/1F438.png";
|
"?"|":frog:":"emojione/1F438.png";
|
||||||
":airplane:":"emojione/2708.png";
|
"?"|":airplane:":"emojione/2708.png";
|
||||||
":heart:|<3":"emojione/2764.png";
|
"?"|":heart:|<3":"emojione/2764.png";
|
||||||
":broken_heart:|</3":"emojione/1F494.png";
|
"?"|":broken_heart:|</3":"emojione/1F494.png";
|
||||||
":love_letter:":"emojione/1F48C.png";
|
"?"|":love_letter:":"emojione/1F48C.png";
|
||||||
":two_hearts:":"emojione/1F495.png";
|
"?"|":two_hearts:":"emojione/1F495.png";
|
||||||
":revolving_hearts:":"emojione/1F49E.png";
|
"?"|":revolving_hearts:":"emojione/1F49E.png";
|
||||||
":heartbeat:":"emojione/1F493.png";
|
"?"|":heartbeat:":"emojione/1F493.png";
|
||||||
":heartpulse:":"emojione/1F497.png";
|
"?"|":heartpulse:":"emojione/1F497.png";
|
||||||
":sparkling_heart:":"emojione/1F496.png";
|
"?"|":sparkling_heart:":"emojione/1F496.png";
|
||||||
":cupid:":"emojione/1F498.png";
|
"?"|":cupid:":"emojione/1F498.png";
|
||||||
":gift_heart:":"emojione/1F49D.png";
|
"?"|":gift_heart:":"emojione/1F49D.png";
|
||||||
":birthday:":"emojione/1F382.png";
|
"?"|":birthday:":"emojione/1F382.png";
|
||||||
":gift:":"emojione/1F381.png";
|
"?"|":gift:":"emojione/1F381.png";
|
||||||
":christmas_tree:":"emojione/1F384.png";
|
"?"|":christmas_tree:":"emojione/1F384.png";
|
||||||
":penguin:":"emojione/1F427.png";
|
"?"|":penguin:":"emojione/1F427.png";
|
||||||
":sunny:":"emojione/2600.png";
|
"?"|":sunny:":"emojione/2600.png";
|
||||||
":partly_sunny:":"emojione/26C5.png";
|
"?"|":partly_sunny:":"emojione/26C5.png";
|
||||||
":cloud:":"emojione/2601.png";
|
"?"|":cloud:":"emojione/2601.png";
|
||||||
":cloud_rain:":"emojione/1F327.png";
|
"?"|":cloud_rain:":"emojione/1F327.png";
|
||||||
":cloud_snow:":"emojione/1F328.png";
|
"?"|":cloud_snow:":"emojione/1F328.png";
|
||||||
":cloud_lightning:":"emojione/1F329.png";
|
"?"|":cloud_lightning:":"emojione/1F329.png";
|
||||||
":cloud_tornado:":"emojione/1F32A.png";
|
"?"|":cloud_tornado:":"emojione/1F32A.png";
|
||||||
":crescent_moon:":"emojione/1F319.png";
|
"?"|":crescent_moon:":"emojione/1F319.png";
|
||||||
":umbrella:":"emojione/2614.png";
|
"?"|":umbrella:":"emojione/2614.png";
|
||||||
":snowflake:":"emojione/2744.png";
|
"?"|":snowflake:":"emojione/2744.png";
|
||||||
":fist:":"emojione/270A.png";
|
"emojione/1F44D.png"|":fist:":"emojione/270A.png";
|
||||||
":v:":"emojione/270C.png";
|
"emojione/1F44D.png"|":v:":"emojione/270C.png";
|
||||||
":raised_hand:":"emojione/270B.png";
|
"emojione/1F44D.png"|":raised_hand:":"emojione/270B.png";
|
||||||
":point_up:":"emojione/261D.png";
|
"emojione/1F44D.png"|":point_up:":"emojione/261D.png";
|
||||||
":pizza:":"emojione/1F355.png";
|
"emojione/1F370.png"|":pizza:":"emojione/1F355.png";
|
||||||
":cookie:":"emojione/1F36A.png";
|
"emojione/1F370.png"|":cookie:":"emojione/1F36A.png";
|
||||||
":ok_hand:":"emojione/1F44C.png";
|
"emojione/1F44D.png"|":ok_hand:":"emojione/1F44C.png";
|
||||||
":four_leaf_clover:":"emojione/1F340.png";
|
"?"|":four_leaf_clover:":"emojione/1F340.png";
|
||||||
":jack_o_lantern:":"emojione/1F383.png";
|
"?"|":jack_o_lantern:":"emojione/1F383.png";
|
||||||
":bouquet:":"emojione/1F490.png";
|
"?"|":bouquet:":"emojione/1F490.png";
|
||||||
":vulcan:":"emojione/1F596.png";
|
"emojione/1F44D.png"|":vulcan:":"emojione/1F596.png";
|
||||||
":zipper_mouth_face:":"emojione/1f910.png";
|
"emojione/1F600.png"|":zipper_mouth_face:":"emojione/1f910.png";
|
||||||
":money_mouth_face:":"emojione/1f911.png";
|
"emojione/1F600.png"|":money_mouth_face:":"emojione/1f911.png";
|
||||||
":face_with_thermometer:":"emojione/1f912.png";
|
"emojione/1F600.png"|":face_with_thermometer:":"emojione/1f912.png";
|
||||||
":nerd_face:":"emojione/1f913.png";
|
"emojione/1F600.png"|":nerd_face:":"emojione/1f913.png";
|
||||||
":thinking_face:":"emojione/1f914.png";
|
"emojione/1F600.png"|":thinking_face:":"emojione/1f914.png";
|
||||||
":head_bandage:":"emojione/1f915.png";
|
"emojione/1F600.png"|":head_bandage:":"emojione/1f915.png";
|
||||||
":robot_face:":"emojione/1f916.png";
|
"emojione/1F600.png"|":robot_face:":"emojione/1f916.png";
|
||||||
":updside_down_face:":"emojione/1f643.png";
|
"emojione/1F600.png"|":updside_down_face:":"emojione/1f643.png";
|
||||||
}
|
}
|
||||||
|
@ -166,43 +166,47 @@ RsHtml::RsHtml()
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void RsHtml::initEmoticons(const QHash< QString, QString >& hash)
|
void RsHtml::initEmoticons(const QHash<QString, QPair<QVector<QString>, QHash<QString, QString> > >& hash)
|
||||||
{
|
{
|
||||||
QString newRE;
|
QString newRE;
|
||||||
for(QHash<QString,QString>::const_iterator it = hash.begin(); it != hash.end(); ++it)
|
for(QHash<QString, QPair<QVector<QString>, QHash<QString, QString> > >::const_iterator groupit = hash.begin(); groupit != hash.end(); ++groupit) {
|
||||||
foreach(QString smile, it.key().split("|")) {
|
QHash<QString,QString> group = groupit.value().second;
|
||||||
if (smile.isEmpty()) {
|
for(QHash<QString,QString>::const_iterator it = group.begin(); it != group.end(); ++it)
|
||||||
continue;
|
foreach(QString smile, it.key().split("|")) {
|
||||||
}
|
if (smile.isEmpty()) {
|
||||||
defEmbedImg.smileys.insert(smile, it.value());
|
continue;
|
||||||
// add space around smileys
|
}
|
||||||
newRE += "(?:^|\\s)(" + QRegExp::escape(smile) + ")(?:$|\\s)|";
|
defEmbedImg.smileys.insert(smile, it.value());
|
||||||
// explanations:
|
// add space around smileys
|
||||||
// (?:^|\s)(*smiley*)(?:$|\s)
|
newRE += "(?:^|\\s)(" + QRegExp::escape(smile) + ")(?:$|\\s)|";
|
||||||
//
|
// explanations:
|
||||||
// (?:^|\s) Non-capturing group
|
// (?:^|\s)(*smiley*)(?:$|\s)
|
||||||
// 1st Alternative: ^
|
//
|
||||||
// ^ assert position at start of the string
|
// (?:^|\s) Non-capturing group
|
||||||
// 2nd Alternative: \s
|
// 1st Alternative: ^
|
||||||
// \s match any white space character [\r\n\t\f ]
|
// ^ assert position at start of the string
|
||||||
//
|
// 2nd Alternative: \s
|
||||||
// 1st Capturing group (*smiley*)
|
// \s match any white space character [\r\n\t\f ]
|
||||||
// *smiley* matches the characters *smiley* literally (case sensitive)
|
//
|
||||||
//
|
// 1st Capturing group (*smiley*)
|
||||||
// (?:$|\s) Non-capturing group
|
// *smiley* matches the characters *smiley* literally (case sensitive)
|
||||||
// 1st Alternative: $
|
//
|
||||||
// $ assert position at end of the string
|
// (?:$|\s) Non-capturing group
|
||||||
// 2nd Alternative: \s
|
// 1st Alternative: $
|
||||||
// \s match any white space character [\r\n\t\f ]
|
// $ assert position at end of the string
|
||||||
|
// 2nd Alternative: \s
|
||||||
|
// \s match any white space character [\r\n\t\f ]
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* TODO
|
* TODO
|
||||||
* a better version is:
|
* a better version is:
|
||||||
* (?<=^|\s)(*smile*)(?=$|\s) using the lookbehind/lookahead operator instead of non-capturing groups.
|
* (?<=^|\s)(*smile*)(?=$|\s) using the lookbehind/lookahead operator instead of non-capturing groups.
|
||||||
* This solves the problem that spaces are matched, too (see workaround in RsHtml::embedHtml)
|
* This solves the problem that spaces are matched, too (see workaround in RsHtml::embedHtml)
|
||||||
* This is not supported by Qt4!
|
* This is not supported by Qt4!
|
||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
newRE.chop(1); // remove last |
|
newRE.chop(1); // remove last |
|
||||||
defEmbedImg.myREs.append(QRegExp(newRE));
|
defEmbedImg.myREs.append(QRegExp(newRE));
|
||||||
}
|
}
|
||||||
|
@ -60,7 +60,7 @@ class RsHtml
|
|||||||
public:
|
public:
|
||||||
RsHtml();
|
RsHtml();
|
||||||
|
|
||||||
static void initEmoticons(const QHash< QString, QString >& hash);
|
static void initEmoticons(const QHash<QString, QPair<QVector<QString>, QHash<QString, QString> > > &hash);
|
||||||
|
|
||||||
QString formatText(QTextDocument *textDocument, const QString &text, ulong flag, const QColor &backgroundColor = Qt::white, qreal desiredContrast = 1.0, int desiredMinimumFontSize = 10);
|
QString formatText(QTextDocument *textDocument, const QString &text, ulong flag, const QColor &backgroundColor = Qt::white, qreal desiredContrast = 1.0, int desiredMinimumFontSize = 10);
|
||||||
static bool findAnchors(const QString &text, QStringList& urls);
|
static bool findAnchors(const QString &text, QStringList& urls);
|
||||||
|
Loading…
Reference in New Issue
Block a user