From 0c0bb9c0c479b0c04e918f1dfb57e2998d0b3ecc Mon Sep 17 00:00:00 2001
From: James Moger <james.moger@gitblit.com>
Date: Mon, 09 Dec 2013 16:37:20 -0500
Subject: [PATCH] Support Markdown image links relative to the repository root (issue-324)

---
 .classpath                                            |    6 +-
 releases.moxie                                        |    3 +
 build.moxie                                           |    2 
 gitblit.iml                                           |   18 ++++----
 src/main/java/com/gitblit/wicket/MarkupProcessor.java |   32 ++++++++++++++++
 5 files changed, 47 insertions(+), 14 deletions(-)

diff --git a/.classpath b/.classpath
index b9367bf..6651e12 100644
--- a/.classpath
+++ b/.classpath
@@ -30,9 +30,9 @@
 	<classpathentry kind="lib" path="ext/lucene-queryparser-4.6.0.jar" sourcepath="ext/src/lucene-queryparser-4.6.0.jar" />
 	<classpathentry kind="lib" path="ext/lucene-sandbox-4.6.0.jar" sourcepath="ext/src/lucene-sandbox-4.6.0.jar" />
 	<classpathentry kind="lib" path="ext/jakarta-regexp-1.4.jar" />
-	<classpathentry kind="lib" path="ext/pegdown-1.4.1.jar" sourcepath="ext/src/pegdown-1.4.1.jar" />
-	<classpathentry kind="lib" path="ext/parboiled-java-1.1.5.jar" sourcepath="ext/src/parboiled-java-1.1.5.jar" />
-	<classpathentry kind="lib" path="ext/parboiled-core-1.1.5.jar" sourcepath="ext/src/parboiled-core-1.1.5.jar" />
+	<classpathentry kind="lib" path="ext/pegdown-1.4.2.jar" sourcepath="ext/src/pegdown-1.4.2.jar" />
+	<classpathentry kind="lib" path="ext/parboiled-java-1.1.6.jar" sourcepath="ext/src/parboiled-java-1.1.6.jar" />
+	<classpathentry kind="lib" path="ext/parboiled-core-1.1.6.jar" sourcepath="ext/src/parboiled-core-1.1.6.jar" />
 	<classpathentry kind="lib" path="ext/asm-4.1.jar" sourcepath="ext/src/asm-4.1.jar" />
 	<classpathentry kind="lib" path="ext/asm-tree-4.1.jar" sourcepath="ext/src/asm-tree-4.1.jar" />
 	<classpathentry kind="lib" path="ext/asm-analysis-4.1.jar" sourcepath="ext/src/asm-analysis-4.1.jar" />
diff --git a/build.moxie b/build.moxie
index 22fdfea..ce3a7e2 100644
--- a/build.moxie
+++ b/build.moxie
@@ -145,7 +145,7 @@
 - compile 'org.apache.lucene:lucene-highlighter:${lucene.version}' :war :fedclient
 - compile 'org.apache.lucene:lucene-memory:${lucene.version}' :war :fedclient
 - compile 'org.apache.lucene:lucene-queryparser:${lucene.version}' :war :fedclient
-- compile 'org.pegdown:pegdown:1.4.1' :war
+- compile 'org.pegdown:pegdown:1.4.2' :war
 - compile 'org.fusesource.wikitext:wikitext-core:${wikitext.version}' :war
 - compile 'org.fusesource.wikitext:twiki-core:${wikitext.version}' :war
 - compile 'org.fusesource.wikitext:textile-core:${wikitext.version}' :war
diff --git a/gitblit.iml b/gitblit.iml
index f1daa9b..6ba4390 100644
--- a/gitblit.iml
+++ b/gitblit.iml
@@ -287,35 +287,35 @@
       </library>
     </orderEntry>
     <orderEntry type="module-library">
-      <library name="pegdown-1.4.1.jar">
+      <library name="pegdown-1.4.2.jar">
         <CLASSES>
-          <root url="jar://$MODULE_DIR$/ext/pegdown-1.4.1.jar!/" />
+          <root url="jar://$MODULE_DIR$/ext/pegdown-1.4.2.jar!/" />
         </CLASSES>
         <JAVADOC />
         <SOURCES>
-          <root url="jar://$MODULE_DIR$/ext/src/pegdown-1.4.1.jar!/" />
+          <root url="jar://$MODULE_DIR$/ext/src/pegdown-1.4.2.jar!/" />
         </SOURCES>
       </library>
     </orderEntry>
     <orderEntry type="module-library">
-      <library name="parboiled-java-1.1.5.jar">
+      <library name="parboiled-java-1.1.6.jar">
         <CLASSES>
