package com.prezi.spaghetti.javascript;
import com.prezi.spaghetti.ast.ConstEntryNode;
import com.prezi.spaghetti.ast.ConstNode;
import org.apache.commons.lang3.StringEscapeUtils;
import org.apache.commons.lang3.StringUtils;
import java.util.ArrayList;
import java.util.List;
public class JavaScriptConstGeneratorVisitor extends AbstractJavaScriptGeneratorVisitor {
@Override
public String visitConstNode(ConstNode node) {
return embedInPackageStructure(node, new PackagedGenerator<ConstNode>() {
@Override
public String generate(ConstNode node, int indentLevel, String parent) {
final String indent = StringUtils.repeat("\t", indentLevel);
List<String> entries = new ArrayList<String>();
for (ConstEntryNode entry : node.getEntries()) {
entries.add(indent + "\t" + entry.accept(JavaScriptConstGeneratorVisitor.this));
}
return String.format(
"%s%s.%s = {\n" +
"%s\n" +
"%s};\n",
indent, parent, node.getName(),
StringUtils.join(entries, ",\n"),
indent
);
}
});
}
@Override
public String visitConstEntryNode(ConstEntryNode node) {
String value = toPrimitiveString(node.getValue());
return String.format("\"%s\": %s", node.getName(), value);
}
public static String toPrimitiveString(Object value) {
if (value instanceof String) {
return String.format("\"%s\"", StringEscapeUtils.escapeJava((String) value));
} else {
return String.valueOf(value);
}
}
}