diff --git a/src/main/scala/gitbucket/core/view/helpers.scala b/src/main/scala/gitbucket/core/view/helpers.scala index b61c0d6..e8e8760 100644 --- a/src/main/scala/gitbucket/core/view/helpers.scala +++ b/src/main/scala/gitbucket/core/view/helpers.scala @@ -9,7 +9,7 @@ import gitbucket.core.service.{RepositoryService, RequestCache} import gitbucket.core.util.{FileUtil, JGitUtil, StringUtil} -import play.twirl.api.Html +import play.twirl.api.{Html, HtmlFormat} /** * Provides helper methods for Twirl templates. @@ -306,6 +306,17 @@ 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)}""")) + val matches = detectAndRenderLinksRegex.findAllMatchIn(text).toVector + var pos = 0 + var out = Vector.empty[Html] + for (m <- matches) { + if (pos < m.start) out :+= HtmlFormat.escape(text.substring(pos, m.start)) + val url = m.group(0) + val href = url.replace("\"", """) + out :+= Html(s"""${url}""") + pos = m.end + } + if (pos < text.length) out :+= HtmlFormat.escape(text.substring(pos)) + HtmlFormat.fill(out) } }