From 214143fe84a76edf0a0461fe7372ff91122619bc Mon Sep 17 00:00:00 2001 From: Moandji Ezana Date: Wed, 27 Jul 2016 15:35:20 +0200 Subject: [PATCH] Support single quotes in table name Fixes #36 --- CHANGELOG.md | 4 +++ .../com/moandjiezana/toml/Identifier.java | 2 +- .../toml/IdentifierConverter.java | 4 +-- src/main/java/com/moandjiezana/toml/Keys.java | 6 +++- .../java/com/moandjiezana/toml/TableTest.java | 28 +++++++++++++++++++ 5 files changed, 40 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8ae89ff..75a7311 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # toml4j Changelog +## 0.7.1 / 2016-07-27 + +* [Support literal strings in table names](https://github.com/mwanji/toml4j/issues/36) (thanks to __[bruno-medeiros](https://github.com/bruno-medeiros)__) + ## 0.7.0 / 2016-07-12 ## Added diff --git a/src/main/java/com/moandjiezana/toml/Identifier.java b/src/main/java/com/moandjiezana/toml/Identifier.java index ba1f692..794b28d 100644 --- a/src/main/java/com/moandjiezana/toml/Identifier.java +++ b/src/main/java/com/moandjiezana/toml/Identifier.java @@ -139,7 +139,7 @@ class Identifier { break; } - if (c == '"') { + if (Keys.isQuote(c)) { if (!quoteAllowed) { valid = false; } else if (quoted && trimmed.charAt(i - 1) != '\\') { diff --git a/src/main/java/com/moandjiezana/toml/IdentifierConverter.java b/src/main/java/com/moandjiezana/toml/IdentifierConverter.java index b0a4444..d5c246f 100644 --- a/src/main/java/com/moandjiezana/toml/IdentifierConverter.java +++ b/src/main/java/com/moandjiezana/toml/IdentifierConverter.java @@ -16,9 +16,9 @@ class IdentifierConverter { for (int i = index.get(); i < s.length(); i = index.incrementAndGet()) { char c = s.charAt(i); - if (c == '"' && (i == 0 || s.charAt(i - 1) != '\\')) { + if (Keys.isQuote(c) && (i == 0 || s.charAt(i - 1) != '\\')) { quoted = !quoted; - name.append('"'); + name.append(c); } else if (c == '\n') { index.decrementAndGet(); break; diff --git a/src/main/java/com/moandjiezana/toml/Keys.java b/src/main/java/com/moandjiezana/toml/Keys.java index 19f8925..f240bed 100644 --- a/src/main/java/com/moandjiezana/toml/Keys.java +++ b/src/main/java/com/moandjiezana/toml/Keys.java @@ -42,7 +42,7 @@ class Keys { current = new StringBuilder(); continue; } - if (c == '"' && (i == 0 || key.charAt(i - 1) != '\\')) { + if (isQuote(c) && (i == 0 || key.charAt(i - 1) != '\\')) { quoted = !quoted; indexable = false; } @@ -60,6 +60,10 @@ class Keys { return splitKey.toArray(new Key[0]); } + + static boolean isQuote(char c) { + return c == '"' || c == '\''; + } private Keys() {} } diff --git a/src/test/java/com/moandjiezana/toml/TableTest.java b/src/test/java/com/moandjiezana/toml/TableTest.java index 9202971..3a8d341 100644 --- a/src/test/java/com/moandjiezana/toml/TableTest.java +++ b/src/test/java/com/moandjiezana/toml/TableTest.java @@ -63,6 +63,34 @@ public class TableTest { public void should_return_null_for_missing_table() throws Exception { assertNull(new Toml().getTable("a")); } + + @Test + public void should_accept_table_name_with_basic_string() { + Toml toml = new Toml().read("[\"a\"]\nb = 'b'"); + + assertEquals("b", toml.getString("\"a\".b")); + } + + @Test + public void should_accept_table_name_part_with_basic_string() { + Toml toml = new Toml().read("[target.\"cfg(unix)\".dependencies]\nb = 'b'"); + + assertEquals("b", toml.getString("target.\"cfg(unix)\".dependencies.b")); + } + + @Test + public void should_accept_table_name_with_literal_string() { + Toml toml = new Toml().read("['a']\nb = 'b'"); + + assertEquals("b", toml.getString("'a'.b")); + } + + @Test + public void should_accept_table_name_part_with_literal_string() { + Toml toml = new Toml().read("[target.'cfg(unix)'.dependencies]\nb = 'b'"); + + assertEquals("b", toml.getString("target.'cfg(unix)'.dependencies.b")); + } @Test public void should_return_null_when_navigating_to_missing_value() throws Exception {