package edu.stanford.nlp.sempre.freebase.utils;
public final class FormatConverter {
private FormatConverter() { }
public static final String FULL_FB_PREFIX = "http://rdf.freebase.com/ns/";
public static final String SHORT_FB_PREFIX = "fb:";
public static String fromDotToSlash(String dotString) {
if (dotString.startsWith("http")) {
return dotString.substring(dotString.lastIndexOf('/')).replace('.', '/');
} else {
if (dotString.startsWith("/"))
return dotString;
return "/" + dotString.substring(dotString.indexOf(':') + 1).replace('.', '/');
}
}
public static String toShortPrefix(String str) {
return str.replace(FULL_FB_PREFIX, SHORT_FB_PREFIX);
}
public static String fromNoPrefixMidToDot(String mid) {
if (mid.startsWith("fb:m") || mid.startsWith("/m/"))
throw new RuntimeException("This mid has a prefix: " + mid);
return SHORT_FB_PREFIX + "m." + mid;
}
/** converts from slash notation to dot notation */
public static String fromSlashToDot(String slashString, boolean strict) {
if (!(slashString.charAt(0) == '/')) {
if (strict) {
throw new IllegalArgumentException("Not a legal slash string: " + slashString);
} else
return slashString;
}
return SHORT_FB_PREFIX + slashString.substring(1).replace('/', '.');
}
/**
* convert from <b>[/award/award_winning_work/awards_won,
* /award/award_honor/award_winner]</b> to <b>(lambda x
* (fb:award.award_winning_work.awards_won (fb:award.award_honor.award_winner
* (var x))))</b>
*/
public static String fromCvtBinaryToLispTree(String str) {
boolean reversed = false;
if (str.startsWith("!")) {
reversed = true;
str = str.substring(1);
}
// strip brackets
str = str.substring(1, str.length() - 1);
String[] tokens = str.split(",");
if (tokens.length == 1) {
return reversed ? "!" + fromSlashToDot(tokens[0].trim(), false) : fromSlashToDot(tokens[0].trim(), false);
} else {
String property1 = fromSlashToDot(tokens[0].trim(), false);
String property2 = fromSlashToDot(tokens[1].trim(), false);
return propertiesToCompositeLispTree(property1, property2, reversed);
}
}
public static String propertiesToCompositeLispTree(String property1,
String property2, boolean reversed) {
StringBuilder sb = new StringBuilder();
if (reversed) {
sb.append("(lambda x (!" + property2 + " (!" + property1 + " (var x))))");
} else {
sb.append("(lambda x (" + property1 + " (" + property2 + " (var x))))");
}
return sb.toString();
}
}