1 /*
2 * %kadu copyright begin%
3 * Copyright 2011 Piotr Galiszewski (piotr.galiszewski@kadu.im)
4 * Copyright 2012 Wojciech Treter (juzefwt@gmail.com)
5 * Copyright 2011, 2012, 2013, 2014 Bartosz Brachaczek (b.brachaczek@gmail.com)
6 * Copyright 2011, 2012, 2013, 2014 Rafał Przemysław Malinowski (rafal.przemyslaw.malinowski@gmail.com)
7 * %kadu copyright end%
8 *
9 * This program is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU General Public License as
11 * published by the Free Software Foundation; either version 2 of
12 * the License, or (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program. If not, see <http://www.gnu.org/licenses/>.
21 */
22
23 #include <QtCore/QFile>
24 #include <QtCore/QRegExp>
25 #include <QtCore/QString>
26 #include <QtCore/QTextStream>
27 #include <QtWidgets/QGridLayout>
28 #include <QtWidgets/QGroupBox>
29 #include <QtWidgets/QHBoxLayout>
30 #include <QtWidgets/QLabel>
31 #include <QtWidgets/QLineEdit>
32 #include <QtWidgets/QPushButton>
33 #include <QtWidgets/QScrollBar>
34 #include <QtWidgets/QTreeWidget>
35 #include <QtWidgets/QTreeWidgetItem>
36
37 #include "configuration/configuration.h"
38 #include "configuration/deprecated-configuration-api.h"
39 #include "configuration/gui/configuration-ui-handler-repository.h"
40 #include "formatted-string/formatted-string-factory.h"
41 #include "formatted-string/formatted-string-html-visitor.h"
42 #include "formatted-string/formatted-string.h"
43 #include "html/html-string.h"
44 #include "html/normalized-html-string.h"
45 #include "gui/widgets/chat-widget/chat-widget-repository.h"
46 #include "gui/widgets/chat-widget/chat-widget.h"
47 #include "gui/widgets/configuration/config-group-box.h"
48 #include "gui/widgets/configuration/configuration-widget.h"
49 #include "gui/widgets/custom-input.h"
50 #include "gui/windows/main-configuration-window.h"
51 #include "misc/paths-provider.h"
52 #include "debug.h"
53
54 #include "word-fix-formatted-string-visitor.h"
55
56 #include "word-fix.h"
57
58
WordFix(QObject * parent)59 WordFix::WordFix(QObject *parent) :
60 QObject{parent}
61 {
62 }
63
~WordFix()64 WordFix::~WordFix()
65 {
66 }
67
setChatWidgetRepository(ChatWidgetRepository * chatWidgetRepository)68 void WordFix::setChatWidgetRepository(ChatWidgetRepository *chatWidgetRepository)
69 {
70 m_chatWidgetRepository = chatWidgetRepository;
71 }
72
setConfiguration(Configuration * configuration)73 void WordFix::setConfiguration(Configuration *configuration)
74 {
75 m_configuration = configuration;
76 }
77
setFormattedStringFactory(FormattedStringFactory * formattedStringFactory)78 void WordFix::setFormattedStringFactory(FormattedStringFactory *formattedStringFactory)
79 {
80 m_formattedStringFactory = formattedStringFactory;
81 }
82
setPathsProvider(PathsProvider * pathsProvider)83 void WordFix::setPathsProvider(PathsProvider *pathsProvider)
84 {
85 m_pathsProvider = pathsProvider;
86 }
87
init()88 void WordFix::init()
89 {
90 ExtractBody.setPattern("<body[^>]*>.*</body>");
91
92 // Loading list
93 QString data = m_configuration->deprecatedApi()->readEntry("word_fix", "WordFix_list");
94 if (data.isEmpty())
95 {
96 QFile defList(m_pathsProvider->dataPath() + QStringLiteral("plugins/data/word_fix/wf_default_list.data"));
97 if (defList.open(QIODevice::ReadOnly))
98 {
99 QTextStream s(&defList);
100 QStringList pair;
101 while (!s.atEnd())
102 {
103 pair = s.readLine().split('|');
104 if (pair.isEmpty())
105 continue;
106
107 // TODO why we are not checking if there are actually at least 2 items?
108 m_wordsList[pair.at(0)] = pair.at(1);
109 }
110 defList.close();
111 }
112 else
113 {
114 kdebug("Can't open file: %s\n", qPrintable((defList.fileName())));
115 }
116 }
117 else
118 {
119 QStringList list = data.split("\t\t");
120 for (int i = 0; i < list.count(); i++)
121 {
122 if (!list.at(i).isEmpty())
123 {
124 QStringList sp = list.at(i).split('\t');
125 m_wordsList[sp.at(0)] = sp.at(1);
126 }
127 }
128 }
129
130 connect(m_chatWidgetRepository, SIGNAL(chatWidgetAdded(ChatWidget *)),
131 this, SLOT(chatWidgetAdded(ChatWidget *)));
132 connect(m_chatWidgetRepository, SIGNAL(chatWidgetRemoved(ChatWidget*)),
133 this, SLOT(chatWidgetRemoved(ChatWidget *)));
134
135 for (auto chatWidget : m_chatWidgetRepository)
136 chatWidgetAdded(chatWidget);
137 }
138
chatWidgetAdded(ChatWidget * chatWidget)139 void WordFix::chatWidgetAdded(ChatWidget *chatWidget)
140 {
141 connect(chatWidget, SIGNAL(messageSendRequested(ChatWidget*)), this, SLOT(sendRequest(ChatWidget*)));
142 }
143
chatWidgetRemoved(ChatWidget * chatWidget)144 void WordFix::chatWidgetRemoved(ChatWidget *chatWidget)
145 {
146 disconnect(chatWidget, 0, this, 0);
147 }
148
sendRequest(ChatWidget * chat)149 void WordFix::sendRequest(ChatWidget* chat)
150 {
151 if (!m_configuration->deprecatedApi()->readBoolEntry("PowerKadu", "enable_word_fix", false))
152 return;
153
154 auto formattedString = m_formattedStringFactory->fromHtml(chat->edit()->htmlMessage());
155 WordFixFormattedStringVisitor fixVisitor(m_wordsList);
156 formattedString->accept(&fixVisitor);
157
158 auto fixedString = fixVisitor.result();
159 FormattedStringHtmlVisitor htmlVisitor;
160 fixedString->accept(&htmlVisitor);
161
162 chat->edit()->setHtml(htmlVisitor.result().string());
163 }
164
165 #include "moc_word-fix.cpp"
166