diff options
| -rw-r--r-- | indra/llui/lltextbase.cpp | 7 | ||||
| -rw-r--r-- | indra/llui/llurlentry.cpp | 24 | ||||
| -rw-r--r-- | indra/llui/llurlentry.h | 14 | ||||
| -rw-r--r-- | indra/llui/llurlmatch.cpp | 8 | ||||
| -rw-r--r-- | indra/llui/llurlmatch.h | 6 | ||||
| -rw-r--r-- | indra/llui/llurlregistry.cpp | 14 | ||||
| -rw-r--r-- | indra/llui/tests/llurlentry_test.cpp | 8 | ||||
| -rw-r--r-- | indra/llui/tests/llurlmatch_test.cpp | 30 | 
8 files changed, 82 insertions, 29 deletions
| diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index 8abbc833e5..2ee2023875 100644 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -1606,11 +1606,10 @@ void LLTextBase::appendText(const std::string &new_text, bool prepend_newline, c  				}  			} -			// output the styled Url (unless we've been asked to suppress it) -			if (isBlackListUrl(match.getUrl())) +			// output the styled Url (unless we've been asked to suppress hyperlinking) +			if (match.isLinkDisabled())  			{ -				std::string orig_url = text.substr(start, end-start); -				appendAndHighlightText(orig_url, prepend_newline, part, style_params); +				appendAndHighlightText(match.getLabel(), prepend_newline, part, style_params);  			}  			else  			{ diff --git a/indra/llui/llurlentry.cpp b/indra/llui/llurlentry.cpp index 4927e57a52..58148ad2aa 100644 --- a/indra/llui/llurlentry.cpp +++ b/indra/llui/llurlentry.cpp @@ -39,8 +39,9 @@  #include "lltrans.h"  #include "lluicolortable.h" -LLUrlEntryBase::LLUrlEntryBase() -: mColor(LLUIColorTable::instance().getColor("HTMLLinkColor")) +LLUrlEntryBase::LLUrlEntryBase() : +	mColor(LLUIColorTable::instance().getColor("HTMLLinkColor")), +	mDisabledLink(false)  {  } @@ -204,7 +205,7 @@ LLUrlEntryHTTPNoProtocol::LLUrlEntryHTTPNoProtocol()  	mPattern = boost::regex("("  				"\\bwww\\.\\S+\\.\\S+" // i.e. www.FOO.BAR  				"|" // or -				"(?<!@)\\b[^[:space:]:@/]+\\.(?:com|net|edu|org)([/:]\\S*)?\\b" // i.e. FOO.net +				"(?<!@)\\b[^[:space:]:@/>]+\\.(?:com|net|edu|org)([/:][^[:space:]<]*)?\\b" // i.e. FOO.net  				")",  				boost::regex::perl|boost::regex::icase);  	mMenuName = "menu_url_http.xml"; @@ -641,3 +642,20 @@ std::string LLUrlEntryWorldMap::getLocation(const std::string &url) const  	// return the part of the Url after secondlife:///app/worldmap/ part  	return ::getStringAfterToken(url, "app/worldmap/");  } + +// +// LLUrlEntryNoLink lets us turn of URL detection with <nolink>...</nolink> tags +// +LLUrlEntryNoLink::LLUrlEntryNoLink() +{ +	mPattern = boost::regex("<nolink>[^[:space:]<]+</nolink>", +							boost::regex::perl|boost::regex::icase); +	mDisabledLink = true; +} + +std::string LLUrlEntryNoLink::getLabel(const std::string &url, const LLUrlLabelCallback &cb) +{ +	// return the text between the <nolink> and </nolink> tags +	return url.substr(8, url.size()-8-9); +} + diff --git a/indra/llui/llurlentry.h b/indra/llui/llurlentry.h index 4adffde99c..94455ac247 100644 --- a/indra/llui/llurlentry.h +++ b/indra/llui/llurlentry.h @@ -91,6 +91,9 @@ public:  	/// Return the name of a SL location described by this Url, if any  	virtual std::string getLocation(const std::string &url) const { return ""; } +	/// is this a match for a URL that should not be hyperlinked? +	bool isLinkDisabled() const { return mDisabledLink; } +  protected:  	std::string getIDStringFromUrl(const std::string &url) const;  	std::string escapeUrl(const std::string &url) const; @@ -111,6 +114,7 @@ protected:  	std::string                                    	mTooltip;  	LLUIColor										mColor;  	std::multimap<std::string, LLUrlEntryObserver>	mObservers; +	bool                                            mDisabledLink;  };  /// @@ -267,4 +271,14 @@ public:  	/*virtual*/ std::string getLocation(const std::string &url) const;  }; +/// +/// LLUrlEntryNoLink lets us turn of URL detection with <nolink>...</nolink> tags +/// +class LLUrlEntryNoLink : public LLUrlEntryBase +{ +public: +	LLUrlEntryNoLink(); +	/*virtual*/ std::string getLabel(const std::string &url, const LLUrlLabelCallback &cb); +}; +  #endif diff --git a/indra/llui/llurlmatch.cpp b/indra/llui/llurlmatch.cpp index 3b47145a22..72a199c220 100644 --- a/indra/llui/llurlmatch.cpp +++ b/indra/llui/llurlmatch.cpp @@ -41,14 +41,17 @@ LLUrlMatch::LLUrlMatch() :  	mLabel(""),  	mTooltip(""),  	mIcon(""), -	mMenuName("") +	mMenuName(""), +	mLocation(""), +	mDisabledLink(false)  {  }  void LLUrlMatch::setValues(U32 start, U32 end, const std::string &url,  						   const std::string &label, const std::string &tooltip,  						   const std::string &icon, const LLUIColor& color, -						   const std::string &menu, const std::string &location) +						   const std::string &menu, const std::string &location, +						   bool disabled_link)  {  	mStart = start;  	mEnd = end; @@ -59,4 +62,5 @@ void LLUrlMatch::setValues(U32 start, U32 end, const std::string &url,  	mColor = color;  	mMenuName = menu;  	mLocation = location; +	mDisabledLink = disabled_link;  } diff --git a/indra/llui/llurlmatch.h b/indra/llui/llurlmatch.h index 7f5767923a..e86762548b 100644 --- a/indra/llui/llurlmatch.h +++ b/indra/llui/llurlmatch.h @@ -83,11 +83,14 @@ public:  	/// return the SL location that this Url describes, or "" if none.  	std::string getLocation() const { return mLocation; } +	/// is this a match for a URL that should not be hyperlinked? +	bool isLinkDisabled() const { return mDisabledLink; } +  	/// Change the contents of this match object (used by LLUrlRegistry)  	void setValues(U32 start, U32 end, const std::string &url, const std::string &label,  	               const std::string &tooltip, const std::string &icon,  				   const LLUIColor& color, const std::string &menu,  -				   const std::string &location); +				   const std::string &location, bool disabled_link);  private:  	U32         mStart; @@ -99,6 +102,7 @@ private:  	std::string mMenuName;  	std::string mLocation;  	LLUIColor	mColor; +	bool        mDisabledLink;  };  #endif diff --git a/indra/llui/llurlregistry.cpp b/indra/llui/llurlregistry.cpp index ad5c0911f8..55eb8950e9 100644 --- a/indra/llui/llurlregistry.cpp +++ b/indra/llui/llurlregistry.cpp @@ -44,6 +44,7 @@ void LLUrlRegistryNullCallback(const std::string &url, const std::string &label)  LLUrlRegistry::LLUrlRegistry()  {  	// Urls are matched in the order that they were registered +	registerUrl(new LLUrlEntryNoLink());  	registerUrl(new LLUrlEntrySLURL());  	registerUrl(new LLUrlEntryHTTP());  	registerUrl(new LLUrlEntryHTTPLabel()); @@ -176,7 +177,8 @@ bool LLUrlRegistry::findUrl(const std::string &text, LLUrlMatch &match, const LL  						match_entry->getIcon(),  						match_entry->getColor(),  						match_entry->getMenuName(), -						match_entry->getLocation(url)); +						match_entry->getLocation(url), +						match_entry->isLinkDisabled());  		return true;  	} @@ -204,9 +206,13 @@ bool LLUrlRegistry::findUrl(const LLWString &text, LLUrlMatch &match, const LLUr  		S32 end = start + wurl.size() - 1;  		match.setValues(start, end, match.getUrl(),  -			match.getLabel(), match.getTooltip(), -			match.getIcon(), match.getColor(), -			match.getMenuName(), match.getLocation()); +						match.getLabel(), +						match.getTooltip(), +						match.getIcon(), +						match.getColor(), +						match.getMenuName(), +						match.getLocation(), +						match.isLinkDisabled());  		return true;  	}  	return false; diff --git a/indra/llui/tests/llurlentry_test.cpp b/indra/llui/tests/llurlentry_test.cpp index 80be8fcbf7..6fec1d3e10 100644 --- a/indra/llui/tests/llurlentry_test.cpp +++ b/indra/llui/tests/llurlentry_test.cpp @@ -610,5 +610,13 @@ namespace tut  		testRegex("invalid .net URL", r,  				  "foo.netty",  				  ""); + +		testRegex("XML tags around URL [1]", r, +				  "<foo>secondlife.com</foo>", +				  "secondlife.com"); + +		testRegex("XML tags around URL [2]", r, +				  "<foo>secondlife.com/status?bar=1</foo>", +				  "secondlife.com/status?bar=1");  	}  } diff --git a/indra/llui/tests/llurlmatch_test.cpp b/indra/llui/tests/llurlmatch_test.cpp index e8cf135346..f9dfee931b 100644 --- a/indra/llui/tests/llurlmatch_test.cpp +++ b/indra/llui/tests/llurlmatch_test.cpp @@ -53,7 +53,7 @@ namespace tut  		LLUrlMatch match;  		ensure("empty()", match.empty()); -		match.setValues(0, 1, "http://secondlife.com", "Second Life", "", "", LLUIColor(), "", ""); +		match.setValues(0, 1, "http://secondlife.com", "Second Life", "", "", LLUIColor(), "", "", false);  		ensure("! empty()", ! match.empty());  	} @@ -66,7 +66,7 @@ namespace tut  		LLUrlMatch match;  		ensure_equals("getStart() == 0", match.getStart(), 0); -		match.setValues(10, 20, "", "", "", "", LLUIColor(), "", ""); +		match.setValues(10, 20, "", "", "", "", LLUIColor(), "", "", false);  		ensure_equals("getStart() == 10", match.getStart(), 10);  	} @@ -79,7 +79,7 @@ namespace tut  		LLUrlMatch match;  		ensure_equals("getEnd() == 0", match.getEnd(), 0); -		match.setValues(10, 20, "", "", "", "", LLUIColor(), "", ""); +		match.setValues(10, 20, "", "", "", "", LLUIColor(), "", "", false);  		ensure_equals("getEnd() == 20", match.getEnd(), 20);  	} @@ -92,10 +92,10 @@ namespace tut  		LLUrlMatch match;  		ensure_equals("getUrl() == ''", match.getUrl(), ""); -		match.setValues(10, 20, "http://slurl.com/", "", "", "", LLUIColor(), "", ""); +		match.setValues(10, 20, "http://slurl.com/", "", "", "", LLUIColor(), "", "", false);  		ensure_equals("getUrl() == 'http://slurl.com/'", match.getUrl(), "http://slurl.com/"); -		match.setValues(10, 20, "", "", "", "", LLUIColor(), "", ""); +		match.setValues(10, 20, "", "", "", "", LLUIColor(), "", "", false);  		ensure_equals("getUrl() == '' (2)", match.getUrl(), "");  	} @@ -108,10 +108,10 @@ namespace tut  		LLUrlMatch match;  		ensure_equals("getLabel() == ''", match.getLabel(), ""); -		match.setValues(10, 20, "", "Label", "", "", LLUIColor(), "", ""); +		match.setValues(10, 20, "", "Label", "", "", LLUIColor(), "", "", false);  		ensure_equals("getLabel() == 'Label'", match.getLabel(), "Label"); -		match.setValues(10, 20, "", "", "", "", LLUIColor(), "", ""); +		match.setValues(10, 20, "", "", "", "", LLUIColor(), "", "", false);  		ensure_equals("getLabel() == '' (2)", match.getLabel(), "");  	} @@ -124,10 +124,10 @@ namespace tut  		LLUrlMatch match;  		ensure_equals("getTooltip() == ''", match.getTooltip(), ""); -		match.setValues(10, 20, "", "", "Info", "", LLUIColor(), "", ""); +		match.setValues(10, 20, "", "", "Info", "", LLUIColor(), "", "", false);  		ensure_equals("getTooltip() == 'Info'", match.getTooltip(), "Info"); -		match.setValues(10, 20, "", "", "", "", LLUIColor(), "", ""); +		match.setValues(10, 20, "", "", "", "", LLUIColor(), "", "", false);  		ensure_equals("getTooltip() == '' (2)", match.getTooltip(), "");  	} @@ -140,10 +140,10 @@ namespace tut  		LLUrlMatch match;  		ensure_equals("getIcon() == ''", match.getIcon(), ""); -		match.setValues(10, 20, "", "", "", "Icon", LLUIColor(), "", ""); +		match.setValues(10, 20, "", "", "", "Icon", LLUIColor(), "", "", false);  		ensure_equals("getIcon() == 'Icon'", match.getIcon(), "Icon"); -		match.setValues(10, 20, "", "", "", "", LLUIColor(), "", ""); +		match.setValues(10, 20, "", "", "", "", LLUIColor(), "", "", false);  		ensure_equals("getIcon() == '' (2)", match.getIcon(), "");  	} @@ -156,10 +156,10 @@ namespace tut  		LLUrlMatch match;  		ensure("getMenuName() empty", match.getMenuName().empty()); -		match.setValues(10, 20, "", "", "", "Icon", LLUIColor(), "xui_file.xml", ""); +		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(), "", ""); +		match.setValues(10, 20, "", "", "", "", LLUIColor(), "", "", false);  		ensure("getMenuName() empty (2)", match.getMenuName().empty());  	} @@ -172,10 +172,10 @@ namespace tut  		LLUrlMatch match;  		ensure("getLocation() empty", match.getLocation().empty()); -		match.setValues(10, 20, "", "", "", "Icon", LLUIColor(), "xui_file.xml", "Paris"); +		match.setValues(10, 20, "", "", "", "Icon", LLUIColor(), "xui_file.xml", "Paris", false);  		ensure_equals("getLocation() == \"Paris\"", match.getLocation(), "Paris"); -		match.setValues(10, 20, "", "", "", "", LLUIColor(), "", ""); +		match.setValues(10, 20, "", "", "", "", LLUIColor(), "", "", false);  		ensure("getLocation() empty (2)", match.getLocation().empty());  	}  } | 
