gitbucket.core.view.LinkConverter.scala Maven / Gradle / Ivy
The newest version!
package gitbucket.core.view
import gitbucket.core.controller.Context
import gitbucket.core.service.{RepositoryService, RequestCache}
import gitbucket.core.util.Implicits.RichString
import gitbucket.core.util.StringUtil
trait LinkConverter { self: RequestCache =>
/**
* Creates a link to the issue or the pull request from the issue id.
*/
protected def createIssueLink(owner: String, repository: String, issueId: Int, title: String)(implicit
context: Context
): String = {
getIssueFromCache(owner, repository, issueId.toString) match {
case Some(issue) =>
s"""${StringUtil
.escapeHtml(title)} #${issueId}"""
case None =>
s"Unknown #${issueId}"
}
}
/**
* Creates a global link to the issue or the pull request from the issue id.
*/
protected def createGlobalIssueLink(owner: String, repository: String, issueId: Int, title: String)(implicit
context: Context
): String = {
getIssueFromCache(owner, repository, issueId.toString) match {
case Some(issue) =>
s"""${StringUtil
.escapeHtml(title)} ${owner}/${repository}#${issueId}"""
case None =>
s"Unknown ${owner}/${repository}#${issueId}"
}
}
/**
* Converts issue id, username and commit id to link in the given text.
*/
protected def convertRefsLinks(
text: String,
repository: RepositoryService.RepositoryInfo,
issueIdPrefix: String = "#",
escapeHtml: Boolean = true
)(implicit context: Context): String = {
// escape HTML tags
val escaped =
if (escapeHtml) text.replace("&", "&").replace("<", "<").replace(">", ">").replace("\"", """)
else text
escaped
// convert username/project@SHA to link
.replaceBy("(?<=(^|\\W))([a-zA-Z0-9\\-_]+)/([a-zA-Z0-9\\-_\\.]+)@([a-f0-9]{40})(?=(\\W|$))".r) { m =>
getAccountByUserNameFromCache(m.group(2)).map { _ =>
s"""${m.group(2)}/${m.group(
3
)}@${m.group(4).substring(0, 7)}
"""
}
}
// convert username/project#Num to link
.replaceBy(("(?<=(^|\\W))([a-zA-Z0-9\\-_]+)/([a-zA-Z0-9\\-_\\.]+)" + issueIdPrefix + "([0-9]+)(?=(\\W|$))").r) {
m =>
getIssueFromCache(m.group(2), m.group(3), m.group(4)) match {
case Some(pull) if (pull.isPullRequest) =>
Some(s"""${m.group(2)}/${m.group(
3
)}#${m.group(4)}""")
case Some(issue) =>
Some(s"""${m.group(2)}/${m
.group(3)}#${m.group(4)}""")
case None =>
Some(s"""${m.group(2)}/${m.group(3)}#${m.group(4)}""")
}
}
// convert username@SHA to link
.replaceBy(("(?<=(^|\\W))([a-zA-Z0-9\\-_]+)@([a-f0-9]{40})(?=(\\W|$))").r) { m =>
getAccountByUserNameFromCache(m.group(2)).map { _ =>
s"""${m.group(2)}@${m
.group(3)
.substring(0, 7)}
"""
}
}
// convert username#Num to link
.replaceBy(("(?<=(^|\\W))([a-zA-Z0-9\\-_]+)" + issueIdPrefix + "([0-9]+)(?=(\\W|$))").r) { m =>
getIssueFromCache(m.group(2), repository.name, m.group(3)) match {
case Some(issue) if (issue.isPullRequest) =>
Some(s"""${m.group(2)}#${m
.group(3)}""")
case Some(_) =>
Some(s"""${m.group(2)}#${m
.group(3)}""")
case None =>
Some(s"""${m.group(2)}#${m.group(3)}""")
}
}
// convert issue id to link
.replaceBy(("(?<=(^|\\W))(GH-|(?
val prefix = if (m.group(2) == "issue:") "#" else m.group(2)
getIssueFromCache(repository.owner, repository.name, m.group(3)) match {
case Some(pull) if (pull.isPullRequest) =>
Some(s"""${prefix}${m
.group(3)}""")
case Some(issue) =>
Some(s"""${prefix}${m
.group(3)}""")
case None =>
Some(s"""${m.group(2)}${m.group(3)}""")
}
}
// convert @username to link
.replaceBy("(?<=(^|\\W))@([a-zA-Z0-9\\-_\\.]+)(?=(\\W|$))".r) { m =>
getAccountByUserNameFromCache(m.group(2)).map { _ =>
s"""@${m.group(2)}"""
}
}
// convert commit id to link
.replaceBy("(?<=(^|[^\\w/@]))([a-f0-9]{40})(?=(\\W|$))".r) { m =>
Some(s"""${m.group(2).substring(0, 7)}
""")
}
}
}