diff --git a/src/main/scala/app/RepositoryViewerController.scala b/src/main/scala/app/RepositoryViewerController.scala index 5c79635..6893e63 100644 --- a/src/main/scala/app/RepositoryViewerController.scala +++ b/src/main/scala/app/RepositoryViewerController.scala @@ -268,16 +268,19 @@ using(Git.open(getRepositoryDir(repository.owner, repository.name))){ git => val revisions = Seq(if(revstr.isEmpty) repository.repository.defaultBranch else revstr, repository.branchList.head) // get specified commit - JGitUtil.getDefaultBranch(git, repository, revstr).map { case (objectId, revision) => - defining(JGitUtil.getRevCommitFromId(git, objectId)){ revCommit => - // get files - val files = JGitUtil.getFileList(git, revision, path) - // process README.md or README.markdown - val readme = files.find { file => - readmeFiles.contains(file.name.toLowerCase) - }.map { file => - file -> StringUtil.convertFromByteArray(JGitUtil.getContent(Git.open(getRepositoryDir(repository.owner, repository.name)), file.id, true).get) - } + JGitUtil.getDefaultBranch(git, repository, revstr).map { + case (objectId, revision) => + defining(JGitUtil.getRevCommitFromId(git, objectId)) { revCommit => + // get files + val files = JGitUtil.getFileList(git, revision, path) + val parentPath = if (path == ".") Nil else path.split("/").toList + // process README.md or README.markdown + val readme = files.find { file => + 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, if(path == ".") Nil else path.split("/").toList, // current path diff --git a/src/main/scala/view/Asciidoc.scala b/src/main/scala/view/Asciidoc.scala index 8d9d376..88c80fb 100644 --- a/src/main/scala/view/Asciidoc.scala +++ b/src/main/scala/view/Asciidoc.scala @@ -17,7 +17,7 @@ /** * 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 = { val options = OptionsBuilder.options() @@ -27,8 +27,11 @@ options.attributes(attributes.get()) 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 relativeUrlPrefix = s"${helpers.url(repository)}/blob/${branch}/" + val path = filePath.reverse.tail.reverse match { + case Nil => "" + case p => p.mkString("", "/", "/") + } + val relativeUrlPrefix = s"${helpers.url(repository)}/blob/${branch}/${path}" prefixRelativeUrls(rendered, relativeUrlPrefix) } diff --git a/src/main/scala/view/helpers.scala b/src/main/scala/view/helpers.scala index 4c7ad5b..feb5f21 100644 --- a/src/main/scala/view/helpers.scala +++ b/src/main/scala/view/helpers.scala @@ -27,12 +27,12 @@ def plural(count: Int, singular: String, plural: String = ""): String = 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( - ".md" -> ((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)), - ".adoc" -> ((fileContent, branch, repository, enableWikiLink, enableRefsLink, context) => asciidoc(fileContent, branch, repository, enableWikiLink, enableRefsLink)(context)), - ".asciidoc" -> ((fileContent, branch, repository, enableWikiLink, enableRefsLink, context) => asciidoc(fileContent, branch, repository, enableWikiLink, enableRefsLink)(context)) + ".md" -> ((filePath, 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" -> ((filePath, fileContent, branch, repository, enableWikiLink, enableRefsLink, context) => asciidoc(filePath, 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) @@ -44,13 +44,13 @@ enableWikiLink: Boolean, enableRefsLink: Boolean)(implicit context: app.Context): Html = 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, 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 { - case Some((_, handler)) => handler(fileContent, branch, repository, enableWikiLink, enableRefsLink, context) + case Some((_, handler)) => handler(filePath, fileContent, branch, repository, enableWikiLink, enableRefsLink, context) case None => Html( s"${ fileContent.split("(\\r\\n)|\\n").map(xml.Utility.escape(_)).mkString("
") @@ -59,9 +59,9 @@ } } - 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 = - Html(Asciidoc.toHtml(value, branch, repository, enableWikiLink, enableRefsLink)) + Html(Asciidoc.toHtml(filePath, value, branch, repository, enableWikiLink, enableRefsLink)) /** * Returns <img> which displays the avatar icon for the given user name. diff --git a/src/main/twirl/repo/blob.scala.html b/src/main/twirl/repo/blob.scala.html index 182a334..acb193a 100644 --- a/src/main/twirl/repo/blob.scala.html +++ b/src/main/twirl/repo/blob.scala.html @@ -39,7 +39,7 @@ @if(content.viewType == "text"){ @defining(pathList.reverse.head) { file => @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 {
@content.content.get
} diff --git a/src/main/twirl/repo/files.scala.html b/src/main/twirl/repo/files.scala.html index 5362b14..c7e97e5 100644 --- a/src/main/twirl/repo/files.scala.html +++ b/src/main/twirl/repo/files.scala.html @@ -3,7 +3,7 @@ pathList: List[String], latestCommit: util.JGitUtil.CommitInfo, 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 view.helpers._ @html.main(s"${repository.owner}/${repository.name}", Some(repository)) { @@ -77,10 +77,10 @@ - @readme.map { case(file, content) => + @readme.map { case(filePath, content) =>
-
@file.name
-
@renderMarkup(file.name, content, branch, repository, false, false)
+
@filePath.reverse.head
+
@renderMarkup(filePath, content, branch, repository, false, false)
} }