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