From d2d0c66bc2fa9c030fe19b6a6da4f153fe8a2f77 Mon Sep 17 00:00:00 2001 From: James Moger <james.moger@gitblit.com> Date: Tue, 11 Mar 2014 10:02:28 -0400 Subject: [PATCH] Workaround pegdown bug and improve relative image path processing --- src/main/java/com/gitblit/wicket/MarkupProcessor.java | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 59 insertions(+), 1 deletions(-) diff --git a/src/main/java/com/gitblit/wicket/MarkupProcessor.java b/src/main/java/com/gitblit/wicket/MarkupProcessor.java index d834439..ff6fbce 100644 --- a/src/main/java/com/gitblit/wicket/MarkupProcessor.java +++ b/src/main/java/com/gitblit/wicket/MarkupProcessor.java @@ -24,6 +24,7 @@ import java.text.MessageFormat; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -41,10 +42,14 @@ import org.eclipse.mylyn.wikitext.textile.core.TextileLanguage; import org.eclipse.mylyn.wikitext.tracwiki.core.TracWikiLanguage; import org.eclipse.mylyn.wikitext.twiki.core.TWikiLanguage; +import org.pegdown.DefaultVerbatimSerializer; import org.pegdown.LinkRenderer; +import org.pegdown.ToHtmlSerializer; +import org.pegdown.VerbatimSerializer; import org.pegdown.ast.ExpImageNode; import org.pegdown.ast.RefImageNode; import org.pegdown.ast.WikiLinkNode; +import org.pegdown.plugins.ToHtmlSerializerPlugin; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -56,6 +61,7 @@ import com.gitblit.utils.StringUtils; import com.gitblit.wicket.pages.DocPage; import com.gitblit.wicket.pages.RawPage; +import com.google.common.base.Joiner; /** * Processes markup content and generates html with repository-relative page and @@ -390,7 +396,59 @@ } String getRelativePath(String ref) { - return ref.charAt(0) == '/' ? ref.substring(1) : (getCurrentPath() + ref); + if (ref.charAt(0) == '/') { + // absolute path in repository + return ref.substring(1); + } else { + // resolve relative repository path + String cp = getCurrentPath(); + if (StringUtils.isEmpty(cp)) { + return ref; + } + // this is a simple relative path resolver + List<String> currPathStrings = new ArrayList<String>(Arrays.asList(cp.split("/"))); + String file = ref; + while (file.startsWith("../")) { + // strip ../ from the file reference + // drop the last path element + file = file.substring(3); + currPathStrings.remove(currPathStrings.size() - 1); + } + currPathStrings.add(file); + String path = Joiner.on("/").join(currPathStrings); + return path; + } } } + + /** + * This class implements a workaround for a bug reported in issue-379. + * The bug was introduced by my own pegdown pull request #115. + * + * @author James Moger + * + */ + public static class WorkaroundHtmlSerializer extends ToHtmlSerializer { + + public WorkaroundHtmlSerializer(final LinkRenderer linkRenderer) { + super(linkRenderer, + Collections.<String, VerbatimSerializer>singletonMap(VerbatimSerializer.DEFAULT, DefaultVerbatimSerializer.INSTANCE), + Collections.<ToHtmlSerializerPlugin>emptyList()); + } + private void printAttribute(String name, String value) { + printer.print(' ').print(name).print('=').print('"').print(value).print('"'); + } + + /* Reimplement print image tag to eliminate a trailing double-quote */ + @Override + protected void printImageTag(LinkRenderer.Rendering rendering) { + printer.print("<img"); + printAttribute("src", rendering.href); + printAttribute("alt", rendering.text); + for (LinkRenderer.Attribute attr : rendering.attributes) { + printAttribute(attr.name, attr.value); + } + printer.print("/>"); + } + } } -- Gitblit v1.9.1