linuxdcpp-team team mailing list archive
-
linuxdcpp-team team
-
Mailing list archive
-
Message #06256
[Branch ~dcplusplus-team/dcplusplus/trunk] Rev 3120: Apply link formatting to status messages
------------------------------------------------------------
revno: 3120
committer: poy <poy@xxxxxxxxxx>
branch nick: trunk
timestamp: Thu 2012-11-08 20:11:36 +0100
message:
Apply link formatting to status messages
modified:
changelog.txt
dcpp/ChatMessage.cpp
dcpp/ChatMessage.h
win32/AspectChat.h
--
lp:dcplusplus
https://code.launchpad.net/~dcplusplus-team/dcplusplus/trunk
Your team Dcplusplus-team is subscribed to branch lp:dcplusplus.
To unsubscribe from this branch go to https://code.launchpad.net/~dcplusplus-team/dcplusplus/trunk/+edit-subscription
=== modified file 'changelog.txt'
--- changelog.txt 2012-11-06 18:52:30 +0000
+++ changelog.txt 2012-11-08 19:11:36 +0000
@@ -7,6 +7,8 @@
* Delete "View as text" files only when their window is closed (poy)
* Fix queue matching when files have the same TTH but a different size (thanks irainman)
* Update Boost to version 1.52
+* Restore "Requesting" messages in the transfer list
+* [L#1071363] Apply link & plugin formatting to status messages (crise, poy)
-- 0.802 2012-10-20 --
* Perf improvements using lock-free queues, requires P6 CPUs (poy)
=== modified file 'dcpp/ChatMessage.cpp'
--- dcpp/ChatMessage.cpp 2012-09-08 13:54:40 +0000
+++ dcpp/ChatMessage.cpp 2012-11-08 19:11:36 +0000
@@ -26,7 +26,6 @@
#include "PluginManager.h"
#include "SettingsManager.h"
#include "SimpleXML.h"
-#include "Tagger.h"
#include "Util.h"
namespace dcpp {
@@ -96,46 +95,53 @@
message += tmp;
/* format the message; this will involve adding custom tags. use the Tagger class to that end. */
-
Tagger tags;
-
+ format(tmp, tags, xmlTmp);
+
+ // let plugins play with the tag list
+ PluginManager::getInstance()->onChatTags(tmp, tags, from);
+
+ htmlMessage += "<span id=\"text\">" + tags.merge(tmp, xmlTmp) + "</span></span>";
+
+ // forward to plugins
+ PluginManager::getInstance()->onChatDisplay(htmlMessage, from);
+}
+
+void ChatMessage::format(string& text, Tagger& tags, string& tmp) {
/* link formatting - optimize the lookup a bit by using the fact that every link identifier
(except www ones) contains a colon. */
- /// @todo add support for spaces within links enclosed by brackets / quotes (see URI RFC)
- auto addLinkStr = [&xmlTmp, &tags](size_t begin, size_t end, const string& link) {
- tags.add(begin, end, "a", "href=\"" + SimpleXML::escape(link, xmlTmp, true) + "\"");
+ auto addLinkStr = [&tmp, &tags](size_t begin, size_t end, const string& link) {
+ tags.add(begin, end, "a", "href=\"" + SimpleXML::escape(link, tmp, true) + "\"");
};
- auto addLink = [&tmp, &addLinkStr](size_t begin, size_t end) {
- addLinkStr(begin, end, tmp.substr(begin, end - begin));
+ auto addLink = [&text, &addLinkStr](size_t begin, size_t end) {
+ addLinkStr(begin, end, text.substr(begin, end - begin));
};
static const string delimiters = " \t\r\n<>\"";
- i = 0;
- size_t begin, end;
- auto n = tmp.size();
- while((i = tmp.find(':', i)) != string::npos) {
+ size_t i = 0, begin, end, n = text.size();
+ while((i = text.find(':', i)) != string::npos) {
- if((begin = tmp.find_last_of(delimiters, i)) == string::npos) begin = 0; else ++begin;
- if((end = tmp.find_first_of(delimiters, i + 1)) == string::npos) end = n;
+ if((begin = text.find_last_of(delimiters, i)) == string::npos) begin = 0; else ++begin;
+ if((end = text.find_first_of(delimiters, i + 1)) == string::npos) end = n;
if(i > 0 && (
- (i + 4 < n && tmp[i + 1] == '/' && tmp[i + 2] == '/') || // "http://", etc
- (i == begin + 6 && i + 1 <= n && !tmp.compare(begin, 6, "mailto"))))
+ (i + 4 < n && text[i + 1] == '/' && text[i + 2] == '/') || // "http://", etc
+ (i == begin + 6 && i + 1 <= n && !text.compare(begin, 6, "mailto"))))
{
addLink(begin, end);
i = end;
- } else if(i == begin + 6 && i + 2 <= n && !tmp.compare(begin, 6, "magnet") && tmp[i + 1] == '?') {
- string link = tmp.substr(begin, end - begin), hash, name, key;
+ } else if(i == begin + 6 && i + 2 <= n && !text.compare(begin, 6, "magnet") && text[i + 1] == '?') {
+ string link = text.substr(begin, end - begin), hash, name, key;
if(Magnet::parseUri(link, hash, name, key)) {
if(!name.empty()) {
// magnet link: replace with the friendly name
name += " (magnet)";
- tmp.replace(begin, end - begin, name);
+ text.replace(begin, end - begin, name);
// the size of the string has changed; update counts.
auto delta = name.size() - link.size();
@@ -157,9 +163,9 @@
// check for www links.
i = 0;
- while((i = tmp.find("www.", i)) != string::npos) {
- if(i + 5 <= n && (i == 0 || delimiters.find(tmp[i - 1]) != string::npos)) {
- if((end = tmp.find_first_of(delimiters, i + 4)) == string::npos) end = n;
+ while((i = text.find("www.", i)) != string::npos) {
+ if(i + 5 <= n && (i == 0 || delimiters.find(text[i - 1]) != string::npos)) {
+ if((end = text.find_first_of(delimiters, i + 4)) == string::npos) end = n;
if(i + 5 <= end) {
addLink(i, end);
i = end;
@@ -168,14 +174,6 @@
}
i += 5;
}
-
- // let plugins play with the tag list
- PluginManager::getInstance()->onChatTags(tmp, tags, from);
-
- htmlMessage += "<span id=\"text\">" + tags.merge(tmp, xmlTmp) + "</span></span>";
-
- // forward to plugins
- PluginManager::getInstance()->onChatDisplay(htmlMessage, from);
}
} // namespace dcpp
=== modified file 'dcpp/ChatMessage.h'
--- dcpp/ChatMessage.h 2012-07-01 18:41:13 +0000
+++ dcpp/ChatMessage.h 2012-11-08 19:11:36 +0000
@@ -20,6 +20,7 @@
#define DCPLUSPLUS_DCPP_CHAT_MESSAGE_H
#include "forward.h"
+#include "Tagger.h"
#include <string>
@@ -58,6 +59,10 @@
bool thirdPerson;
/** [ADC only] Time when the message was initially sent. */
time_t messageTimestamp;
+
+ /** Store context-agnostic formattings that can be applied to the given message in the tagger.
+ Note that the string may be modified. */
+ static void format(string& text, Tagger& tags, string& tmp);
};
} // namespace dcpp
=== modified file 'win32/AspectChat.h'
--- win32/AspectChat.h 2012-11-08 16:20:20 +0000
+++ win32/AspectChat.h 2012-11-08 19:11:36 +0000
@@ -76,7 +76,9 @@
/// add a chat message with some formatting and call addedChat.
void addChat(const tstring& message) {
string xmlTmp, tmp = Text::fromT(message);
+
Tagger tags;
+ ChatMessage::format(tmp, tags, xmlTmp);
PluginManager::getInstance()->onChatTags(tmp, tags);