@fiduswriter/bibliography-manager 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +20 -0
  3. package/dist/database/index.js +172 -0
  4. package/dist/database/index.js.map +1 -0
  5. package/dist/database/server_connector.js +47 -0
  6. package/dist/database/server_connector.js.map +1 -0
  7. package/dist/export/index.js +23 -0
  8. package/dist/export/index.js.map +1 -0
  9. package/dist/form/cats.js +22 -0
  10. package/dist/form/cats.js.map +1 -0
  11. package/dist/form/fields/date.js +28 -0
  12. package/dist/form/fields/date.js.map +1 -0
  13. package/dist/form/fields/key.js +100 -0
  14. package/dist/form/fields/key.js.map +1 -0
  15. package/dist/form/fields/key_list.js +37 -0
  16. package/dist/form/fields/key_list.js.map +1 -0
  17. package/dist/form/fields/literal.js +43 -0
  18. package/dist/form/fields/literal.js.map +1 -0
  19. package/dist/form/fields/literal_list.js +36 -0
  20. package/dist/form/fields/literal_list.js.map +1 -0
  21. package/dist/form/fields/literal_long.js +42 -0
  22. package/dist/form/fields/literal_long.js.map +1 -0
  23. package/dist/form/fields/name.js +121 -0
  24. package/dist/form/fields/name.js.map +1 -0
  25. package/dist/form/fields/name_list.js +36 -0
  26. package/dist/form/fields/name_list.js.map +1 -0
  27. package/dist/form/fields/range.js +89 -0
  28. package/dist/form/fields/range.js.map +1 -0
  29. package/dist/form/fields/range_list.js +36 -0
  30. package/dist/form/fields/range_list.js.map +1 -0
  31. package/dist/form/fields/tag_list.js +30 -0
  32. package/dist/form/fields/tag_list.js.map +1 -0
  33. package/dist/form/fields/title.js +46 -0
  34. package/dist/form/fields/title.js.map +1 -0
  35. package/dist/form/fields/uri.js +40 -0
  36. package/dist/form/fields/uri.js.map +1 -0
  37. package/dist/form/fields/verbatim.js +19 -0
  38. package/dist/form/fields/verbatim.js.map +1 -0
  39. package/dist/form/index.js +344 -0
  40. package/dist/form/index.js.map +1 -0
  41. package/dist/form/strings.js +89 -0
  42. package/dist/form/strings.js.map +1 -0
  43. package/dist/form/templates.js +59 -0
  44. package/dist/form/templates.js.map +1 -0
  45. package/dist/import/bibliography_import.js +83 -0
  46. package/dist/import/bibliography_import.js.map +1 -0
  47. package/dist/import/dialog.js +71 -0
  48. package/dist/import/dialog.js.map +1 -0
  49. package/dist/import/index.js +3 -0
  50. package/dist/import/index.js.map +1 -0
  51. package/dist/import/templates.js +12 -0
  52. package/dist/import/templates.js.map +1 -0
  53. package/dist/index.js +6 -0
  54. package/dist/index.js.map +1 -0
  55. package/dist/overview/index.js +453 -0
  56. package/dist/overview/index.js.map +1 -0
  57. package/dist/overview/menu.js +91 -0
  58. package/dist/overview/menu.js.map +1 -0
  59. package/dist/overview/templates.js +24 -0
  60. package/dist/overview/templates.js.map +1 -0
  61. package/dist/plugins/bibliography_overview/index.js +2 -0
  62. package/dist/plugins/bibliography_overview/index.js.map +1 -0
  63. package/dist/schema/literal.js +24 -0
  64. package/dist/schema/literal.js.map +1 -0
  65. package/dist/schema/literal_long.js +40 -0
  66. package/dist/schema/literal_long.js.map +1 -0
  67. package/dist/schema/title.js +31 -0
  68. package/dist/schema/title.js.map +1 -0
  69. package/dist/tools.js +53 -0
  70. package/dist/tools.js.map +1 -0
  71. package/package.json +55 -0
  72. package/src/database/index.js +234 -0
  73. package/src/database/server_connector.js +57 -0
  74. package/src/export/index.js +27 -0
  75. package/src/form/cats.js +24 -0
  76. package/src/form/fields/date.js +31 -0
  77. package/src/form/fields/key.js +113 -0
  78. package/src/form/fields/key_list.js +45 -0
  79. package/src/form/fields/literal.js +48 -0
  80. package/src/form/fields/literal_list.js +42 -0
  81. package/src/form/fields/literal_long.js +47 -0
  82. package/src/form/fields/name.js +152 -0
  83. package/src/form/fields/name_list.js +42 -0
  84. package/src/form/fields/range.js +104 -0
  85. package/src/form/fields/range_list.js +42 -0
  86. package/src/form/fields/tag_list.js +33 -0
  87. package/src/form/fields/title.js +51 -0
  88. package/src/form/fields/uri.js +43 -0
  89. package/src/form/fields/verbatim.js +21 -0
  90. package/src/form/index.js +424 -0
  91. package/src/form/strings.js +122 -0
  92. package/src/form/templates.js +70 -0
  93. package/src/import/bibliography_import.js +104 -0
  94. package/src/import/dialog.js +95 -0
  95. package/src/import/index.js +2 -0
  96. package/src/import/templates.js +12 -0
  97. package/src/index.js +5 -0
  98. package/src/overview/index.js +548 -0
  99. package/src/overview/menu.js +106 -0
  100. package/src/overview/templates.js +30 -0
  101. package/src/plugins/bibliography_overview/index.js +1 -0
  102. package/src/schema/literal.js +34 -0
  103. package/src/schema/literal_long.js +50 -0
  104. package/src/schema/title.js +42 -0
  105. package/src/tools.js +58 -0
