diff options
| author | Michael Williamson <mike@zwobble.org> | 2016-11-14 22:59:32 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2016-11-14 22:59:32 +0000 |
| commit | 3707fb14902ec697e25d49636c5e13c4c17f3ed7 (patch) | |
| tree | efb9c59a408bf8a7fe0cd7b901cec0b7168af211 /src | |
| parent | 7feed8041f5980d94d9a959428385d1c87a65a97 (diff) | |
Decode escape sequences in strings
Diffstat (limited to 'src')
4 files changed, 95 insertions, 2 deletions
diff --git a/src/main/java/org/zwobble/mammoth/internal/styles/parsing/EscapeSequences.java b/src/main/java/org/zwobble/mammoth/internal/styles/parsing/EscapeSequences.java index 2633232..1415227 100644 --- a/src/main/java/org/zwobble/mammoth/internal/styles/parsing/EscapeSequences.java +++ b/src/main/java/org/zwobble/mammoth/internal/styles/parsing/EscapeSequences.java @@ -1,7 +1,39 @@ package org.zwobble.mammoth.internal.styles.parsing; +import java.nio.CharBuffer; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + public class EscapeSequences { + private static final Pattern PATTERN = Pattern.compile("\\\\(.)"); + public static String decode(String value) { - return value.replaceAll("\\\\(.)", "$1"); + return decode(CharBuffer.wrap(value)); + } + + private static String decode(CharBuffer value) { + Matcher matcher = PATTERN.matcher(value); + StringBuilder decoded = new StringBuilder(); + int lastIndex = 0; + while (matcher.find()) { + decoded.append(value.subSequence(lastIndex, matcher.start())); + decoded.append(escapeSequence(matcher.group(1))); + lastIndex = matcher.end(); + } + decoded.append(value.subSequence(lastIndex, value.length())); + return decoded.toString(); + } + + private static char escapeSequence(String code) { + switch (code) { + case "n": + return '\n'; + case "r": + return '\r'; + case "t": + return '\t'; + default: + return code.charAt(0); + } } } diff --git a/src/main/java/org/zwobble/mammoth/internal/styles/parsing/TokenParser.java b/src/main/java/org/zwobble/mammoth/internal/styles/parsing/TokenParser.java index 54fce78..3760d64 100644 --- a/src/main/java/org/zwobble/mammoth/internal/styles/parsing/TokenParser.java +++ b/src/main/java/org/zwobble/mammoth/internal/styles/parsing/TokenParser.java @@ -7,6 +7,6 @@ public class TokenParser { public static String parseString(TokenIterator<TokenType> tokens) { String value = tokens.nextValue(TokenType.STRING); - return value.substring(1, value.length() - 1); + return EscapeSequences.decode(value.substring(1, value.length() - 1)); } } diff --git a/src/test/java/org/zwobble/mammoth/tests/styles/parsing/EscapeSequencesTests.java b/src/test/java/org/zwobble/mammoth/tests/styles/parsing/EscapeSequencesTests.java new file mode 100644 index 0000000..8b76316 --- /dev/null +++ b/src/test/java/org/zwobble/mammoth/tests/styles/parsing/EscapeSequencesTests.java @@ -0,0 +1,33 @@ +package org.zwobble.mammoth.tests.styles.parsing; + +import org.junit.Test; +import org.zwobble.mammoth.internal.styles.parsing.EscapeSequences; + +import static org.junit.Assert.assertEquals; + +public class EscapeSequencesTests { + @Test + public void lineFeedsAreDecoded() { + assertEquals("\n", EscapeSequences.decode("\\n")); + } + + @Test + public void carriageReturnsAreDecoded() { + assertEquals("\r", EscapeSequences.decode("\\r")); + } + + @Test + public void tabsAreDecoded() { + assertEquals("\t", EscapeSequences.decode("\\t")); + } + + @Test + public void backslashesAreDecoded() { + assertEquals("\\", EscapeSequences.decode("\\\\")); + } + + @Test + public void colonsAreDecoded() { + assertEquals(":", EscapeSequences.decode("\\:")); + } +} diff --git a/src/test/java/org/zwobble/mammoth/tests/styles/parsing/TokenParserTests.java b/src/test/java/org/zwobble/mammoth/tests/styles/parsing/TokenParserTests.java new file mode 100644 index 0000000..dabe2cd --- /dev/null +++ b/src/test/java/org/zwobble/mammoth/tests/styles/parsing/TokenParserTests.java @@ -0,0 +1,28 @@ +package org.zwobble.mammoth.tests.styles.parsing; + +import org.junit.Test; +import org.zwobble.mammoth.internal.styles.parsing.Token; +import org.zwobble.mammoth.internal.styles.parsing.TokenIterator; +import org.zwobble.mammoth.internal.styles.parsing.TokenParser; +import org.zwobble.mammoth.internal.styles.parsing.TokenType; + +import static org.junit.Assert.assertEquals; +import static org.zwobble.mammoth.internal.util.Lists.list; + +public class TokenParserTests { + @Test + public void escapeSequencesInClassNameAreDecoded() { + String value = TokenParser.parseClassName(new TokenIterator<>(list( + new Token<>(0, TokenType.CLASS_NAME, "\\:") + ))); + assertEquals(":", value); + } + + @Test + public void escapeSequencesInStringAreDecoded() { + String value = TokenParser.parseString(new TokenIterator<>(list( + new Token<>(0, TokenType.STRING, "'\\n'") + ))); + assertEquals("\n", value); + } +} |
