diff --git a/src/main/java/com/moandjiezana/toml/LiteralStringParser.java b/src/main/java/com/moandjiezana/toml/LiteralStringParser.java new file mode 100644 index 0000000..d2191d1 --- /dev/null +++ b/src/main/java/com/moandjiezana/toml/LiteralStringParser.java @@ -0,0 +1,30 @@ +package com.moandjiezana.toml; + +import java.util.List; + +import org.parboiled.Parboiled; +import org.parboiled.parserunners.BasicParseRunner; + +class LiteralStringParser implements ValueParser { + + static final LiteralStringParser LITERAL_STRING_PARSER = new LiteralStringParser(); + + @Override + public boolean canParse(String s) { + return s.startsWith("'"); + } + + @Override + public Object parse(String s) { + StatementParser parser = Parboiled.createParser(StatementParser.class); + List resultValue = new BasicParseRunner>(parser.LiteralString()).run(s).resultValue; + + if (resultValue == null) { + return ValueParserUtils.INVALID; + } + + return resultValue.get(0); + } + + private LiteralStringParser() {} +} diff --git a/src/main/java/com/moandjiezana/toml/StatementParser.java b/src/main/java/com/moandjiezana/toml/StatementParser.java index 9967b73..5c09ba0 100644 --- a/src/main/java/com/moandjiezana/toml/StatementParser.java +++ b/src/main/java/com/moandjiezana/toml/StatementParser.java @@ -21,6 +21,10 @@ class StatementParser extends BaseParser> { return Sequence('[', '[', startList(), Sequence(OneOrMore(NoneOf("[]")), pushToken(match())), ']', ']', endList(), FirstOf(EOI, Sequence(TestNot(']'), ANY))); } + public Rule LiteralString() { + return FirstOf(Sequence('\'', '\'', startList(), pushToken(""), endList()), Sequence('\'', OneOrMore(TestNot("'"), ANY), startList(), pushToken(match()) , '\'', endList(), FirstOf(EOI, OneOrMore(' ', Sequence('#', ZeroOrMore(ANY)))))); + } + Rule NonEmptyArray() { return FirstOf(Array(), OneOrMore(TestNot(']'), FirstOf(String(), Array(), ',', ' ', OtherValue()))); } diff --git a/src/main/java/com/moandjiezana/toml/ValueConverter.java b/src/main/java/com/moandjiezana/toml/ValueConverter.java index a62bbc7..dccc250 100644 --- a/src/main/java/com/moandjiezana/toml/ValueConverter.java +++ b/src/main/java/com/moandjiezana/toml/ValueConverter.java @@ -5,6 +5,7 @@ import static com.moandjiezana.toml.BooleanParser.BOOLEAN_PARSER; import static com.moandjiezana.toml.DateParser.DATE_PARSER; import static com.moandjiezana.toml.FloatParser.FLOAT_PARSER; import static com.moandjiezana.toml.IntegerParser.INTEGER_PARSER; +import static com.moandjiezana.toml.LiteralStringParser.LITERAL_STRING_PARSER; import static com.moandjiezana.toml.MultilineStringParser.MULTILINE_STRING_PARSER; import static com.moandjiezana.toml.StringParser.STRING_PARSER; import static com.moandjiezana.toml.ValueParserUtils.INVALID; @@ -14,6 +15,8 @@ class ValueConverter { public Object convert(String value) { if (MULTILINE_STRING_PARSER.canParse(value)) { return MULTILINE_STRING_PARSER.parse(value); + } else if (LITERAL_STRING_PARSER.canParse(value)) { + return LITERAL_STRING_PARSER.parse(value); } else if (STRING_PARSER.canParse(value)) { return STRING_PARSER.parse(value); } else if (INTEGER_PARSER.canParse(value)) { diff --git a/src/test/java/com/moandjiezana/toml/TomlTest.java b/src/test/java/com/moandjiezana/toml/TomlTest.java index 4e50f63..b7a438d 100644 --- a/src/test/java/com/moandjiezana/toml/TomlTest.java +++ b/src/test/java/com/moandjiezana/toml/TomlTest.java @@ -53,7 +53,16 @@ public class TomlTest { assertEquals(toml.getString("ref"), toml.getString("multi1")); assertEquals(toml.getString("ref"), toml.getString("multi2")); + } + + @Test + public void should_get_literal_string() throws Exception { + Toml toml = new Toml().parse(file("should_get_literal_string")); + assertEquals("C:\\Users\\nodejs\\templates", toml.getString("winpath")); + assertEquals("\\\\ServerX\\admin$\\system32\\", toml.getString("winpath2")); + assertEquals("Tom \"Dubs\" Preston-Werner", toml.getString("quoted")); + assertEquals("<\\i\\c*\\s*>", toml.getString("regex")); } @Test @@ -414,6 +423,11 @@ public class TomlTest { public void should_fail_on_invalid_boolean_false() { new Toml().parse("answer = false abc"); } + + @Test(expected = IllegalStateException.class) + public void should_fail_on_invalid_literal_string() { + new Toml().parse("a = ' ' jdkf"); + } private File file(String file) { return new File(getClass().getResource(file + ".toml").getFile()); diff --git a/src/test/resources/com/moandjiezana/toml/should_get_literal_string.toml b/src/test/resources/com/moandjiezana/toml/should_get_literal_string.toml new file mode 100644 index 0000000..98c5c05 --- /dev/null +++ b/src/test/resources/com/moandjiezana/toml/should_get_literal_string.toml @@ -0,0 +1,4 @@ +winpath = 'C:\Users\nodejs\templates' +winpath2 = '\\ServerX\admin$\system32\' # comment +quoted = 'Tom "Dubs" Preston-Werner' +regex = '<\i\c*\s*>'