From 3707fb14902ec697e25d49636c5e13c4c17f3ed7 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Mon, 14 Nov 2016 22:59:32 +0000 Subject: Decode escape sequences in strings --- .../internal/styles/parsing/EscapeSequences.java | 34 +++++++++++++++++++++- .../internal/styles/parsing/TokenParser.java | 2 +- 2 files changed, 34 insertions(+), 2 deletions(-) (limited to 'src/main') 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 tokens) { String value = tokens.nextValue(TokenType.STRING); - return value.substring(1, value.length() - 1); + return EscapeSequences.decode(value.substring(1, value.length() - 1)); } } -- cgit v1.2.3