package org.krakenapps.docxcod;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.w3c.dom.Node;
public class Directive {
private final Node position;
private final String directiveStr;
public Directive(Node parentNode, String extractDirective) {
this.position = parentNode;
this.directiveStr = extractDirective;
}
public Node getPosition() {
return position;
}
public String getDirectiveString() {
return directiveStr;
}
@SuppressWarnings("unused")
private static Pattern quotedString = Pattern
.compile("[^\\s\"]*\"([^\\\\\"]+|\\\\([btnfr\"'\\\\]|[0-3]?[0-7]{1,2}|u[0-9a-fA-F]{4}))*\"[^\\s\"]*");
private static Pattern MERGEFIELD_PATTERN = Pattern.compile("MERGEFIELD\\s+(?:\"(.*)\"|([^\"].*[^\"]))");
private static String parseMergeField(String in) {
in = replaceUnicodeQuote(in.trim());
Matcher matcher = MERGEFIELD_PATTERN.matcher(in);
if (matcher.find() && matcher.groupCount() > 0) {
String f = matcher.group(1);
if (f == null)
f = matcher.group(2);
f = f.replaceAll("\\s*\\\\\\*\\s*MERGEFORMAT\\s*", "");
f = f.replaceAll("\\\\(.)", "$1");
return f;
} else
return null;
}
private static String replaceUnicodeQuote(String in) {
StringBuilder builder = new StringBuilder();
for (int i = 0; i < in.length(); ++i) {
int type = Character.getType(in.codePointAt(i));
switch (type) {
case Character.FINAL_QUOTE_PUNCTUATION:
case Character.INITIAL_QUOTE_PUNCTUATION:
builder.append('"');
break;
default:
builder.append(in.charAt(i));
break;
}
}
return builder.toString();
}
public static String extractDirective(String nodeValue) {
String result = nodeValue.trim();
if (result.startsWith("MERGEFIELD")) {
result = parseMergeField(result);
}
return result;
}
}