package org.textmapper.lapg.ui.settings;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.textmapper.lapg.ui.settings.SettingsTree.TextSource;
import org.textmapper.tool.gen.TMOptions;
public class SettingsPersister {
public static Map<IPath, TMOptions> load(String content) {
SettingsTree<AstInput> tree = SettingsTree.parse(new TextSource(".lapg", content.toCharArray(), 1));
if (tree.getRoot() == null) {
return Collections.emptyMap();
}
Map<IPath, TMOptions> result = new LinkedHashMap<IPath, TMOptions>();
for (AstSettings s : tree.getRoot().getSettingsList()) {
IPath p = new Path(s.getScon());
TMOptions opts = new TMOptions();
for (AstOption o : s.getOptionsList()) {
if (o.getIsVardef()) {
opts.getAdditionalOptions().put(o.getIdentifier(), o.getScon());
} else {
String key = o.getIdentifier();
if (key.equals("no-default-templates")) {
opts.setUseDefaultTemplates(false);
} else if(key.equals("include-folders")) {
List<String> list = o.getStringList();
if(list != null) {
opts.getIncludeFolders().addAll(list);
}
} else if(key.equals("template")) {
String val = o.getScon();
if(val != null) {
opts.setTemplateName(val);
}
}
}
}
result.put(p, opts);
}
return result;
}
public static String serialize(Map<IPath, TMOptions> settings) {
StringBuilder sb = new StringBuilder();
List<IPath> paths = new ArrayList<IPath>(settings.keySet());
Collections.sort(paths, new Comparator<IPath>() {
public int compare(IPath o1, IPath o2) {
return o1.toString().compareTo(o2.toString());
}
});
for (IPath p : paths) {
sb.append("[");
sb.append(p.toString());
sb.append("]\n");
TMOptions opts = settings.get(p);
serialize(opts, sb);
sb.append("\n");
}
return sb.toString();
}
private static void serialize(TMOptions opts, StringBuilder sb) {
if (!opts.isUseDefaultTemplates()) {
sb.append("no-default-templates\n");
}
if (!opts.getIncludeFolders().isEmpty()) {
serialize("include-folders", opts.getIncludeFolders(), sb);
}
if(opts.getTemplateName() != null) {
sb.append("template = ");
serialize(opts.getTemplateName(), sb);
}
if(!opts.getAdditionalOptions().isEmpty()) {
// TODO
}
}
private static void serialize(String title, List<String> list, StringBuilder sb) {
sb.append(title);
sb.append(" = (");
boolean first = true;
for (String s : list) {
if (first) {
first = false;
} else {
sb.append(", ");
}
serialize(s, sb);
}
sb.append(")\n");
}
private static void serialize(String s, StringBuilder sb) {
sb.append("\"");
for (char c : s.toCharArray()) {
switch (c) {
case '\n':
sb.append("\\n");
continue;
case '\r':
sb.append("\\r");
continue;
case '\t':
sb.append("\\t");
continue;
}
if (c < 0x20 || c >= 128) {
sb.append("\\x");
String number = Integer.toString(c, 16);
if(number.length() < 4) {
sb.append("0000".substring(number.length()));
}
sb.append(number);
}
if (c == '"') {
sb.append("\\");
}
sb.append(c);
}
sb.append("\"");
}
}