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("
")
-// text = text.substring(1)
-// }
-// printer.printEncoded(text)
-// 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("
")
-// }
-//
// 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('"')
// }