mirror of
https://github.com/gitbucket/gitbucket.git
synced 2025-11-12 16:35:52 +01:00
Add option to disable anchor for headline in markdown
This commit is contained in:
@@ -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)
|
||||||
@@ -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)
|
||||||
|
|||||||
@@ -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 = {
|
||||||
|
|||||||
@@ -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 = {
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user