diff options
Diffstat (limited to 'SwifTools')
-rw-r--r-- | SwifTools/Linkify.cpp | 17 | ||||
-rw-r--r-- | SwifTools/Linkify.h | 9 | ||||
-rw-r--r-- | SwifTools/SConscript | 15 | ||||
-rw-r--r-- | SwifTools/UnitTest/LinkifyTest.cpp | 60 | ||||
-rw-r--r-- | SwifTools/UnitTest/SConscript | 5 |
5 files changed, 106 insertions, 0 deletions
diff --git a/SwifTools/Linkify.cpp b/SwifTools/Linkify.cpp new file mode 100644 index 0000000..8654307 --- /dev/null +++ b/SwifTools/Linkify.cpp @@ -0,0 +1,17 @@ +#include "SwifTools/Linkify.h" + +#include <boost/regex.hpp> + +namespace Swift { + +static const boost::regex linkifyRegexp("(https?://([-\\w\\.]+)+(:\\d+)?(/([%-\\w/_\\.]*(\\?\\S+)?)?)?)"); + +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)); +} + +} diff --git a/SwifTools/Linkify.h b/SwifTools/Linkify.h new file mode 100644 index 0000000..04182f9 --- /dev/null +++ b/SwifTools/Linkify.h @@ -0,0 +1,9 @@ +#pragma once + +#include "Swiften/Base/String.h" + +namespace Swift { + namespace Linkify { + String linkify(const String&); + } +} diff --git a/SwifTools/SConscript b/SwifTools/SConscript new file mode 100644 index 0000000..2caff5f --- /dev/null +++ b/SwifTools/SConscript @@ -0,0 +1,15 @@ +Import("env") + +env["SWIFTOOLS_FLAGS"] = { + "LIBPATH": [Dir(".")], + "LIBS": ["SwifTools"] + } + +myenv = env.Clone() + +myenv.MergeFlags(myenv["BOOST_FLAGS"]) +myenv.StaticLibrary("SwifTools", [ + "Linkify.cpp" + ]) + +SConscript(dirs = ["UnitTest"]) diff --git a/SwifTools/UnitTest/LinkifyTest.cpp b/SwifTools/UnitTest/LinkifyTest.cpp new file mode 100644 index 0000000..9b66614 --- /dev/null +++ b/SwifTools/UnitTest/LinkifyTest.cpp @@ -0,0 +1,60 @@ +#include <cppunit/extensions/HelperMacros.h> +#include <cppunit/extensions/TestFactoryRegistry.h> + +#include "SwifTools/Linkify.h" + +using namespace Swift; + +class LinkifyTest : public CppUnit::TestFixture { + CPPUNIT_TEST_SUITE(LinkifyTest); + CPPUNIT_TEST(testLinkify_URLWithResource); + CPPUNIT_TEST(testLinkify_URLWithEmptyResource); + CPPUNIT_TEST(testLinkify_BareURL); + CPPUNIT_TEST(testLinkify_URLSurroundedByWhitespace); + CPPUNIT_TEST(testLinkify_MultipleURLs); + CPPUNIT_TEST_SUITE_END(); + + public: + void testLinkify_URLWithResource() { + String result = Linkify::linkify("http://swift.im/blog"); + + CPPUNIT_ASSERT_EQUAL( + String("<a href=\"http://swift.im/blog\">http://swift.im/blog</a>"), + result); + } + + void testLinkify_URLWithEmptyResource() { + String result = Linkify::linkify("http://swift.im/"); + + CPPUNIT_ASSERT_EQUAL( + String("<a href=\"http://swift.im/\">http://swift.im/</a>"), + result); + } + + + void testLinkify_BareURL() { + String result = Linkify::linkify("http://swift.im"); + + CPPUNIT_ASSERT_EQUAL( + String("<a href=\"http://swift.im\">http://swift.im</a>"), + result); + } + + void testLinkify_URLSurroundedByWhitespace() { + String result = Linkify::linkify("Foo http://swift.im/blog Bar"); + + CPPUNIT_ASSERT_EQUAL( + String("Foo <a href=\"http://swift.im/blog\">http://swift.im/blog</a> Bar"), + result); + } + + void testLinkify_MultipleURLs() { + String result = Linkify::linkify("Foo http://swift.im/blog Bar http://el-tramo.be/about Baz"); + + CPPUNIT_ASSERT_EQUAL( + String("Foo <a href=\"http://swift.im/blog\">http://swift.im/blog</a> Bar <a href=\"http://el-tramo.be/about\">http://el-tramo.be/about</a> Baz"), + result); + } +}; + +CPPUNIT_TEST_SUITE_REGISTRATION(LinkifyTest); diff --git a/SwifTools/UnitTest/SConscript b/SwifTools/UnitTest/SConscript new file mode 100644 index 0000000..2622f39 --- /dev/null +++ b/SwifTools/UnitTest/SConscript @@ -0,0 +1,5 @@ +Import("env") + +env.Append(UNITTEST_SOURCES = [ + File("LinkifyTest.cpp") + ]) |