EXT-1566: Fixed another case of UTF-8 vs UTF-32 coding error for SLURL

parsing in text editors. Any time we are looking up segment start/end
ranges we should do this on a wide string.

Also added a convenience LLUrlRegistry::hasUrl() method to easily
determine if a string contains a valid SLURL.
master
Martin Reddy 2009-10-16 14:04:23 +00:00
parent a0ee6fbbdd
commit 7aa859b7f4
3 changed files with 23 additions and 5 deletions

View File

@ -2505,6 +2505,8 @@ void LLTextEditor::updateSegments()
void LLTextEditor::updateLinkSegments()
{
LLWString wtext = getWText();
// update any segments that contain a link
for (segment_set_t::iterator it = mSegments.begin(); it != mSegments.end(); ++it)
{
@ -2514,13 +2516,13 @@ void LLTextEditor::updateLinkSegments()
// if the link's label (what the user can edit) is a valid Url,
// then update the link's HREF to be the same as the label text.
// This lets users edit Urls in-place.
LLUrlMatch match;
LLStyleSP style = static_cast<LLStyleSP>(segment->getStyle());
std::string url_label = getText().substr(segment->getStart(), segment->getEnd()-segment->getStart());
if (LLUrlRegistry::instance().findUrl(url_label, match))
LLWString url_label = wtext.substr(segment->getStart(), segment->getEnd()-segment->getStart());
if (LLUrlRegistry::instance().hasUrl(url_label))
{
LLStringUtil::trim(url_label);
style->setLinkHREF(url_label);
std::string new_url = wstring_to_utf8str(url_label);
LLStringUtil::trim(new_url);
style->setLinkHREF(new_url);
}
}
}

View File

@ -192,3 +192,15 @@ bool LLUrlRegistry::findUrl(const LLWString &text, LLUrlMatch &match, const LLUr
}
return false;
}
bool LLUrlRegistry::hasUrl(const std::string &text)
{
LLUrlMatch match;
return findUrl(text, match);
}
bool LLUrlRegistry::hasUrl(const LLWString &text)
{
LLUrlMatch match;
return findUrl(text, match);
}

View File

@ -81,6 +81,10 @@ public:
bool findUrl(const LLWString &text, LLUrlMatch &match,
const LLUrlLabelCallback &cb = &LLUrlRegistryNullCallback);
// return true if the given string contains a URL that findUrl would match
bool hasUrl(const std::string &text);
bool hasUrl(const LLWString &text);
private:
LLUrlRegistry();
friend class LLSingleton<LLUrlRegistry>;