diff --git a/src/main/scala/app/RepositoryViewerController.scala b/src/main/scala/app/RepositoryViewerController.scala index fcc81df..7337c2f 100644 --- a/src/main/scala/app/RepositoryViewerController.scala +++ b/src/main/scala/app/RepositoryViewerController.scala @@ -251,7 +251,7 @@ } - private val readmeFiles = Seq("readme.md", "readme.markdown") + private val readmeFiles = view.helpers.renderableSuffixes.map(suffix => s"readme${suffix}") /** * Provides HTML of the file list. diff --git a/src/main/scala/view/Asciidoc.scala b/src/main/scala/view/Asciidoc.scala new file mode 100644 index 0000000..523f146 --- /dev/null +++ b/src/main/scala/view/Asciidoc.scala @@ -0,0 +1,30 @@ +package view + +import util.StringUtil +import util.ControlUtil._ +import util.Directory._ +import org.parboiled.common.StringUtils +import org.pegdown._ +import org.pegdown.ast._ +import org.pegdown.LinkRenderer.Rendering +import java.text.Normalizer +import java.util.Locale +import scala.collection.JavaConverters._ +import service.{ RequestCache, WikiService } +import org.asciidoctor.{ Asciidoctor, OptionsBuilder, SafeMode } + +object Asciidoc { + + private[this] lazy val asciidoctor = Asciidoctor.Factory.create() + + /** + * Converts Markdown of Wiki pages to HTML. + */ + def toHtml(asciidoc: String, repository: service.RepositoryService.RepositoryInfo, + enableWikiLink: Boolean, enableRefsLink: Boolean)(implicit context: app.Context): String = { + val options = OptionsBuilder.options() + options.safe(SafeMode.SECURE) + asciidoctor.render(asciidoc, options) + } +} + diff --git a/src/main/scala/view/helpers.scala b/src/main/scala/view/helpers.scala index 8dc2adf..a06f97f 100644 --- a/src/main/scala/view/helpers.scala +++ b/src/main/scala/view/helpers.scala @@ -27,6 +27,16 @@ 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, service.RepositoryService.RepositoryInfo, Boolean, Boolean, app.Context) => Html)] = + Seq( + ".md" -> ((fileContent, repository, enableWikiLink, enableRefsLink, context) => markdown(fileContent, repository, enableWikiLink, enableRefsLink)(context)), + ".markdown" -> ((fileContent, repository, enableWikiLink, enableRefsLink, context) => markdown(fileContent, repository, enableWikiLink, enableRefsLink)(context)), + ".adoc" -> ((fileContent, repository, enableWikiLink, enableRefsLink, context) => asciidoc(fileContent, repository, enableWikiLink, enableRefsLink)(context)), + ".asciidoc" -> ((fileContent, repository, enableWikiLink, enableRefsLink, context) => asciidoc(fileContent, repository, enableWikiLink, enableRefsLink)(context)) + ) + + def renderableSuffixes: Seq[String] = renderersBySuffix.map(_._1) + /** * Converts Markdown of Wiki pages to HTML. */ @@ -34,6 +44,21 @@ enableWikiLink: Boolean, enableRefsLink: Boolean)(implicit context: app.Context): Html = Html(Markdown.toHtml(value, repository, enableWikiLink, enableRefsLink)) + def renderMarkup(fileName: String, fileContent: String, + repository: service.RepositoryService.RepositoryInfo, + enableWikiLink: Boolean, enableRefsLink: Boolean)(implicit context: app.Context): Html = { + + val fileNameLower = fileName.toLowerCase + renderersBySuffix.find { case (suffix, _) => fileNameLower.endsWith(suffix) } match { + case Some((_, handler)) => handler(fileContent, repository, enableWikiLink, enableRefsLink, context) + case None => Html("UNSUPPORTED MARKUP TYPE") + } + } + + def asciidoc(value: String, repository: service.RepositoryService.RepositoryInfo, + enableWikiLink: Boolean, enableRefsLink: Boolean)(implicit context: app.Context): Html = + Html(Asciidoc.toHtml(value, repository, enableWikiLink, enableRefsLink)) + /** * Returns <img> which displays the avatar icon for the given user name. * This method looks up Gravatar if avatar icon has not been configured in user settings. diff --git a/src/main/twirl/repo/files.scala.html b/src/main/twirl/repo/files.scala.html index 823298e..814e498 100644 --- a/src/main/twirl/repo/files.scala.html +++ b/src/main/twirl/repo/files.scala.html @@ -80,7 +80,7 @@ @readme.map { case(file, content) =>