Skip to content

Commit fac6e62

Browse files
authored
Revert "Revert "Fix: bibkey generated does not handle diacritics" (#4741)" (#4742)
This reverts commit 26f7865.
1 parent 26f7865 commit fac6e62

File tree

4 files changed

+61
-36
lines changed

4 files changed

+61
-36
lines changed

src/main/java/org/jabref/logic/bibtexkeypattern/BibtexKeyGenerator.java

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@ public class BibtexKeyGenerator extends BracketedPattern {
2626
*/
2727
public static final String APPENDIX_CHARACTERS = "abcdefghijklmnopqrstuvwxyz";
2828
private static final Logger LOGGER = LoggerFactory.getLogger(BibtexKeyGenerator.class);
29-
private static final String KEY_ILLEGAL_CHARACTERS = "{}(),\\\"#~^':`";
30-
private static final String KEY_UNWANTED_CHARACTERS = "{}(),\\\"";
29+
private static final String KEY_ILLEGAL_CHARACTERS = "{}(),\\\"-#~^':`";
30+
private static final String KEY_UNWANTED_CHARACTERS = "{}(),\\\"-";
3131
private final AbstractBibtexKeyPattern citeKeyPattern;
3232
private final BibDatabase database;
3333
private final BibtexKeyPatternPreferences bibtexKeyPatternPreferences;
@@ -72,15 +72,15 @@ private static String getAppendix(int number) {
7272
}
7373
}
7474

75-
public static String cleanKey(String key, boolean enforceLegalKey) {
75+
public static String removeUnwantedCharacters(String key, boolean enforceLegalKey) {
7676
if (!enforceLegalKey) {
7777
// User doesn't want us to enforce legal characters. We must still look
7878
// for whitespace and some characters such as commas, since these would
7979
// interfere with parsing:
8080
StringBuilder newKey = new StringBuilder();
8181
for (int i = 0; i < key.length(); i++) {
8282
char c = key.charAt(i);
83-
if (!Character.isWhitespace(c) && (KEY_UNWANTED_CHARACTERS.indexOf(c) == -1)) {
83+
if (KEY_UNWANTED_CHARACTERS.indexOf(c) == -1) {
8484
newKey.append(c);
8585
}
8686
}
@@ -90,7 +90,7 @@ public static String cleanKey(String key, boolean enforceLegalKey) {
9090
StringBuilder newKey = new StringBuilder();
9191
for (int i = 0; i < key.length(); i++) {
9292
char c = key.charAt(i);
93-
if (!Character.isWhitespace(c) && (KEY_ILLEGAL_CHARACTERS.indexOf(c) == -1)) {
93+
if (KEY_ILLEGAL_CHARACTERS.indexOf(c) == -1) {
9494
newKey.append(c);
9595
}
9696
}
@@ -100,6 +100,10 @@ public static String cleanKey(String key, boolean enforceLegalKey) {
100100
return StringUtil.replaceSpecialCharacters(newKey.toString());
101101
}
102102

103+
public static String cleanKey(String key, boolean enforceLegalKey) {
104+
return removeUnwantedCharacters(key, enforceLegalKey).replaceAll("\\s","");
105+
}
106+
103107
public String generateKey(BibEntry entry) {
104108
String key;
105109
StringBuilder stringBuilder = new StringBuilder();
@@ -123,7 +127,7 @@ public String generateKey(BibEntry entry) {
123127
List<String> parts = parseFieldMarker(typeListEntry);
124128
Character delimiter = bibtexKeyPatternPreferences.getKeywordDelimiter();
125129
String pattern = "[" + parts.get(0) + "]";
126-
String label = expandBrackets(pattern, delimiter, entry, database);
130+
String label = expandBrackets(pattern, delimiter, entry, database, bibtexKeyPatternPreferences.isEnforceLegalKey());
127131
// apply modifier if present
128132
if (parts.size() > 1) {
129133
label = applyModifiers(label, parts, 1);

src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,10 @@ public String expand(BibEntry bibentry, Character keywordDelimiter, BibDatabase
9292
return expandBrackets(this.pattern, keywordDelimiter, bibentry, database);
9393
}
9494

95+
public static String expandBrackets(String pattern, Character keywordDelimiter, BibEntry entry, BibDatabase database) {
96+
return expandBrackets(pattern, keywordDelimiter, entry, database, false);
97+
}
98+
9599
/**
96100
* Expands a pattern
97101
*
@@ -101,7 +105,7 @@ public String expand(BibEntry bibentry, Character keywordDelimiter, BibDatabase
101105
* @param database The database for field resolving. May be null.
102106
* @return The expanded pattern. Not null.
103107
*/
104-
public static String expandBrackets(String pattern, Character keywordDelimiter, BibEntry entry, BibDatabase database) {
108+
public static String expandBrackets(String pattern, Character keywordDelimiter, BibEntry entry, BibDatabase database, boolean isEnforceLegalKey) {
105109
Objects.requireNonNull(pattern);
106110
Objects.requireNonNull(entry);
107111
StringBuilder sb = new StringBuilder();
@@ -122,10 +126,10 @@ public static String expandBrackets(String pattern, Character keywordDelimiter,
122126
// check whether there is a modifier on the end such as
123127
// ":lower":
124128
if (fieldParts.size() <= 1) {
125-
sb.append(getFieldValue(entry, token, keywordDelimiter, database));
129+
sb.append(getFieldValue(entry, token, keywordDelimiter, database, isEnforceLegalKey));
126130
} else {
127131
// apply modifiers:
128-
String fieldValue = getFieldValue(entry, fieldParts.get(0), keywordDelimiter, database);
132+
String fieldValue = getFieldValue(entry, fieldParts.get(0), keywordDelimiter, database, isEnforceLegalKey);
129133
sb.append(applyModifiers(fieldValue, fieldParts, 1));
130134
}
131135
// Fetch and discard the closing ']'
@@ -156,7 +160,7 @@ public static String expandBrackets(String pattern, Character keywordDelimiter,
156160
*
157161
* @return String containing the evaluation result. Empty string if the pattern cannot be resolved.
158162
*/
159-
public static String getFieldValue(BibEntry entry, String value, Character keywordDelimiter, BibDatabase database) {
163+
public static String getFieldValue(BibEntry entry, String value, Character keywordDelimiter, BibDatabase database, boolean isEnforceLegalKey) {
160164

161165
String val = value;
162166
try {
@@ -224,15 +228,8 @@ else if ("authorLast".equals(val)) {
224228
return authNofMth(authString, Integer.parseInt(nums[0]),
225229
Integer.parseInt(nums[1]));
226230
} else if (val.matches("auth\\d+")) {
227-
// authN. First N chars of the first author's last
228-
// name.
229-
230-
String fa = firstAuthor(authString);
231231
int num = Integer.parseInt(val.substring(4));
232-
if (num > fa.length()) {
233-
num = fa.length();
234-
}
235-
return fa.substring(0, num);
232+
return authN(authString, num, isEnforceLegalKey);
236233
} else if (val.matches("authors\\d+")) {
237234
return nAuthors(authString, Integer.parseInt(val.substring(7)));
238235
} else {
@@ -840,6 +837,18 @@ public static String authNofMth(String authorField, int n, int m) {
840837
}
841838
}
842839

840+
/**
841+
* First N chars of the first author's last name.
842+
*/
843+
public static String authN(String authString, int num, boolean isEnforceLegalKey) {
844+
authString = BibtexKeyGenerator.removeUnwantedCharacters(authString, isEnforceLegalKey);
845+
String fa = firstAuthor(authString);
846+
if (num > fa.length()) {
847+
num = fa.length();
848+
}
849+
return fa.substring(0, num);
850+
}
851+
843852
/**
844853
* authshort format:
845854
* added by Kolja Brix, [email protected]

src/test/java/org/jabref/logic/bibtexkeypattern/BibtexKeyGeneratorTest.java

Lines changed: 29 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -119,73 +119,73 @@ public void testMakeLabelAndCheckLegalKeys() throws ParseException {
119119

120120
Optional<BibEntry> entry0 = BibtexParser.singleFromString(
121121
"@ARTICLE{kohn, author={Andreas Köning}, year={2000}}", importFormatPreferences, fileMonitor);
122-
assertEquals("Koen",
122+
assertEquals("Koe",
123123
BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3",
124124
new BibDatabase()), true));
125125

126126
entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Áöning}, year={2000}}",
127127
importFormatPreferences, fileMonitor);
128-
assertEquals("Aoen",
128+
assertEquals("Aoe",
129129
BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3",
130130
new BibDatabase()), true));
131131

132132
entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Éöning}, year={2000}}",
133133
importFormatPreferences, fileMonitor);
134-
assertEquals("Eoen",
134+
assertEquals("Eoe",
135135
BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3",
136136
new BibDatabase()), true));
137137

138138
entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Íöning}, year={2000}}",
139139
importFormatPreferences, fileMonitor);
140-
assertEquals("Ioen",
140+
assertEquals("Ioe",
141141
BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3",
142142
new BibDatabase()), true));
143143

144144
entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Ĺöning}, year={2000}}",
145145
importFormatPreferences, fileMonitor);
146-
assertEquals("Loen",
146+
assertEquals("Loe",
147147
BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3",
148148
new BibDatabase()), true));
149149

150150
entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Ńöning}, year={2000}}",
151151
importFormatPreferences, fileMonitor);
152-
assertEquals("Noen",
152+
assertEquals("Noe",
153153
BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3",
154154
new BibDatabase()), true));
155155

156156
entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Óöning}, year={2000}}",
157157
importFormatPreferences, fileMonitor);
158-
assertEquals("Ooen",
158+
assertEquals("Ooe",
159159
BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3",
160160
new BibDatabase()), true));
161161

162162
entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Ŕöning}, year={2000}}",
163163
importFormatPreferences, fileMonitor);
164-
assertEquals("Roen",
164+
assertEquals("Roe",
165165
BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3",
166166
new BibDatabase()), true));
167167

168168
entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Śöning}, year={2000}}",
169169
importFormatPreferences, fileMonitor);
170-
assertEquals("Soen",
170+
assertEquals("Soe",
171171
BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3",
172172
new BibDatabase()), true));
173173

174174
entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Úöning}, year={2000}}",
175175
importFormatPreferences, fileMonitor);
176-
assertEquals("Uoen",
176+
assertEquals("Uoe",
177177
BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3",
178178
new BibDatabase()), true));
179179

180180
entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Ýöning}, year={2000}}",
181181
importFormatPreferences, fileMonitor);
182-
assertEquals("Yoen",
182+
assertEquals("Yoe",
183183
BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3",
184184
new BibDatabase()), true));
185185

186186
entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Źöning}, year={2000}}",
187187
importFormatPreferences, fileMonitor);
188-
assertEquals("Zoen",
188+
assertEquals("Zoe",
189189
BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3",
190190
new BibDatabase()), true));
191191
}
@@ -197,31 +197,43 @@ public void testMakeLabelAndCheckLegalKeys() throws ParseException {
197197
public void testMakeLabelAndCheckLegalKeysAccentGrave() throws ParseException {
198198
Optional<BibEntry> entry0 = BibtexParser.singleFromString(
199199
"@ARTICLE{kohn, author={Andreas Àöning}, year={2000}}", importFormatPreferences, fileMonitor);
200-
assertEquals("Aoen",
200+
assertEquals("Aoe",
201201
BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3",
202202
new BibDatabase()), true));
203203

204204
entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Èöning}, year={2000}}",
205205
importFormatPreferences, fileMonitor);
206-
assertEquals("Eoen",
206+
assertEquals("Eoe",
207207
BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3",
208208
new BibDatabase()), true));
209209

210210
entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Ìöning}, year={2000}}",
211211
importFormatPreferences, fileMonitor);
212-
assertEquals("Ioen",
212+
assertEquals("Ioe",
213213
BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3",
214214
new BibDatabase()), true));
215215

216216
entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Òöning}, year={2000}}",
217217
importFormatPreferences, fileMonitor);
218-
assertEquals("Ooen",
218+
assertEquals("Ooe",
219219
BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3",
220220
new BibDatabase()), true));
221221

222222
entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Ùöning}, year={2000}}",
223223
importFormatPreferences, fileMonitor);
224-
assertEquals("Uoen",
224+
assertEquals("Uoe",
225+
BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3",
226+
new BibDatabase()), true));
227+
228+
entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Oraib Al-Ketan}, year={2000}}",
229+
importFormatPreferences, fileMonitor);
230+
assertEquals("AlK",
231+
BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3",
232+
new BibDatabase()), true));
233+
234+
entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andrés D'Alessandro}, year={2000}}",
235+
importFormatPreferences, fileMonitor);
236+
assertEquals("DAl",
225237
BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3",
226238
new BibDatabase()), true));
227239
}

src/test/java/org/jabref/logic/bibtexkeypattern/MakeLabelWithDatabaseTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -397,7 +397,7 @@ void generateKeyTitleRegexe() {
397397
bibtexKeyPattern.setDefaultValue("[title:regex(\" \",\"-\")]");
398398
entry.setField("title", "Please replace the spaces");
399399
new BibtexKeyGenerator(bibtexKeyPattern, database, preferences).generateAndSetKey(entry);
400-
assertEquals(Optional.of("Please-Replace-the-Spaces"), entry.getCiteKeyOptional());
400+
assertEquals(Optional.of("PleaseReplacetheSpaces"), entry.getCiteKeyOptional());
401401
}
402402

403403
@Test

0 commit comments

Comments
 (0)