Support relative links in asciidoc files.

This commit is contained in:
Tobias Roeser
2014-03-04 16:42:41 +01:00
parent 9e1352c8b1
commit 4276c8f23e
5 changed files with 34 additions and 28 deletions

View File

@@ -268,16 +268,19 @@ trait RepositoryViewerControllerBase extends ControllerBase {
using(Git.open(getRepositoryDir(repository.owner, repository.name))){ git => using(Git.open(getRepositoryDir(repository.owner, repository.name))){ git =>
val revisions = Seq(if(revstr.isEmpty) repository.repository.defaultBranch else revstr, repository.branchList.head) val revisions = Seq(if(revstr.isEmpty) repository.repository.defaultBranch else revstr, repository.branchList.head)
// get specified commit // get specified commit
JGitUtil.getDefaultBranch(git, repository, revstr).map { case (objectId, revision) => JGitUtil.getDefaultBranch(git, repository, revstr).map {
defining(JGitUtil.getRevCommitFromId(git, objectId)){ revCommit => case (objectId, revision) =>
// get files defining(JGitUtil.getRevCommitFromId(git, objectId)) { revCommit =>
val files = JGitUtil.getFileList(git, revision, path) // get files
// process README.md or README.markdown val files = JGitUtil.getFileList(git, revision, path)
val readme = files.find { file => val parentPath = if (path == ".") Nil else path.split("/").toList
readmeFiles.contains(file.name.toLowerCase) // process README.md or README.markdown
}.map { file => val readme = files.find { file =>
file -> StringUtil.convertFromByteArray(JGitUtil.getContent(Git.open(getRepositoryDir(repository.owner, repository.name)), file.id, true).get) readmeFiles.contains(file.name.toLowerCase)
} }.map { file =>
val path = (file.name :: parentPath.reverse).reverse
path -> StringUtil.convertFromByteArray(JGitUtil.getContent(Git.open(getRepositoryDir(repository.owner, repository.name)), file.id, true).get)
}
repo.html.files(revision, repository, repo.html.files(revision, repository,
if(path == ".") Nil else path.split("/").toList, // current path if(path == ".") Nil else path.split("/").toList, // current path

View File

@@ -17,7 +17,7 @@ object Asciidoc {
/** /**
* Converts Markdown of Wiki pages to HTML. * Converts Markdown of Wiki pages to HTML.
*/ */
def toHtml(asciidoc: String, branch: String, repository: service.RepositoryService.RepositoryInfo, def toHtml(filePath: List[String], asciidoc: String, branch: String, repository: service.RepositoryService.RepositoryInfo,
enableWikiLink: Boolean, enableRefsLink: Boolean)(implicit context: app.Context): String = { enableWikiLink: Boolean, enableRefsLink: Boolean)(implicit context: app.Context): String = {
val options = OptionsBuilder.options() val options = OptionsBuilder.options()
@@ -27,8 +27,11 @@ object Asciidoc {
options.attributes(attributes.get()) options.attributes(attributes.get())
val rendered = asciidoctor.render(asciidoc, options) val rendered = asciidoctor.render(asciidoc, options)
// this is always relative to the base dir of the repo, as we currently only render README files. val path = filePath.reverse.tail.reverse match {
val relativeUrlPrefix = s"${helpers.url(repository)}/blob/${branch}/" case Nil => ""
case p => p.mkString("", "/", "/")
}
val relativeUrlPrefix = s"${helpers.url(repository)}/blob/${branch}/${path}"
prefixRelativeUrls(rendered, relativeUrlPrefix) prefixRelativeUrls(rendered, relativeUrlPrefix)
} }

View File

@@ -27,12 +27,12 @@ object helpers extends AvatarImageProvider with LinkConverter with RequestCache
def plural(count: Int, singular: String, plural: String = ""): String = def plural(count: Int, singular: String, plural: String = ""): String =
if(count == 1) singular else if(plural.isEmpty) singular + "s" else plural if(count == 1) singular else if(plural.isEmpty) singular + "s" else plural
private[this] val renderersBySuffix: Seq[(String, (String, String, service.RepositoryService.RepositoryInfo, Boolean, Boolean, app.Context) => Html)] = private[this] val renderersBySuffix: Seq[(String, (List[String], String, String, service.RepositoryService.RepositoryInfo, Boolean, Boolean, app.Context) => Html)] =
Seq( Seq(
".md" -> ((fileContent, branch, repository, enableWikiLink, enableRefsLink, context) => markdown(fileContent, repository, enableWikiLink, enableRefsLink)(context)), ".md" -> ((filePath, fileContent, branch, repository, enableWikiLink, enableRefsLink, context) => markdown(fileContent, repository, enableWikiLink, enableRefsLink)(context)),
".markdown" -> ((fileContent, branch, repository, enableWikiLink, enableRefsLink, context) => markdown(fileContent, repository, enableWikiLink, enableRefsLink)(context)), ".markdown" -> ((filePath, fileContent, branch, repository, enableWikiLink, enableRefsLink, context) => markdown(fileContent, repository, enableWikiLink, enableRefsLink)(context)),
".adoc" -> ((fileContent, branch, repository, enableWikiLink, enableRefsLink, context) => asciidoc(fileContent, branch, repository, enableWikiLink, enableRefsLink)(context)), ".adoc" -> ((filePath, fileContent, branch, repository, enableWikiLink, enableRefsLink, context) => asciidoc(filePath, fileContent, branch, repository, enableWikiLink, enableRefsLink)(context)),
".asciidoc" -> ((fileContent, branch, repository, enableWikiLink, enableRefsLink, context) => asciidoc(fileContent, branch, repository, enableWikiLink, enableRefsLink)(context)) ".asciidoc" -> ((filePath, fileContent, branch, repository, enableWikiLink, enableRefsLink, context) => asciidoc(filePath, fileContent, branch, repository, enableWikiLink, enableRefsLink)(context))
) )
def renderableSuffixes: Seq[String] = renderersBySuffix.map(_._1) def renderableSuffixes: Seq[String] = renderersBySuffix.map(_._1)
@@ -44,13 +44,13 @@ object helpers extends AvatarImageProvider with LinkConverter with RequestCache
enableWikiLink: Boolean, enableRefsLink: Boolean)(implicit context: app.Context): Html = enableWikiLink: Boolean, enableRefsLink: Boolean)(implicit context: app.Context): Html =
Html(Markdown.toHtml(value, repository, enableWikiLink, enableRefsLink)) Html(Markdown.toHtml(value, repository, enableWikiLink, enableRefsLink))
def renderMarkup(fileName: String, fileContent: String, branch: String, def renderMarkup(filePath: List[String], fileContent: String, branch: String,
repository: service.RepositoryService.RepositoryInfo, repository: service.RepositoryService.RepositoryInfo,
enableWikiLink: Boolean, enableRefsLink: Boolean)(implicit context: app.Context): Html = { enableWikiLink: Boolean, enableRefsLink: Boolean)(implicit context: app.Context): Html = {
val fileNameLower = fileName.toLowerCase val fileNameLower = filePath.reverse.head.toLowerCase
renderersBySuffix.find { case (suffix, _) => fileNameLower.endsWith(suffix) } match { renderersBySuffix.find { case (suffix, _) => fileNameLower.endsWith(suffix) } match {
case Some((_, handler)) => handler(fileContent, branch, repository, enableWikiLink, enableRefsLink, context) case Some((_, handler)) => handler(filePath, fileContent, branch, repository, enableWikiLink, enableRefsLink, context)
case None => Html( case None => Html(
s"<tt>${ s"<tt>${
fileContent.split("(\\r\\n)|\\n").map(xml.Utility.escape(_)).mkString("<br/>") fileContent.split("(\\r\\n)|\\n").map(xml.Utility.escape(_)).mkString("<br/>")
@@ -59,9 +59,9 @@ object helpers extends AvatarImageProvider with LinkConverter with RequestCache
} }
} }
def asciidoc(value: String, branch: String, repository: service.RepositoryService.RepositoryInfo, def asciidoc(filePath: List[String], value: String, branch: String, repository: service.RepositoryService.RepositoryInfo,
enableWikiLink: Boolean, enableRefsLink: Boolean)(implicit context: app.Context): Html = enableWikiLink: Boolean, enableRefsLink: Boolean)(implicit context: app.Context): Html =
Html(Asciidoc.toHtml(value, branch, repository, enableWikiLink, enableRefsLink)) Html(Asciidoc.toHtml(filePath, value, branch, repository, enableWikiLink, enableRefsLink))
/** /**
* Returns &lt;img&gt; which displays the avatar icon for the given user name. * Returns &lt;img&gt; which displays the avatar icon for the given user name.

View File

@@ -39,7 +39,7 @@
@if(content.viewType == "text"){ @if(content.viewType == "text"){
@defining(pathList.reverse.head) { file => @defining(pathList.reverse.head) { file =>
@if(renderableSuffixes.find(suffix => file.toLowerCase.endsWith(suffix))) { @if(renderableSuffixes.find(suffix => file.toLowerCase.endsWith(suffix))) {
@renderMarkup(file, content.content.get, branch, repository, false, false) @renderMarkup(pathList, content.content.get, branch, repository, false, false)
} else { } else {
<pre class="prettyprint linenums blob">@content.content.get</pre> <pre class="prettyprint linenums blob">@content.content.get</pre>
} }

View File

@@ -3,7 +3,7 @@
pathList: List[String], pathList: List[String],
latestCommit: util.JGitUtil.CommitInfo, latestCommit: util.JGitUtil.CommitInfo,
files: List[util.JGitUtil.FileInfo], files: List[util.JGitUtil.FileInfo],
readme: Option[(util.JGitUtil.FileInfo, String)])(implicit context: app.Context) readme: Option[(List[String], String)])(implicit context: app.Context)
@import context._ @import context._
@import view.helpers._ @import view.helpers._
@html.main(s"${repository.owner}/${repository.name}", Some(repository)) { @html.main(s"${repository.owner}/${repository.name}", Some(repository)) {
@@ -77,10 +77,10 @@
</table> </table>
</div> </div>
@readme.map { case(file, content) => @readme.map { case(filePath, content) =>
<div id="readme" class="box"> <div id="readme" class="box">
<div class="box-header">@file.name</div> <div class="box-header">@filePath.reverse.head</div>
<div class="box-content markdown-body">@renderMarkup(file.name, content, branch, repository, false, false)</div> <div class="box-content markdown-body">@renderMarkup(filePath, content, branch, repository, false, false)</div>
</div> </div>
} }
} }