mirror of
				https://github.com/gitbucket/gitbucket.git
				synced 2025-10-31 18:46:28 +01:00 
			
		
		
		
	Support relative links in asciidoc files.
This commit is contained in:
		| @@ -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 | ||||||
|   | |||||||
| @@ -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) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -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 <img> which displays the avatar icon for the given user name. |    * Returns <img> which displays the avatar icon for the given user name. | ||||||
|   | |||||||
| @@ -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> | ||||||
|             } |             } | ||||||
|   | |||||||
| @@ -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> | ||||||
|   } |   } | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user