Add option to disable anchor for headline in markdown

This commit is contained in:
Naoki Takezoe
2015-06-28 03:20:55 +09:00
parent 869eaf8cfd
commit 0fe062a02f
6 changed files with 27 additions and 12 deletions

View File

@@ -20,7 +20,7 @@ trait Renderer {
object MarkdownRenderer extends Renderer { object MarkdownRenderer extends Renderer {
override def render(request: RenderRequest): Html = { override def render(request: RenderRequest): Html = {
import request._ import request._
Html(Markdown.toHtml(fileContent, repository, enableWikiLink, enableRefsLink)(context)) Html(Markdown.toHtml(fileContent, repository, enableWikiLink, enableRefsLink, enableAnchor)(context))
} }
} }
@@ -41,4 +41,5 @@ case class RenderRequest(filePath: List[String],
repository: RepositoryService.RepositoryInfo, repository: RepositoryService.RepositoryInfo,
enableWikiLink: Boolean, enableWikiLink: Boolean,
enableRefsLink: Boolean, enableRefsLink: Boolean,
enableAnchor: Boolean,
context: Context) context: Context)

View File

@@ -75,7 +75,7 @@ class Mailer(private val smtp: Smtp) extends Notifier {
database withSession { implicit session => database withSession { implicit session =>
defining( defining(
s"[${r.name}] ${issue.title} (#${issue.issueId})" -> s"[${r.name}] ${issue.title} (#${issue.issueId})" ->
msg(Markdown.toHtml(content, r, false, true))) { case (subject, msg) => msg(Markdown.toHtml(content, r, false, true, false))) { case (subject, msg) =>
recipients(issue) { to => recipients(issue) { to =>
val email = new HtmlEmail val email = new HtmlEmail
email.setHostName(smtp.host) email.setHostName(smtp.host)

View File

@@ -18,11 +18,20 @@ object Markdown {
/** /**
* Converts Markdown of Wiki pages to HTML. * Converts Markdown of Wiki pages to HTML.
*
* @param repository the repository which contains the markdown
* @param enableWikiLink if true then wiki style link is available in markdown
* @param enableRefsLink if true then issue reference (e.g. #123) is rendered as link
* @param enableAnchor if true then anchor for headline is generated
* @param enableTaskList if true then task list syntax is available
* @param hasWritePermission
* @param pages the list of existing Wiki pages
*/ */
def toHtml(markdown: String, def toHtml(markdown: String,
repository: RepositoryService.RepositoryInfo, repository: RepositoryService.RepositoryInfo,
enableWikiLink: Boolean, enableWikiLink: Boolean,
enableRefsLink: Boolean, enableRefsLink: Boolean,
enableAnchor: Boolean,
enableTaskList: Boolean = false, enableTaskList: Boolean = false,
hasWritePermission: Boolean = false, hasWritePermission: Boolean = false,
pages: List[String] = Nil)(implicit context: Context): String = { pages: List[String] = Nil)(implicit context: Context): String = {
@@ -41,7 +50,7 @@ object Markdown {
Extensions.AUTOLINKS | Extensions.WIKILINKS | Extensions.FENCED_CODE_BLOCKS | Extensions.TABLES | Extensions.HARDWRAPS | Extensions.SUPPRESS_ALL_HTML Extensions.AUTOLINKS | Extensions.WIKILINKS | Extensions.FENCED_CODE_BLOCKS | Extensions.TABLES | Extensions.HARDWRAPS | Extensions.SUPPRESS_ALL_HTML
).parseMarkdown(source.toCharArray) ).parseMarkdown(source.toCharArray)
new GitBucketHtmlSerializer(markdown, repository, enableWikiLink, enableRefsLink, enableTaskList, hasWritePermission, pages).toHtml(rootNode) new GitBucketHtmlSerializer(markdown, repository, enableWikiLink, enableRefsLink, enableAnchor, enableTaskList, hasWritePermission, pages).toHtml(rootNode)
} }
} }
@@ -101,6 +110,7 @@ class GitBucketHtmlSerializer(
enableWikiLink: Boolean, enableWikiLink: Boolean,
enableRefsLink: Boolean, enableRefsLink: Boolean,
enableTaskList: Boolean, enableTaskList: Boolean,
enableAnchor: Boolean,
hasWritePermission: Boolean, hasWritePermission: Boolean,
pages: List[String] pages: List[String]
)(implicit val context: Context) extends ToHtmlSerializer( )(implicit val context: Context) extends ToHtmlSerializer(
@@ -152,11 +162,15 @@ class GitBucketHtmlSerializer(
val tag = s"h${node.getLevel}" val tag = s"h${node.getLevel}"
val headerTextString = printChildrenToString(node) val headerTextString = printChildrenToString(node)
val anchorName = GitBucketHtmlSerializer.generateAnchorName(headerTextString) val anchorName = GitBucketHtmlSerializer.generateAnchorName(headerTextString)
printer.print(s"""<$tag class="markdown-head">""") if(enableAnchor){
printer.print(s"""<a class="markdown-anchor-link" href="#$anchorName"></a>""") printer.print(s"""<$tag class="markdown-head">""")
printer.print(s"""<a class="markdown-anchor" name="$anchorName"></a>""") printer.print(s"""<a class="markdown-anchor-link" href="#$anchorName"></a>""")
printer.print(s"""<a class="markdown-anchor" name="$anchorName"></a>""")
}
visitChildren(node) visitChildren(node)
printer.print(s"</$tag>") if(enableAnchor){
printer.print(s"</$tag>")
}
} }
override def visit(node: HeaderNode): Unit = { override def visit(node: HeaderNode): Unit = {

View File

@@ -91,16 +91,16 @@ object helpers extends AvatarImageProvider with LinkConverter with RequestCache
enableTaskList: Boolean = false, enableTaskList: Boolean = false,
hasWritePermission: Boolean = false, hasWritePermission: Boolean = false,
pages: List[String] = Nil)(implicit context: Context): Html = pages: List[String] = Nil)(implicit context: Context): Html =
Html(Markdown.toHtml(value, repository, enableWikiLink, enableRefsLink, enableTaskList, hasWritePermission, pages)) Html(Markdown.toHtml(value, repository, enableWikiLink, enableRefsLink, enableTaskList, true, hasWritePermission, pages))
def renderMarkup(filePath: List[String], fileContent: String, branch: String, def renderMarkup(filePath: List[String], fileContent: String, branch: String,
repository: RepositoryService.RepositoryInfo, repository: RepositoryService.RepositoryInfo,
enableWikiLink: Boolean, enableRefsLink: Boolean)(implicit context: Context): Html = { enableWikiLink: Boolean, enableRefsLink: Boolean, enableAnchor: Boolean)(implicit context: Context): Html = {
val fileName = filePath.reverse.head.toLowerCase val fileName = filePath.reverse.head.toLowerCase
val extension = FileUtil.getExtension(fileName) val extension = FileUtil.getExtension(fileName)
val renderer = PluginRegistry().getRenderer(extension) val renderer = PluginRegistry().getRenderer(extension)
renderer.render(RenderRequest(filePath, fileContent, branch, repository, enableWikiLink, enableRefsLink, context)) renderer.render(RenderRequest(filePath, fileContent, branch, repository, enableWikiLink, enableRefsLink, enableAnchor, context))
} }
def isRenderable(fileName: String): Boolean = { def isRenderable(fileName: String): Boolean = {

View File

@@ -78,7 +78,7 @@
@defining(isRenderable(pathList.reverse.head)){ isRrenderable => @defining(isRenderable(pathList.reverse.head)){ isRrenderable =>
@if(!isBlame && isRrenderable) { @if(!isBlame && isRrenderable) {
<div class="box-content markdown-body" style="border: none; padding-left: 16px; padding-right: 16px;"> <div class="box-content markdown-body" style="border: none; padding-left: 16px; padding-right: 16px;">
@renderMarkup(pathList, content.content.get, branch, repository, false, false) @renderMarkup(pathList, content.content.get, branch, repository, false, false, true)
</div> </div>
} else { } else {
<pre class="prettyprint linenums blob @if(!isRrenderable){ no-renderable } ">@content.content.get</pre> <pre class="prettyprint linenums blob @if(!isRrenderable){ no-renderable } ">@content.content.get</pre>

View File

@@ -128,7 +128,7 @@
@readme.map { case(filePath, content) => @readme.map { case(filePath, content) =>
<div id="readme"> <div id="readme">
<div class="box-header">@filePath.reverse.head</div> <div class="box-header">@filePath.reverse.head</div>
<div class="box-content markdown-body">@renderMarkup(filePath, content, branch, repository, false, false)</div> <div class="box-content markdown-body">@renderMarkup(filePath, content, branch, repository, false, false, true)</div>
</div> </div>
} }
} }