File indexing completed on 2024-05-19 05:04:33
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"