QString AdiumThemeView::replaceMessageKeywords(QString &htmlTemplate, const AdiumThemeMessageInfo& info) { //message QString message = info.message(); htmlTemplate.replace(QLatin1String("%message%"), message); //service htmlTemplate.replace(QLatin1String("%service%"), info.service()); //time htmlTemplate.replace(QLatin1String("%time%"), KGlobal::locale()->formatLocaleTime(info.time().time())); //shortTime htmlTemplate.replace(QLatin1String("%shortTime%"), KGlobal::locale()->formatLocaleTime(info.time().time(), KLocale::TimeWithoutSeconds | KLocale::TimeWithoutAmPm)); //time{X} QRegExp timeRegExp(QLatin1String("%time\\{([^}]*)\\}%")); int pos = 0; while ((pos = timeRegExp.indexIn(htmlTemplate , pos)) != -1) { QString timeKeyword = formatTime(timeRegExp.cap(1), info.time()); htmlTemplate.replace(pos , timeRegExp.cap(0).length() , timeKeyword); } htmlTemplate.replace(QLatin1String("%messageClasses%"), info.messageClasses()); return htmlTemplate; }
// Some parts of the code below are borrowed from Kopete project (http://kopete.kde.org/) QString AdiumChatStyleEngine::replaceKeywords(Chat *chat, QString &styleHref, QString &style) { if (!chat) return QString(""); QString result = style; QString name; //TODO: get Chat name (contacts' nicks?) if (chat) { // Replace %chatName% //TODO. Find way to dynamic update this tag (add id ?) int uinsSize = chat->contacts().count(); int i = 0; foreach (const Contact &contact, chat->contacts()) { name.append(contact.display()); if (++i < uinsSize) name.append(", "); } } result.replace(QString("%chatName%"), name); // Replace %sourceName% result.replace(QString("%sourceName%"), chat->account()->name()); // Replace %destinationName% result.replace(QString("%destinationName%"), name); // For %timeOpened%, display the date and time. TODO: get real time result.replace(QString("%timeOpened%"), printDateTime(QDateTime::currentDateTime())); //TODO 0.6.6: get real time!!! QRegExp timeRegExp("%timeOpened\\{([^}]*)\\}%"); int pos=0; while ((pos=timeRegExp.indexIn(result, pos)) != -1) result.replace(pos, timeRegExp.cap(0).length(), timeFormatter->convertTimeDate(timeRegExp.cap(1), QDateTime::currentDateTime())); QString photoIncoming; QString photoOutgoing; if (chat->contacts().count() > 1) photoIncoming = QString("file://") + styleHref + QString("Incoming/buddy_icon.png"); else { ContactAccountData *cad = (*chat->contacts().begin()).accountData(chat->account()); if (cad && !cad->avatar().pixmap().isNull()) photoIncoming = QString("file://") + cad->avatar().filePath(); else photoIncoming = QString("file://") + styleHref + QString("Incoming/buddy_icon.png"); } photoOutgoing = QString("file://") + styleHref + QString("Outgoing/buddy_icon.png"); result.replace(QString("%incomingIconPath%"), photoIncoming); result.replace(QString("%outgoingIconPath%"), photoOutgoing); return result; }
QString AdiumThemeView::replaceHeaderKeywords(QString htmlTemplate, const AdiumThemeHeaderInfo & info) { htmlTemplate.replace(QLatin1String("%chatName%"), info.chatName()); htmlTemplate.replace(QLatin1String("%topic%"), info.chatName()); htmlTemplate.replace(QLatin1String("%sourceName%"), info.sourceName()); htmlTemplate.replace(QLatin1String("%destinationName%"), info.destinationName()); htmlTemplate.replace(QLatin1String("%destinationDisplayName%"), info.destinationDisplayName()); htmlTemplate.replace(QLatin1String("%incomingIconPath%"), (!info.incomingIconPath().isEmpty() ? info.incomingIconPath().toString() : m_defaultAvatar)); htmlTemplate.replace(QLatin1String("%outgoingIconPath%"), (!info.outgoingIconPath().isEmpty() ? info.incomingIconPath().toString() : m_defaultAvatar)); htmlTemplate.replace(QLatin1String("%timeOpened%"), KGlobal::locale()->formatTime(info.timeOpened().time())); htmlTemplate.replace(QLatin1String("%dateOpened%"), KGlobal::locale()->formatDate(info.timeOpened().date(), KLocale::LongDate)); //FIXME time fields - remember to do both, steal the complicated one from Kopete code. // Look for %timeOpened{X}% QRegExp timeRegExp(QLatin1String("%timeOpened\\{([^}]*)\\}%")); int pos = 0; while ((pos = timeRegExp.indexIn(htmlTemplate , pos)) != -1) { QString timeKeyword = formatTime(timeRegExp.cap(1), info.timeOpened()); htmlTemplate.replace(pos , timeRegExp.cap(0).length() , timeKeyword); } htmlTemplate.replace(QLatin1String("%serviceIconImg%"), QString::fromLatin1("<img src=\"%1\" class=\"serviceIcon\" />").arg(info.serviceIconImg())); return htmlTemplate; }
QString AdiumChatStyleEngine::replaceKeywords(Chat *chat, QString &styleHref, QString &source, MessageRenderInfo *message) { if (!chat) return QString(""); QString result = source; QString nick, contactId, service, protocolIcon, nickLink; Message msg = message->message(); // Replace sender (contact nick) result.replace(QString("%sender%"), msg.sender().display()); // Replace %screenName% (contact ID) result.replace(QString("%senderScreenName%"), msg.sender().id(chat->account())); // Replace service name (protocol name) result.replace(QString("%service%"), chat->account()->protocol()->protocolFactory()->displayName()); // Replace protocolIcon (sender statusIcon). TODO: result.replace(QString("%senderStatusIcon%"), chat->account()->protocol()->protocolFactory()->iconName()); // Replace time QDateTime time = msg.sendDate().isNull() ? msg.receiveDate(): msg.sendDate(); result.replace(QString("%time%"), printDateTime(time)); // Look for %time{X}% QRegExp timeRegExp("%time\\{([^}]*)\\}%"); int pos = 0; while ((pos = timeRegExp.indexIn(result , pos)) != -1) result.replace(pos, timeRegExp.cap(0).length(), timeFormatter->convertTimeDate(timeRegExp.cap(1), time)); // Look for %textbackgroundcolor{X}% // TODO: highlight background color: use the X value. QRegExp textBackgroundRegExp("%textbackgroundcolor\\{([^}]*)\\}%"); int textPos = 0; while ((textPos=textBackgroundRegExp.indexIn(result, textPos)) != -1) result.replace(textPos, textBackgroundRegExp.cap(0).length(), "inherit"); // Replace userIconPath QString photoPath; if (msg.type() == Message::TypeReceived) { result.replace(QString("%messageClasses%"), "message incoming"); ContactAccountData *cad = msg.sender().accountData(chat->account()); if (cad && !cad->avatar().pixmap().isNull()) photoPath = QString("file://") + cad->avatar().filePath(); else photoPath = QString("file://") + styleHref + QString("Incoming/buddy_icon.png"); } else { result.replace(QString("%messageClasses%"), "message outgoing"); photoPath = QString("file://") + styleHref + QString("Outgoing/buddy_icon.png"); } result.replace(QString("%userIconPath%"), photoPath); //Message direction ("rtl"(Right-To-Left) or "ltr"(Left-to-right)) result.replace(QString("%messageDirection%"), "ltr"); // Replace contact's color const QString colorName = message->nickColor(); QString lightColorName; QRegExp senderColorRegExp("%senderColor(?:\\{([^}]*)\\})?%"); textPos = 0; while((textPos = senderColorRegExp.indexIn(result, textPos)) != -1) { int light = 100; bool doLight = false; if(senderColorRegExp.numCaptures()>=1) light = senderColorRegExp.cap(1).toUInt(&doLight); if (doLight && lightColorName.isNull()) lightColorName = QColor(colorName).light(light).name(); result.replace(textPos ,senderColorRegExp.cap(0).length(), doLight ? lightColorName : colorName); } // Replace message TODO: do sth with formatMessage QString messageText = QString("<span>") + formatMessage(message->htmlMessageContent(), message->backgroundColor()) + QString("</span>"); result.replace(QString("%message%"), messageText); return result; }