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/)""" + } + + } + +} +