From a7317acec01cde855a9f9f3d2da3dcc49d89aa86 Mon Sep 17 00:00:00 2001
From: James Moger <james.moger@gitblit.com>
Date: Fri, 25 Oct 2013 08:39:56 -0400
Subject: [PATCH] Support for intra-Markdown linking using [[WikiLinks]] syntax (issue-324)
---
src/main/java/com/gitblit/wicket/pages/RepositoryPage.java | 76 ++++++++++++++++++++++++++++++++++----
1 files changed, 68 insertions(+), 8 deletions(-)
diff --git a/src/main/java/com/gitblit/wicket/pages/RepositoryPage.java b/src/main/java/com/gitblit/wicket/pages/RepositoryPage.java
index afbed86..3b1d296 100644
--- a/src/main/java/com/gitblit/wicket/pages/RepositoryPage.java
+++ b/src/main/java/com/gitblit/wicket/pages/RepositoryPage.java
@@ -16,6 +16,8 @@
package com.gitblit.wicket.pages;
import java.io.Serializable;
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Arrays;
@@ -43,6 +45,8 @@
import org.eclipse.jgit.lib.PersonIdent;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.revwalk.RevCommit;
+import org.pegdown.LinkRenderer;
+import org.pegdown.ast.WikiLinkNode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -75,7 +79,7 @@
public abstract class RepositoryPage extends RootPage {
- private final Logger logger = LoggerFactory.getLogger(getClass());
+ protected final Logger logger = LoggerFactory.getLogger(getClass());
private final String PARAM_STAR = "star";
@@ -204,7 +208,7 @@
// conditional links
// per-repository extra page links
- if (model.showReadme || model.useDocs) {
+ if (model.useDocs) {
pages.put("docs", new PageRegistration("gb.docs", DocsPage.class, params, true));
}
if (JGitUtils.getPagesBranch(r) != null) {
@@ -399,6 +403,30 @@
return commit;
}
+ protected String getBestCommitId(RevCommit commit) {
+ String head = null;
+ try {
+ head = r.resolve(getRepositoryModel().HEAD).getName();
+ } catch (Exception e) {
+ }
+
+ String id = commit.getName();
+ if (!StringUtils.isEmpty(head) && head.equals(id)) {
+ // match default branch
+ return Repository.shortenRefName(getRepositoryModel().HEAD);
+ }
+
+ // find first branch match
+ for (RefModel ref : JGitUtils.getLocalBranches(r, false, -1)) {
+ if (ref.getObjectId().getName().equals(id)) {
+ return ref.getName();
+ }
+ }
+
+ // return sha
+ return id;
+ }
+
protected Map<String, SubmoduleModel> getSubmodules(RevCommit commit) {
if (submodules == null) {
submodules = new HashMap<String, SubmoduleModel>();
@@ -482,12 +510,17 @@
add(new RefsPanel("refsPanel", repositoryName, c, JGitUtils.getAllRefs(r, getRepositoryModel().showRemoteBranches)));
}
- protected void addFullText(String wicketId, String text, boolean substituteRegex) {
- String html = StringUtils.escapeForHtml(text, false);
- if (substituteRegex) {
- html = GitBlit.self().processCommitMessage(repositoryName, html);
- } else {
- html = StringUtils.breakLinesForHtml(html);
+ protected void addFullText(String wicketId, String text) {
+ RepositoryModel model = getRepositoryModel();
+ String content = GitBlit.self().processCommitMessage(model, text);
+ String html;
+ switch (model.commitMessageRenderer) {
+ case MARKDOWN:
+ html = MessageFormat.format("<div class='commit_message'>{0}</div>", content);
+ break;
+ default:
+ html = MessageFormat.format("<pre class='commit_message'>{0}</pre>", content);
+ break;
}
add(new Label(wicketId, html).setEscapeModelStrings(false));
}
@@ -615,6 +648,33 @@
return isOwner;
}
+ /**
+ * Returns a Pegdown/Markdown link renderer which renders WikiLinks.
+ *
+ * @return a link renderer
+ */
+ protected LinkRenderer getLinkRenderer() {
+ RevCommit head = JGitUtils.getCommit(r, "HEAD");
+ final String id = getBestCommitId(head);
+ LinkRenderer renderer = new LinkRenderer() {
+ @Override
+ public Rendering render(WikiLinkNode node) {
+ try {
+ String path = URLEncoder.encode(node.getText().replace(' ', '-'), "UTF-8");
+ String name = node.getText();
+ if (name.indexOf('/') > -1) {
+ name = name.substring(name.lastIndexOf('/') + 1);
+ }
+ String url = urlFor(MarkdownPage.class, WicketUtils.newPathParameter(repositoryName, id, path)).toString();
+ return new Rendering(url, name);
+ } catch (UnsupportedEncodingException e) {
+ throw new IllegalStateException();
+ }
+ }
+ };
+ return renderer;
+ }
+
private class SearchForm extends SessionlessForm<Void> implements Serializable {
private static final long serialVersionUID = 1L;
--
Gitblit v1.9.1