diff --git a/exercises/practice/sgf-parsing/.meta/config.json b/exercises/practice/sgf-parsing/.meta/config.json index aec3220c4..a793a42b4 100644 --- a/exercises/practice/sgf-parsing/.meta/config.json +++ b/exercises/practice/sgf-parsing/.meta/config.json @@ -2,6 +2,10 @@ "authors": [ "tlphat" ], + "contributors": [ + "jagdish-15", + "kahgoh" + ], "files": { "solution": [ "src/main/java/SgfParsing.java" diff --git a/exercises/practice/sgf-parsing/.meta/src/reference/java/SgfParsing.java b/exercises/practice/sgf-parsing/.meta/src/reference/java/SgfParsing.java index 94422d3e7..6a9f4d684 100644 --- a/exercises/practice/sgf-parsing/.meta/src/reference/java/SgfParsing.java +++ b/exercises/practice/sgf-parsing/.meta/src/reference/java/SgfParsing.java @@ -29,26 +29,52 @@ private int parseFromIndex(String input, int index, SgfNode root) throws SgfPars StringBuilder buffer = new StringBuilder(); Map> properties = new HashMap<>(); String key = null; + boolean escape = false; + boolean inValue = false; while (index < input.length()) { - switch (input.charAt(index)) { - case '(': - index = addNewChild(input, index, root); - break; - case ')': - break; - case '[': - key = loadKeyFromBuffer(buffer, properties); - break; - case ']': - properties.get(key).add(popStringFromBuffer(buffer)); - if (input.charAt(index + 1) == ')') { - root.setProperties(properties); - return index + 1; - } - index = examineNextNode(input, index, root, properties); - break; - default: - index = appendCharToBuffer(input, index, buffer); + char nextChar = input.charAt(index); + if (escape) { + if (nextChar != '\n') { + appendChar(buffer, nextChar); + } + escape = false; + } else { + switch (nextChar) { + case '(': + if (inValue) { + buffer.append(nextChar); + } else { + index = addNewChild(input, index, root); + } + break; + case ')': + if (inValue) { + buffer.append(nextChar); + } + break; + case '[': + if (inValue) { + buffer.append(nextChar); + } else { + key = loadKeyFromBuffer(buffer, properties); + inValue = true; + } + break; + case ']': + properties.get(key).add(popStringFromBuffer(buffer)); + if (input.charAt(index + 1) == ')') { + root.setProperties(properties); + return index + 1; + } + index = examineNextNode(input, index, root, properties); + inValue = false; + break; + case '\\': + escape = true; + break; + default: + appendChar(buffer, nextChar); + } } ++index; } @@ -101,14 +127,13 @@ private int examineNextNode(String input, int index, SgfNode root, Map