Rewrite relative links to reflect the base url of the repo.

This commit is contained in:
Tobias Roeser
2014-03-04 11:38:56 +01:00
parent 0311359922
commit 3db3bf1b74
4 changed files with 50 additions and 25 deletions

View File

@@ -1,17 +1,14 @@
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, Attributes, AttributesBuilder, OptionsBuilder, SafeMode }
import org.asciidoctor.Asciidoctor
import org.asciidoctor.AttributesBuilder
import org.asciidoctor.OptionsBuilder
import org.asciidoctor.SafeMode
import org.htmlcleaner.HtmlCleaner
import org.htmlcleaner.HtmlNode
import org.htmlcleaner.SimpleHtmlSerializer
import org.htmlcleaner.TagNode
import org.htmlcleaner.TagNodeVisitor
object Asciidoc {
@@ -20,14 +17,41 @@ object Asciidoc {
/**
* Converts Markdown of Wiki pages to HTML.
*/
def toHtml(asciidoc: String, repository: service.RepositoryService.RepositoryInfo,
def toHtml(asciidoc: String, branch: String, repository: service.RepositoryService.RepositoryInfo,
enableWikiLink: Boolean, enableRefsLink: Boolean)(implicit context: app.Context): String = {
val options = OptionsBuilder.options()
options.safe(SafeMode.SECURE)
val attributes = AttributesBuilder.attributes()
attributes.showTitle(true)
options.attributes(attributes.get())
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 relativeUrlPrefix = s"${helpers.url(repository)}/blob/${branch}/"
prefixRelativeUrls(rendered, relativeUrlPrefix)
}
def prefixRelativeUrls(html: String, urlPrefix: String): String = {
val cleaner = new HtmlCleaner()
val node = cleaner.clean(html)
node.traverse(new TagNodeVisitor() {
override def visit(tagNode: TagNode, htmlNode: HtmlNode): Boolean = {
htmlNode match {
case tag: TagNode if tag.getName == "a" =>
Option(tag.getAttributeByName("href")) foreach { href =>
if (!href.startsWith("/") && !href.startsWith("http://") && !href.startsWith("https://")) {
tag.addAttribute("href", s"${urlPrefix}${href}")
}
}
case _ =>
}
// continue traversal
true
}
})
new SimpleHtmlSerializer(cleaner.getProperties()).getAsString(node)
}
}