blob: 51006c8d66ddf7f7efe97afc252dd2e6b6a38853 [file] [log] [blame]
package com.atlassian.uwc.converters.dokuwiki;
import java.io.File;
import java.util.HashMap;
import java.util.Vector;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.log4j.Logger;
import com.atlassian.uwc.converters.tikiwiki.RegexUtil;
import com.atlassian.uwc.ui.Page;
public class HierarchyLinkConverter extends HierarchyTarget {
private String origPageTitle;
Logger log = Logger.getLogger(this.getClass());
public void convert(Page page) {
log.debug("Link Conversion --- Start");
String input = page.getOriginalText();
origPageTitle = page.getName();
String current = getCurrentPath(page);
String spacekey = getSpacekey(page);
log.debug("current: '" + current + "' spacekey: '" + spacekey + "'");
String relativePath = getRelativePath(page);
String converted = convertLink(input, current, spacekey, relativePath);
page.setConvertedText(converted);
log.debug("Link Conversion --- Completed");
}
public String getSpacekey(Page page) {
if (page != null && page.getSpacekey() != null) {
return page.getSpacekey();
}
return getProperties().getProperty("spacekey", null);
}
Pattern link = Pattern.compile("(?<=\\[)\\[([^\\]]*)\\](?=\\])");
Pattern onecolon = Pattern.compile("^([^:]*:)([^:]*)$");
protected String convertLink(String input) {
return convertLink(input, null, getSpacekey(null), "");
}
protected String convertLink(String input, String currentPath, String spacekey, String pagepath) {
Matcher linkFinder = link.matcher(input);
String currentSpacekey = spacekey;
Vector<String> allspaces = getSpaces();
HashMap<String,String> namespaces = getDokuDirectories();
StringBuffer sb = new StringBuffer();
boolean found = false;
while (linkFinder.find()) {
found = true;
String target = linkFinder.group(1);
log.debug("link target orig: " + target);
String alias = null;
if (target.startsWith("\\\\")) continue; //UNC link
if (target.contains("|")) {
String[] parts = target.split("\\|");
target = parts[0];
alias = parts[1];
}
//FIXME anchors? we're not ready to transform these, so just get rid of the anchor part
if (target.contains("#")) target = target.replaceAll("#[^|]*", "");
log.debug("target: '" + target + "' and alias: '" + alias + "'");
//remove any opening colons (:namespace:page)
target = target.trim();
if (!isExternal(target)) {
if (target.startsWith(".")) {
target = target.replaceAll("^[.]*", "");
if (currentPath != null && !currentPath.equals(currentSpacekey)) { //need to add hierarchy in
String pre = currentPath.replaceAll("\\/", ":");
// log.debug("pre = " +pre);
if (pre.endsWith(".txt")) {
pre = pre.replaceFirst("[.]txt$", "");
String sibling = target.replaceFirst(":[^:]+$", "");
// log.debug("sibling = " +sibling);
if (pre.endsWith(sibling)) {
target = target.replaceFirst("^:[^:]+:", "");
}
}
target = pre + ":" + target;
}
}
if (target.startsWith(":")) target = target.replaceFirst(":", "");
//figure out if we've already got the space represented
String targetPart1 = target.replaceFirst(":[^:]+$", "");
boolean containsSpace = false;
if (namespaces.containsKey(target.replaceAll(":", "/"))) {
targetPart1 = target;
}
if (allspaces.contains(targetPart1))
containsSpace = true;
// log.debug("--LinkConverter");
// log.debug("targetPart1 =" + targetPart1);
//get rid of unnecessary links to start
//(start page content will be moved to parent in DokuwikiHierarchy
//unless the start page is a top level page in the space)
boolean isOne = (onecolon.matcher(target)).matches();
if (!(containsSpace && isOne))
target = target.replaceFirst(":start$", "");
if (containsSpace) //remove the space from the target for now
target = target.replaceFirst("\\Q"+targetPart1+"\\E:", "");
String hierarchy = target; //save for later
//is there a meta title to be used?
// log.debug("pagepath = " + pagepath);
String origMetaFilename = getMetaFilename(pagepath, ".meta");
String metaFilename = origMetaFilename;
// log.debug("isOne = " + isOne + ", target = " + target + ", metaFilename = " + metaFilename);
metaFilename = getTargetMetaFilename(target, metaFilename, isOne);
// log.debug("metaFilename = " + metaFilename);
String metatitle = HierarchyTitleConverter.getMetaTitle(metaFilename);
log.debug("metatitle = " + metatitle);
//get confluence page name and fix the case to match HierarchyTitleConverter
if (metatitle == null || "".equals(metatitle))
target = target.replaceFirst("^.*:", ""); //remove everything to the last colon
else //title was set with metadata
target = metatitle;
target = HierarchyTitleConverter.fixTitle(target); //foo_bar becomes Foo Bar
//fix collisions
String linkSpacekey = currentSpacekey;
targetPart1 = targetPart1.replaceAll(":+", File.separator);
// log.debug("containsSpace: " + containsSpace + ", " +
// "ns: "+ namespaces.containsKey(targetPart1)
// +", tp1: '" + targetPart1+"'");
if (!containsSpace && namespaces.containsKey(targetPart1)) {
linkSpacekey = namespaces.get(targetPart1);
log.debug("linkSpacekey = " + linkSpacekey);
}
if (containsSpace) linkSpacekey = targetPart1;
target = fixCollisions(target, hierarchy, linkSpacekey, metaFilename);
//underscores to spaces
target = target.replaceAll("_", " ");
//add spacekey to target if necessary
if (!target.contains(":") || containsSpace)
target = linkSpacekey + ":" + target;
blogLinkReport(namespaces, targetPart1, origMetaFilename, spacekey, target);
log.debug("link target = " + target);
}
//build complete link
String replacement = (alias == null)?
target:
alias.trim() + "|" + target;
//replace
replacement = RegexUtil.handleEscapesInReplacement(replacement);
linkFinder.appendReplacement(sb, replacement);
}
if (found) {
linkFinder.appendTail(sb);
return sb.toString();
}
return input;
}
private void blogLinkReport(HashMap<String, String> namespaces,
String ns, String pageMetaFilename,
String spacekey, String linktarget) {
if (namespaces.containsKey(ns)) {
String nsString = getProperties().getProperty("blog-namespaces", null);
if (BlogConverter.namespaceIsBlog(ns, nsString)) {
String pagetitle = HierarchyTitleConverter.getMetaTitle(pageMetaFilename);
if (pagetitle == null || "".equals(pagetitle))
pagetitle = origPageTitle;
pagetitle = HierarchyTitleConverter.fixTitle(pagetitle);
log.info("Blog Link Report - page: '" + pagetitle + "' " +
"in space: '" + spacekey + "' " +
"linking to: '" + linktarget + "'");
}
}
}
protected String getTargetMetaFilename(String target, String metaFilename, boolean isOne) {
target=target.replaceAll(":+", File.separator);
if (!target.startsWith(File.separator)) target = File.separator + target;
if (!isOne) {
String metadir = getProperties().getProperty("meta-dir", null);
return metadir + target + ".meta";
}
Matcher metaFinder = metaFile.matcher(metaFilename);
StringBuffer sb = new StringBuffer();
boolean found = false;
if (metaFinder.find()) {
found = true;
String replacement = target + metaFinder.group(3);
replacement = RegexUtil.handleEscapesInReplacement(replacement);
metaFinder.appendReplacement(sb, replacement);
}
if (found) {
metaFinder.appendTail(sb);
return sb.toString();
}
return null;
}
Pattern protocol = Pattern.compile("(https?:)|(ftp:)");
private boolean isExternal(String target) {
Matcher protocolFinder = protocol.matcher(target);
return protocolFinder.lookingAt();
}
}