1 /*
2  * %kadu copyright begin%
3  * Copyright 2012, 2013 Bartosz Brachaczek (b.brachaczek@gmail.com)
4  * Copyright 2011, 2012, 2013, 2014, 2015 Rafał Przemysław Malinowski (rafal.przemyslaw.malinowski@gmail.com)
5  * %kadu copyright end%
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License as
9  * published by the Free Software Foundation; either version 2 of
10  * the License, or (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program. If not, see <http://www.gnu.org/licenses/>.
19  */
20 
21 #include "message-render-info.h"
22 
23 #include "core/core.h"
24 #include "gui/configuration/chat-configuration-holder.h"
25 #include "message/message-html-renderer-service.h"
26 #include "misc/date-time.h"
27 #include "parser/parser.h"
28 
getMessage(MessageHtmlRendererService * messageHtmlRendererService,const ParserData * const object)29 static QString getMessage(MessageHtmlRendererService *messageHtmlRendererService, const ParserData * const object)
30 {
31 	const MessageRenderInfo * const messageRenderInfo = dynamic_cast<const MessageRenderInfo * const>(object);
32 	if (messageRenderInfo)
33 		return messageHtmlRendererService->renderMessage(messageRenderInfo->message());
34 	else
35 		return QString();
36 }
37 
getMessageId(const ParserData * const object)38 static QString getMessageId(const ParserData * const object)
39 {
40 	const MessageRenderInfo * const messageRenderInfo = dynamic_cast<const MessageRenderInfo * const>(object);
41 	if (messageRenderInfo)
42 		return messageRenderInfo->message().id();
43 	return QString();
44 }
45 
getMessageStatus(const ParserData * const object)46 static QString getMessageStatus(const ParserData * const object)
47 {
48 	const MessageRenderInfo * const messageRenderInfo = dynamic_cast<const MessageRenderInfo * const>(object);
49 	if (messageRenderInfo)
50 		return QString::number(messageRenderInfo->message().status());
51 	return QString();
52 }
53 
getBackgroundColor(const ParserData * const object)54 static QString getBackgroundColor(const ParserData * const object)
55 {
56 	const MessageRenderInfo * const messageRenderInfo = dynamic_cast<const MessageRenderInfo * const>(object);
57 	if (messageRenderInfo)
58 		return messageRenderInfo->backgroundColor();
59 	else
60 		return QString();
61 }
62 
getFontColor(const ParserData * const object)63 static QString getFontColor(const ParserData * const object)
64 {
65 	const MessageRenderInfo * const messageRenderInfo = dynamic_cast<const MessageRenderInfo * const>(object);
66 	if (messageRenderInfo)
67 		return messageRenderInfo->fontColor();
68 	else
69 		return QString();
70 }
71 
getNickColor(const ParserData * const object)72 static QString getNickColor(const ParserData * const object)
73 {
74 	const MessageRenderInfo * const messageRenderInfo = dynamic_cast<const MessageRenderInfo * const>(object);
75 	if (messageRenderInfo)
76 		return messageRenderInfo->nickColor();
77 	else
78 		return QString();
79 }
80 
getSentDate(bool niceDateFormat,const ParserData * const object)81 static QString getSentDate(bool niceDateFormat, const ParserData * const object)
82 {
83 	const MessageRenderInfo * const messageRenderInfo = dynamic_cast<const MessageRenderInfo * const>(object);
84 	if (messageRenderInfo && messageRenderInfo->showServerTime())
85 		return printDateTime(niceDateFormat, messageRenderInfo->message().sendDate());
86 	else
87 		return QString();
88 }
89 
getReceivedDate(bool niceDateFormat,const ParserData * const object)90 static QString getReceivedDate(bool niceDateFormat, const ParserData * const object)
91 {
92 	const MessageRenderInfo * const messageRenderInfo = dynamic_cast<const MessageRenderInfo * const>(object);
93 	if (messageRenderInfo)
94 		return printDateTime(niceDateFormat, messageRenderInfo->message().receiveDate());
95 	else
96 		return QString();
97 }
98 
getSeparator(const ParserData * const object)99 static QString getSeparator(const ParserData * const object)
100 {
101 	const MessageRenderInfo * const messageRenderInfo = dynamic_cast<const MessageRenderInfo * const>(object);
102 	if (!messageRenderInfo)
103 		return QString();
104 
105 	int separatorSize = messageRenderInfo->separatorSize();
106 	if (separatorSize)
107 		return "<div style=\"margin: 0; margin-top:" + QString::number(separatorSize) + "px\"></div>";
108 	else
109 		return QString();
110 }
111 
registerParserTags(Parser * parser,ChatConfigurationHolder * chatConfigurationHolder,MessageHtmlRendererService * messageHtmlRendererService)112 void MessageRenderInfo::registerParserTags(Parser *parser, ChatConfigurationHolder *chatConfigurationHolder, MessageHtmlRendererService *messageHtmlRendererService)
113 {
114 	parser->registerObjectTag("message", [messageHtmlRendererService](const ParserData * const object){ return getMessage(messageHtmlRendererService, object); });
115 	parser->registerObjectTag("messageId", getMessageId);
116 	parser->registerObjectTag("messageStatus", getMessageStatus);
117 	parser->registerObjectTag("backgroundColor", getBackgroundColor);
118 	parser->registerObjectTag("fontColor", getFontColor);
119 	parser->registerObjectTag("nickColor", getNickColor);
120 	parser->registerObjectTag("sentDate", [chatConfigurationHolder](const ParserData * const object){ return getSentDate(chatConfigurationHolder->niceDateFormat(), object); } );
121 	parser->registerObjectTag("receivedDate", [chatConfigurationHolder](const ParserData * const object){ return getReceivedDate(chatConfigurationHolder->niceDateFormat(), object); });
122 	parser->registerObjectTag("separator", getSeparator);
123 }
124 
unregisterParserTags(Parser * parser)125 void MessageRenderInfo::unregisterParserTags(Parser *parser)
126 {
127 	parser->unregisterObjectTag("message");
128 	parser->unregisterObjectTag("messageId");
129 	parser->unregisterObjectTag("messageStatus");
130 	parser->unregisterObjectTag("backgroundColor");
131 	parser->unregisterObjectTag("fontColor");
132 	parser->unregisterObjectTag("nickColor");
133 	parser->unregisterObjectTag("sentDate");
134 	parser->unregisterObjectTag("receivedDate");
135 	parser->unregisterObjectTag("separator");
136 }
137 
MessageRenderInfo(Message message,QString backgroundColor,QString fontColor,QString nickColor,bool includeHeader,int separatorSize,bool showServerTime)138 MessageRenderInfo::MessageRenderInfo(Message message, QString backgroundColor, QString fontColor, QString nickColor,
139 			bool includeHeader, int separatorSize, bool showServerTime) :
140 		m_message{std::move(message)}, m_backgroundColor{std::move(backgroundColor)}, m_fontColor{std::move(fontColor)}, m_nickColor{std::move(nickColor)},
141 		m_includeHeader(includeHeader), m_separatorSize{separatorSize}, m_showServerTime{showServerTime}
142 {
143 }
144 
~MessageRenderInfo()145 MessageRenderInfo::~MessageRenderInfo()
146 {
147 }
148 
message() const149 Message MessageRenderInfo::message() const
150 {
151 	return m_message;
152 }
153 
backgroundColor() const154 QString MessageRenderInfo::backgroundColor() const
155 {
156 	return m_backgroundColor;
157 }
158 
fontColor() const159 QString MessageRenderInfo::fontColor() const
160 {
161 	return m_fontColor;
162 }
163 
nickColor() const164 QString MessageRenderInfo::nickColor() const
165 {
166 	return m_nickColor;
167 }
168 
includeHeader() const169 bool MessageRenderInfo::includeHeader() const
170 {
171 	return m_includeHeader;
172 }
173 
separatorSize() const174 int MessageRenderInfo::separatorSize() const
175 {
176 	return m_separatorSize;
177 }
178 
showServerTime() const179 bool MessageRenderInfo::showServerTime() const
180 {
181 	return m_showServerTime;
182 }
183