diff --git a/src/main/scala/gitbucket/core/view/helpers.scala b/src/main/scala/gitbucket/core/view/helpers.scala
index 0d1a9a5..8f7dd03 100644
--- a/src/main/scala/gitbucket/core/view/helpers.scala
+++ b/src/main/scala/gitbucket/core/view/helpers.scala
@@ -275,4 +275,11 @@
case CommitState.ERROR => "Failed"
case CommitState.FAILURE => "Failed"
}
+
+ // This pattern comes from: http://stackoverflow.com/a/4390768/1771641 (extract-url-from-string)
+ private[this] val detectAndRenderLinksRegex = """(?i)\b((?:https?://|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,13}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))""".r
+
+ def detectAndRenderLinks(text: String): Html = {
+ Html(detectAndRenderLinksRegex.replaceAllIn(text, m => s"""${m.group(0)}"""))
+ }
}
diff --git a/src/main/twirl/gitbucket/core/menu.scala.html b/src/main/twirl/gitbucket/core/menu.scala.html
index d2798ab..7e71382 100644
--- a/src/main/twirl/gitbucket/core/menu.scala.html
+++ b/src/main/twirl/gitbucket/core/menu.scala.html
@@ -104,7 +104,7 @@
@if(expand){
@repository.repository.description.map { description =>
-
@description
+
@detectAndRenderLinks(description)
}
diff --git a/src/test/scala/gitbucket/core/view/HelpersSpec.scala b/src/test/scala/gitbucket/core/view/HelpersSpec.scala
new file mode 100644
index 0000000..41d0053
--- /dev/null
+++ b/src/test/scala/gitbucket/core/view/HelpersSpec.scala
@@ -0,0 +1,38 @@
+package gitbucket.core.view
+
+import org.specs2.mutable._
+
+class HelpersSpec extends Specification {
+
+ import helpers._
+
+ "detect and render links" should {
+
+ "pass identical string when no link is present" in {
+ val before = "Description"
+ val after = detectAndRenderLinks(before).toString()
+ after mustEqual before
+ }
+
+ "convert a single link" in {
+ val before = "http://example.com"
+ val after = detectAndRenderLinks(before).toString()
+ after mustEqual """http://example.com"""
+ }
+
+ "convert a single link within trailing text" in {
+ val before = "Example Project. http://example.com"
+ val after = detectAndRenderLinks(before).toString()
+ after mustEqual """Example Project. http://example.com"""
+ }
+
+ "convert a mulitple links within text" in {
+ val before = "Example Project. http://example.com. (See also https://github.com/)"
+ val after = detectAndRenderLinks(before).toString()
+ after mustEqual """Example Project. http://example.com. (See also https://github.com/)"""
+ }
+
+ }
+
+}
+