diff --git a/src/main/scala/gitbucket/core/view/Markdown.scala b/src/main/scala/gitbucket/core/view/Markdown.scala index aefdef5..5d274f6 100644 --- a/src/main/scala/gitbucket/core/view/Markdown.scala +++ b/src/main/scala/gitbucket/core/view/Markdown.scala @@ -42,22 +42,15 @@ } else s val options = new Options() - Marked.marked(source, options, new GitBucketMarkedRenderer(options)) - -// -// val rootNode = new PegDownProcessor( -// Extensions.AUTOLINKS | Extensions.WIKILINKS | Extensions.FENCED_CODE_BLOCKS | -// Extensions.TABLES | Extensions.HARDWRAPS | Extensions.SUPPRESS_ALL_HTML | Extensions.STRIKETHROUGH -// ).parseMarkdown(source.toCharArray) -// -// new GitBucketHtmlSerializer( -// markdown, repository, enableWikiLink, enableRefsLink, enableAnchor, enableTaskList, -// hasWritePermission, pages -// ).toHtml(rootNode) + val renderer = new GitBucketMarkedRenderer(options, repository, enableWikiLink, enableRefsLink, enableTaskList, hasWritePermission, pages) + Marked.marked(source, options, renderer) } } -class GitBucketMarkedRenderer(options: Options) extends Renderer(options) { +class GitBucketMarkedRenderer(options: Options, repository: RepositoryService.RepositoryInfo, + enableWikiLink: Boolean, enableRefsLink: Boolean, enableTaskList: Boolean, hasWritePermission: Boolean, + pages: List[String]) + (implicit val context: Context) extends Renderer(options) with LinkConverter with RequestCache { override def code(code: String, lang: Optional[String], escaped: Boolean): String = { "
" + @@ -65,7 +58,61 @@ } override def text(text: String): String = { - text + // convert commit id and username to link. + val t1 = if(enableRefsLink) convertRefsLinks(text, repository, "issue:") else text + + // convert task list to checkbox. + val t2 = if(enableTaskList) GitBucketHtmlSerializer.convertCheckBox(t1, hasWritePermission) else t1 + + t2 + } + + override def image(href: String, title: Optional[String], text: String): String = { + super.image(fixUrl(href, true), title, text); + } + + override def nolink(text: String): String = { + if(enableWikiLink && text.startsWith("[") && text.endsWith("]")){ + val link = text.replaceAll("(^\\[\\[|\\]\\]$)", "") + + val (label, page) = if(link.contains('|')){ + val i = link.indexOf('|') + (link.substring(0, i), link.substring(i + 1)) + } else { + (link, link) + } + + val url = repository.httpUrl.replaceFirst("/git/", "/").stripSuffix(".git") + "/wiki/" + StringUtil.urlEncode(page) + if(pages.contains(page)){ + "" + escape(page) + "" + } else { + "" + escape(page) + "" + } + } else { + escape(text) + } + } + + private def fixUrl(url: String, isImage: Boolean = false): String = { + if(url.startsWith("http://") || url.startsWith("https://") || url.startsWith("/")){ + url + } else if(url.startsWith("#")){ + ("#" + GitBucketHtmlSerializer.generateAnchorName(url.substring(1))) + } else if(!enableWikiLink){ + if(context.currentPath.contains("/blob/")){ + url + (if(isImage) "?raw=true" else "") + } else if(context.currentPath.contains("/tree/")){ + val paths = context.currentPath.split("/") + val branch = if(paths.length > 3) paths.drop(4).mkString("/") else repository.repository.defaultBranch + repository.httpUrl.replaceFirst("/git/", "/").stripSuffix(".git") + "/blob/" + branch + "/" + url + (if(isImage) "?raw=true" else "") + } else { + val paths = context.currentPath.split("/") + val branch = if(paths.length > 3) paths.last else repository.repository.defaultBranch + repository.httpUrl.replaceFirst("/git/", "/").stripSuffix(".git") + "/blob/" + branch + "/" + url + (if(isImage) "?raw=true" else "") + } + } else { + repository.httpUrl.replaceFirst("/git/", "/").stripSuffix(".git") + "/wiki/_blob/" + url + } } } @@ -76,50 +123,6 @@ // enableWikiLink: Boolean, // pages: List[String]) extends LinkRenderer with WikiService { // -// override def render(node: WikiLinkNode): Rendering = { -// if(enableWikiLink){ -// try { -// val text = node.getText -// val (label, page) = if(text.contains('|')){ -// val i = text.indexOf('|') -// (text.substring(0, i), text.substring(i + 1)) -// } else { -// (text, text) -// } -// -// val url = repository.httpUrl.replaceFirst("/git/", "/").stripSuffix(".git") + "/wiki/" + StringUtil.urlEncode(page) -// -// if(pages.contains(page)){ -// new Rendering(url, label) -// } else { -// new Rendering(url, label).withAttribute("class", "absent") -// } -// } catch { -// case e: java.io.UnsupportedEncodingException => throw new IllegalStateException -// } -// } else { -// super.render(node) -// } -// } -//} -// -//class GitBucketVerbatimSerializer extends VerbatimSerializer { -// def serialize(node: VerbatimNode, printer: Printer): Unit = { -// printer.println.print("") -// var text: String = node.getText -// while (text.charAt(0) == '\n') { -// printer.print("") -// } -//} -// //class GitBucketHtmlSerializer( // markdown: String, // repository: RepositoryService.RepositoryInfo, @@ -134,11 +137,6 @@ // Map[String, VerbatimSerializer](VerbatimSerializer.DEFAULT -> new GitBucketVerbatimSerializer).asJava // ) with LinkConverter with RequestCache { // -// override protected def printImageTag(rendering: LinkRenderer.Rendering): Unit = { -// printer.print("") -// .print("
") -// text = text.substring(1) -// } -// printer.printEncoded(text) -// printer.print("") -// } -// // override protected def printLink(rendering: LinkRenderer.Rendering): Unit = { // printer.print('<').print('a') // printAttribute("href", fixUrl(rendering.href)) @@ -148,28 +146,6 @@ // printer.print('>').print(rendering.text).print("") // } // -// private def fixUrl(url: String, isImage: Boolean = false): String = { -// if(url.startsWith("http://") || url.startsWith("https://") || url.startsWith("/")){ -// url -// } else if(url.startsWith("#")){ -// ("#" + GitBucketHtmlSerializer.generateAnchorName(url.substring(1))) -// } else if(!enableWikiLink){ -// if(context.currentPath.contains("/blob/")){ -// url + (if(isImage) "?raw=true" else "") -// } else if(context.currentPath.contains("/tree/")){ -// val paths = context.currentPath.split("/") -// val branch = if(paths.length > 3) paths.drop(4).mkString("/") else repository.repository.defaultBranch -// repository.httpUrl.replaceFirst("/git/", "/").stripSuffix(".git") + "/blob/" + branch + "/" + url + (if(isImage) "?raw=true" else "") -// } else { -// val paths = context.currentPath.split("/") -// val branch = if(paths.length > 3) paths.last else repository.repository.defaultBranch -// repository.httpUrl.replaceFirst("/git/", "/").stripSuffix(".git") + "/blob/" + branch + "/" + url + (if(isImage) "?raw=true" else "") -// } -// } else { -// repository.httpUrl.replaceFirst("/git/", "/").stripSuffix(".git") + "/wiki/_blob/" + url -// } -// } -// // private def printAttribute(name: String, value: String): Unit = { // printer.print(' ').print(name).print('=').print('"').print(value).print('"') // }