aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/zwobble/mammoth/internal/styles/parsing/EscapeSequences.java34
-rw-r--r--src/main/java/org/zwobble/mammoth/internal/styles/parsing/TokenParser.java2
-rw-r--r--src/test/java/org/zwobble/mammoth/tests/styles/parsing/EscapeSequencesTests.java33
-rw-r--r--src/test/java/org/zwobble/mammoth/tests/styles/parsing/TokenParserTests.java28
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);
+ }
+}