@@ -0,0 +1,344 @@
1
+ import { BibFieldTypes, BibTypes } from "bibliojson";
2
+ import { Dialog, DialogTabs, InfoRow, addAlert } from "fwtoolkit";
3
+ import { dateToYear, litToText, nameToText } from "../tools";
4
+ import { CatsForm } from "./cats";
5
+ import { DateFieldForm } from "./fields/date";
6
+ import { KeyFieldForm } from "./fields/key";
7
+ import { KeyListForm } from "./fields/key_list";
8
+ import { LiteralFieldForm } from "./fields/literal";
9
+ import { LiteralListForm } from "./fields/literal_list";
10
+ import { LiteralLongFieldForm } from "./fields/literal_long";
11
+ import { NameListForm } from "./fields/name_list";
12
+ import { RangeListForm } from "./fields/range_list";
13
+ import { TagListForm } from "./fields/tag_list";
14
+ import { TitleFieldForm } from "./fields/title";
15
+ import { URIFieldForm } from "./fields/uri";
16
+ import { VerbatimFieldForm } from "./fields/verbatim";
17
+ import { BibFieldHelp, BibFieldTitles, BibTypeTitles, getBibFieldTitle } from "./strings";
18
+ import { bibDialog } from "./templates";
19
+ const FIELD_FORMS = {
20
+ f_date: DateFieldForm,
21
+ f_integer: LiteralFieldForm,
22
+ f_literal: LiteralFieldForm,
23
+ l_literal: LiteralListForm,
24
+ f_long_literal: LiteralLongFieldForm,
25
+ f_key: KeyFieldForm,
26
+ l_key: KeyListForm,
27
+ l_name: NameListForm,
28
+ l_range: RangeListForm,
29
+ l_tag: TagListForm,
30
+ f_title: TitleFieldForm,
31
+ f_uri: URIFieldForm,
32
+ f_verbatim: VerbatimFieldForm
33
+ };
34
+ export class BibEntryForm {
35
+ constructor(bibDB, app = false, itemId = false) {
36
+ this.bibDB = bibDB;
37
+ this.itemId = itemId;
38
+ this.app = app;
39
+ this.fields = {};
40
+ this.currentValues = {};
41
+ }
42
+ init() {
43
+ if (this.app && this.app.isOffline()) {
44
+ // Diable the editing of main user bibliography , since Document bibliography is stored in Editor/Document.
45
+ addAlert("info", gettext("You are currently offline. Please try again when you are back online."));
46
+ return Promise.resolve();
47
+ }
48
+ if (this.itemId !== false) {
49
+ this.dialogHeader = gettext("Edit Source");
50
+ const bibEntry = this.bibDB.db[this.itemId];
51
+ this.currentValues = JSON.parse(JSON.stringify(bibEntry)); // copy current values
52
+ }
53
+ else {
54
+ this.dialogHeader = gettext("Register New Source");
55
+ this.currentValues = {
56
+ bib_type: false,
57
+ cats: [],
58
+ entry_key: "",
59
+ fields: {}
60
+ };
61
+ }
62
+ return this.createForm();
63
+ }
64
+ addDialogToDOM() {
65
+ // Add form to DOM
66
+ const buttons = [
67
+ {
68
+ type: "close"
69
+ }
70
+ ];
71
+ return new Promise(resolve => {
72
+ buttons.push({
73
+ classes: "fw-dark",
74
+ text: gettext("Submit"),
75
+ click: () => {
76
+ if (this.check()) {
77
+ const returnValue = this.save();
78
+ this.dialog.close();
79
+ resolve(returnValue);
80
+ }
81
+ }
82
+ });
83
+ this.entryKeyAutoGenerate = !this.currentValues.entry_key;
84
+ this.programmaticallySettingKey = false;
85
+ this.lastAutoGeneratedKey = null;
86
+ const hasCats = this.bibDB.cats.length > 0;
87
+ this.dialog = new Dialog({
88
+ title: this.dialogHeader,
89
+ id: "bib-dialog",
90
+ width: 940,
91
+ body: bibDialog({
92
+ bib_type: this.currentValues.bib_type,
93
+ BibTypes,
94
+ hasCats
95
+ }),
96
+ buttons
97
+ });
98
+ this.dialog.open();
99
+ this.dialogTabs = new DialogTabs([
100
+ {
101
+ id: "req-fields-tab",
102
+ title: gettext("Required Fields"),
103
+ template: () => ""
104
+ },
105
+ {
106
+ id: "opt-fields-tab",
107
+ title: gettext("Optional Fields"),
108
+ template: () => ""
109
+ },
110
+ ...(hasCats
111
+ ? [
112
+ {
113
+ id: "categories-tab",
114
+ title: gettext("Categories"),
115
+ template: () => ""
116
+ }
117
+ ]
118
+ : [])
119
+ ], { containerId: "bib-dialog-tabs" });
120
+ this.dialogTabs.bind(this.dialog.dialogEl.querySelector("#bib-dialog-tabs"));
121
+ const entryKeyInput = document.getElementById("entry-key");
122
+ if (entryKeyInput) {
123
+ entryKeyInput.value = this.currentValues.entry_key || "";
124
+ entryKeyInput.addEventListener("input", () => {
125
+ if (this.programmaticallySettingKey) {
126
+ return;
127
+ }
128
+ this.entryKeyAutoGenerate = !entryKeyInput.value.trim();
129
+ if (this.entryKeyAutoGenerate) {
130
+ this.lastAutoGeneratedKey = null;
131
+ }
132
+ this.checkEntryKey();
133
+ });
134
+ this.checkEntryKey();
135
+ this.dialog.dialogEl.addEventListener("focusout", () => {
136
+ if (this.entryKeyAutoGenerate) {
137
+ this.maybeAutoGenerateEntryKey();
138
+ }
139
+ });
140
+ }
141
+ document
142
+ .getElementById("select-bibtype")
143
+ .addEventListener("change", () => resolve(this.changeBibType()));
144
+ });
145
+ }
146
+ addField(fieldName, dom) {
147
+ const fieldType = BibFieldTypes[fieldName];
148
+ const fieldTitleText = getBibFieldTitle(fieldName, this.currentValues.bib_type);
149
+ const row = new InfoRow({
150
+ label: fieldTitleText,
151
+ helpText: BibFieldHelp[fieldName],
152
+ fieldClass: fieldName
153
+ });
154
+ dom.insertAdjacentHTML("beforeend", row.html());
155
+ const fieldDOM = dom.lastChild.lastChild;
156
+ const FieldClass = FIELD_FORMS[fieldType.type];
157
+ if (FieldClass) {
158
+ const fieldHandler = new FieldClass(fieldDOM, this.currentValues.fields[fieldName], undefined, fieldType);
159
+ fieldHandler.init();
160
+ this.fields[fieldName] = fieldHandler;
161
+ }
162
+ }
163
+ createForm() {
164
+ const dialogPromise = this.addDialogToDOM();
165
+ if (this.currentValues.bib_type !== false) {
166
+ const eitherOrFields = document.getElementById("eo-fields");
167
+ BibTypes[this.currentValues.bib_type].eitheror.forEach(fieldName => {
168
+ this.addField(fieldName, eitherOrFields);
169
+ });
170
+ const reqFields = document.getElementById("req-fields");
171
+ BibTypes[this.currentValues.bib_type].required.forEach(fieldName => {
172
+ this.addField(fieldName, reqFields);
173
+ });
174
+ const optFields = document.getElementById("opt-fields");
175
+ BibTypes[this.currentValues.bib_type].optional.forEach(fieldName => {
176
+ this.addField(fieldName, optFields);
177
+ });
178
+ const catsField = document.getElementById("categories-field");
179
+ if (catsField) {
180
+ this.catsForm = new CatsForm(catsField, this.currentValues.cats, this.bibDB.cats);
181
+ this.catsForm.init();
182
+ }
183
+ }
184
+ return dialogPromise;
185
+ }
186
+ changeBibType() {
187
+ // Add all current values into temporary currentValues, in case the
188
+ // user still wants them.
189
+ const formValue = this.value;
190
+ Object.assign(this.currentValues.fields, formValue.fields);
191
+ this.currentValues.cats = formValue.cats;
192
+ this.currentValues.bib_type = formValue.bib_type;
193
+ // Reset fields and close dialog.
194
+ this.fields = {};
195
+ this.dialog.close();
196
+ return this.createForm();
197
+ }
198
+ createEntryKey(bibItem) {
199
+ // We attempt to create a biblatex compatible entry key if there is no entry
200
+ // key so far.
201
+ let entryKey = "";
202
+ if (bibItem.fields.author) {
203
+ entryKey += nameToText(bibItem.fields.author).replace(/\s|,|=|;|:|{|}/g, "");
204
+ }
205
+ else if (bibItem.fields.editor) {
206
+ entryKey += nameToText(bibItem.fields.editor).replace(/\s|,|=|;|:|{|}/g, "");
207
+ }
208
+ if (bibItem.fields.date) {
209
+ entryKey += bibItem.fields.date
210
+ .split("/")[0]
211
+ .replace(/\?|\*|u|~|-/g, "");
212
+ }
213
+ if (entryKey.length) {
214
+ bibItem.entry_key = entryKey;
215
+ }
216
+ }
217
+ maybeAutoGenerateEntryKey() {
218
+ if (!this.entryKeyAutoGenerate) {
219
+ return;
220
+ }
221
+ const input = document.getElementById("entry-key");
222
+ if (!input) {
223
+ return;
224
+ }
225
+ const currentValue = input.value.trim();
226
+ if (currentValue && currentValue !== this.lastAutoGeneratedKey) {
227
+ return;
228
+ }
229
+ let lastName = "";
230
+ const nameField = this.fields.author || this.fields.editor;
231
+ if (nameField && nameField.value && nameField.value.length) {
232
+ const firstAuthor = nameField.value[0];
233
+ if (firstAuthor.family && firstAuthor.family.length) {
234
+ lastName = litToText(firstAuthor.family);
235
+ }
236
+ else if (firstAuthor.literal && firstAuthor.literal.length) {
237
+ lastName = litToText(firstAuthor.literal);
238
+ }
239
+ }
240
+ lastName = lastName.replace(/[^a-zA-Z0-9_-]/g, "");
241
+ let year = "";
242
+ if (this.fields.date && this.fields.date.value) {
243
+ const yearStr = dateToYear(this.fields.date.value);
244
+ const yearMatch = yearStr.match(/-?(\d+)/);
245
+ year = yearMatch ? yearMatch[1] : "";
246
+ }
247
+ year = year.replace(/[^a-zA-Z0-9_-]/g, "");
248
+ const baseKey = `${lastName}${year}`;
249
+ if (!baseKey) {
250
+ return;
251
+ }
252
+ const existingKeys = new Set(Object.entries(this.bibDB.db)
253
+ .filter(([id]) => Number.parseInt(id) !==
254
+ Number.parseInt(this.itemId || 0))
255
+ .map(([, entry]) => entry.entry_key));
256
+ let key = baseKey;
257
+ let suffix = "";
258
+ while (existingKeys.has(key + suffix)) {
259
+ suffix =
260
+ suffix === ""
261
+ ? "a"
262
+ : String.fromCharCode(suffix.charCodeAt(0) + 1);
263
+ }
264
+ key = key + suffix;
265
+ if (key === currentValue) {
266
+ return;
267
+ }
268
+ this.programmaticallySettingKey = true;
269
+ input.value = key;
270
+ this.programmaticallySettingKey = false;
271
+ this.lastAutoGeneratedKey = key;
272
+ this.checkEntryKey();
273
+ }
274
+ checkEntryKey() {
275
+ const input = document.getElementById("entry-key");
276
+ const warningEl = document.getElementById("entry-key-warning");
277
+ if (!input || !warningEl) {
278
+ return;
279
+ }
280
+ const value = input.value.trim();
281
+ if (!value) {
282
+ warningEl.textContent = "";
283
+ return;
284
+ }
285
+ const slugPattern = /^[a-zA-Z0-9_-]+$/;
286
+ if (!slugPattern.test(value)) {
287
+ warningEl.textContent = gettext("Only letters, numbers, hyphens and underscores are allowed.");
288
+ return;
289
+ }
290
+ // Check for duplicates in the user's library (soft requirement - just warn)
291
+ const duplicate = Object.entries(this.bibDB.db).find(([id, entry]) => entry.entry_key === value &&
292
+ Number.parseInt(id) !== Number.parseInt(this.itemId || 0));
293
+ if (duplicate) {
294
+ warningEl.textContent = gettext("Warning: this key is already used in your library.");
295
+ }
296
+ else {
297
+ warningEl.textContent = "";
298
+ }
299
+ }
300
+ get value() {
301
+ const entryKeyInput = document.querySelector("#entry-key");
302
+ const entryKey = entryKeyInput
303
+ ? entryKeyInput.value.trim()
304
+ : this.currentValues.entry_key;
305
+ const returnObj = {
306
+ bib_type: document.querySelector("#select-bibtype").value,
307
+ cats: this.catsForm ? this.catsForm.value : [],
308
+ entry_key: entryKey,
309
+ fields: {}
310
+ };
311
+ Object.keys(this.fields).forEach(fieldName => {
312
+ const fieldValue = this.fields[fieldName].value;
313
+ if (fieldValue !== false) {
314
+ returnObj["fields"][fieldName] = fieldValue;
315
+ }
316
+ });
317
+ return returnObj;
318
+ }
319
+ save() {
320
+ const isNew = this.itemId === false ? true : false, itemId = this.itemId === false ? 0 : this.itemId, item = this.value;
321
+ if (!item.entry_key) {
322
+ this.createEntryKey(item);
323
+ }
324
+ const saveObj = {};
325
+ saveObj[itemId] = item;
326
+ return this.bibDB.saveBibEntries(saveObj, isNew);
327
+ }
328
+ check() {
329
+ let passed = true;
330
+ if (!this.currentValues.bib_type) {
331
+ return false;
332
+ }
333
+ Object.keys(this.fields).forEach(fieldName => {
334
+ if (this.fields[fieldName].check() !== true) {
335
+ passed = false;
336
+ }
337
+ });
338
+ if (!passed) {
339
+ addAlert("error", gettext("Error in form, check highlighted values!"));
340
+ }
341
+ return passed;
342
+ }
343
+ }
344
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/form/index.js"],"names":[],"mappings":"AAAA,OAAO,EAAC,aAAa,EAAE,QAAQ,EAAC,MAAM,YAAY,CAAA;AAClD,OAAO,EAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAC,MAAM,WAAW,CAAA;AAC/D,OAAO,EAAC,UAAU,EAAE,SAAS,EAAE,UAAU,EAAC,MAAM,UAAU,CAAA;AAC1D,OAAO,EAAC,QAAQ,EAAC,MAAM,QAAQ,CAAA;AAC/B,OAAO,EAAC,aAAa,EAAC,MAAM,eAAe,CAAA;AAC3C,OAAO,EAAC,YAAY,EAAC,MAAM,cAAc,CAAA;AACzC,OAAO,EAAC,WAAW,EAAC,MAAM,mBAAmB,CAAA;AAC7C,OAAO,EAAC,gBAAgB,EAAC,MAAM,kBAAkB,CAAA;AACjD,OAAO,EAAC,eAAe,EAAC,MAAM,uBAAuB,CAAA;AACrD,OAAO,EAAC,oBAAoB,EAAC,MAAM,uBAAuB,CAAA;AAC1D,OAAO,EAAC,YAAY,EAAC,MAAM,oBAAoB,CAAA;AAC/C,OAAO,EAAC,aAAa,EAAC,MAAM,qBAAqB,CAAA;AACjD,OAAO,EAAC,WAAW,EAAC,MAAM,mBAAmB,CAAA;AAC7C,OAAO,EAAC,cAAc,EAAC,MAAM,gBAAgB,CAAA;AAC7C,OAAO,EAAC,YAAY,EAAC,MAAM,cAAc,CAAA;AACzC,OAAO,EAAC,iBAAiB,EAAC,MAAM,mBAAmB,CAAA;AACnD,OAAO,EACH,YAAY,EACZ,cAAc,EACd,aAAa,EACb,gBAAgB,EACnB,MAAM,WAAW,CAAA;AAClB,OAAO,EAAC,SAAS,EAAC,MAAM,aAAa,CAAA;AAErC,MAAM,WAAW,GAAG;IAChB,MAAM,EAAE,aAAa;IACrB,SAAS,EAAE,gBAAgB;IAC3B,SAAS,EAAE,gBAAgB;IAC3B,SAAS,EAAE,eAAe;IAC1B,cAAc,EAAE,oBAAoB;IACpC,KAAK,EAAE,YAAY;IACnB,KAAK,EAAE,WAAW;IAClB,MAAM,EAAE,YAAY;IACpB,OAAO,EAAE,aAAa;IACtB,KAAK,EAAE,WAAW;IAClB,OAAO,EAAE,cAAc;IACvB,KAAK,EAAE,YAAY;IACnB,UAAU,EAAE,iBAAiB;CAChC,CAAA;AAED,MAAM,OAAO,YAAY;IACrB,YAAY,KAAK,EAAE,GAAG,GAAG,KAAK,EAAE,MAAM,GAAG,KAAK;QAC1C,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;QAClB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACpB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAA;QACd,IAAI,CAAC,MAAM,GAAG,EAAE,CAAA;QAChB,IAAI,CAAC,aAAa,GAAG,EAAE,CAAA;IAC3B,CAAC;IAED,IAAI;QACA,IAAI,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC;YACnC,2GAA2G;YAC3G,QAAQ,CACJ,MAAM,EACN,OAAO,CACH,uEAAuE,CAC1E,CACJ,CAAA;YACD,OAAO,OAAO,CAAC,OAAO,EAAE,CAAA;QAC5B,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;YACxB,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC,CAAA;YAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;YAC3C,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAA,CAAC,sBAAsB;QACpF,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAA;YAClD,IAAI,CAAC,aAAa,GAAG;gBACjB,QAAQ,EAAE,KAAK;gBACf,IAAI,EAAE,EAAE;gBACR,SAAS,EAAE,EAAE;gBACb,MAAM,EAAE,EAAE;aACb,CAAA;QACL,CAAC;QACD,OAAO,IAAI,CAAC,UAAU,EAAE,CAAA;IAC5B,CAAC;IAED,cAAc;QACV,kBAAkB;QAClB,MAAM,OAAO,GAAG;YACZ;gBACI,IAAI,EAAE,OAAO;aAChB;SACJ,CAAA;QAED,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE;YACzB,OAAO,CAAC,IAAI,CAAC;gBACT,OAAO,EAAE,SAAS;gBAClB,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC;gBACvB,KAAK,EAAE,GAAG,EAAE;oBACR,IAAI,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;wBACf,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE,CAAA;wBAC/B,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAA;wBACnB,OAAO,CAAC,WAAW,CAAC,CAAA;oBACxB,CAAC;gBACL,CAAC;aACJ,CAAC,CAAA;YAEF,IAAI,CAAC,oBAAoB,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,SAAS,CAAA;YACzD,IAAI,CAAC,0BAA0B,GAAG,KAAK,CAAA;YACvC,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAA;YAEhC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAA;YAC1C,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC;gBACrB,KAAK,EAAE,IAAI,CAAC,YAAY;gBACxB,EAAE,EAAE,YAAY;gBAChB,KAAK,EAAE,GAAG;gBACV,IAAI,EAAE,SAAS,CAAC;oBACZ,QAAQ,EAAE,IAAI,CAAC,aAAa,CAAC,QAAQ;oBACrC,QAAQ;oBACR,OAAO;iBACV,CAAC;gBACF,OAAO;aACV,CAAC,CAAA;YAEF,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAA;YAElB,IAAI,CAAC,UAAU,GAAG,IAAI,UAAU,CAC5B;gBACI;oBACI,EAAE,EAAE,gBAAgB;oBACpB,KAAK,EAAE,OAAO,CAAC,iBAAiB,CAAC;oBACjC,QAAQ,EAAE,GAAG,EAAE,CAAC,EAAE;iBACrB;gBACD;oBACI,EAAE,EAAE,gBAAgB;oBACpB,KAAK,EAAE,OAAO,CAAC,iBAAiB,CAAC;oBACjC,QAAQ,EAAE,GAAG,EAAE,CAAC,EAAE;iBACrB;gBACD,GAAG,CAAC,OAAO;oBACP,CAAC,CAAC;wBACI;4BACI,EAAE,EAAE,gBAAgB;4BACpB,KAAK,EAAE,OAAO,CAAC,YAAY,CAAC;4BAC5B,QAAQ,EAAE,GAAG,EAAE,CAAC,EAAE;yBACrB;qBACJ;oBACH,CAAC,CAAC,EAAE,CAAC;aACZ,EACD,EAAC,WAAW,EAAE,iBAAiB,EAAC,CACnC,CAAA;YACD,IAAI,CAAC,UAAU,CAAC,IAAI,CAChB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,kBAAkB,CAAC,CACzD,CAAA;YAED,MAAM,aAAa,GAAG,QAAQ,CAAC,cAAc,CAAC,WAAW,CAAC,CAAA;YAC1D,IAAI,aAAa,EAAE,CAAC;gBAChB,aAAa,CAAC,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,IAAI,EAAE,CAAA;gBACxD,aAAa,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;oBACzC,IAAI,IAAI,CAAC,0BAA0B,EAAE,CAAC;wBAClC,OAAM;oBACV,CAAC;oBACD,IAAI,CAAC,oBAAoB,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,EAAE,CAAA;oBACvD,IAAI,IAAI,CAAC,oBAAoB,EAAE,CAAC;wBAC5B,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAA;oBACpC,CAAC;oBACD,IAAI,CAAC,aAAa,EAAE,CAAA;gBACxB,CAAC,CAAC,CAAA;gBACF,IAAI,CAAC,aAAa,EAAE,CAAA;gBACpB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC,UAAU,EAAE,GAAG,EAAE;oBACnD,IAAI,IAAI,CAAC,oBAAoB,EAAE,CAAC;wBAC5B,IAAI,CAAC,yBAAyB,EAAE,CAAA;oBACpC,CAAC;gBACL,CAAC,CAAC,CAAA;YACN,CAAC;YAED,QAAQ;iBACH,cAAc,CAAC,gBAAgB,CAAC;iBAChC,gBAAgB,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,CAAA;QACxE,CAAC,CAAC,CAAA;IACN,CAAC;IAED,QAAQ,CAAC,SAAS,EAAE,GAAG;QACnB,MAAM,SAAS,GAAG,aAAa,CAAC,SAAS,CAAC,CAAA;QAC1C,MAAM,cAAc,GAAG,gBAAgB,CACnC,SAAS,EACT,IAAI,CAAC,aAAa,CAAC,QAAQ,CAC9B,CAAA;QAED,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC;YACpB,KAAK,EAAE,cAAc;YACrB,QAAQ,EAAE,YAAY,CAAC,SAAS,CAAC;YACjC,UAAU,EAAE,SAAS;SACxB,CAAC,CAAA;QACF,GAAG,CAAC,kBAAkB,CAAC,WAAW,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC,CAAA;QAC/C,MAAM,QAAQ,GAAG,GAAG,CAAC,SAAS,CAAC,SAAS,CAAA;QACxC,MAAM,UAAU,GAAG,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;QAC9C,IAAI,UAAU,EAAE,CAAC;YACb,MAAM,YAAY,GAAG,IAAI,UAAU,CAC/B,QAAQ,EACR,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC,EACpC,SAAS,EACT,SAAS,CACZ,CAAA;YACD,YAAY,CAAC,IAAI,EAAE,CAAA;YACnB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,YAAY,CAAA;QACzC,CAAC;IACL,CAAC;IAED,UAAU;QACN,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,EAAE,CAAA;QAC3C,IAAI,IAAI,CAAC,aAAa,CAAC,QAAQ,KAAK,KAAK,EAAE,CAAC;YACxC,MAAM,cAAc,GAAG,QAAQ,CAAC,cAAc,CAAC,WAAW,CAAC,CAAA;YAC3D,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,OAAO,CAClD,SAAS,CAAC,EAAE;gBACR,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAC,CAAA;YAC5C,CAAC,CACJ,CAAA;YACD,MAAM,SAAS,GAAG,QAAQ,CAAC,cAAc,CAAC,YAAY,CAAC,CAAA;YACvD,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,OAAO,CAClD,SAAS,CAAC,EAAE;gBACR,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;YACvC,CAAC,CACJ,CAAA;YACD,MAAM,SAAS,GAAG,QAAQ,CAAC,cAAc,CAAC,YAAY,CAAC,CAAA;YACvD,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,OAAO,CAClD,SAAS,CAAC,EAAE;gBACR,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;YACvC,CAAC,CACJ,CAAA;YACD,MAAM,SAAS,GAAG,QAAQ,CAAC,cAAc,CAAC,kBAAkB,CAAC,CAAA;YAC7D,IAAI,SAAS,EAAE,CAAC;gBACZ,IAAI,CAAC,QAAQ,GAAG,IAAI,QAAQ,CACxB,SAAS,EACT,IAAI,CAAC,aAAa,CAAC,IAAI,EACvB,IAAI,CAAC,KAAK,CAAC,IAAI,CAClB,CAAA;gBACD,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAA;YACxB,CAAC;QACL,CAAC;QACD,OAAO,aAAa,CAAA;IACxB,CAAC;IAED,aAAa;QACT,mEAAmE;QACnE,yBAAyB;QACzB,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAA;QAC5B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,CAAA;QAC1D,IAAI,CAAC,aAAa,CAAC,IAAI,GAAG,SAAS,CAAC,IAAI,CAAA;QACxC,IAAI,CAAC,aAAa,CAAC,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAA;QAChD,iCAAiC;QACjC,IAAI,CAAC,MAAM,GAAG,EAAE,CAAA;QAChB,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAA;QACnB,OAAO,IAAI,CAAC,UAAU,EAAE,CAAA;IAC5B,CAAC;IAED,cAAc,CAAC,OAAO;QAClB,4EAA4E;QAC5E,cAAc;QACd,IAAI,QAAQ,GAAG,EAAE,CAAA;QACjB,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACxB,QAAQ,IAAI,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CACjD,iBAAiB,EACjB,EAAE,CACL,CAAA;QACL,CAAC;aAAM,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YAC/B,QAAQ,IAAI,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CACjD,iBAAiB,EACjB,EAAE,CACL,CAAA;QACL,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACtB,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI;iBAC1B,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;iBACb,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAA;QACpC,CAAC;QACD,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;YAClB,OAAO,CAAC,SAAS,GAAG,QAAQ,CAAA;QAChC,CAAC;IACL,CAAC;IAED,yBAAyB;QACrB,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC7B,OAAM;QACV,CAAC;QACD,MAAM,KAAK,GAAG,QAAQ,CAAC,cAAc,CAAC,WAAW,CAAC,CAAA;QAClD,IAAI,CAAC,KAAK,EAAE,CAAC;YACT,OAAM;QACV,CAAC;QACD,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAA;QACvC,IAAI,YAAY,IAAI,YAAY,KAAK,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC7D,OAAM;QACV,CAAC;QAED,IAAI,QAAQ,GAAG,EAAE,CAAA;QACjB,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,CAAA;QAC1D,IAAI,SAAS,IAAI,SAAS,CAAC,KAAK,IAAI,SAAS,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YACzD,MAAM,WAAW,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;YACtC,IAAI,WAAW,CAAC,MAAM,IAAI,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;gBAClD,QAAQ,GAAG,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC,CAAA;YAC5C,CAAC;iBAAM,IAAI,WAAW,CAAC,OAAO,IAAI,WAAW,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;gBAC3D,QAAQ,GAAG,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA;YAC7C,CAAC;QACL,CAAC;QACD,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAA;QAElD,IAAI,IAAI,GAAG,EAAE,CAAA;QACb,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAC7C,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YAClD,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;YAC1C,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;QACxC,CAAC;QACD,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAA;QAE1C,MAAM,OAAO,GAAG,GAAG,QAAQ,GAAG,IAAI,EAAE,CAAA;QACpC,IAAI,CAAC,OAAO,EAAE,CAAC;YACX,OAAM;QACV,CAAC;QAED,MAAM,YAAY,GAAG,IAAI,GAAG,CACxB,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;aACxB,MAAM,CACH,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACL,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;YACnB,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,CACxC;aACA,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAC3C,CAAA;QAED,IAAI,GAAG,GAAG,OAAO,CAAA;QACjB,IAAI,MAAM,GAAG,EAAE,CAAA;QACf,OAAO,YAAY,CAAC,GAAG,CAAC,GAAG,GAAG,MAAM,CAAC,EAAE,CAAC;YACpC,MAAM;gBACF,MAAM,KAAK,EAAE;oBACT,CAAC,CAAC,GAAG;oBACL,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;QAC3D,CAAC;QACD,GAAG,GAAG,GAAG,GAAG,MAAM,CAAA;QAElB,IAAI,GAAG,KAAK,YAAY,EAAE,CAAC;YACvB,OAAM;QACV,CAAC;QAED,IAAI,CAAC,0BAA0B,GAAG,IAAI,CAAA;QACtC,KAAK,CAAC,KAAK,GAAG,GAAG,CAAA;QACjB,IAAI,CAAC,0BAA0B,GAAG,KAAK,CAAA;QACvC,IAAI,CAAC,oBAAoB,GAAG,GAAG,CAAA;QAC/B,IAAI,CAAC,aAAa,EAAE,CAAA;IACxB,CAAC;IAED,aAAa;QACT,MAAM,KAAK,GAAG,QAAQ,CAAC,cAAc,CAAC,WAAW,CAAC,CAAA;QAClD,MAAM,SAAS,GAAG,QAAQ,CAAC,cAAc,CAAC,mBAAmB,CAAC,CAAA;QAC9D,IAAI,CAAC,KAAK,IAAI,CAAC,SAAS,EAAE,CAAC;YACvB,OAAM;QACV,CAAC;QACD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAA;QAChC,IAAI,CAAC,KAAK,EAAE,CAAC;YACT,SAAS,CAAC,WAAW,GAAG,EAAE,CAAA;YAC1B,OAAM;QACV,CAAC;QACD,MAAM,WAAW,GAAG,kBAAkB,CAAA;QACtC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3B,SAAS,CAAC,WAAW,GAAG,OAAO,CAC3B,6DAA6D,CAChE,CAAA;YACD,OAAM;QACV,CAAC;QACD,4EAA4E;QAC5E,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAChD,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,CACZ,KAAK,CAAC,SAAS,KAAK,KAAK;YACzB,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,CAChE,CAAA;QACD,IAAI,SAAS,EAAE,CAAC;YACZ,SAAS,CAAC,WAAW,GAAG,OAAO,CAC3B,oDAAoD,CACvD,CAAA;QACL,CAAC;aAAM,CAAC;YACJ,SAAS,CAAC,WAAW,GAAG,EAAE,CAAA;QAC9B,CAAC;IACL,CAAC;IAED,IAAI,KAAK;QACL,MAAM,aAAa,GAAG,QAAQ,CAAC,aAAa,CAAC,YAAY,CAAC,CAAA;QAC1D,MAAM,QAAQ,GAAG,aAAa;YAC1B,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,EAAE;YAC5B,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,SAAS,CAAA;QAClC,MAAM,SAAS,GAAG;YACd,QAAQ,EAAE,QAAQ,CAAC,aAAa,CAAC,iBAAiB,CAAC,CAAC,KAAK;YACzD,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;YAC9C,SAAS,EAAE,QAAQ;YACnB,MAAM,EAAE,EAAE;SACb,CAAA;QACD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE;YACzC,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,KAAK,CAAA;YAC/C,IAAI,UAAU,KAAK,KAAK,EAAE,CAAC;gBACvB,SAAS,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,GAAG,UAAU,CAAA;YAC/C,CAAC;QACL,CAAC,CAAC,CAAA;QACF,OAAO,SAAS,CAAA;IACpB,CAAC;IAED,IAAI;QACA,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,EAC9C,MAAM,GAAG,IAAI,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAChD,IAAI,GAAG,IAAI,CAAC,KAAK,CAAA;QAErB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YAClB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAA;QAC7B,CAAC;QACD,MAAM,OAAO,GAAG,EAAE,CAAA;QAClB,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,CAAA;QACtB,OAAO,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;IACpD,CAAC;IAED,KAAK;QACD,IAAI,MAAM,GAAG,IAAI,CAAA;QACjB,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC;YAC/B,OAAO,KAAK,CAAA;QAChB,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE;YACzC,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,KAAK,IAAI,EAAE,CAAC;gBAC1C,MAAM,GAAG,KAAK,CAAA;YAClB,CAAC;QACL,CAAC,CAAC,CAAA;QACF,IAAI,CAAC,MAAM,EAAE,CAAC;YACV,QAAQ,CACJ,OAAO,EACP,OAAO,CAAC,0CAA0C,CAAC,CACtD,CAAA;QACL,CAAC;QACD,OAAO,MAAM,CAAA;IACjB,CAAC;CACJ"}
@@ -0,0 +1,89 @@
1
+ import { BibFieldTypes, BibTypes, getFieldHelp, getFieldTitle, getLangidTitle, getLocale, getOtherOptionTitle, getTypeTitle } from "bibliojson";
2
+ // Cache for the current locale to avoid repeated lookups
3
+ let cachedLocale = null;
4
+ let cachedLang = null;
5
+ function getCachedLocale() {
6
+ const lang = document.documentElement.lang || "en";
7
+ if (lang !== cachedLang) {
8
+ cachedLocale = getLocale(lang);
9
+ cachedLang = lang;
10
+ }
11
+ return cachedLocale;
12
+ }
13
+ // Dynamic field title getter that uses bibliojson's i18n
14
+ export function getBibFieldTitle(fieldKey, bibType = null) {
15
+ const locale = getCachedLocale();
16
+ if (bibType && BibTypes[bibType]) {
17
+ return getFieldTitle(locale, bibType, fieldKey);
18
+ }
19
+ // Fallback to generic field title
20
+ const fieldType = BibFieldTypes[fieldKey];
21
+ if (fieldType && fieldType.title) {
22
+ return fieldType.title;
23
+ }
24
+ return fieldKey;
25
+ }
26
+ // Dynamic type title getter
27
+ export function getBibTypeTitle(typeKey) {
28
+ const locale = getCachedLocale();
29
+ return getTypeTitle(locale, typeKey);
30
+ }
31
+ // Dynamic field help getter
32
+ export function getBibFieldHelp(fieldKey) {
33
+ const locale = getCachedLocale();
34
+ return getFieldHelp(locale, fieldKey);
35
+ }
36
+ // Dynamic option title getter (for editortype, pagination, pubstate, etc.)
37
+ export function getBibOptionTitle(optionKey) {
38
+ const locale = getCachedLocale();
39
+ return getOtherOptionTitle(locale, optionKey);
40
+ }
41
+ // Dynamic langid title getter
42
+ export function getBibLangidTitle(langidKey) {
43
+ const locale = getCachedLocale();
44
+ return getLangidTitle(locale, langidKey);
45
+ }
46
+ // For backward compatibility, create proxy objects that dynamically return translations
47
+ // These should be used sparingly - prefer using the function versions above
48
+ export const BibFieldTitles = new Proxy({}, {
49
+ get(_target, prop) {
50
+ return getBibFieldTitle(prop);
51
+ }
52
+ });
53
+ export const BibTypeTitles = new Proxy({}, {
54
+ get(_target, prop) {
55
+ return getBibTypeTitle(prop);
56
+ }
57
+ });
58
+ export const BibFieldHelp = new Proxy({}, {
59
+ get(_target, prop) {
60
+ return getBibFieldHelp(prop);
61
+ }
62
+ });
63
+ export const BibOptionTitles = new Proxy({}, {
64
+ get(_target, prop) {
65
+ return getBibOptionTitle(prop);
66
+ }
67
+ });
68
+ // Export a function to get all type titles as an object (for templates that need to map all types)
69
+ export function getAllTypeTitles() {
70
+ const locale = getCachedLocale();
71
+ const titles = {};
72
+ Object.keys(BibTypes).forEach(typeKey => {
73
+ titles[typeKey] = getTypeTitle(locale, typeKey);
74
+ });
75
+ return titles;
76
+ }
77
+ // Export a function to get all field help texts
78
+ export function getAllFieldHelp() {
79
+ const locale = getCachedLocale();
80
+ const help = {};
81
+ Object.keys(BibFieldTypes).forEach(fieldKey => {
82
+ const helpText = getFieldHelp(locale, fieldKey);
83
+ if (helpText) {
84
+ help[fieldKey] = helpText;
85
+ }
86
+ });
87
+ return help;
88
+ }
89
+ //# sourceMappingURL=strings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"strings.js","sourceRoot":"","sources":["../../src/form/strings.js"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ /** A template for the bibliography item edit dialog. */
2
+ import { DialogTabs } from "fwtoolkit";
3
+ import { getAllTypeTitles } from "./strings";
4
+ const requiredFieldsTemplate = () => `<table class="fw-dialog-table"><tbody id="eo-fields"></tbody></table>
5
+ <table class="fw-dialog-table"><tbody id="req-fields"></tbody></table>`;
6
+ const optionalFieldsTemplate = () => `<table class="fw-dialog-table"><tbody id="opt-fields"></tbody></table>`;
7
+ const categoriesTemplate = () => `<table class="fw-dialog-table">
8
+ <tbody>
9
+ <tr>
10
+ <th><h4 class="fw-tablerow-title">${gettext("Categories")}</h4></th>
11
+ <td id="categories-field"></td>
12
+ </tr>
13
+ </tbody>
14
+ </table>`;
15
+ export const bibDialog = ({ bib_type, BibTypes, hasCats }) => {
16
+ const typeTitles = getAllTypeTitles();
17
+ const tabs = [
18
+ {
19
+ id: "req-fields-tab",
20
+ title: gettext("Required Fields"),
21
+ template: requiredFieldsTemplate
22
+ },
23
+ {
24
+ id: "opt-fields-tab",
25
+ title: gettext("Optional Fields"),
26
+ template: optionalFieldsTemplate
27
+ }
28
+ ];
29
+ if (hasCats) {
30
+ tabs.push({
31
+ id: "categories-tab",
32
+ title: gettext("Categories"),
33
+ template: categoriesTemplate
34
+ });
35
+ }
36
+ const dialogTabs = new DialogTabs(tabs, { containerId: "bib-dialog-tabs" });
37
+ return `<div class="bib-dialog-header">
38
+ <div class="fw-select-container">
39
+ <select id="select-bibtype" class="fw-button fw-light fw-large" required>
40
+ ${bib_type === false
41
+ ? `<option class="fw-placeholder" selected disabled value="">${gettext("Select source type")}</option>`
42
+ : ""}
43
+ ${Object.keys(BibTypes)
44
+ .map(key => `<option value="${key}"
45
+ ${key === bib_type ? "selected" : ""}>
46
+ ${typeTitles[key]}
47
+ </option>`)
48
+ .join("")}
49
+ </select>
50
+ <div class="fw-select-arrow fa fa-caret-down"></div>
51
+ </div>
52
+ <div class="entry-key-input-container">
53
+ <input type="text" id="entry-key" class="fw-button fw-light" value="" placeholder="${gettext("Citation key")}" />
54
+ <div id="entry-key-warning" class="entry-key-warning"></div>
55
+ </div>
56
+ </div>
57
+ ${dialogTabs.render()}`;
58
+ };
59
+ //# sourceMappingURL=templates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/form/templates.js"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,OAAO,EAAC,UAAU,EAAC,MAAM,WAAW,CAAA;AACpC,OAAO,EAAC,gBAAgB,EAAC,MAAM,WAAW,CAAA;AAE1C,MAAM,sBAAsB,GAAG,GAAG,EAAE,CAChC;2EACuE,CAAA;AAE3E,MAAM,sBAAsB,GAAG,GAAG,EAAE,CAChC,wEAAwE,CAAA;AAE5E,MAAM,kBAAkB,GAAG,GAAG,EAAE,CAC5B;;;oDAGgD,OAAO,CAAC,YAAY,CAAC;;;;aAI5D,CAAA;AAEb,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,EAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAC,EAAE,EAAE;IACvD,MAAM,UAAU,GAAG,gBAAgB,EAAE,CAAA;IACrC,MAAM,IAAI,GAAG;QACT;YACI,EAAE,EAAE,gBAAgB;YACpB,KAAK,EAAE,OAAO,CAAC,iBAAiB,CAAC;YACjC,QAAQ,EAAE,sBAAsB;SACnC;QACD;YACI,EAAE,EAAE,gBAAgB;YACpB,KAAK,EAAE,OAAO,CAAC,iBAAiB,CAAC;YACjC,QAAQ,EAAE,sBAAsB;SACnC;KACJ,CAAA;IACD,IAAI,OAAO,EAAE,CAAC;QACV,IAAI,CAAC,IAAI,CAAC;YACN,EAAE,EAAE,gBAAgB;YACpB,KAAK,EAAE,OAAO,CAAC,YAAY,CAAC;YAC5B,QAAQ,EAAE,kBAAkB;SAC/B,CAAC,CAAA;IACN,CAAC;IACD,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,IAAI,EAAE,EAAC,WAAW,EAAE,iBAAiB,EAAC,CAAC,CAAA;IACzE,OAAO;;;sBAIa,QAAQ,KAAK,KAAK;QACd,CAAC,CAAC,6DAA6D,OAAO,CAAC,oBAAoB,CAAC,WAAW;QACvG,CAAC,CAAC,EACV;sBACE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC;SAClB,GAAG,CACA,GAAG,CAAC,EAAE,CACF,kBAAkB,GAAG;sCACf,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE;kCACtC,UAAU,CAAC,GAAG,CAAC;sCACX,CACb;SACA,IAAI,CAAC,EAAE,CAAC;;;;;qGAKoE,OAAO,CAAC,cAAc,CAAC;;;;UAIlH,UAAU,CAAC,MAAM,EAAE,EAAE,CAAA;AAC/B,CAAC,CAAA"}
@@ -0,0 +1,83 @@
1
+ import { sniffFormat } from "bibliojson";
2
+ import { addAlert, makeWorker } from "fwtoolkit";
3
+ const ERROR_MSG = {
4
+ no_entries: gettext("No bibliography entries could be found in import file."),
5
+ entry_error: gettext("An error occured while reading a bibliography entry"),
6
+ unknown_field: gettext("Field cannot not be saved. Fidus Writer does not support the field."),
7
+ unknown_type: gettext('Entry has been saved as "misc". Fidus Writer does not support the entry type.'),
8
+ unknown_date: gettext("Field does not contain a valid EDTF string."),
9
+ server_save: gettext("The bibliography could not be updated"),
10
+ unsupported_format: gettext("The file format could not be recognized.")
11
+ };
12
+ export class BibliographyImporter {
13
+ constructor(fileContents, bibDB, addToListCall, callback, showAlerts = true) {
14
+ this.fileContents = fileContents;
15
+ this.bibDB = bibDB;
16
+ this.addToListCall = addToListCall;
17
+ this.callback = callback;
18
+ this.showAlerts = showAlerts;
19
+ }
20
+ init() {
21
+ // Detect the format of the input file
22
+ const format = sniffFormat(this.fileContents);
23
+ if (!format) {
24
+ if (this.showAlerts) {
25
+ addAlert("error", ERROR_MSG.unsupported_format);
26
+ }
27
+ if (this.callback) {
28
+ this.callback();
29
+ }
30
+ return;
31
+ }
32
+ // Use the worker for the detected format
33
+ const importWorker = makeWorker(staticUrl("js/bibliography_import_worker.js"));
34
+ importWorker.onmessage = message => this.onMessage(message.data);
35
+ importWorker.postMessage({
36
+ fileContents: this.fileContents,
37
+ format: format
38
+ });
39
+ }
40
+ onMessage(message) {
41
+ let errorMsg, data;
42
+ switch (message.type) {
43
+ case "error":
44
+ case "warning":
45
+ errorMsg = ERROR_MSG[message.errorCode];
46
+ if (!errorMsg) {
47
+ errorMsg = gettext("There was an issue with the bibliography import");
48
+ }
49
+ if (message.errorType) {
50
+ errorMsg += `, error_type: ${message.errorType}`;
51
+ }
52
+ if (message.key) {
53
+ errorMsg += `, key: ${message.key}`;
54
+ }
55
+ if (message.type_name) {
56
+ errorMsg += `, entry: ${message.type_name}`;
57
+ }
58
+ if (message.field_name) {
59
+ errorMsg += `, field_name: ${message.field_name}`;
60
+ }
61
+ if (message.entry) {
62
+ errorMsg += `, entry: ${message.entry}`;
63
+ }
64
+ if (this.showAlerts) {
65
+ addAlert(message.type, errorMsg);
66
+ }
67
+ break;
68
+ case "data":
69
+ data = message.data;
70
+ this.bibDB.saveBibEntries(data, true).then(idTranslations => {
71
+ const newIds = idTranslations.map(idTrans => idTrans[1]);
72
+ this.addToListCall(newIds);
73
+ });
74
+ break;
75
+ default:
76
+ break;
77
+ }
78
+ if (message.done && this.callback) {
79
+ this.callback();
80
+ }
81
+ }
82
+ }
83
+ //# sourceMappingURL=bibliography_import.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bibliography_import.js","sourceRoot":"","sources":["../../src/import/bibliography_import.js"],"names":[],"mappings":"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"}