void LLUrlAction::copyLabelToClipboard(std::string url) { LLUrlMatch match; if (LLUrlRegistry::instance().findUrl(url, match)) { LLView::getWindow()->copyTextToClipboard(utf8str_to_wstring(match.getLabel())); } }
bool LLUrlRegistry::isUrl(const LLWString &text) { LLUrlMatch match; if (findUrl(text, match)) { return (match.getStart() == 0 && match.getEnd() >= text.size()-1); } return false; }
void object::test<2>() { // // test the getStart() method // LLUrlMatch match; ensure_equals("getStart() == 0", match.getStart(), 0); match.setValues(10, 20, "", "", "", "", LLUIColor(), "", "", false); ensure_equals("getStart() == 10", match.getStart(), 10); }
bool GrowlManager::onLLNotification(const LLSD& notice) { if (notice["sigtype"].asString() != "add") { return false; } LLNotificationPtr notification = LLNotifications::instance().find(notice["id"].asUUID()); std::string name = notification->getName(); LLSD substitutions = notification->getSubstitutions(); if (gGrowlManager->mNotifications.find(name) != gGrowlManager->mNotifications.end()) { GrowlNotification* growl_notification = &gGrowlManager->mNotifications[name]; std::string body = ""; std::string title = ""; if (growl_notification->useDefaultTextForTitle) { title = notification->getMessage(); } else if (!growl_notification->growlTitle.empty()) { title = growl_notification->growlTitle; LLStringUtil::format(title, substitutions); } if (growl_notification->useDefaultTextForBody) { body = notification->getMessage(); } else if (!growl_notification->growlBody.empty()) { body = growl_notification->growlBody; LLStringUtil::format(body, substitutions); } //TM:FS no need to log whats sent to growl //LL_INFOS("GrowlLLNotification") << "Notice: " << title << ": " << body << LL_ENDL; if (name == "ObjectGiveItem" || name == "OwnObjectGiveItem" || name == "ObjectGiveItemUnknownUser" || name == "UserGiveItem" || name == "SystemMessageTip") { LLUrlMatch urlMatch; LLWString newLine = utf8str_to_wstring(body); LLWString workLine = utf8str_to_wstring(body); while (LLUrlRegistry::instance().findUrl(workLine, urlMatch) && !urlMatch.getUrl().empty()) { LLWStringUtil::replaceString(newLine, utf8str_to_wstring(urlMatch.getUrl()), utf8str_to_wstring(urlMatch.getLabel())); // Remove the URL from the work line so we don't end in a loop in case of regular URLs! // findUrl will always return the very first URL in a string workLine = workLine.erase(0, urlMatch.getEnd() + 1); } body = wstring_to_utf8str(newLine); } gGrowlManager->notify(title, body, growl_notification->growlName); } return false; }
void object::test<2>() { // // test the getStart() method // LLUrlMatch match; ensure_equals("getStart() == 0", match.getStart(), 0); match.setValues(10, 20, "", "", "", "", "", LLStyle::Params(), "", "", LLUUID::null); ensure_equals("getStart() == 10", match.getStart(), 10); }
void LLUrlAction::showLocationOnMap(std::string url) { LLUrlMatch match; if (LLUrlRegistry::instance().findUrl(url, match)) { if (! match.getLocation().empty()) { executeSLURL("secondlife:///app/worldmap/" + match.getLocation()); } } }
void object::test<3>() { // // test the getEnd() method // LLUrlMatch match; ensure_equals("getEnd() == 0", match.getEnd(), 0); match.setValues(10, 20, "", "", "", "", LLUIColor(), "", "", false,LLUUID::null); ensure_equals("getEnd() == 20", match.getEnd(), 20); }
void LLUrlAction::teleportToLocation(std::string url) { LLUrlMatch match; if (LLUrlRegistry::instance().findUrl(url, match)) { if (! match.getLocation().empty()) { executeSLURL("secondlife:///app/teleport/" + match.getLocation()); } } }
void object::test<1>() { // // test the empty() method // LLUrlMatch match; ensure("empty()", match.empty()); match.setValues(0, 1, "http://secondlife.com", "Second Life", "", "", LLUIColor(), "", "", false,LLUUID::null); ensure("! empty()", ! match.empty()); }
bool LLUrlEntrySLLabel::underlineOnHoverOnly(const std::string &string) const { std::string url = getUrl(string); LLUrlMatch match; if (LLUrlRegistry::instance().findUrl(url, match)) { return match.underlineOnHoverOnly(); } // unrecognized URL? should not happen return LLUrlEntryBase::underlineOnHoverOnly(string); }
std::string LLUrlEntrySLLabel::getTooltip(const std::string &string) const { // return a tooltip corresponding to the URL type instead of the generic one (EXT-4574) std::string url = getUrl(string); LLUrlMatch match; if (LLUrlRegistry::instance().findUrl(url, match)) { return match.getTooltip(); } // unrecognized URL? should not happen return LLUrlEntryBase::getTooltip(string); }
bool LLUrlRegistry::findUrl(const std::string &text, LLUrlMatch &match, const LLUrlLabelCallback &cb) { // avoid costly regexes if there is clearly no URL in the text if (! (stringHasUrl(text) || stringHasJira(text))) { return false; } // find the first matching regex from all url entries in the registry U32 match_start = 0, match_end = 0; LLUrlEntryBase *match_entry = NULL; std::vector<LLUrlEntryBase *>::iterator it; for (it = mUrlEntry.begin(); it != mUrlEntry.end(); ++it) { LLUrlEntryBase *url_entry = *it; U32 start = 0, end = 0; if (matchRegex(text.c_str(), url_entry->getPattern(), start, end)) { // does this match occur in the string before any other match if (start < match_start || match_entry == NULL) { match_start = start; match_end = end; match_entry = url_entry; } } } // did we find a match? if so, return its details in the match object if (match_entry) { // fill in the LLUrlMatch object and return it std::string url = text.substr(match_start, match_end - match_start + 1); match.setValues(match_start, match_end, match_entry->getUrl(url), match_entry->getLabel(url, cb), match_entry->getTooltip(url), match_entry->getIcon(url), match_entry->getStyle(), match_entry->getMenuName(), match_entry->getLocation(url), match_entry->getID(url), match_entry->underlineOnHoverOnly(url)); return true; } return false; }
void object::test<5>() { // // test the getLabel() method // LLUrlMatch match; ensure_equals("getLabel() == ''", match.getLabel(), ""); match.setValues(10, 20, "", "Label", "", "", LLUIColor(), "", "", false,LLUUID::null); ensure_equals("getLabel() == 'Label'", match.getLabel(), "Label"); match.setValues(10, 20, "", "", "", "", LLUIColor(), "", "", false,LLUUID::null); ensure_equals("getLabel() == '' (2)", match.getLabel(), ""); }
void object::test<6>() { // // test the getTooltip() method // LLUrlMatch match; ensure_equals("getTooltip() == ''", match.getTooltip(), ""); match.setValues(10, 20, "", "", "Info", "", LLUIColor(), "", "", false,LLUUID::null); ensure_equals("getTooltip() == 'Info'", match.getTooltip(), "Info"); match.setValues(10, 20, "", "", "", "", LLUIColor(), "", "", false,LLUUID::null); ensure_equals("getTooltip() == '' (2)", match.getTooltip(), ""); }
void object::test<8>() { // // test the getMenuName() method // LLUrlMatch match; ensure("getMenuName() empty", match.getMenuName().empty()); match.setValues(10, 20, "", "", "", "Icon", LLUIColor(), "xui_file.xml", "", false); ensure_equals("getMenuName() == \"xui_file.xml\"", match.getMenuName(), "xui_file.xml"); match.setValues(10, 20, "", "", "", "", LLUIColor(), "", "", false); ensure("getMenuName() empty (2)", match.getMenuName().empty()); }
void object::test<4>() { // // test the getUrl() method // LLUrlMatch match; ensure_equals("getUrl() == ''", match.getUrl(), ""); match.setValues(10, 20, "http://slurl.com/", "", "", "", LLUIColor(), "", "", false,LLUUID::null); ensure_equals("getUrl() == 'http://slurl.com/'", match.getUrl(), "http://slurl.com/"); match.setValues(10, 20, "", "", "", "", LLUIColor(), "", "", false,LLUUID::null); ensure_equals("getUrl() == '' (2)", match.getUrl(), ""); }
void object::test<9>() { // // test the getLocation() method // LLUrlMatch match; ensure("getLocation() empty", match.getLocation().empty()); match.setValues(10, 20, "", "", "", "Icon", LLUIColor(), "xui_file.xml", "Paris", false,LLUUID::null); ensure_equals("getLocation() == \"Paris\"", match.getLocation(), "Paris"); match.setValues(10, 20, "", "", "", "", LLUIColor(), "", "", false,LLUUID::null); ensure("getLocation() empty (2)", match.getLocation().empty()); }
void object::test<7>() { // // test the getIcon() method // LLUrlMatch match; ensure_equals("getIcon() == ''", match.getIcon(), ""); match.setValues(10, 20, "", "", "", "Icon", LLUIColor(), "", "", false,LLUUID::null); ensure_equals("getIcon() == 'Icon'", match.getIcon(), "Icon"); match.setValues(10, 20, "", "", "", "", LLUIColor(), "", "", false,LLUUID::null); ensure_equals("getIcon() == '' (2)", match.getIcon(), ""); }
// Put a line of chat in all the right places void LLFloaterChat::addChat(const LLChat& chat, BOOL from_instant_message, BOOL local_agent) { LLColor4 text_color = get_text_color(chat, from_instant_message); BOOL invisible_script_debug_chat = chat.mChatType == CHAT_TYPE_DEBUG_MSG && !gSavedSettings.getBOOL("ScriptErrorsAsChat"); // [RLVa:KB] - Checked: 2009-07-08 (RLVa-1.0.0e) if (rlv_handler_t::isEnabled()) { // TODO-RLVa: we might cast too broad a net by filtering here, needs testing if ( (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC)) && (!chat.mRlvLocFiltered) && (CHAT_SOURCE_AGENT != chat.mSourceType) ) { LLChat& rlvChat = const_cast<LLChat&>(chat); if (!from_instant_message) RlvUtil::filterLocation(rlvChat.mText); rlvChat.mRlvLocFiltered = TRUE; } if ( (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) && (!chat.mRlvNamesFiltered) ) { LLChat& rlvChat = const_cast<LLChat&>(chat); if ( (!from_instant_message) && (CHAT_SOURCE_AGENT != chat.mSourceType) ) { // Filter object and system chat (names are filtered elsewhere to save ourselves an gObjectList lookup) RlvUtil::filterNames(rlvChat.mText); } rlvChat.mRlvNamesFiltered = TRUE; } } // [/RLVa:KB] if (!invisible_script_debug_chat && !chat.mMuted && gConsole && !local_agent) { // We display anything if it's not an IM. If it's an IM, check pref... if ( !from_instant_message || gSavedSettings.getBOOL("IMInChatConsole") ) { // Replace registered urls in the console so it looks right. std::string chit(chat.mText), // Read through this chat; // Add parts to this LLUrlMatch match; while (!chit.empty() && LLUrlRegistry::instance().findUrl(chit, match)) { const auto start(match.getStart()), length(match.getEnd()+1-start); if (start > 0) chat += chit.substr(0, start); // Add up to the start of the match chat += match.getLabel() + match.getQuery(); // Add the label and the query chit.erase(0, start+length); // remove the url match and all before it } if (!chit.empty()) chat += chit; // Add any leftovers gConsole->addConsoleLine(chat, text_color); } } if(from_instant_message && gSavedPerAccountSettings.getBOOL("LogChatIM")) log_chat_text(chat); if(from_instant_message && gSavedSettings.getBOOL("IMInChatHistory")) addChatHistory(chat,false); triggerAlerts(chat.mText); if(!from_instant_message) addChatHistory(chat); }
bool LLUrlRegistry::findUrl(const LLWString &text, LLUrlMatch &match, const LLUrlLabelCallback &cb) { // boost::regex_search() only works on char or wchar_t // types, but wchar_t is only 2-bytes on Win32 (not 4). // So we use UTF-8 to make this work the same everywhere. std::string utf8_text = wstring_to_utf8str(text); if (findUrl(utf8_text, match, cb)) { // we cannot blindly return the start/end offsets from // the UTF-8 string because it is a variable-length // character encoding, so we need to update the start // and end values to be correct for the wide string. LLWString wurl = utf8str_to_wstring(match.getUrl()); S32 start = text.find(wurl); if (start == std::string::npos) { return false; } S32 end = start + wurl.size() - 1; match.setValues(start, end, match.getUrl(), match.getLabel(), match.getTooltip(), match.getIcon(), match.getStyle(), match.getMenuName(), match.getLocation(), match.getID(), match.underlineOnHoverOnly()); return true; } return false; }