James Moger
2013-12-09 0c0bb9c0c479b0c04e918f1dfb57e2998d0b3ecc
Support Markdown image links relative to the repository root (issue-324)

Change-Id: I8bad02b26a20636e4fc3d1f0ab0a16f0bacc7bf1
5 files modified
61 ■■■■ changed files
.classpath 6 ●●●● patch | view | raw | blame | history
build.moxie 2 ●●● patch | view | raw | blame | history
gitblit.iml 18 ●●●● patch | view | raw | blame | history
releases.moxie 3 ●●●● patch | view | raw | blame | history
src/main/java/com/gitblit/wicket/MarkupProcessor.java 32 ●●●●● patch | view | raw | blame | history
.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" />
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
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>
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' }
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());