File indexing completed on 2024-05-12 16:27:42

0001 /*
0002    SPDX-FileCopyrightText: 2019-2024 Laurent Montel <montel@kde.org>
0003 
0004    SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "validemoticongui.h"
0008 
0009 #include <KListWidgetSearchLine>
0010 #include <KUrlRequester>
0011 
0012 #include <QApplication>
0013 #include <QDebug>
0014 #include <QFile>
0015 #include <QHBoxLayout>
0016 #include <QJsonDocument>
0017 #include <QJsonObject>
0018 #include <QLabel>
0019 #include <QLineEdit>
0020 #include <QListWidget>
0021 #include <QPlainTextEdit>
0022 #include <QPushButton>
0023 #include <QRegularExpression>
0024 #include <QStandardPaths>
0025 #include <QVBoxLayout>
0026 #include <TextEmoticonsCore/UnicodeEmoticonParser>
0027 
0028 ValidEmoticonGui::ValidEmoticonGui(QWidget *parent)
0029     : QWidget(parent)
0030 {
0031     auto mainLayout = new QVBoxLayout(this);
0032     auto hboxLayout = new QHBoxLayout;
0033     hboxLayout->setContentsMargins({});
0034     mainLayout->addLayout(hboxLayout);
0035 
0036     auto mainComponentLayout = new QVBoxLayout;
0037     mainComponentLayout->setContentsMargins({});
0038 
0039     mSearchEmoticon = new KListWidgetSearchLine(this);
0040     mListWidget = new QListWidget(this);
0041     mSearchEmoticon->setListWidget(mListWidget);
0042     mainComponentLayout->addWidget(mSearchEmoticon);
0043     mainComponentLayout->addWidget(mListWidget);
0044     hboxLayout->addLayout(mainComponentLayout);
0045 
0046     auto vboxLayout = new QVBoxLayout;
0047     vboxLayout->setContentsMargins({});
0048     mainLayout->addLayout(vboxLayout);
0049 
0050     auto hboxLayoutUrlRequester = new QHBoxLayout;
0051     vboxLayout->addLayout(hboxLayoutUrlRequester);
0052 
0053     auto label = new QLabel(QStringLiteral("Path emoji RocketChat:"), this);
0054     hboxLayoutUrlRequester->addWidget(label);
0055 
0056     auto urlRequester = new KUrlRequester(this);
0057     urlRequester->setPlaceholderText(QStringLiteral("<foo>/packages/livechat/src/components/Emoji/emojis.ts"));
0058     hboxLayoutUrlRequester->addWidget(urlRequester);
0059 
0060     auto plainTextEdit = new QPlainTextEdit(this);
0061     plainTextEdit->setReadOnly(true);
0062     vboxLayout->addWidget(plainTextEdit);
0063 
0064     const QStringList identifiers = load();
0065     connect(urlRequester, &KUrlRequester::urlSelected, this, [this, plainTextEdit, identifiers](const QUrl &url) {
0066         if (url.isValid()) {
0067             plainTextEdit->setPlainText(generateExcludeEmoticon(url, identifiers));
0068         }
0069     });
0070 }
0071 
0072 ValidEmoticonGui::~ValidEmoticonGui() = default;
0073 
0074 QString ValidEmoticonGui::generateExcludeEmoticon(const QUrl &url, const QStringList &identifiers) const
0075 {
0076     QFile file(url.toLocalFile());
0077     if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
0078         return {};
0079     }
0080     QStringList resultRocketChatEmoticons;
0081     QTextStream in(&file);
0082     while (!in.atEnd()) {
0083         const QString line = in.readLine();
0084         static QRegularExpression regular{QStringLiteral("':(.*):':")};
0085         QRegularExpressionMatch match;
0086         if (line.contains(regular, &match)) {
0087             const QString captured = match.captured(1);
0088             resultRocketChatEmoticons.append(QStringLiteral(":%1:").arg(captured));
0089         }
0090     }
0091     QString result;
0092     for (const auto &emoticons : identifiers) {
0093         if (!resultRocketChatEmoticons.contains(emoticons)) {
0094             result.append(QStringLiteral("QStringLiteral(\"%1\"),\n").arg(emoticons));
0095         }
0096     }
0097 
0098     return result;
0099 }
0100 
0101 QStringList ValidEmoticonGui::load()
0102 {
0103     TextEmoticonsCore::UnicodeEmoticonParser unicodeParser;
0104     QFile file(QStringLiteral(":/emoji.json"));
0105     if (!file.open(QFile::ReadOnly)) {
0106         qWarning() << "Impossible to open file: " << file.errorString();
0107         return {};
0108     }
0109     const QJsonDocument doc = QJsonDocument::fromJson(file.readAll());
0110 
0111     QStringList lst;
0112     const QJsonObject obj = doc.object();
0113     const QList<TextEmoticonsCore::UnicodeEmoticon> unicodeEmojiList = unicodeParser.parse(obj);
0114     for (const TextEmoticonsCore::UnicodeEmoticon &emoticon : unicodeEmojiList) {
0115         const auto identifier = emoticon.identifier();
0116         auto item = new UnicodeEmoticonListWidgetItem(identifier, mListWidget);
0117         item->setInfo(emoticon);
0118         lst << identifier;
0119     }
0120     return lst;
0121 }
0122 
0123 UnicodeEmoticonListWidgetItem::UnicodeEmoticonListWidgetItem(const QString &str, QListWidget *parent)
0124     : QListWidgetItem(str, parent)
0125 {
0126 }
0127 
0128 TextEmoticonsCore::UnicodeEmoticon UnicodeEmoticonListWidgetItem::info() const
0129 {
0130     return mInfo;
0131 }
0132 
0133 void UnicodeEmoticonListWidgetItem::setInfo(const TextEmoticonsCore::UnicodeEmoticon &info)
0134 {
0135     mInfo = info;
0136 }
0137 
0138 int main(int argc, char *argv[])
0139 {
0140     QApplication app(argc, argv);
0141     QStandardPaths::setTestModeEnabled(true);
0142 
0143     ValidEmoticonGui w;
0144     w.show();
0145     return app.exec();
0146 }
0147 
0148 #include "moc_validemoticongui.cpp"