package view import org.parboiled.common.StringUtils import org.pegdown._ import org.pegdown.ast._ import org.pegdown.LinkRenderer.Rendering import scala.collection.JavaConverters._ object Markdown { /** * Converts Markdown of Wiki pages to HTML. */ def toHtml(markdown: String, repository: service.RepositoryService.RepositoryInfo, enableWikiLink: Boolean, enableCommitLink: Boolean, enableIssueLink: Boolean)(implicit context: app.Context): String = { val rootNode = new PegDownProcessor( Extensions.AUTOLINKS | Extensions.WIKILINKS | Extensions.FENCED_CODE_BLOCKS | Extensions.TABLES ).parseMarkdown(markdown.toCharArray) new GitBucketHtmlSerializer(markdown, context, repository, enableWikiLink, enableCommitLink, enableIssueLink).toHtml(rootNode) } } class GitBucketLinkRender(context: app.Context, repository: service.RepositoryService.RepositoryInfo, enableWikiLink: Boolean) extends LinkRenderer { override def render(node: WikiLinkNode): Rendering = { if(enableWikiLink){ super.render(node) } else { 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 = "%s/%s/%s/wiki/%s".format(context.path, repository.owner, repository.name, java.net.URLEncoder.encode(page.replace(' ', '-'), "UTF-8")) new Rendering(url, label) } catch { case e: java.io.UnsupportedEncodingException => throw new IllegalStateException(); } } } } class GitBucketVerbatimSerializer extends VerbatimSerializer { def serialize(node: VerbatimNode, printer: Printer) { 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,
context: app.Context,
repository: service.RepositoryService.RepositoryInfo,
enableWikiLink: Boolean,
enableCommitLink: Boolean,
enableIssueLink: Boolean
) extends ToHtmlSerializer(
new GitBucketLinkRender(context, repository, enableWikiLink),
Map[String, VerbatimSerializer](VerbatimSerializer.DEFAULT -> new GitBucketVerbatimSerializer).asJava
) {
override def toHtml(rootNode: RootNode): String = {
val html = super.toHtml(rootNode)
if(enableIssueLink){
// convert marked issue id to link.
html.replaceAll("#\\{\\{\\{\\{(\\d+)\\}\\}\\}\\}",
"#$1".format(context.path, repository.owner, repository.name))
} else html
}
override protected def printImageTag(imageNode: SuperNode, url: String): Unit =
printer.print("