diff options
Diffstat (limited to 'indra')
| -rw-r--r-- | indra/llui/llurlaction.cpp | 10 | ||||
| -rw-r--r-- | indra/llui/llurlaction.h | 2 | ||||
| -rw-r--r-- | indra/llui/llurlentry.cpp | 2 | ||||
| -rw-r--r-- | indra/llui/llurlentry.h | 2 | ||||
| -rw-r--r-- | indra/newview/lllogchat.cpp | 33 | 
5 files changed, 46 insertions, 3 deletions
| diff --git a/indra/llui/llurlaction.cpp b/indra/llui/llurlaction.cpp index b6b450c2a1..d017f536f0 100644 --- a/indra/llui/llurlaction.cpp +++ b/indra/llui/llurlaction.cpp @@ -142,6 +142,16 @@ void LLUrlAction::copyLabelToClipboard(std::string url)      }  } +std::string LLUrlAction::getURLLabel(std::string url) +{ +    LLUrlMatch match; +    if (LLUrlRegistry::instance().findUrl(url, match)) +    { +       return match.getLabel(); +    } +    return ""; +} +  void LLUrlAction::showProfile(std::string url)  {      // Get id from 'secondlife:///app/{cmd}/{id}/{action}' diff --git a/indra/llui/llurlaction.h b/indra/llui/llurlaction.h index ac9741a7ad..6fb14f26b4 100644 --- a/indra/llui/llurlaction.h +++ b/indra/llui/llurlaction.h @@ -72,6 +72,8 @@ public:      /// copy a Url to the clipboard      static void copyURLToClipboard(std::string url); +    static std::string getURLLabel(std::string url); +      /// if the Url specifies an SL command in the form like 'app/{cmd}/{id}/*', show its profile      static void showProfile(std::string url);      static std::string getUserID(std::string url); diff --git a/indra/llui/llurlentry.cpp b/indra/llui/llurlentry.cpp index bcd13b7f0b..ce6595965a 100644 --- a/indra/llui/llurlentry.cpp +++ b/indra/llui/llurlentry.cpp @@ -42,8 +42,6 @@  #include "message.h"  #include "llexperiencecache.h" -#define APP_HEADER_REGEX "((x-grid-location-info://[-\\w\\.]+/app)|(secondlife:///app))" -  // Utility functions  std::string localize_slapp_label(const std::string& url, const std::string& full_name); diff --git a/indra/llui/llurlentry.h b/indra/llui/llurlentry.h index 6e7d2fc80f..36128b0391 100644 --- a/indra/llui/llurlentry.h +++ b/indra/llui/llurlentry.h @@ -42,6 +42,8 @@  class LLAvatarName; +#define APP_HEADER_REGEX "((x-grid-location-info://[-\\w\\.]+/app)|(secondlife:///app))" +  typedef boost::signals2::signal<void (const std::string& url,                                        const std::string& label,                                        const std::string& icon)> LLUrlLabelSignal; diff --git a/indra/newview/lllogchat.cpp b/indra/newview/lllogchat.cpp index fbf4a7d1dd..76d3c8cea2 100644 --- a/indra/newview/lllogchat.cpp +++ b/indra/newview/lllogchat.cpp @@ -32,6 +32,8 @@  #include "lllogchat.h"  #include "llregex.h"  #include "lltrans.h" +#include "llurlaction.h" +#include "llurlentry.h"  #include "llviewercontrol.h"  #include "lldiriterator.h" @@ -358,13 +360,29 @@ void LLLogChat::saveHistory(const std::string& filename,          return;      } +    std::string altered_line = line; + +    // avoid costly regex calls +    if (line.find("/mention") != std::string::npos) +    { +        static const boost::regex mention_regex(APP_HEADER_REGEX "/agent/[\\da-f-]+/mention", boost::regex::perl | boost::regex::icase); + +        // replace mention URL with [@username](URL) +        altered_line = boost::regex_replace(line, mention_regex, [](const boost::smatch& match) -> std::string +        { +            std::string url = match[0].str(); +            std::string username = LLUrlAction::getURLLabel(url); +            return "[" + username + "](" + url + ")"; +        }); +    } +      LLSD item;      if (gSavedPerAccountSettings.getBOOL("LogTimestamp"))           item["time"] = LLLogChat::timestamp2LogString(0, gSavedPerAccountSettings.getBOOL("LogTimestampDate"));      item["from_id"] = from_id; -    item["message"] = line; +    item["message"] = altered_line;      //adding "Second Life:" for all system messages to make chat log history parsing more reliable      if (from.empty() && from_id.isNull()) @@ -470,6 +488,19 @@ void LLLogChat::loadChatHistory(const std::string& file_name, std::list<LLSD>& m          std::string line(remove_utf8_bom(buffer)); + +        // fast heuristic test for a mention URL in a string +        // this is used to avoid costly regex calls +        if (line.find("/mention)") != std::string::npos) +        { +            // restore original mention URL from [@username](URL) format +            static const boost::regex altered_mention_regex("\\[@([^\\]]+)\\]\\((" APP_HEADER_REGEX "/agent/[\\da-f-]+/mention)\\)", +                                                            boost::regex::perl | boost::regex::icase); + +            // $2 captures the URL part +            line = boost::regex_replace(line, altered_mention_regex, "$2"); +        } +          //updated 1.23 plain text log format requires a space added before subsequent lines in a multilined message          if (' ' == line[0])          { | 