-          <root url="jar://$MODULE_DIR$/ext/parboiled-java-1.1.5.jar!/" />
+          <root url="jar://$MODULE_DIR$/ext/parboiled-java-1.1.6.jar!/" />
         </CLASSES>
         <JAVADOC />
         <SOURCES>
-          <root url="jar://$MODULE_DIR$/ext/src/parboiled-java-1.1.5.jar!/" />
+          <root url="jar://$MODULE_DIR$/ext/src/parboiled-java-1.1.6.jar!/" />
         </SOURCES>
       </library>
     </orderEntry>
     <orderEntry type="module-library">
-      <library name="parboiled-core-1.1.5.jar">
+      <library name="parboiled-core-1.1.6.jar">
         <CLASSES>
-          <root url="jar://$MODULE_DIR$/ext/parboiled-core-1.1.5.jar!/" />
+          <root url="jar://$MODULE_DIR$/ext/parboiled-core-1.1.6.jar!/" />
         </CLASSES>
         <JAVADOC />
         <SOURCES>
-          <root url="jar://$MODULE_DIR$/ext/src/parboiled-core-1.1.5.jar!/" />
+          <root url="jar://$MODULE_DIR$/ext/src/parboiled-core-1.1.6.jar!/" />
         </SOURCES>
       </library>
     </orderEntry>
diff --git a/releases.moxie b/releases.moxie
index 9f559af..1e8ce8c 100644
--- a/releases.moxie
+++ b/releases.moxie
@@ -47,6 +47,7 @@
 	- Set Link: <url>; rel="canonical" http header for SEO (issue-304)
 	- Added raw links to the commit, commitdiff, and compare pages (issue-319)
 	- Support intradocument linking in Markdown content using [[WikiLinks]] syntax (issue-324)
+	- Support Markdown image links relative to the repository root (issue-324)
 	- Added filesystem write permission check (issue-345) 
 	- Support rendering confluence, mediawiki, textile, tracwiki, and twiki markup documents
 	- Added setting to globally disable anonymous pushes in the receive pack
@@ -59,7 +60,7 @@
 	- updated to JGit 3.1.0
 	- updated to Lucene 4.6.0
 	- updated to BouncyCastle 1.49
-	- replaced MarkdownPapers with pegdown 1.4.1
+	- replaced MarkdownPapers with pegdown 1.4.2
 	- added Eclipse WikiText libraries for processing confluence, mediawiki, textile, tracwiki, and twiki
     settings:
     - { name: 'git.createRepositoriesShared', defaultValue: 'false' }
diff --git a/src/main/java/com/gitblit/wicket/MarkupProcessor.java b/src/main/java/com/gitblit/wicket/MarkupProcessor.java
index 1a5f553..d834439 100644
--- a/src/main/java/com/gitblit/wicket/MarkupProcessor.java
+++ b/src/main/java/com/gitblit/wicket/MarkupProcessor.java
@@ -15,6 +15,8 @@
  */
 package com.gitblit.wicket;
 
+import static org.pegdown.FastEncoder.encode;
+
 import java.io.Serializable;
 import java.io.StringWriter;
 import java.io.UnsupportedEncodingException;
@@ -40,6 +42,8 @@
 import org.eclipse.mylyn.wikitext.tracwiki.core.TracWikiLanguage;
 import org.eclipse.mylyn.wikitext.twiki.core.TWikiLanguage;
 import org.pegdown.LinkRenderer;
+import org.pegdown.ast.ExpImageNode;
+import org.pegdown.ast.RefImageNode;
 import org.pegdown.ast.WikiLinkNode;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -296,6 +300,34 @@
 	 */
 	private void parse(final MarkupDocument doc, final String repositoryName, final String commitId) {
 		LinkRenderer renderer = new LinkRenderer() {
+
+			@Override
+			public Rendering render(ExpImageNode node, String text) {
+				if (node.url.indexOf("://") == -1) {
+					// repository-relative image link
+					String path = doc.getRelativePath(node.url);
+					String url = getWicketUrl(RawPage.class, repositoryName, commitId, path);
+					return new Rendering(url, text);
+				}
+				// absolute image link
+				return new Rendering(node.url, text);
+			}
+
+			@Override
+			public Rendering render(RefImageNode node, String url, String title, String alt) {
+				Rendering rendering;
+				if (url.indexOf("://") == -1) {
+					// repository-relative image link
+					String path = doc.getRelativePath(url);
+					String wurl = getWicketUrl(RawPage.class, repositoryName, commitId, path);
+					rendering = new Rendering(wurl, alt);
+				} else {
+					// absolute image link
+					rendering = new Rendering(url, alt);
+				}
+				return StringUtils.isEmpty(title) ? rendering : rendering.withAttribute("title", encode(title));
+			}
+
 			@Override
 			public Rendering render(WikiLinkNode node) {
 				String path = doc.getRelativePath(node.getText());

--
Gitblit v1.9.1