Skip to content

Commit 1c99753

Browse files
committed
Fix JabRef#12810: Add escaping for keyword separators in KeywordList
1 parent 40e4142 commit 1c99753

File tree

1 file changed

+31
-7
lines changed

1 file changed

+31
-7
lines changed

src/main/java/org/jabref/model/entry/KeywordList.java

Lines changed: 31 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -51,14 +51,34 @@ public static KeywordList parse(String keywordString, Character delimiter, Chara
5151
Objects.requireNonNull(delimiter);
5252
Objects.requireNonNull(hierarchicalDelimiter);
5353

54-
KeywordList keywordList = new KeywordList();
54+
List<String> keywords = new ArrayList<>();
55+
StringBuilder current = new StringBuilder();
56+
boolean escaping = false;
57+
58+
for (char ch : keywordString.toCharArray()) {
59+
if (escaping) {
60+
current.append(ch);
61+
escaping = false;
62+
} else if (ch == '\\') {
63+
escaping = true;
64+
} else if (ch == delimiter) {
65+
keywords.add(current.toString().trim());
66+
current.setLength(0);
67+
} else {
68+
current.append(ch);
69+
}
70+
}
5571

56-
StringTokenizer tok = new StringTokenizer(keywordString, delimiter.toString());
57-
while (tok.hasMoreTokens()) {
58-
String chain = tok.nextToken();
59-
Keyword chainRoot = Keyword.of(chain.split(hierarchicalDelimiter.toString()));
72+
if (current.length() > 0) {
73+
keywords.add(current.toString().trim());
74+
}
75+
76+
KeywordList keywordList = new KeywordList();
77+
for (String keyword : keywords) {
78+
Keyword chainRoot = Keyword.of(keyword.split(hierarchicalDelimiter.toString()));
6079
keywordList.add(chainRoot);
6180
}
81+
6282
return keywordList;
6383
}
6484

@@ -67,14 +87,18 @@ public static KeywordList parse(String keywordString, Character delimiter, Chara
6787
*
6888
* @param keywordString a String of keywordChains
6989
* @param delimiter The delimiter used for separating the keywords
70-
* @return an parsed list containing the keywordChains
90+
* @return a parsed list containing the keywordChains
7191
*/
7292
public static KeywordList parse(String keywordString, Character delimiter) {
7393
return parse(keywordString, delimiter, Keyword.DEFAULT_HIERARCHICAL_DELIMITER);
7494
}
7595

7696
public static String serialize(List<Keyword> keywords, Character delimiter) {
77-
return keywords.stream().map(Keyword::get).collect(Collectors.joining(delimiter.toString()));
97+
return keywords.stream()
98+
.map(keyword -> keyword.get()
99+
.replace("\\", "\\\\") // escape backslashes
100+
.replace(delimiter.toString(), "\\" + delimiter)) // escape delimiters
101+
.collect(Collectors.joining(delimiter.toString()));
78102
}
79103

80104
public static KeywordList merge(String keywordStringA, String keywordStringB, Character delimiter) {

0 commit comments

Comments
 (0)