diff --git a/src/main/scala/gitbucket/core/view/Markdown.scala b/src/main/scala/gitbucket/core/view/Markdown.scala index 49ceeed..a2aa763 100644 --- a/src/main/scala/gitbucket/core/view/Markdown.scala +++ b/src/main/scala/gitbucket/core/view/Markdown.scala @@ -6,7 +6,7 @@ import gitbucket.core.controller.Context import gitbucket.core.service.{RepositoryService, RequestCache} -import gitbucket.core.util.StringUtil +import gitbucket.core.util.{EmojiUtil, StringUtil} import io.github.gitbucket.markedj._ import io.github.gitbucket.markedj.Utils._ @@ -44,7 +44,7 @@ val renderer = new GitBucketMarkedRenderer(options, repository, enableWikiLink, enableRefsLink, enableAnchor, enableTaskList, hasWritePermission, pages) - helpers.decorateHtml(Marked.marked(source, options, renderer), repository) + EmojiUtil.convertEmojis(Marked.marked(source, options, renderer)) } /** diff --git a/src/main/scala/gitbucket/core/view/helpers.scala b/src/main/scala/gitbucket/core/view/helpers.scala index 9a64b01..7d4fd64 100644 --- a/src/main/scala/gitbucket/core/view/helpers.scala +++ b/src/main/scala/gitbucket/core/view/helpers.scala @@ -153,7 +153,7 @@ * Converts commit id, issue id and username to the link. */ def link(value: String, repository: RepositoryService.RepositoryInfo)(implicit context: Context): Html = - Html(decorateHtml(convertRefsLinks(value, repository), repository)) + Html(EmojiUtil.convertEmojis(convertRefsLinks(value, repository))) def cut(value: String, length: Int): String = if(value.length > length){ @@ -321,7 +321,7 @@ // 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 = { + def detectAndRenderLinks(text: String)(implicit context: Context): String = { val matches = detectAndRenderLinksRegex.findAllMatchIn(text).toSeq val (x, pos) = matches.foldLeft((collection.immutable.Seq.empty[Html], 0)){ case ((x, pos), m) => @@ -335,36 +335,38 @@ // append rest fragment val out = if (pos < text.length) x :+ HtmlFormat.escape(text.substring(pos)) else x - HtmlFormat.fill(out) + EmojiUtil.convertEmojis(HtmlFormat.fill(out).toString) + //HtmlFormat.fill(out).toString } - /** - * Decorate text in HTML by TextDecorator. - * - * TODO Move to the other place. - */ - def decorateHtml(text: String, repository: RepositoryInfo)(implicit context: Context): String = { -// val textDecorators = PluginRegistry().getTextDecorators - - def processNode(n: Node): Unit = { - n match { - case x: Element => { - if(x.hasText && x.ownText.nonEmpty){ - val text = EmojiUtil.convertEmojis(x.ownText) -// val text = textDecorators.foldLeft(x.ownText){ case (text, textDecorator) => -// textDecorator.decorate(text, repository) -// } - x.html(text) - } - x.children.toArray.foreach { c => - processNode(c.asInstanceOf[Node]) - } - } - case _ => () - } - } - val body = Jsoup.parseBodyFragment(text).getElementsByTag("body").get(0) - processNode(body) - body.html - } +// /** +// * Decorate text in HTML by TextDecorator. +// * +// * TODO Move to the other place. +// */ +// def decorateHtml(text: String, repository: RepositoryInfo)(implicit context: Context): String = { +// +//// val textDecorators = PluginRegistry().getTextDecorators +// +// def processNode(n: Node): Unit = { +// n match { +// case x: Element => { +// if(x.hasText && x.ownText.nonEmpty){ +// val text = EmojiUtil.convertEmojis(x.ownText) +//// val text = textDecorators.foldLeft(x.ownText){ case (text, textDecorator) => +//// textDecorator.decorate(text, repository) +//// } +// x.html(text) +// } +// x.children.toArray.foreach { c => +// processNode(c.asInstanceOf[Node]) +// } +// } +// case _ => () +// } +// } +// val body = Jsoup.parseBodyFragment(text).getElementsByTag("body").get(0) +// processNode(body) +// body.html +// } } diff --git a/src/main/twirl/gitbucket/core/menu.scala.html b/src/main/twirl/gitbucket/core/menu.scala.html index 3b22a17..60628b8 100644 --- a/src/main/twirl/gitbucket/core/menu.scala.html +++ b/src/main/twirl/gitbucket/core/menu.scala.html @@ -73,7 +73,7 @@ } @x.description.map { description => -
@helpers.detectAndRenderLinks(description)
+
@Html(helpers.detectAndRenderLinks(description))
} } diff --git a/src/test/scala/gitbucket/core/view/HelpersSpec.scala b/src/test/scala/gitbucket/core/view/HelpersSpec.scala index ee5ea0c..d3c9a6c 100644 --- a/src/test/scala/gitbucket/core/view/HelpersSpec.scala +++ b/src/test/scala/gitbucket/core/view/HelpersSpec.scala @@ -1,58 +1,62 @@ package gitbucket.core.view +import gitbucket.core.controller.Context +import gitbucket.core.service.RepositoryService.RepositoryInfo import org.scalatest.FunSpec +import org.scalatest.mock.MockitoSugar -class HelpersSpec extends FunSpec { +class HelpersSpec extends FunSpec with MockitoSugar { + implicit val context = mock[Context] import helpers._ describe("detect and render links") { it("should pass identical string when no link is present") { val before = "Description" - val after = detectAndRenderLinks(before).toString() + val after = detectAndRenderLinks(before) assert(after == before) } it("should convert a single link") { val before = "http://example.com" - val after = detectAndRenderLinks(before).toString() + val after = detectAndRenderLinks(before) assert(after == """http://example.com""") } it("should convert a single link within trailing text") { val before = "Example Project. http://example.com" - val after = detectAndRenderLinks(before).toString() + val after = detectAndRenderLinks(before) assert(after == """Example Project. http://example.com""") } it("should convert a mulitple links within text") { val before = "Example Project. http://example.com. (See also https://github.com/)" - val after = detectAndRenderLinks(before).toString() + val after = detectAndRenderLinks(before) assert(after == """Example Project. http://example.com. (See also https://github.com/)""") } it("should properly escape html metacharacters") { val before = "<>&" - val after = detectAndRenderLinks(before).toString() + val after = detectAndRenderLinks(before) assert(after == """<>&""") } it("should escape html metacharacters adjacent to a link") { val before = "" - val after = detectAndRenderLinks(before).toString() + val after = detectAndRenderLinks(before) assert(after == """<http://example.com>""") } it("should stop link recognition at a metacharacter") { val before = "http://exahttp://exa<mple.com""") } it("should make sure there are no double quotes in the href attribute") { val before = "http://exa\"mple.com" - val after = detectAndRenderLinks(before).toString() + val after = detectAndRenderLinks(before) assert(after == """http://exa"mple.com""") } }