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 |   31 +++++++++++++++++++++++++++++++
 1 files changed, 31 insertions(+), 0 deletions(-)

diff --git a/src/main/java/com/gitblit/wicket/pages/RepositoryPage.java b/src/main/java/com/gitblit/wicket/pages/RepositoryPage.java
index 2df0a0e..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;
 
@@ -644,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