package flow.netbeans.markdown;
import java.net.MalformedURLException;
import java.net.URISyntaxException;
import java.net.URL;
import org.pegdown.LinkRenderer;
import org.pegdown.ast.AutoLinkNode;
import org.pegdown.ast.ExpLinkNode;
import org.pegdown.ast.MailLinkNode;
import org.pegdown.ast.RefLinkNode;
import org.pegdown.ast.WikiLinkNode;
/**
* Turns pegdown AST link nodes into rendered links, optionally resolving relative URLs to
* absolute URLs using a given base URL.
*
* @author Holger Stenger
*/
public class PreviewLinkRenderer extends LinkRenderer {
/** The base URL against which absolute URLs should be resolved. */
private final URL baseUrl;
/** Indicates whether relative URLs should be resolved against the base URL. */
private final boolean resolveLinkUrls;
/**
* Create a new link renderer that will optionally resolve relative URLs to absolute URLs.
*
* @param baseUrl the base URL against which relative URLs will be resolved.
* @param resolveLinkUrls if true, relative URLs in rendered links will be resolved to
* absolute URLs with the given base URL.
*/
public PreviewLinkRenderer(URL baseUrl, boolean resolveLinkUrls) {
super();
this.baseUrl = baseUrl;
this.resolveLinkUrls = resolveLinkUrls;
}
@Override
public LinkRenderer.Rendering render(AutoLinkNode node) {
return transform(super.render(node));
}
@Override
public LinkRenderer.Rendering render(MailLinkNode node) {
return transform(super.render(node));
}
@Override
public LinkRenderer.Rendering render(WikiLinkNode node) {
return transform(super.render(node));
}
@Override
public LinkRenderer.Rendering render(ExpLinkNode node, String text) {
return transform(super.render(node, text));
}
@Override
public LinkRenderer.Rendering render(RefLinkNode node, String url, String title, String text) {
return transform(super.render(node, url, title, text));
}
/**
* Resolves relative URLs against a base URL to return an absolute URL.
*
* @param uriText the possibly relative URL to resolve
* @return the absolute form of the provided relative URL; if the URL is already absolute, or if it
* would otherwise result in an invalid URL when resolved against the base URL, then the
* original string is returned unmodified
*/
private String resolveUrl(final String uriText) {
try {
return baseUrl.toURI().resolve(uriText).toURL().toExternalForm();
}
catch (URISyntaxException ex) {
}
catch (MalformedURLException ex) {
}
return uriText;
}
/**
* Transforms the rendered link's href URL to its absolute form using a base URL,
* if URL resolution is turned on.
*
* @param rendering the previously rendered link
* @return if URL resolution is turned on and the link is relative, then the rendered
* link with the href URL in its absolute form using the base URL provided to
* this renderer; otherwise the original rendered link
*/
private LinkRenderer.Rendering transform(LinkRenderer.Rendering rendering) {
if (resolveLinkUrls && (rendering.href != null)) {
LinkRenderer.Rendering resolvedRendering = new LinkRenderer.Rendering(
resolveUrl(rendering.href), rendering.text);
for (LinkRenderer.Attribute attr : rendering.attributes) {
resolvedRendering.withAttribute(attr);
}
return resolvedRendering;
} else {
return rendering;
}
}
}