textbrowser 0.45.2 → 0.46.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.
@@ -1,8 +1,8 @@
1
1
  /* eslint-env browser */
2
2
  import rtlDetect from 'rtl-detect';
3
- import JsonRefs from 'json-refs';
4
3
  import {jml} from 'jamilih';
5
4
 
5
+ import JsonRefs from './vendor/json-refs-min.js';
6
6
  import Templates from './templates/index.js';
7
7
  import {escapeHTML} from './utils/sanitize.js';
8
8
  import {
@@ -23,7 +23,7 @@ const getRawFieldValue = (v) => {
23
23
 
24
24
  const setAnchor = ({
25
25
  applicableBrowseFieldSet,
26
- fieldValueAliasMapPreferred, ilRaw, iil, max, $p
26
+ fieldValueAliasMapPreferred, lParamRaw, lIndexedParam, max, $p
27
27
  }) => {
28
28
  const applicableBrowseFieldSchemaIndexes = applicableBrowseFieldSet.map((abfs) => {
29
29
  return abfs.fieldSchemaIndex;
@@ -32,7 +32,7 @@ const setAnchor = ({
32
32
  // other anchor params)
33
33
  const work = $p.get('work');
34
34
  let anchor;
35
- const anchorRowCol = ilRaw('anchorrowcol');
35
+ const anchorRowCol = lParamRaw('anchorrowcol');
36
36
  if (anchorRowCol) {
37
37
  anchor = Templates.resultsDisplayClient.anchorRowCol({anchorRowCol});
38
38
  }
@@ -51,7 +51,7 @@ const setAnchor = ({
51
51
  }
52
52
  break;
53
53
  }
54
- anchorField = $p.get(iil('anchorfield') + i, true);
54
+ anchorField = $p.get(lIndexedParam('anchorfield') + i, true);
55
55
 
56
56
  const x = applicableBrowseFieldSchemaIndexes[j - 1];
57
57
  const rawVal = getRawFieldValue(anchor);
@@ -87,24 +87,23 @@ export const resultsDisplayClient = async function resultsDisplayClient (args) {
87
87
  browseFieldSets,
88
88
  applicableBrowseFieldSet,
89
89
  lang, metadataObj, fileData,
90
- fieldValueAliasMapPreferred, lf, iil, ilRaw,
90
+ fieldValueAliasMapPreferred, workI18n, lIndexedParam, lParamRaw,
91
91
  templateArgs
92
92
  } = await resultsDisplayServerOrClient.call(this, {
93
93
  ...args, skipIndexedDB, prefI18n
94
94
  });
95
- document.title = lf({
96
- key: 'browserfile-resultsdisplay',
97
- values: {
95
+ document.title = workI18n(
96
+ 'browserfile-resultsdisplay',
97
+ {
98
98
  work: fileData
99
99
  ? getMetaProp(lang, metadataObj, 'alias')
100
100
  : ''
101
- },
102
- fallback: true
103
- });
101
+ }
102
+ );
104
103
  Templates.resultsDisplayClient.main(templateArgs);
105
104
  setAnchor({
106
105
  applicableBrowseFieldSet,
107
- fieldValueAliasMapPreferred, iil, ilRaw,
106
+ fieldValueAliasMapPreferred, lIndexedParam, lParamRaw,
108
107
  $p: args.$p,
109
108
  max: browseFieldSets.length
110
109
  });
@@ -134,13 +133,14 @@ export const resultsDisplayServer = async function resultsDisplayServer (args) {
134
133
  const jamilih = Templates.resultsDisplayServerOrClient.main(templateArgs);
135
134
  return jml.toHTML(...jamilih);
136
135
  }
137
- case 'json': default:
136
+ // case 'json':
137
+ default:
138
138
  return templateArgs.tableData;
139
139
  }
140
140
  };
141
141
 
142
142
  export const resultsDisplayServerOrClient = async function resultsDisplayServerOrClient ({
143
- l, lang, fallbackLanguages, imfLocales, $p, skipIndexedDB, noIndexedDB, prefI18n,
143
+ l, lang, fallbackLanguages, locales, $p, skipIndexedDB, noIndexedDB, prefI18n,
144
144
  files, allowPlugins, langData, basePath = '', dynamicBasePath = ''
145
145
  }) {
146
146
  const languages = new Languages({langData});
@@ -178,7 +178,12 @@ export const resultsDisplayServerOrClient = async function resultsDisplayServerO
178
178
  // for a number representing a book); we may wish to
179
179
  // switch this (and also for other browse field-based
180
180
  // items).
181
- if (fieldValueAliasMap[idx] !== undefined) {
181
+ if (
182
+ fieldValueAliasMap[idx] !== undefined &&
183
+ // Added this condition after imf->intl-dom conversion; concealing a
184
+ // bug?
185
+ fieldValueAliasMap[idx] !== null
186
+ ) {
182
187
  return fieldValueAliasMapPreferred[idx][tr[idx]];
183
188
  }
184
189
  return tr[idx];
@@ -200,7 +205,12 @@ export const resultsDisplayServerOrClient = async function resultsDisplayServerO
200
205
  // be multiple aliases for a value; we may wish to
201
206
  // switch this (and also for other browse field-based
202
207
  // items).
203
- if (fieldValueAliasMap[idx] !== undefined) {
208
+ if (
209
+ fieldValueAliasMap[idx] !== undefined &&
210
+ // Added this condition after imf->intl-dom conversion; concealing a
211
+ // bug?
212
+ fieldValueAliasMap[idx] !== null
213
+ ) {
204
214
  rowIDPartsPreferred.push(fieldValueAliasMapPreferred[idx][tr[idx]]);
205
215
  } else {
206
216
  rowIDPartsPreferred.push(tr[idx]);
@@ -398,7 +408,7 @@ export const resultsDisplayServerOrClient = async function resultsDisplayServerO
398
408
  return false;
399
409
  });
400
410
  }
401
- reverseLocaleLookup(imfLocales);
411
+ reverseLocaleLookup(locales);
402
412
  if (!key && !avoidLog) {
403
413
  console.log('Bad param/value', param, '::', p);
404
414
  }
@@ -413,7 +423,7 @@ export const resultsDisplayServerOrClient = async function resultsDisplayServerO
413
423
  const escapeQuotedCSS = (s) => s.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
414
424
 
415
425
  const {
416
- fileData, lf, getFieldAliasOrName, schemaObj, metadataObj,
426
+ fileData, workI18n, getFieldAliasOrName, schemaObj, metadataObj,
417
427
  pluginsForWork
418
428
  } = await getWorkData({
419
429
  files: files || this.files,
@@ -484,7 +494,7 @@ export const resultsDisplayServerOrClient = async function resultsDisplayServerO
484
494
  const fieldAliasOrName = plugin.getFieldAliasOrName
485
495
  ? plugin.getFieldAliasOrName({
486
496
  locales: lang,
487
- lf,
497
+ workI18n,
488
498
  targetLanguage,
489
499
  applicableField,
490
500
  applicableFieldI18N,
@@ -495,7 +505,7 @@ export const resultsDisplayServerOrClient = async function resultsDisplayServerO
495
505
  : languages.getFieldNameFromPluginNameAndLocales({
496
506
  pluginName,
497
507
  locales: lang,
498
- lf,
508
+ workI18n,
499
509
  targetLanguage,
500
510
  applicableFieldI18N,
501
511
  // Todo: Should have formal way to i18nize meta
@@ -553,22 +563,22 @@ export const resultsDisplayServerOrClient = async function resultsDisplayServerO
553
563
  : prefI18n === 'true' || (
554
564
  prefI18n !== 'false' && this.localizeParamNames
555
565
  );
556
- const il = localizeParamNames
566
+ const lParam = localizeParamNames
557
567
  ? key => l(['params', key])
558
568
  : key => key;
559
- const iil = localizeParamNames
569
+ const lIndexedParam = localizeParamNames
560
570
  ? key => l(['params', 'indexed', key])
561
571
  : key => key;
562
- const ilRaw = localizeParamNames
563
- ? (key, suffix = '') => $p.get(il(key) + suffix, true)
572
+ const lParamRaw = localizeParamNames
573
+ ? (key, suffix = '') => $p.get(lParam(key) + suffix, true)
564
574
  : (key, suffix = '') => $p.get(key + suffix, true);
565
- const iilRaw = localizeParamNames
566
- ? (key, suffix = '') => $p.get($p.get('work') + '-' + iil(key) + suffix, true)
575
+ const lIndexedParamRaw = localizeParamNames
576
+ ? (key, suffix = '') => $p.get($p.get('work') + '-' + lIndexedParam(key) + suffix, true)
567
577
  : (key, suffix = '') => $p.get($p.get('work') + '-' + key + suffix, true);
568
578
 
569
579
  // Now that we know `browseFieldSets`, we can parse `startEnd`
570
580
  const browseFieldSetStartEndIdx = browseFieldSets.findIndex((item, i) =>
571
- iilRaw('startEnd', (i + 1))
581
+ lIndexedParamRaw('startEnd', (i + 1))
572
582
  );
573
583
  if (browseFieldSetStartEndIdx !== -1) {
574
584
  // Todo: i18nize (by work and/or by whole app?)
@@ -581,7 +591,7 @@ export const resultsDisplayServerOrClient = async function resultsDisplayServerO
581
591
  // Todo: Change query beginning at 0 to 1 if none present?
582
592
  // Todo: Support i18nized or canonical aliases (but don't
583
593
  // over-trim in such cases)
584
- const rawSearch = (iilRaw('startEnd', browseFieldSetStartEndIdx + 1) || '').trim();
594
+ const rawSearch = (lIndexedParamRaw('startEnd', browseFieldSetStartEndIdx + 1) || '').trim();
585
595
  const [startFull, endFull] = rawSearch.split(rangeSep);
586
596
  if (endFull !== undefined) {
587
597
  const startPartVals = startFull.split(partSep);
@@ -605,7 +615,7 @@ export const resultsDisplayServerOrClient = async function resultsDisplayServerO
605
615
  }
606
616
 
607
617
  const browseFieldSetIdx = browseFieldSets.findIndex((item, i) =>
608
- iilRaw('start', (i + 1) + '-1')
618
+ lIndexedParamRaw('start', (i + 1) + '-1')
609
619
  );
610
620
  const applicableBrowseFieldSet = browseFieldSets[browseFieldSetIdx];
611
621
  const applicableBrowseFieldSetName = setNames[browseFieldSetIdx];
@@ -635,7 +645,7 @@ export const resultsDisplayServerOrClient = async function resultsDisplayServerO
635
645
  });
636
646
  const showInterlinTitles = $pRaw('interlintitle') === '1';
637
647
 
638
- console.log('rand', ilRaw('rand') === 'yes');
648
+ console.log('rand', lParamRaw('rand') === 'yes');
639
649
 
640
650
  const stripToRawFieldValue = (v, i) => {
641
651
  let val;
@@ -809,7 +819,7 @@ export const resultsDisplayServerOrClient = async function resultsDisplayServerO
809
819
  fieldInfo,
810
820
  $p,
811
821
  applicableBrowseFieldSet, fieldValueAliasMapPreferred,
812
- lf, iil, ilRaw, browseFieldSets,
822
+ workI18n, lIndexedParam, lParamRaw, browseFieldSets,
813
823
  lang, metadataObj, fileData,
814
824
  templateArgs
815
825
  };
@@ -22,144 +22,157 @@ const Templates = {
22
22
  return jml('div', {
23
23
  id: 'main', role: 'main'
24
24
  }, body);
25
- }
26
- };
27
- Templates.permissions = {
28
- versionChange () {
29
- $('#versionChange').showModal();
30
25
  },
31
- addLogEntry ({text}) {
32
- const installationDialog = $('#installationLogContainer');
33
- try {
34
- installationDialog.showModal();
26
+ permissions: {
27
+ versionChange () {
28
+ $('#versionChange').showModal();
29
+ },
30
+ addLogEntry ({text}) {
31
+ const installationDialog = $('#installationLogContainer');
32
+ try {
33
+ installationDialog.showModal();
34
+ const container = $('#dialogContainer');
35
+ container.hidden = false;
36
+ } catch (err) {
37
+ // May already be open
38
+ }
39
+ $('#installationLog').append(text + '\n');
40
+ },
41
+ exitDialogs () {
35
42
  const container = $('#dialogContainer');
36
- container.hidden = false;
37
- } catch (err) {
38
- // May already be open
39
- }
40
- $('#installationLog').append(text + '\n');
41
- },
42
- exitDialogs () {
43
- const container = $('#dialogContainer');
44
- if (container) {
45
- container.hidden = true;
46
- }
47
- },
48
- dbError ({type, escapedErrorMessage}) {
49
- if (type) {
50
- jml('span', [
51
- type, ' ',
52
- escapedErrorMessage
53
- ], $('#dbError'));
54
- }
55
- $('#dbError').showModal();
56
- },
57
- errorRegistering (escapedErrorMessage) {
58
- if (escapedErrorMessage) {
59
- jml('span', [escapedErrorMessage], $('#errorRegistering'));
60
- }
61
- $('#errorRegistering').showModal();
62
- },
63
- browserNotGrantingPersistence () {
64
- $('#browserNotGrantingPersistence').showModal();
65
- },
66
- main ({l, ok, refuse, close, closeBrowserNotGranting}) {
67
- const installationDialog = jml('dialog', {
68
- style: 'text-align: center; height: 100%',
69
- id: 'installationLogContainer',
70
- class: 'focus'
71
- }, [
72
- ['p', [
73
- l('wait-installing')
74
- ]],
75
- ['div', {style: 'height: 80%; overflow: auto;'}, [
76
- ['pre', {id: 'installationLog'}, [
43
+ if (container) {
44
+ container.hidden = true;
45
+ }
46
+ },
47
+ dbError ({type, escapedErrorMessage}) {
48
+ if (type) {
49
+ jml('span', [
50
+ type, ' ',
51
+ escapedErrorMessage
52
+ ], $('#dbError'));
53
+ }
54
+ $('#dbError').showModal();
55
+ },
56
+ errorRegistering (escapedErrorMessage) {
57
+ if (escapedErrorMessage) {
58
+ jml('span', [escapedErrorMessage], $('#errorRegistering'));
59
+ }
60
+ $('#errorRegistering').showModal();
61
+ },
62
+ browserNotGrantingPersistence () {
63
+ $('#browserNotGrantingPersistence').showModal();
64
+ },
65
+ /**
66
+ * @param {PlainObject} cfg
67
+ * @param {I18NCallback} cfg.siteI18n
68
+ * @param {() => Promise<void>} cfg.ok
69
+ * @param {() => void} cfg.refuse
70
+ * @param {() => Promise<void>} cfg.close
71
+ * @param {() => void} cfg.closeBrowserNotGranting
72
+ * @returns {[
73
+ * HTMLDialogElement, HTMLDialogElement, HTMLDialogElement,
74
+ * HTMLDialogElement, HTMLDialogElement, HTMLDialogElement
75
+ * ]}
76
+ */
77
+ main ({siteI18n, ok, refuse, close, closeBrowserNotGranting}) {
78
+ const installationDialog = jml('dialog', {
79
+ style: 'text-align: center; height: 100%',
80
+ id: 'installationLogContainer',
81
+ class: 'focus'
82
+ }, [
83
+ ['p', [
84
+ siteI18n('wait-installing')
85
+ ]],
86
+ ['div', {style: 'height: 80%; overflow: auto;'}, [
87
+ ['pre', {id: 'installationLog'}, [
88
+ ]]
77
89
  ]]
78
- ]]
79
- // ['textarea', {readonly: true, style: 'width: 80%; height: 80%;'}]
80
- ]);
81
- let requestPermissionsDialog = '';
82
- if (ok) {
83
- requestPermissionsDialog = jml(
90
+ // ['textarea', {readonly: true, style: 'width: 80%; height: 80%;'}]
91
+ ]);
92
+ let requestPermissionsDialog = '';
93
+ if (ok) {
94
+ requestPermissionsDialog = jml(
95
+ 'dialog', {
96
+ id: 'willRequestStoragePermissions',
97
+ $on: {close}
98
+ }, [
99
+ ['section', [
100
+ siteI18n('will-request-storage-permissions')
101
+ ]],
102
+ ['br'],
103
+ ['div', {class: 'focus'}, [
104
+ ['button', {$on: {click: ok}}, [
105
+ siteI18n('OK')
106
+ ]],
107
+ ['br'], ['br'],
108
+ ['button', {$on: {click: refuse}}, [
109
+ siteI18n('refuse-request-storage-permissions')
110
+ ]]
111
+ ]]
112
+ ]
113
+ );
114
+ }
115
+ const errorRegisteringNotice = jml(
84
116
  'dialog', {
85
- id: 'willRequestStoragePermissions',
86
- $on: {close}
117
+ id: 'errorRegistering'
87
118
  }, [
88
119
  ['section', [
89
- l('will-request-storage-permissions')
90
- ]],
91
- ['br'],
92
- ['div', {class: 'focus'}, [
93
- ['button', {$on: {click: ok}}, [
94
- l('OK')
120
+ siteI18n('errorRegistering')
121
+ ]]
122
+ ]
123
+ );
124
+ let browserNotGrantingPersistenceAlert = '';
125
+ if (closeBrowserNotGranting) {
126
+ browserNotGrantingPersistenceAlert = jml(
127
+ 'dialog', {
128
+ id: 'browserNotGrantingPersistence'
129
+ }, [
130
+ ['section', [
131
+ siteI18n('browser-not-granting-persistence')
95
132
  ]],
96
- ['br'], ['br'],
97
- ['button', {$on: {click: refuse}}, [
98
- l('refuse-request-storage-permissions')
133
+ ['br'],
134
+ ['div', {class: 'focus'}, [
135
+ ['button', {$on: {click: closeBrowserNotGranting}}, [
136
+ siteI18n('OK')
137
+ ]]
99
138
  ]]
139
+ ]
140
+ );
141
+ }
142
+ const versionChangeNotice = jml(
143
+ 'dialog', {
144
+ id: 'versionChange'
145
+ }, [
146
+ ['section', [
147
+ siteI18n('versionChange')
100
148
  ]]
101
149
  ]
102
150
  );
103
- }
104
- const errorRegisteringNotice = jml(
105
- 'dialog', {
106
- id: 'errorRegistering'
107
- }, [
108
- ['section', [
109
- l('errorRegistering')
110
- ]]
111
- ]
112
- );
113
- let browserNotGrantingPersistenceAlert = '';
114
- if (closeBrowserNotGranting) {
115
- browserNotGrantingPersistenceAlert = jml(
151
+ const dbErrorNotice = jml(
116
152
  'dialog', {
117
- id: 'browserNotGrantingPersistence'
153
+ id: 'dbError'
118
154
  }, [
119
155
  ['section', [
120
- l('browser-not-granting-persistence')
121
- ]],
122
- ['br'],
123
- ['div', {class: 'focus'}, [
124
- ['button', {$on: {click: closeBrowserNotGranting}}, [
125
- l('OK')
126
- ]]
156
+ siteI18n('dbError')
127
157
  ]]
128
158
  ]
129
159
  );
130
- }
131
- const versionChangeNotice = jml(
132
- 'dialog', {
133
- id: 'versionChange'
134
- }, [
135
- ['section', [
136
- l('versionChange')
137
- ]]
138
- ]
139
- );
140
- const dbErrorNotice = jml(
141
- 'dialog', {
142
- id: 'dbError'
143
- }, [
144
- ['section', [
145
- l('dbError')
146
- ]]
147
- ]
148
- );
149
- jml('div', {id: 'dialogContainer', style: 'height: 100%'}, [
150
- installationDialog,
151
- requestPermissionsDialog,
152
- browserNotGrantingPersistenceAlert,
153
- errorRegisteringNotice,
154
- versionChangeNotice,
155
- dbErrorNotice
156
- ], $('#main'));
160
+ jml('div', {id: 'dialogContainer', style: 'height: 100%'}, [
161
+ installationDialog,
162
+ requestPermissionsDialog,
163
+ browserNotGrantingPersistenceAlert,
164
+ errorRegisteringNotice,
165
+ versionChangeNotice,
166
+ dbErrorNotice
167
+ ], $('#main'));
157
168
 
158
- return [
159
- installationDialog,
160
- requestPermissionsDialog, browserNotGrantingPersistenceAlert,
161
- errorRegisteringNotice, versionChangeNotice, dbErrorNotice
162
- ];
169
+ return [
170
+ installationDialog,
171
+ requestPermissionsDialog,
172
+ browserNotGrantingPersistenceAlert,
173
+ errorRegisteringNotice, versionChangeNotice, dbErrorNotice
174
+ ];
175
+ }
163
176
  }
164
177
  };
165
178
  export default Templates;
@@ -20,6 +20,8 @@ export default {
20
20
  } catch (err) {
21
21
  if (err.message === 'JSON support is currently not available') {
22
22
  dialogs.alert(err.message);
23
+ } else {
24
+ console.error(err);
23
25
  }
24
26
  }
25
27
  jml(...html, $('#main'));