diff options
| author | Remko Tronçon <git@el-tramo.be> | 2010-10-27 19:12:46 (GMT) | 
|---|---|---|
| committer | Remko Tronçon <git@el-tramo.be> | 2010-10-27 19:51:30 (GMT) | 
| commit | 5f6543647862b5ae1d5abdddd0612e6cf9f23c8f (patch) | |
| tree | a46da0aae9787c52963e1df59123a9326a055d02 | |
| parent | 6810a2896f27e7ee07aee847f5e8dbccd1f6ec89 (diff) | |
| download | swift-contrib-5f6543647862b5ae1d5abdddd0612e6cf9f23c8f.zip swift-contrib-5f6543647862b5ae1d5abdddd0612e6cf9f23c8f.tar.bz2 | |
Changed linkifcation algorithm.
| -rw-r--r-- | SwifTools/Linkify.cpp | 41 | ||||
| -rw-r--r-- | SwifTools/UnitTest/LinkifyTest.cpp | 18 | 
2 files changed, 53 insertions, 6 deletions
| diff --git a/SwifTools/Linkify.cpp b/SwifTools/Linkify.cpp index 0ebe832..0dfa7b5 100644 --- a/SwifTools/Linkify.cpp +++ b/SwifTools/Linkify.cpp @@ -7,17 +7,46 @@  #include "SwifTools/Linkify.h"  #include <boost/regex.hpp> +#include <sstream> +#include <iostream>  namespace Swift { -static const boost::regex linkifyRegexp("(https?://([@:\\-\\w\\.]+)+(:\\d+)?(/([=%~\\-\\w/_#@\\.\\+]*(\\?\\S+)?)?)?)"); +static boost::regex linkifyRegexp("^https?://.*");  String Linkify::linkify(const String& input) { -	return String(boost::regex_replace( -			input.getUTF8String(),  -			linkifyRegexp,  -			"<a href=\"\\1\">\\1</a>",  -			boost::match_default|boost::format_all)); +	std::ostringstream result; +	std::vector<char> currentURL; +	bool inURL = false; +	for (size_t i = 0; i < input.getUTF8Size(); ++i) { +		char c = input[i]; +		if (inURL) { +			if (c >= 33 && c != '\\' && c != '"') { +				currentURL.push_back(c); +			} +			else { +				String url(¤tURL[0], currentURL.size()); +				result << "<a href=\"" << url << "\">" <<  url << "</a>"; +				currentURL.clear(); +				inURL = false; +				result << c; +			} +		} +		else { +			if (boost::regex_match(input.getSubstring(i, 8).getUTF8String(), linkifyRegexp)) { +				currentURL.push_back(c); +				inURL = true; +			} +			else { +				result << c; +			} +		} +	} +	if (currentURL.size() > 0) { +		String url(¤tURL[0], currentURL.size()); +		result << "<a href=\"" << url << "\">" <<  url << "</a>"; +	} +	return String(result.str());  }  } diff --git a/SwifTools/UnitTest/LinkifyTest.cpp b/SwifTools/UnitTest/LinkifyTest.cpp index 1418957..9655b87 100644 --- a/SwifTools/UnitTest/LinkifyTest.cpp +++ b/SwifTools/UnitTest/LinkifyTest.cpp @@ -14,6 +14,7 @@ using namespace Swift;  class LinkifyTest : public CppUnit::TestFixture {  		CPPUNIT_TEST_SUITE(LinkifyTest);  		CPPUNIT_TEST(testLinkify_URLWithResource); +		CPPUNIT_TEST(testLinkify_HTTPSURLWithResource);  		CPPUNIT_TEST(testLinkify_URLWithEmptyResource);  		CPPUNIT_TEST(testLinkify_BareURL);  		CPPUNIT_TEST(testLinkify_URLSurroundedByWhitespace); @@ -26,6 +27,7 @@ class LinkifyTest : public CppUnit::TestFixture {  		CPPUNIT_TEST(testLinkify_Equal);  		CPPUNIT_TEST(testLinkify_Authentication);  		CPPUNIT_TEST(testLinkify_At); +		CPPUNIT_TEST(testLinkify_Amps);  		CPPUNIT_TEST_SUITE_END();  	public: @@ -37,6 +39,14 @@ class LinkifyTest : public CppUnit::TestFixture {  					result);  		} +		void testLinkify_HTTPSURLWithResource() { +			String result = Linkify::linkify("https://swift.im/blog"); + +			CPPUNIT_ASSERT_EQUAL( +					String("<a href=\"https://swift.im/blog\">https://swift.im/blog</a>"), +					result); +		} +  		void testLinkify_URLWithEmptyResource() {  			String result = Linkify::linkify("http://swift.im/"); @@ -133,6 +143,14 @@ class LinkifyTest : public CppUnit::TestFixture {  					String("<a href=\"http://swift.im/foo@bar\">http://swift.im/foo@bar</a>"),  					result);  		} + +		void testLinkify_Amps() { +			String result = Linkify::linkify("http://swift.im/foo&bar&baz"); + +			CPPUNIT_ASSERT_EQUAL( +					String("<a href=\"http://swift.im/foo&bar&baz\">http://swift.im/foo&bar&baz</a>"), +					result); +		}  };  CPPUNIT_TEST_SUITE_REGISTRATION(LinkifyTest); | 
 Swift
 Swift