Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Dot fixes #621

Merged
merged 9 commits into from Jul 7, 2012
57 changes: 34 additions & 23 deletions ImportPlugin/src/org/gephi/io/importer/plugin/file/ImporterDOT.java
Expand Up @@ -75,6 +75,12 @@ public class ImporterDOT implements FileImporter, LongTask {
private Map<String, Color> colorTable = new HashMap<String, Color>();
private String graphName = "";

private static class ParseException extends RuntimeException {
public ParseException() {
super("Parse error while parsing DOT file");
}
}

public boolean execute(ContainerLoader container) {
this.container = container;
this.report = new Report();
Expand Down Expand Up @@ -191,6 +197,27 @@ protected NodeDraft getOrCreateNode(String id) {
return container.getNode(id);
}

protected Color parseColor(StreamTokenizer streamTokenizer) throws Exception {
if (streamTokenizer.ttype == '#') {
streamTokenizer.nextToken();
return new Color(Integer.parseInt(streamTokenizer.sval, 16), true);
} else if (streamTokenizer.ttype == '"' && streamTokenizer.sval.startsWith("#")) {
return new Color(Integer.parseInt(streamTokenizer.sval.substring(1), 16), true);
} else if (streamTokenizer.ttype != StreamTokenizer.TT_WORD && streamTokenizer.ttype != '"') {
throw new ParseException();
} else if (colorTable.containsKey(streamTokenizer.sval)) {
return colorTable.get(streamTokenizer.sval);
} else {
String[] colors = streamTokenizer.sval.split(" ");
if (colors.length != 3)
colors = streamTokenizer.sval.split(",");
if (colors.length != 3)
throw new ParseException();

return Color.getHSBColor(Float.parseFloat(colors[0]), Float.parseFloat(colors[1]), Float.parseFloat(colors[2]));
}
}

protected void nodeAttributes(StreamTokenizer streamTokenizer, final NodeDraft nodeDraft) throws Exception {
streamTokenizer.nextToken();

Expand All @@ -216,17 +243,9 @@ protected void nodeAttributes(StreamTokenizer streamTokenizer, final NodeDraft n
streamTokenizer.nextToken();
if (streamTokenizer.ttype == '=') {
streamTokenizer.nextToken();
if (streamTokenizer.ttype == StreamTokenizer.TT_WORD || streamTokenizer.ttype == '"') {
if (colorTable.containsKey(streamTokenizer.sval)) {
nodeDraft.setColor(colorTable.get(streamTokenizer.sval));
} else {
try {
String[] colors = streamTokenizer.sval.split(" ");
nodeDraft.setColor(Float.parseFloat(colors[0]), Float.parseFloat(colors[1]), Float.parseFloat(colors[2]));
} catch (Exception e) {
}
}
} else {
try {
nodeDraft.setColor(parseColor(streamTokenizer));
} catch (ParseException e) {
report.logIssue(new Issue(NbBundle.getMessage(ImporterDOT.class, "importerDOT_error_colorunreachable", streamTokenizer.lineno()), Issue.Level.WARNING));
streamTokenizer.pushBack();
}
Expand Down Expand Up @@ -363,18 +382,10 @@ protected void edgeAttributes(StreamTokenizer streamTokenizer, final EdgeDraft e
streamTokenizer.nextToken();
if (streamTokenizer.ttype == '=') {
streamTokenizer.nextToken();
if (streamTokenizer.ttype == StreamTokenizer.TT_WORD || streamTokenizer.ttype == '"') {
if (colorTable.containsKey(streamTokenizer.sval)) {
edge.setColor(colorTable.get(streamTokenizer.sval));
} else {
try {
String[] colors = streamTokenizer.sval.split(" ");
edge.setColor(Float.parseFloat(colors[0]), Float.parseFloat(colors[1]), Float.parseFloat(colors[2]));
} catch (Exception e) {
}
}
} else {
report.logIssue(new Issue(NbBundle.getMessage(ImporterDOT.class, "importerDOT_color_labelunreachable", streamTokenizer.lineno()), Issue.Level.WARNING));
try {
edge.setColor(parseColor(streamTokenizer));
} catch (ParseException e) {
report.logIssue(new Issue(NbBundle.getMessage(ImporterDOT.class, "importerDOT_error_colorunreachable", streamTokenizer.lineno()), Issue.Level.WARNING));
streamTokenizer.pushBack();
}
} else {
Expand Down