Skip to content

Commit eca968e

Browse files
InAnYansubhramitSiedlerchr
authored
Add support for transliterated citation keys (#13893)
* feat(citation-key-generator): add support for transliterating fields in citation key * feat(citation-key-generator): add transliteration action + refactor to class * chore(test): better format comments in TransliterationTest * chore(changelog): add changelog entry for transliteration * refactor(transliteration): refactor code after reviewing PR changes * refactor(transliteration): address review comments * chore(transliteration): reformat files * refactor(citationkey): append "for citation key" to "Transliterate fields" + change tests * chore(changelog): update CHANGELOG.md * Update CHANGELOG.md * fix(citationkey): address review comments * Fix duplicate entry in CHANGELOG.md * chore(submodules): fix submodules * refactor(citationkey): change true to false * chore(submodules): fix submodules --------- Co-authored-by: Subhramit Basu <subhramit.bb@live.in> Co-authored-by: Christoph <siedlerkiller@gmail.com>
1 parent 663e768 commit eca968e

File tree

21 files changed

+271
-236
lines changed

21 files changed

+271
-236
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ Note that this project **does not** adhere to [Semantic Versioning](https://semv
1414
- We added "IEEE" as another option for parsing plain text citations. [#14233](github.com/JabRef/jabref/pull/14233)
1515
- We added automatic date-based groups that create year/month/day subgroups from an entry’s date fields. [#10822](https://github.com/JabRef/jabref/issues/10822)
1616
- We added `doi-to-bibtex` to `JabKit`. [#14244](https://github.com/JabRef/jabref/pull/14244)
17+
- We added support for transliteration of fields to English and automatic transliteration of generated citation key. [#11377](https://github.com/JabRef/jabref/issues/11377)
1718

1819
### Changed
1920

jabgui/src/main/java/org/jabref/gui/preferences/citationkeypattern/CitationKeyPatternTab.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
public class CitationKeyPatternTab extends AbstractPreferenceTabView<CitationKeyPatternTabViewModel> implements PreferencesTab {
1818

19+
@FXML private CheckBox transliterateFieldsForCitationKey;
1920
@FXML private CheckBox overwriteAllow;
2021
@FXML private CheckBox overwriteWarning;
2122
@FXML private CheckBox generateOnSave;
@@ -42,6 +43,7 @@ public String getTabName() {
4243
public void initialize() {
4344
this.viewModel = new CitationKeyPatternTabViewModel(preferences.getCitationKeyPatternPreferences(), preferences.getImporterPreferences());
4445

46+
transliterateFieldsForCitationKey.selectedProperty().bindBidirectional(viewModel.transliterateFieldsForCitationKeyProperty());
4547
overwriteAllow.selectedProperty().bindBidirectional(viewModel.overwriteAllowProperty());
4648
overwriteWarning.selectedProperty().bindBidirectional(viewModel.overwriteWarningProperty());
4749
generateOnSave.selectedProperty().bindBidirectional(viewModel.generateOnSaveProperty());

jabgui/src/main/java/org/jabref/gui/preferences/citationkeypattern/CitationKeyPatternTabViewModel.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
public class CitationKeyPatternTabViewModel implements PreferenceTabViewModel {
2121

22+
private final BooleanProperty transliterateFieldsForCitationKeyProperty = new SimpleBooleanProperty();
2223
private final BooleanProperty overwriteAllowProperty = new SimpleBooleanProperty();
2324
private final BooleanProperty overwriteWarningProperty = new SimpleBooleanProperty();
2425
private final BooleanProperty generateOnSaveProperty = new SimpleBooleanProperty();
@@ -53,6 +54,7 @@ public CitationKeyPatternTabViewModel(CitationKeyPatternPreferences keyPatternPr
5354

5455
@Override
5556
public void setValues() {
57+
transliterateFieldsForCitationKeyProperty.setValue(keyPatternPreferences.shouldTransliterateFieldsForCitationKey());
5658
overwriteAllowProperty.setValue(!keyPatternPreferences.shouldAvoidOverwriteCiteKey());
5759
overwriteWarningProperty.setValue(keyPatternPreferences.shouldWarnBeforeOverwriteCiteKey());
5860
generateOnSaveProperty.setValue(keyPatternPreferences.shouldGenerateCiteKeysBeforeSaving());
@@ -106,6 +108,7 @@ public void storeSettings() {
106108
keySuffix = CitationKeyPatternPreferences.KeySuffix.SECOND_WITH_B;
107109
}
108110

111+
keyPatternPreferences.setShouldTransliterateFieldsForCitationKey(transliterateFieldsForCitationKeyProperty.getValue());
109112
keyPatternPreferences.setAvoidOverwriteCiteKey(!overwriteAllowProperty.getValue());
110113
keyPatternPreferences.setWarnBeforeOverwriteCiteKey(overwriteWarningProperty.getValue());
111114
keyPatternPreferences.setGenerateCiteKeysBeforeSaving(generateOnSaveProperty.getValue());
@@ -117,6 +120,10 @@ public void storeSettings() {
117120
keyPatternPreferences.setKeyPatterns(newKeyPattern);
118121
}
119122

123+
public BooleanProperty transliterateFieldsForCitationKeyProperty() {
124+
return transliterateFieldsForCitationKeyProperty;
125+
}
126+
120127
public BooleanProperty overwriteAllowProperty() {
121128
return overwriteAllowProperty;
122129
}

jabgui/src/main/resources/org/jabref/gui/preferences/citationkeypattern/CitationKeyPatternTab.fxml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,9 @@
7474
GridPane.columnIndex="0" GridPane.rowIndex="8"/>
7575
<TextField fx:id="unwantedCharacters"
7676
GridPane.columnIndex="1" GridPane.rowIndex="8"/>
77+
78+
<CheckBox fx:id="transliterateFieldsForCitationKey" text="%Transliterate fields for citation key"
79+
GridPane.columnIndex="0" GridPane.rowIndex="9"/>
7780
</GridPane>
7881

7982
<HBox spacing="8.0">
@@ -90,4 +93,4 @@
9093
<Button text="%Reset All" onAction="#resetAllKeyPatterns"
9194
AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0"/>
9295
</AnchorPane>
93-
</fx:root>
96+
</fx:root>

jabgui/src/test/java/org/jabref/gui/externalfiles/AutoRenameFileOnEntryChangeTest.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ void setUp(@TempDir Path tempDir) {
4444
GuiPreferences guiPreferences = mock(GuiPreferences.class);
4545
filePreferences = mock(FilePreferences.class);
4646
CitationKeyPatternPreferences patternPreferences = new CitationKeyPatternPreferences(
47+
false,
4748
false,
4849
true,
4950
false,

jablib/src/main/java/org/jabref/logic/citationkeypattern/CitationKeyGenerator.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import java.util.regex.PatternSyntaxException;
99

1010
import org.jabref.logic.util.strings.StringUtil;
11+
import org.jabref.logic.util.strings.Transliteration;
1112
import org.jabref.model.FieldChange;
1213
import org.jabref.model.database.BibDatabase;
1314
import org.jabref.model.database.BibDatabaseContext;
@@ -37,7 +38,7 @@ public class CitationKeyGenerator extends BracketedPattern {
3738

3839
/// Source of disallowed characters: <https://tex.stackexchange.com/a/408548/9075>
3940
/// These characters are disallowed in BibTeX keys.
40-
private static final List<Character> DISALLOWED_CHARACTERS = Arrays.asList('{', '}', '(', ')', ',', '=', '\\', '"', '#', '%', '~', '\'');
41+
public static final List<Character> DISALLOWED_CHARACTERS = Arrays.asList('{', '}', '(', ')', ',', '=', '\\', '"', '#', '%', '~', '\'');
4142

4243
private static final Logger LOGGER = LoggerFactory.getLogger(CitationKeyGenerator.class);
4344

@@ -109,7 +110,8 @@ public String generateKey(@NonNull BibEntry entry) {
109110
String newKey = createCitationKeyFromPattern(entry);
110111
newKey = replaceWithRegex(newKey);
111112
newKey = appendLettersToKey(newKey, currentKey);
112-
return cleanKey(newKey, unwantedCharacters);
113+
newKey = cleanKey(newKey, unwantedCharacters);
114+
return transliterateIfNeeded(newKey);
113115
}
114116

115117
/**
@@ -155,6 +157,15 @@ private String appendLettersToKey(String key, String oldKey) {
155157
return key;
156158
}
157159

160+
public String transliterateIfNeeded(String key) {
161+
if (!citationKeyPatternPreferences.shouldTransliterateFieldsForCitationKey()) {
162+
return key;
163+
}
164+
165+
String result = Transliteration.transliterate(key);
166+
return result.replace(" ", "");
167+
}
168+
158169
/**
159170
* Using preferences, replace matches to the provided regex with a string.
160171
*
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package org.jabref.logic.citationkeypattern;
2+
3+
import static org.jabref.logic.citationkeypattern.CitationKeyGenerator.DEFAULT_UNWANTED_CHARACTERS;
4+
5+
public class CitationKeyGeneratorTestUtils {
6+
7+
public static CitationKeyPatternPreferences getInstanceForTesting() {
8+
return new CitationKeyPatternPreferences(
9+
true,
10+
false,
11+
false,
12+
false,
13+
CitationKeyPatternPreferences.KeySuffix.SECOND_WITH_A,
14+
"",
15+
"",
16+
DEFAULT_UNWANTED_CHARACTERS,
17+
GlobalCitationKeyPatterns.fromPattern("[auth][year]"),
18+
"",
19+
','
20+
);
21+
}
22+
}

jablib/src/main/java/org/jabref/logic/citationkeypattern/CitationKeyPatternPreferences.java

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ public enum KeySuffix {
1818
SECOND_WITH_B // CiteKey, CiteKeyB, CiteKeyC ...
1919
}
2020

21+
private final BooleanProperty shouldTransliterateFieldsForCitationKey = new SimpleBooleanProperty();
2122
private final BooleanProperty shouldAvoidOverwriteCiteKey = new SimpleBooleanProperty();
2223
private final BooleanProperty shouldWarnBeforeOverwriteCiteKey = new SimpleBooleanProperty();
2324
private final BooleanProperty shouldGenerateCiteKeysBeforeSaving = new SimpleBooleanProperty();
@@ -29,7 +30,8 @@ public enum KeySuffix {
2930
private final String defaultPattern;
3031
private final ReadOnlyObjectProperty<Character> keywordDelimiter;
3132

32-
public CitationKeyPatternPreferences(boolean shouldAvoidOverwriteCiteKey,
33+
public CitationKeyPatternPreferences(boolean shouldTransliterateFieldsForCitationKey,
34+
boolean shouldAvoidOverwriteCiteKey,
3335
boolean shouldWarnBeforeOverwriteCiteKey,
3436
boolean shouldGenerateCiteKeysBeforeSaving,
3537
KeySuffix keySuffix,
@@ -40,6 +42,7 @@ public CitationKeyPatternPreferences(boolean shouldAvoidOverwriteCiteKey,
4042
String defaultPattern,
4143
ReadOnlyObjectProperty<Character> keywordDelimiter) {
4244

45+
this.shouldTransliterateFieldsForCitationKey.set(shouldTransliterateFieldsForCitationKey);
4346
this.shouldAvoidOverwriteCiteKey.set(shouldAvoidOverwriteCiteKey);
4447
this.shouldWarnBeforeOverwriteCiteKey.set(shouldWarnBeforeOverwriteCiteKey);
4548
this.shouldGenerateCiteKeysBeforeSaving.set(shouldGenerateCiteKeysBeforeSaving);
@@ -54,7 +57,8 @@ public CitationKeyPatternPreferences(boolean shouldAvoidOverwriteCiteKey,
5457
}
5558

5659
@VisibleForTesting
57-
public CitationKeyPatternPreferences(boolean shouldAvoidOverwriteCiteKey,
60+
public CitationKeyPatternPreferences(boolean shouldTransliterateFieldsForCitationKey,
61+
boolean shouldAvoidOverwriteCiteKey,
5862
boolean shouldWarnBeforeOverwriteCiteKey,
5963
boolean shouldGenerateCiteKeysBeforeSaving,
6064
KeySuffix keySuffix,
@@ -65,7 +69,8 @@ public CitationKeyPatternPreferences(boolean shouldAvoidOverwriteCiteKey,
6569
String defaultPattern,
6670
Character keywordDelimiter) {
6771

68-
this(shouldAvoidOverwriteCiteKey,
72+
this(shouldTransliterateFieldsForCitationKey,
73+
shouldAvoidOverwriteCiteKey,
6974
shouldWarnBeforeOverwriteCiteKey,
7075
shouldGenerateCiteKeysBeforeSaving,
7176
keySuffix,
@@ -77,6 +82,18 @@ public CitationKeyPatternPreferences(boolean shouldAvoidOverwriteCiteKey,
7782
new SimpleObjectProperty<>(keywordDelimiter));
7883
}
7984

85+
public boolean shouldTransliterateFieldsForCitationKey() {
86+
return shouldTransliterateFieldsForCitationKey.get();
87+
}
88+
89+
public BooleanProperty shouldTransliterateFieldsForCitationKeyProperty() {
90+
return shouldTransliterateFieldsForCitationKey;
91+
}
92+
93+
public void setShouldTransliterateFieldsForCitationKey(boolean shouldTransliterateFieldsForCitationKey) {
94+
this.shouldTransliterateFieldsForCitationKey.set(shouldTransliterateFieldsForCitationKey);
95+
}
96+
8097
public boolean shouldAvoidOverwriteCiteKey() {
8198
return shouldAvoidOverwriteCiteKey.get();
8299
}

jablib/src/main/java/org/jabref/logic/formatter/Formatters.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import org.jabref.logic.formatter.bibtexfields.RemoveEnclosingBracesFormatter;
3030
import org.jabref.logic.formatter.bibtexfields.RemoveWordEnclosingAndOuterEnclosingBracesFormatter;
3131
import org.jabref.logic.formatter.bibtexfields.ShortenDOIFormatter;
32+
import org.jabref.logic.formatter.bibtexfields.TransliterateFormatter;
3233
import org.jabref.logic.formatter.bibtexfields.UnicodeToLatexFormatter;
3334
import org.jabref.logic.formatter.bibtexfields.UnitsToLatexFormatter;
3435
import org.jabref.logic.formatter.casechanger.CamelFormatter;
@@ -66,7 +67,8 @@ public static List<Formatter> getConverters() {
6667
new HtmlToUnicodeFormatter(),
6768
new LatexToUnicodeFormatter(),
6869
new UnicodeToLatexFormatter(),
69-
new ConvertMSCCodesFormatter()
70+
new ConvertMSCCodesFormatter(),
71+
new TransliterateFormatter()
7072
);
7173
}
7274

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package org.jabref.logic.formatter.bibtexfields;
2+
3+
import org.jabref.logic.cleanup.Formatter;
4+
import org.jabref.logic.l10n.Localization;
5+
import org.jabref.logic.util.strings.Transliteration;
6+
7+
public class TransliterateFormatter extends Formatter {
8+
@Override
9+
public String getName() {
10+
return Localization.lang("Transliterate");
11+
}
12+
13+
@Override
14+
public String getKey() {
15+
return "transliterate";
16+
}
17+
18+
@Override
19+
public String format(String value) {
20+
return Transliteration.transliterate(value);
21+
}
22+
23+
@Override
24+
public String getDescription() {
25+
return Localization.lang("Converts non-Latin characters to their Latin equivalents.");
26+
}
27+
28+
@Override
29+
public String getExampleInput() {
30+
return "Карпенко Надежда";
31+
}
32+
}

0 commit comments

Comments
 (0)