@internetarchive/bookreader 5.0.0-24-sortingstate-1 → 5.0.0-24-sortingstate-5
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.
- package/BookReader/BookReader.js +1 -4
- package/BookReader/BookReader.js.map +1 -1
- package/BookReader/bookreader-component-bundle.js +16 -22
- package/BookReader/bookreader-component-bundle.js.map +1 -1
- package/BookReader/plugins/plugin.url.js +61 -46
- package/BookReader/plugins/plugin.url.js.map +1 -1
- package/package.json +1 -1
- package/src/BookNavigator/volumes/volumes-provider.js +1 -1
- package/src/BookReader.js +0 -4
- package/src/plugins/plugin.url.js +29 -23
- package/tests/jest/plugins/plugin.url.test.js +15 -24
- package/tests/karma/BookNavigator/volumes/volumes-provider.test.js +6 -6
@@ -54,24 +54,26 @@ __webpack_require__.r(__webpack_exports__);
|
|
54
54
|
/* harmony import */ var core_js_modules_es_string_split_js__WEBPACK_IMPORTED_MODULE_19___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_split_js__WEBPACK_IMPORTED_MODULE_19__);
|
55
55
|
/* harmony import */ var core_js_modules_es_object_entries_js__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! core-js/modules/es.object.entries.js */ "./node_modules/core-js/modules/es.object.entries.js");
|
56
56
|
/* harmony import */ var core_js_modules_es_object_entries_js__WEBPACK_IMPORTED_MODULE_20___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_object_entries_js__WEBPACK_IMPORTED_MODULE_20__);
|
57
|
-
/* harmony import */ var
|
58
|
-
/* harmony import */ var
|
59
|
-
/* harmony import */ var
|
60
|
-
/* harmony import */ var
|
61
|
-
/* harmony import */ var
|
62
|
-
/* harmony import */ var
|
63
|
-
/* harmony import */ var
|
64
|
-
/* harmony import */ var
|
65
|
-
/* harmony import */ var
|
66
|
-
/* harmony import */ var
|
67
|
-
/* harmony import */ var
|
68
|
-
/* harmony import */ var
|
69
|
-
/* harmony import */ var
|
70
|
-
/* harmony import */ var
|
71
|
-
/* harmony import */ var
|
72
|
-
/* harmony import */ var
|
73
|
-
/* harmony import */ var
|
74
|
-
/* harmony import */ var
|
57
|
+
/* harmony import */ var core_js_modules_es_string_search_js__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! core-js/modules/es.string.search.js */ "./node_modules/core-js/modules/es.string.search.js");
|
58
|
+
/* harmony import */ var core_js_modules_es_string_search_js__WEBPACK_IMPORTED_MODULE_21___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_search_js__WEBPACK_IMPORTED_MODULE_21__);
|
59
|
+
/* harmony import */ var core_js_modules_es_symbol_js__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! core-js/modules/es.symbol.js */ "./node_modules/core-js/modules/es.symbol.js");
|
60
|
+
/* harmony import */ var core_js_modules_es_symbol_js__WEBPACK_IMPORTED_MODULE_22___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_symbol_js__WEBPACK_IMPORTED_MODULE_22__);
|
61
|
+
/* harmony import */ var core_js_modules_es_symbol_description_js__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! core-js/modules/es.symbol.description.js */ "./node_modules/core-js/modules/es.symbol.description.js");
|
62
|
+
/* harmony import */ var core_js_modules_es_symbol_description_js__WEBPACK_IMPORTED_MODULE_23___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_symbol_description_js__WEBPACK_IMPORTED_MODULE_23__);
|
63
|
+
/* harmony import */ var core_js_modules_es_symbol_iterator_js__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! core-js/modules/es.symbol.iterator.js */ "./node_modules/core-js/modules/es.symbol.iterator.js");
|
64
|
+
/* harmony import */ var core_js_modules_es_symbol_iterator_js__WEBPACK_IMPORTED_MODULE_24___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_symbol_iterator_js__WEBPACK_IMPORTED_MODULE_24__);
|
65
|
+
/* harmony import */ var core_js_modules_es_array_slice_js__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! core-js/modules/es.array.slice.js */ "./node_modules/core-js/modules/es.array.slice.js");
|
66
|
+
/* harmony import */ var core_js_modules_es_array_slice_js__WEBPACK_IMPORTED_MODULE_25___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_slice_js__WEBPACK_IMPORTED_MODULE_25__);
|
67
|
+
/* harmony import */ var core_js_modules_es_array_from_js__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! core-js/modules/es.array.from.js */ "./node_modules/core-js/modules/es.array.from.js");
|
68
|
+
/* harmony import */ var core_js_modules_es_array_from_js__WEBPACK_IMPORTED_MODULE_26___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_from_js__WEBPACK_IMPORTED_MODULE_26__);
|
69
|
+
/* harmony import */ var core_js_modules_es_object_get_prototype_of_js__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! core-js/modules/es.object.get-prototype-of.js */ "./node_modules/core-js/modules/es.object.get-prototype-of.js");
|
70
|
+
/* harmony import */ var core_js_modules_es_object_get_prototype_of_js__WEBPACK_IMPORTED_MODULE_27___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_object_get_prototype_of_js__WEBPACK_IMPORTED_MODULE_27__);
|
71
|
+
/* harmony import */ var core_js_modules_es_reflect_construct_js__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! core-js/modules/es.reflect.construct.js */ "./node_modules/core-js/modules/es.reflect.construct.js");
|
72
|
+
/* harmony import */ var core_js_modules_es_reflect_construct_js__WEBPACK_IMPORTED_MODULE_28___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_reflect_construct_js__WEBPACK_IMPORTED_MODULE_28__);
|
73
|
+
/* harmony import */ var core_js_modules_es_reflect_get_js__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! core-js/modules/es.reflect.get.js */ "./node_modules/core-js/modules/es.reflect.get.js");
|
74
|
+
/* harmony import */ var core_js_modules_es_reflect_get_js__WEBPACK_IMPORTED_MODULE_29___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_reflect_get_js__WEBPACK_IMPORTED_MODULE_29__);
|
75
|
+
/* harmony import */ var core_js_modules_es_object_get_own_property_descriptor_js__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! core-js/modules/es.object.get-own-property-descriptor.js */ "./node_modules/core-js/modules/es.object.get-own-property-descriptor.js");
|
76
|
+
/* harmony import */ var core_js_modules_es_object_get_own_property_descriptor_js__WEBPACK_IMPORTED_MODULE_30___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_object_get_own_property_descriptor_js__WEBPACK_IMPORTED_MODULE_30__);
|
75
77
|
/* provided dependency */ var jQuery = __webpack_require__(/*! jquery */ "jquery");
|
76
78
|
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
|
77
79
|
|
@@ -140,6 +142,7 @@ function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _d
|
|
140
142
|
|
141
143
|
|
142
144
|
|
145
|
+
|
143
146
|
|
144
147
|
|
145
148
|
/* global BookReader */
|
@@ -368,7 +371,8 @@ var UrlPlugin = /*#__PURE__*/function () {
|
|
368
371
|
|
369
372
|
_classCallCheck(this, UrlPlugin);
|
370
373
|
|
371
|
-
this.bookReaderOptions = options;
|
374
|
+
this.bookReaderOptions = options; // the canonical order of elements is important in the path and query string
|
375
|
+
|
372
376
|
this.urlSchema = [{
|
373
377
|
name: 'page',
|
374
378
|
position: 'path',
|
@@ -395,7 +399,7 @@ var UrlPlugin = /*#__PURE__*/function () {
|
|
395
399
|
position: 'query_param'
|
396
400
|
}];
|
397
401
|
this.urlState = {};
|
398
|
-
this.urlMode = 'hash';
|
402
|
+
this.urlMode = this.options.urlMode || 'hash';
|
399
403
|
this.urlHistoryBasePath = '/';
|
400
404
|
this.urlLocationPollId = null;
|
401
405
|
this.oldLocationHash = null;
|
@@ -404,25 +408,27 @@ var UrlPlugin = /*#__PURE__*/function () {
|
|
404
408
|
/**
|
405
409
|
* Parse JSON object URL state to string format
|
406
410
|
* Arrange path names in an order that it is positioned on the urlSchema
|
407
|
-
* @param {
|
411
|
+
* @param {string} urlState
|
408
412
|
* @returns {string}
|
409
413
|
*/
|
410
414
|
|
411
415
|
|
412
416
|
_createClass(UrlPlugin, [{
|
413
417
|
key: "urlStateToUrlString",
|
414
|
-
value: function urlStateToUrlString(
|
418
|
+
value: function urlStateToUrlString(urlState) {
|
419
|
+
var _this3 = this;
|
420
|
+
|
415
421
|
var searchParams = new URLSearchParams();
|
416
422
|
var pathParams = {};
|
417
423
|
Object.keys(urlState).forEach(function (key) {
|
418
424
|
var _schema, _schema2;
|
419
425
|
|
420
|
-
var schema = urlSchema.find(function (schema) {
|
426
|
+
var schema = _this3.urlSchema.find(function (schema) {
|
421
427
|
return schema.name === key;
|
422
428
|
});
|
423
429
|
|
424
430
|
if ((_schema = schema) !== null && _schema !== void 0 && _schema.deprecated_for) {
|
425
|
-
schema = urlSchema.find(function (schemaKey) {
|
431
|
+
schema = _this3.urlSchema.find(function (schemaKey) {
|
426
432
|
return schemaKey.name === schema.deprecated_for;
|
427
433
|
});
|
428
434
|
}
|
@@ -437,7 +443,7 @@ var UrlPlugin = /*#__PURE__*/function () {
|
|
437
443
|
searchParams.append(((_schema4 = schema) === null || _schema4 === void 0 ? void 0 : _schema4.name) || key, urlState[key]);
|
438
444
|
}
|
439
445
|
});
|
440
|
-
var strPathParams = urlSchema.filter(function (s) {
|
446
|
+
var strPathParams = this.urlSchema.filter(function (s) {
|
441
447
|
return s.position == 'path';
|
442
448
|
}).map(function (schema) {
|
443
449
|
return pathParams[schema.name] ? "".concat(schema.name, "/").concat(pathParams[schema.name]) : '';
|
@@ -451,18 +457,18 @@ var UrlPlugin = /*#__PURE__*/function () {
|
|
451
457
|
* Example:
|
452
458
|
* /page/n7/mode/2up => {page: 'n7', mode: '2up'}
|
453
459
|
* /page/n7/mode/2up/search/hello => {page: 'n7', mode: '2up', q: 'hello'}
|
454
|
-
* @param {
|
455
|
-
* @param {string} str
|
460
|
+
* @param {string} urlString
|
456
461
|
* @returns {object}
|
457
462
|
*/
|
458
463
|
|
459
464
|
}, {
|
460
465
|
key: "urlStringToUrlState",
|
461
|
-
value: function urlStringToUrlState(
|
462
|
-
var urlState = {}; // Fetch searchParams from given {
|
466
|
+
value: function urlStringToUrlState(urlString) {
|
467
|
+
var urlState = {}; // Fetch searchParams from given {urlString}
|
463
468
|
// Note: whole URL path is needed for URLSearchParams
|
464
469
|
|
465
|
-
var urlPath = new URL(
|
470
|
+
var urlPath = new URL(urlString, 'http://example.com');
|
471
|
+
console.log('urlSearch: ', urlPath.searchParams, ' urlPath: ', urlPath.pathname);
|
466
472
|
var urlSearchParamsObj = Object.fromEntries(urlPath.searchParams.entries());
|
467
473
|
var urlStrSplitSlashObj = Object.fromEntries(urlPath.pathname.match(/[^\\/]+\/[^\\/]+/g).map(function (x) {
|
468
474
|
return x.split('/');
|
@@ -472,9 +478,10 @@ var UrlPlugin = /*#__PURE__*/function () {
|
|
472
478
|
return Object.keys(_object).some(function (value) {
|
473
479
|
return value == _key;
|
474
480
|
});
|
475
|
-
};
|
481
|
+
}; // Add path objects to urlState
|
482
|
+
|
476
483
|
|
477
|
-
urlSchema.filter(function (schema) {
|
484
|
+
this.urlSchema.filter(function (schema) {
|
478
485
|
return schema.position == 'path';
|
479
486
|
}).forEach(function (schema) {
|
480
487
|
if (!urlStrSplitSlashObj[schema.name] && schema.default) {
|
@@ -483,13 +490,21 @@ var UrlPlugin = /*#__PURE__*/function () {
|
|
483
490
|
|
484
491
|
var hasPropertyKey = doesKeyExists(urlStrSplitSlashObj, schema.name);
|
485
492
|
var hasDeprecatedKey = doesKeyExists(schema, 'deprecated_for') && hasPropertyKey;
|
486
|
-
|
487
|
-
if (
|
493
|
+
|
494
|
+
if (hasDeprecatedKey) {
|
495
|
+
urlState[schema.deprecated_for] = urlStrSplitSlashObj[schema.name];
|
496
|
+
return;
|
497
|
+
}
|
498
|
+
|
499
|
+
if (hasPropertyKey) {
|
500
|
+
urlState[schema.name] = urlStrSplitSlashObj[schema.name];
|
501
|
+
return;
|
502
|
+
}
|
488
503
|
}); // Add searchParams to urlState
|
489
504
|
// Check if Object value is a Boolean and convert value to Boolean
|
490
505
|
// Otherwise, return Object value
|
491
506
|
|
492
|
-
var
|
507
|
+
var isBooleanValue = function isBooleanValue(value) {
|
493
508
|
return value === 'true' || (value === 'false' ? false : value);
|
494
509
|
};
|
495
510
|
|
@@ -498,7 +513,7 @@ var UrlPlugin = /*#__PURE__*/function () {
|
|
498
513
|
key = _ref2[0],
|
499
514
|
value = _ref2[1];
|
500
515
|
|
501
|
-
urlState[key] =
|
516
|
+
urlState[key] = isBooleanValue(value);
|
502
517
|
});
|
503
518
|
return urlState;
|
504
519
|
}
|
@@ -564,7 +579,7 @@ var UrlPlugin = /*#__PURE__*/function () {
|
|
564
579
|
}, {
|
565
580
|
key: "listenForHashChanges",
|
566
581
|
value: function listenForHashChanges() {
|
567
|
-
var
|
582
|
+
var _this4 = this;
|
568
583
|
|
569
584
|
this.oldLocationHash = window.location.hash.substr(1);
|
570
585
|
|
@@ -576,27 +591,27 @@ var UrlPlugin = /*#__PURE__*/function () {
|
|
576
591
|
|
577
592
|
var updateHash = function updateHash() {
|
578
593
|
var newFragment = window.location.hash.substr(1);
|
579
|
-
var hasFragmentChange = newFragment !=
|
594
|
+
var hasFragmentChange = newFragment != _this4.oldLocationHash;
|
580
595
|
|
581
596
|
if (!hasFragmentChange) {
|
582
597
|
return;
|
583
598
|
}
|
584
599
|
|
585
|
-
|
600
|
+
_this4.urlState = _this4.urlStringToUrlState(newFragment);
|
586
601
|
};
|
587
602
|
|
588
603
|
this.urlLocationPollId = setInterval(updateHash, 500);
|
589
604
|
}
|
590
605
|
/**
|
591
606
|
* Will read either the hash or URL and return the bookreader fragment
|
592
|
-
* @param {string} location
|
593
|
-
* @return {string}
|
594
607
|
*/
|
595
608
|
|
596
609
|
}, {
|
597
610
|
key: "pullFromAddressBar",
|
598
|
-
value: function pullFromAddressBar(
|
599
|
-
var
|
611
|
+
value: function pullFromAddressBar() {
|
612
|
+
var location = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : window.location;
|
613
|
+
var path = this.urlMode === 'history' ? location.pathname.substr(this.urlHistoryBasePath.length) + location.search : location.hash.substr(1);
|
614
|
+
console.log('path: ', path);
|
600
615
|
this.urlState = this.urlStringToUrlState(this.urlSchema, path);
|
601
616
|
}
|
602
617
|
}]);
|
@@ -617,15 +632,15 @@ var BookreaderUrlPlugin = /*#__PURE__*/function (_BookReader) {
|
|
617
632
|
_createClass(BookreaderUrlPlugin, [{
|
618
633
|
key: "init",
|
619
634
|
value: function init() {
|
620
|
-
var
|
635
|
+
var _this5 = this;
|
621
636
|
|
622
637
|
if (this.options.enableUrlPlugin) {
|
623
638
|
this.urlPlugin = new UrlPlugin(this.options);
|
624
639
|
this.bind(BookReader.eventNames.PostInit, function () {
|
625
|
-
var urlMode =
|
640
|
+
var urlMode = _this5.options.urlMode;
|
626
641
|
|
627
642
|
if (urlMode === 'hash') {
|
628
|
-
|
643
|
+
_this5.urlPlugin.listenForHashChanges();
|
629
644
|
}
|
630
645
|
});
|
631
646
|
}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"plugins/plugin.url.js","mappings":"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","sources":["webpack://@internetarchive/bookreader/./src/plugins/plugin.url.js","webpack://@internetarchive/bookreader/./node_modules/core-js/modules/es.object.entries.js","webpack://@internetarchive/bookreader/./node_modules/core-js/modules/es.object.from-entries.js","webpack://@internetarchive/bookreader/./node_modules/core-js/modules/es.string.match.js"],"sourcesContent":["/* global BookReader */\n/**\n * Plugin for URL management in BookReader\n * Note read more about the url \"fragment\" here:\n * https://openlibrary.org/dev/docs/bookurls\n */\n\njQuery.extend(BookReader.defaultOptions, {\n enableUrlPlugin: true,\n bookId: '',\n /** @type {string} Defaults can be a urlFragment string */\n defaults: null,\n updateWindowTitle: false,\n\n /** @type {'history' | 'hash'} */\n urlMode: 'hash',\n\n /**\n * When using 'history' mode, this part of the URL is kept constant\n * @example /details/plato/\n */\n urlHistoryBasePath: '/',\n\n /** Only these params will be reflected onto the URL */\n urlTrackedParams: ['page', 'search', 'mode', 'region', 'highlight', 'view'],\n\n /** If true, don't update the URL when `page == n0 (eg \"/page/n0\")` */\n urlTrackIndex0: false,\n});\n\n/** @override */\nBookReader.prototype.setup = (function(super_) {\n return function(options) {\n super_.call(this, options);\n\n this.bookId = options.bookId;\n this.defaults = options.defaults;\n\n this.locationPollId = null;\n this.oldLocationHash = null;\n this.oldUserHash = null;\n };\n})(BookReader.prototype.setup);\n\n/** @override */\nBookReader.prototype.init = (function(super_) {\n return function() {\n\n if (this.options.enableUrlPlugin) {\n this.bind(BookReader.eventNames.PostInit, () => {\n const { updateWindowTitle, urlMode } = this.options;\n if (updateWindowTitle) {\n document.title = this.shortTitle(this.bookTitle, 50);\n }\n if (urlMode === 'hash') {\n this.urlStartLocationPolling();\n }\n });\n\n this.bind(BookReader.eventNames.fragmentChange,\n this.urlUpdateFragment.bind(this)\n );\n }\n super_.call(this);\n };\n})(BookReader.prototype.init);\n\n/**\n * Returns a shortened version of the title with the maximum number of characters\n * @param {number} maximumCharacters\n * @return {string}\n */\nBookReader.prototype.shortTitle = function(maximumCharacters) {\n if (this.bookTitle.length < maximumCharacters) {\n return this.bookTitle;\n }\n\n const title = `${this.bookTitle.substr(0, maximumCharacters - 3)}...`;\n return title;\n};\n\n/**\n * Starts polling of window.location to see hash fragment changes\n */\nBookReader.prototype.urlStartLocationPolling = function() {\n this.oldLocationHash = this.urlReadFragment();\n\n if (this.locationPollId) {\n clearInterval(this.locationPollId);\n this.locationPollId = null;\n }\n\n const updateHash = () => {\n const newFragment = this.urlReadFragment();\n const hasFragmentChange = (newFragment != this.oldLocationHash) && (newFragment != this.oldUserHash);\n\n if (!hasFragmentChange) { return; }\n\n const params = this.paramsFromFragment(newFragment);\n\n const updateParams = () => this.updateFromParams(params);\n\n this.trigger(BookReader.eventNames.stop);\n if (this.animating) {\n // Queue change if animating\n if (this.autoStop) this.autoStop();\n this.animationFinishedCallback = updateParams;\n } else {\n // update immediately\n updateParams();\n }\n this.oldUserHash = newFragment;\n };\n\n this.locationPollId = setInterval(updateHash, 500);\n};\n\n/**\n * Update URL from the current parameters.\n * Call this instead of manually using window.location.replace\n */\nBookReader.prototype.urlUpdateFragment = function() {\n const allParams = this.paramsFromCurrent();\n const { urlMode, urlTrackIndex0, urlTrackedParams } = this.options;\n\n if (!urlTrackIndex0\n && (typeof(allParams.index) !== 'undefined')\n && allParams.index === 0) {\n delete allParams.index;\n delete allParams.page;\n }\n\n const params = urlTrackedParams.reduce((validParams, paramName) => {\n if (paramName in allParams) {\n validParams[paramName] = allParams[paramName];\n }\n return validParams;\n }, {});\n\n const newFragment = this.fragmentFromParams(params, urlMode);\n const currFragment = this.urlReadFragment();\n const currQueryString = this.getLocationSearch();\n const newQueryString = this.queryStringFromParams(params, currQueryString, urlMode);\n if (currFragment === newFragment && currQueryString === newQueryString) {\n return;\n }\n\n if (urlMode === 'history') {\n if (window.history && window.history.replaceState) {\n const baseWithoutSlash = this.options.urlHistoryBasePath.replace(/\\/+$/, '');\n const newFragmentWithSlash = newFragment === '' ? '' : `/${newFragment}`;\n\n const newUrlPath = `${baseWithoutSlash}${newFragmentWithSlash}${newQueryString}`;\n window.history.replaceState({}, null, newUrlPath);\n this.oldLocationHash = newFragment + newQueryString;\n\n }\n } else {\n const newQueryStringSearch = this.urlParamsFiltersOnlySearch(this.readQueryString());\n window.location.replace('#' + newFragment + newQueryStringSearch);\n this.oldLocationHash = newFragment + newQueryStringSearch;\n\n }\n};\n\n/**\n * @private\n * Filtering query parameters to select only book search param (?q=foo)\n This needs to be updated/URL system modified if future query params are to be added\n * @param {string} url\n * @return {string}\n * */\nBookReader.prototype.urlParamsFiltersOnlySearch = function(url) {\n const params = new URLSearchParams(url);\n return params.has('q') ? `?${new URLSearchParams({ q: params.get('q') })}` : '';\n};\n\n\n/**\n * Will read either the hash or URL and return the bookreader fragment\n * @return {string}\n */\nBookReader.prototype.urlReadFragment = function() {\n const { urlMode, urlHistoryBasePath } = this.options;\n if (urlMode === 'history') {\n return window.location.pathname.substr(urlHistoryBasePath.length);\n } else {\n return window.location.hash.substr(1);\n }\n};\n\n/**\n * Will read the hash return the bookreader fragment\n * @return {string}\n */\nBookReader.prototype.urlReadHashFragment = function() {\n return window.location.hash.substr(1);\n};\nexport class UrlPlugin {\n constructor(options = {}) {\n this.bookReaderOptions = options;\n\n this.urlSchema = [\n { name: 'page', position: 'path', default: 'n0' },\n { name: 'mode', position: 'path', default: '2up' },\n { name: 'search', position: 'path', deprecated_for: 'q' },\n { name: 'q', position: 'query_param' },\n { name: 'sort', position: 'query_param' },\n { name: 'view', position: 'query_param' },\n { name: 'admin', position: 'query_param' },\n ];\n\n this.urlState = {};\n this.urlMode = 'hash';\n this.urlHistoryBasePath = '/';\n this.urlLocationPollId = null;\n this.oldLocationHash = null;\n this.oldUserHash = null;\n }\n\n /**\n * Parse JSON object URL state to string format\n * Arrange path names in an order that it is positioned on the urlSchema\n * @param {object} urlState\n * @returns {string}\n */\n urlStateToUrlString(urlSchema, urlState) {\n const searchParams = new URLSearchParams();\n const pathParams = {};\n\n Object.keys(urlState).forEach(key => {\n let schema = urlSchema.find(schema => schema.name === key);\n if (schema?.deprecated_for) {\n schema = urlSchema.find(schemaKey => schemaKey.name === schema.deprecated_for);\n }\n if (schema?.position == 'path') {\n pathParams[schema?.name] = urlState[key];\n } else {\n searchParams.append(schema?.name || key, urlState[key]);\n }\n });\n\n const strPathParams = urlSchema\n .filter(s => s.position == 'path')\n .map(schema => pathParams[schema.name] ? `${schema.name}/${pathParams[schema.name]}` : '')\n .join('/');\n\n const strStrippedTrailingSlash = `${strPathParams.replace(/\\/$/, '')}`;\n const concatenatedPath = `/${strStrippedTrailingSlash}?${searchParams.toString()}`;\n return searchParams.toString() ? concatenatedPath : `/${strStrippedTrailingSlash}`;\n }\n\n /**\n * Parse string URL and add it in the current urlState\n * Example:\n * /page/n7/mode/2up => {page: 'n7', mode: '2up'}\n * /page/n7/mode/2up/search/hello => {page: 'n7', mode: '2up', q: 'hello'}\n * @param {array} urlSchema\n * @param {string} str\n * @returns {object}\n */\n urlStringToUrlState(urlSchema, str) {\n const urlState = {};\n\n // Fetch searchParams from given {str}\n // Note: whole URL path is needed for URLSearchParams\n const urlPath = new URL(str, 'http://example.com');\n const urlSearchParamsObj = Object.fromEntries(urlPath.searchParams.entries());\n const urlStrSplitSlashObj = Object.fromEntries(urlPath.pathname\n .match(/[^\\\\/]+\\/[^\\\\/]+/g)\n .map(x => x.split('/'))\n );\n const doesKeyExists = (_object, _key) => {\n return Object.keys(_object).some(value => value == _key);\n };\n\n urlSchema\n .filter(schema => schema.position == 'path')\n .forEach(schema => {\n if (!urlStrSplitSlashObj[schema.name] && schema.default) {\n return urlState[schema.name] = schema.default;\n }\n const hasPropertyKey = doesKeyExists(urlStrSplitSlashObj, schema.name);\n const hasDeprecatedKey = doesKeyExists(schema, 'deprecated_for') && hasPropertyKey;\n\n if (hasDeprecatedKey)\n return urlState[schema.deprecated_for] = urlStrSplitSlashObj[schema.name];\n\n if (hasPropertyKey)\n return urlState[schema.name] = urlStrSplitSlashObj[schema.name];\n });\n\n // Add searchParams to urlState\n // Check if Object value is a Boolean and convert value to Boolean\n // Otherwise, return Object value\n const isBoolean = value => value === 'true' || (value === 'false' ? false : value);\n Object.entries(urlSearchParamsObj).forEach(([key, value]) => {\n urlState[key] = isBoolean(value);\n });\n\n return urlState;\n }\n\n /**\n * Add or update key-value to the urlState\n * @param {string} key\n * @param {string} val\n */\n setUrlParam(key, value) {\n this.urlState[key] = value;\n\n this.pushToAddressBar();\n }\n\n /**\n * Delete key-value to the urlState\n * @param {string} key\n */\n removeUrlParam(key) {\n delete this.urlState[key];\n\n this.pushToAddressBar();\n }\n\n /**\n * Get key-value from the urlState\n * @param {string} key\n * @return {string}\n */\n getUrlParam(key) {\n return this.urlState[key];\n }\n\n /**\n * Push URL params to addressbar\n */\n pushToAddressBar() {\n const urlStrPath = this.urlStateToUrlString(this.urlSchema, this.urlState);\n if (this.urlMode == 'history') {\n if (window.history && window.history.replaceState) {\n const newUrlPath = `${this.urlHistoryBasePath}${urlStrPath}`;\n window.history.replaceState({}, null, newUrlPath);\n }\n } else {\n window.location.replace('#' + urlStrPath);\n }\n this.oldLocationHash = urlStrPath;\n }\n\n /**\n * Get the url and check if it has changed\n * If it was changeed, update the urlState\n */\n listenForHashChanges() {\n this.oldLocationHash = window.location.hash.substr(1);\n if (this.urlLocationPollId) {\n clearInterval(this.urlLocationPollId);\n this.urlLocationPollId = null;\n }\n\n // check if the URL changes\n const updateHash = () => {\n const newFragment = window.location.hash.substr(1);\n const hasFragmentChange = newFragment != this.oldLocationHash;\n\n if (!hasFragmentChange) { return; }\n\n this.urlState = this.urlStringToUrlState(newFragment);\n };\n this.urlLocationPollId = setInterval(updateHash, 500);\n }\n\n /**\n * Will read either the hash or URL and return the bookreader fragment\n * @param {string} location\n * @return {string}\n */\n pullFromAddressBar (location) {\n const path = this.urlMode === 'history'\n ? location.substr(this.urlHistoryBasePath.length)\n : location.substr(1);\n this.urlState = this.urlStringToUrlState(this.urlSchema, path);\n }\n}\nexport class BookreaderUrlPlugin extends BookReader {\n\n init() {\n if (this.options.enableUrlPlugin) {\n this.urlPlugin = new UrlPlugin(this.options);\n this.bind(BookReader.eventNames.PostInit, () => {\n const { urlMode } = this.options;\n\n if (urlMode === 'hash') {\n this.urlPlugin.listenForHashChanges();\n }\n });\n }\n\n super.init();\n }\n\n}\n\nwindow.BookReader = BookreaderUrlPlugin;\nexport default BookreaderUrlPlugin;\n","var $ = require('../internals/export');\nvar $entries = require('../internals/object-to-array').entries;\n\n// `Object.entries` method\n// https://tc39.es/ecma262/#sec-object.entries\n$({ target: 'Object', stat: true }, {\n entries: function entries(O) {\n return $entries(O);\n }\n});\n","var $ = require('../internals/export');\nvar iterate = require('../internals/iterate');\nvar createProperty = require('../internals/create-property');\n\n// `Object.fromEntries` method\n// https://github.com/tc39/proposal-object-from-entries\n$({ target: 'Object', stat: true }, {\n fromEntries: function fromEntries(iterable) {\n var obj = {};\n iterate(iterable, function (k, v) {\n createProperty(obj, k, v);\n }, { AS_ENTRIES: true });\n return obj;\n }\n});\n","'use strict';\nvar fixRegExpWellKnownSymbolLogic = require('../internals/fix-regexp-well-known-symbol-logic');\nvar anObject = require('../internals/an-object');\nvar toLength = require('../internals/to-length');\nvar toString = require('../internals/to-string');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar advanceStringIndex = require('../internals/advance-string-index');\nvar regExpExec = require('../internals/regexp-exec-abstract');\n\n// @@match logic\nfixRegExpWellKnownSymbolLogic('match', function (MATCH, nativeMatch, maybeCallNative) {\n return [\n // `String.prototype.match` method\n // https://tc39.es/ecma262/#sec-string.prototype.match\n function match(regexp) {\n var O = requireObjectCoercible(this);\n var matcher = regexp == undefined ? undefined : regexp[MATCH];\n return matcher !== undefined ? matcher.call(regexp, O) : new RegExp(regexp)[MATCH](toString(O));\n },\n // `RegExp.prototype[@@match]` method\n // https://tc39.es/ecma262/#sec-regexp.prototype-@@match\n function (string) {\n var rx = anObject(this);\n var S = toString(string);\n var res = maybeCallNative(nativeMatch, rx, S);\n\n if (res.done) return res.value;\n\n if (!rx.global) return regExpExec(rx, S);\n\n var fullUnicode = rx.unicode;\n rx.lastIndex = 0;\n var A = [];\n var n = 0;\n var result;\n while ((result = regExpExec(rx, S)) !== null) {\n var matchStr = toString(result[0]);\n A[n] = matchStr;\n if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n n++;\n }\n return n === 0 ? null : A;\n }\n ];\n});\n"],"names":["jQuery","extend","BookReader","defaultOptions","enableUrlPlugin","bookId","defaults","updateWindowTitle","urlMode","urlHistoryBasePath","urlTrackedParams","urlTrackIndex0","prototype","setup","super_","options","call","locationPollId","oldLocationHash","oldUserHash","init","bind","eventNames","PostInit","document","title","shortTitle","bookTitle","urlStartLocationPolling","fragmentChange","urlUpdateFragment","maximumCharacters","length","substr","urlReadFragment","clearInterval","updateHash","newFragment","hasFragmentChange","params","paramsFromFragment","updateParams","updateFromParams","trigger","stop","animating","autoStop","animationFinishedCallback","setInterval","allParams","paramsFromCurrent","index","page","reduce","validParams","paramName","fragmentFromParams","currFragment","currQueryString","getLocationSearch","newQueryString","queryStringFromParams","window","history","replaceState","baseWithoutSlash","replace","newFragmentWithSlash","newUrlPath","newQueryStringSearch","urlParamsFiltersOnlySearch","readQueryString","location","url","URLSearchParams","has","q","get","pathname","hash","urlReadHashFragment","UrlPlugin","bookReaderOptions","urlSchema","name","position","default","deprecated_for","urlState","urlLocationPollId","searchParams","pathParams","Object","keys","forEach","key","schema","find","schemaKey","append","strPathParams","filter","s","map","join","strStrippedTrailingSlash","concatenatedPath","toString","str","urlPath","URL","urlSearchParamsObj","fromEntries","entries","urlStrSplitSlashObj","match","x","split","doesKeyExists","_object","_key","some","value","hasPropertyKey","hasDeprecatedKey","isBoolean","pushToAddressBar","urlStrPath","urlStateToUrlString","urlStringToUrlState","path","BookreaderUrlPlugin","urlPlugin","listenForHashChanges"],"sourceRoot":""}
|
1
|
+
{"version":3,"file":"plugins/plugin.url.js","mappings":"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","sources":["webpack://@internetarchive/bookreader/./src/plugins/plugin.url.js","webpack://@internetarchive/bookreader/./node_modules/core-js/modules/es.object.entries.js","webpack://@internetarchive/bookreader/./node_modules/core-js/modules/es.object.from-entries.js","webpack://@internetarchive/bookreader/./node_modules/core-js/modules/es.string.match.js"],"sourcesContent":["/* global BookReader */\n/**\n * Plugin for URL management in BookReader\n * Note read more about the url \"fragment\" here:\n * https://openlibrary.org/dev/docs/bookurls\n */\n\njQuery.extend(BookReader.defaultOptions, {\n enableUrlPlugin: true,\n bookId: '',\n /** @type {string} Defaults can be a urlFragment string */\n defaults: null,\n updateWindowTitle: false,\n\n /** @type {'history' | 'hash'} */\n urlMode: 'hash',\n\n /**\n * When using 'history' mode, this part of the URL is kept constant\n * @example /details/plato/\n */\n urlHistoryBasePath: '/',\n\n /** Only these params will be reflected onto the URL */\n urlTrackedParams: ['page', 'search', 'mode', 'region', 'highlight', 'view'],\n\n /** If true, don't update the URL when `page == n0 (eg \"/page/n0\")` */\n urlTrackIndex0: false,\n});\n\n/** @override */\nBookReader.prototype.setup = (function(super_) {\n return function(options) {\n super_.call(this, options);\n\n this.bookId = options.bookId;\n this.defaults = options.defaults;\n\n this.locationPollId = null;\n this.oldLocationHash = null;\n this.oldUserHash = null;\n };\n})(BookReader.prototype.setup);\n\n/** @override */\nBookReader.prototype.init = (function(super_) {\n return function() {\n\n if (this.options.enableUrlPlugin) {\n this.bind(BookReader.eventNames.PostInit, () => {\n const { updateWindowTitle, urlMode } = this.options;\n if (updateWindowTitle) {\n document.title = this.shortTitle(this.bookTitle, 50);\n }\n if (urlMode === 'hash') {\n this.urlStartLocationPolling();\n }\n });\n\n this.bind(BookReader.eventNames.fragmentChange,\n this.urlUpdateFragment.bind(this)\n );\n }\n super_.call(this);\n };\n})(BookReader.prototype.init);\n\n/**\n * Returns a shortened version of the title with the maximum number of characters\n * @param {number} maximumCharacters\n * @return {string}\n */\nBookReader.prototype.shortTitle = function(maximumCharacters) {\n if (this.bookTitle.length < maximumCharacters) {\n return this.bookTitle;\n }\n\n const title = `${this.bookTitle.substr(0, maximumCharacters - 3)}...`;\n return title;\n};\n\n/**\n * Starts polling of window.location to see hash fragment changes\n */\nBookReader.prototype.urlStartLocationPolling = function() {\n this.oldLocationHash = this.urlReadFragment();\n\n if (this.locationPollId) {\n clearInterval(this.locationPollId);\n this.locationPollId = null;\n }\n\n const updateHash = () => {\n const newFragment = this.urlReadFragment();\n const hasFragmentChange = (newFragment != this.oldLocationHash) && (newFragment != this.oldUserHash);\n\n if (!hasFragmentChange) { return; }\n\n const params = this.paramsFromFragment(newFragment);\n\n const updateParams = () => this.updateFromParams(params);\n\n this.trigger(BookReader.eventNames.stop);\n if (this.animating) {\n // Queue change if animating\n if (this.autoStop) this.autoStop();\n this.animationFinishedCallback = updateParams;\n } else {\n // update immediately\n updateParams();\n }\n this.oldUserHash = newFragment;\n };\n\n this.locationPollId = setInterval(updateHash, 500);\n};\n\n/**\n * Update URL from the current parameters.\n * Call this instead of manually using window.location.replace\n */\nBookReader.prototype.urlUpdateFragment = function() {\n const allParams = this.paramsFromCurrent();\n const { urlMode, urlTrackIndex0, urlTrackedParams } = this.options;\n\n if (!urlTrackIndex0\n && (typeof(allParams.index) !== 'undefined')\n && allParams.index === 0) {\n delete allParams.index;\n delete allParams.page;\n }\n\n const params = urlTrackedParams.reduce((validParams, paramName) => {\n if (paramName in allParams) {\n validParams[paramName] = allParams[paramName];\n }\n return validParams;\n }, {});\n\n const newFragment = this.fragmentFromParams(params, urlMode);\n const currFragment = this.urlReadFragment();\n const currQueryString = this.getLocationSearch();\n const newQueryString = this.queryStringFromParams(params, currQueryString, urlMode);\n if (currFragment === newFragment && currQueryString === newQueryString) {\n return;\n }\n\n if (urlMode === 'history') {\n if (window.history && window.history.replaceState) {\n const baseWithoutSlash = this.options.urlHistoryBasePath.replace(/\\/+$/, '');\n const newFragmentWithSlash = newFragment === '' ? '' : `/${newFragment}`;\n\n const newUrlPath = `${baseWithoutSlash}${newFragmentWithSlash}${newQueryString}`;\n window.history.replaceState({}, null, newUrlPath);\n this.oldLocationHash = newFragment + newQueryString;\n\n }\n } else {\n const newQueryStringSearch = this.urlParamsFiltersOnlySearch(this.readQueryString());\n window.location.replace('#' + newFragment + newQueryStringSearch);\n this.oldLocationHash = newFragment + newQueryStringSearch;\n\n }\n};\n\n/**\n * @private\n * Filtering query parameters to select only book search param (?q=foo)\n This needs to be updated/URL system modified if future query params are to be added\n * @param {string} url\n * @return {string}\n * */\nBookReader.prototype.urlParamsFiltersOnlySearch = function(url) {\n const params = new URLSearchParams(url);\n return params.has('q') ? `?${new URLSearchParams({ q: params.get('q') })}` : '';\n};\n\n\n/**\n * Will read either the hash or URL and return the bookreader fragment\n * @return {string}\n */\nBookReader.prototype.urlReadFragment = function() {\n const { urlMode, urlHistoryBasePath } = this.options;\n if (urlMode === 'history') {\n return window.location.pathname.substr(urlHistoryBasePath.length);\n } else {\n return window.location.hash.substr(1);\n }\n};\n\n/**\n * Will read the hash return the bookreader fragment\n * @return {string}\n */\nBookReader.prototype.urlReadHashFragment = function() {\n return window.location.hash.substr(1);\n};\nexport class UrlPlugin {\n constructor(options = {}) {\n this.bookReaderOptions = options;\n\n // the canonical order of elements is important in the path and query string\n this.urlSchema = [\n { name: 'page', position: 'path', default: 'n0' },\n { name: 'mode', position: 'path', default: '2up' },\n { name: 'search', position: 'path', deprecated_for: 'q' },\n { name: 'q', position: 'query_param' },\n { name: 'sort', position: 'query_param' },\n { name: 'view', position: 'query_param' },\n { name: 'admin', position: 'query_param' },\n ];\n\n this.urlState = {};\n this.urlMode = this.options.urlMode || 'hash';\n this.urlHistoryBasePath = '/';\n this.urlLocationPollId = null;\n this.oldLocationHash = null;\n this.oldUserHash = null;\n }\n\n /**\n * Parse JSON object URL state to string format\n * Arrange path names in an order that it is positioned on the urlSchema\n * @param {string} urlState\n * @returns {string}\n */\n urlStateToUrlString(urlState) {\n const searchParams = new URLSearchParams();\n const pathParams = {};\n\n Object.keys(urlState).forEach(key => {\n let schema = this.urlSchema.find(schema => schema.name === key);\n if (schema?.deprecated_for) {\n schema = this.urlSchema.find(schemaKey => schemaKey.name === schema.deprecated_for);\n }\n if (schema?.position == 'path') {\n pathParams[schema?.name] = urlState[key];\n } else {\n searchParams.append(schema?.name || key, urlState[key]);\n }\n });\n\n const strPathParams = this.urlSchema\n .filter(s => s.position == 'path')\n .map(schema => pathParams[schema.name] ? `${schema.name}/${pathParams[schema.name]}` : '')\n .join('/');\n\n const strStrippedTrailingSlash = `${strPathParams.replace(/\\/$/, '')}`;\n const concatenatedPath = `/${strStrippedTrailingSlash}?${searchParams.toString()}`;\n return searchParams.toString() ? concatenatedPath : `/${strStrippedTrailingSlash}`;\n }\n\n /**\n * Parse string URL and add it in the current urlState\n * Example:\n * /page/n7/mode/2up => {page: 'n7', mode: '2up'}\n * /page/n7/mode/2up/search/hello => {page: 'n7', mode: '2up', q: 'hello'}\n * @param {string} urlString\n * @returns {object}\n */\n urlStringToUrlState(urlString) {\n const urlState = {};\n\n // Fetch searchParams from given {urlString}\n // Note: whole URL path is needed for URLSearchParams\n const urlPath = new URL(urlString, 'http://example.com');\n console.log('urlSearch: ', urlPath.searchParams, ' urlPath: ', urlPath.pathname);\n const urlSearchParamsObj = Object.fromEntries(urlPath.searchParams.entries());\n const urlStrSplitSlashObj = Object.fromEntries(urlPath.pathname\n .match(/[^\\\\/]+\\/[^\\\\/]+/g)\n .map(x => x.split('/'))\n );\n const doesKeyExists = (_object, _key) => {\n return Object.keys(_object).some(value => value == _key);\n };\n\n // Add path objects to urlState\n this.urlSchema\n .filter(schema => schema.position == 'path')\n .forEach(schema => {\n if (!urlStrSplitSlashObj[schema.name] && schema.default) {\n return urlState[schema.name] = schema.default;\n }\n const hasPropertyKey = doesKeyExists(urlStrSplitSlashObj, schema.name);\n const hasDeprecatedKey = doesKeyExists(schema, 'deprecated_for') && hasPropertyKey;\n\n if (hasDeprecatedKey) {\n urlState[schema.deprecated_for] = urlStrSplitSlashObj[schema.name];\n return;\n }\n\n if (hasPropertyKey) {\n urlState[schema.name] = urlStrSplitSlashObj[schema.name];\n return;\n }\n });\n\n // Add searchParams to urlState\n // Check if Object value is a Boolean and convert value to Boolean\n // Otherwise, return Object value\n const isBooleanValue = value => value === 'true' || (value === 'false' ? false : value);\n Object.entries(urlSearchParamsObj).forEach(([key, value]) => {\n urlState[key] = isBooleanValue(value);\n });\n\n return urlState;\n }\n\n /**\n * Add or update key-value to the urlState\n * @param {string} key\n * @param {string} val\n */\n setUrlParam(key, value) {\n this.urlState[key] = value;\n\n this.pushToAddressBar();\n }\n\n /**\n * Delete key-value to the urlState\n * @param {string} key\n */\n removeUrlParam(key) {\n delete this.urlState[key];\n\n this.pushToAddressBar();\n }\n\n /**\n * Get key-value from the urlState\n * @param {string} key\n * @return {string}\n */\n getUrlParam(key) {\n return this.urlState[key];\n }\n\n /**\n * Push URL params to addressbar\n */\n pushToAddressBar() {\n const urlStrPath = this.urlStateToUrlString(this.urlSchema, this.urlState);\n if (this.urlMode == 'history') {\n if (window.history && window.history.replaceState) {\n const newUrlPath = `${this.urlHistoryBasePath}${urlStrPath}`;\n window.history.replaceState({}, null, newUrlPath);\n }\n } else {\n window.location.replace('#' + urlStrPath);\n }\n this.oldLocationHash = urlStrPath;\n }\n\n /**\n * Get the url and check if it has changed\n * If it was changeed, update the urlState\n */\n listenForHashChanges() {\n this.oldLocationHash = window.location.hash.substr(1);\n if (this.urlLocationPollId) {\n clearInterval(this.urlLocationPollId);\n this.urlLocationPollId = null;\n }\n\n // check if the URL changes\n const updateHash = () => {\n const newFragment = window.location.hash.substr(1);\n const hasFragmentChange = newFragment != this.oldLocationHash;\n\n if (!hasFragmentChange) { return; }\n\n this.urlState = this.urlStringToUrlState(newFragment);\n };\n this.urlLocationPollId = setInterval(updateHash, 500);\n }\n\n /**\n * Will read either the hash or URL and return the bookreader fragment\n */\n pullFromAddressBar (location = window.location) {\n const path = this.urlMode === 'history'\n ? (location.pathname.substr(this.urlHistoryBasePath.length) + location.search)\n : location.hash.substr(1);\n console.log('path: ', path);\n this.urlState = this.urlStringToUrlState(this.urlSchema, path);\n }\n}\n\nexport class BookreaderUrlPlugin extends BookReader {\n\n init() {\n if (this.options.enableUrlPlugin) {\n this.urlPlugin = new UrlPlugin(this.options);\n this.bind(BookReader.eventNames.PostInit, () => {\n const { urlMode } = this.options;\n\n if (urlMode === 'hash') {\n this.urlPlugin.listenForHashChanges();\n }\n });\n }\n\n super.init();\n }\n\n}\n\nwindow.BookReader = BookreaderUrlPlugin;\nexport default BookreaderUrlPlugin;\n","var $ = require('../internals/export');\nvar $entries = require('../internals/object-to-array').entries;\n\n// `Object.entries` method\n// https://tc39.es/ecma262/#sec-object.entries\n$({ target: 'Object', stat: true }, {\n entries: function entries(O) {\n return $entries(O);\n }\n});\n","var $ = require('../internals/export');\nvar iterate = require('../internals/iterate');\nvar createProperty = require('../internals/create-property');\n\n// `Object.fromEntries` method\n// https://github.com/tc39/proposal-object-from-entries\n$({ target: 'Object', stat: true }, {\n fromEntries: function fromEntries(iterable) {\n var obj = {};\n iterate(iterable, function (k, v) {\n createProperty(obj, k, v);\n }, { AS_ENTRIES: true });\n return obj;\n }\n});\n","'use strict';\nvar fixRegExpWellKnownSymbolLogic = require('../internals/fix-regexp-well-known-symbol-logic');\nvar anObject = require('../internals/an-object');\nvar toLength = require('../internals/to-length');\nvar toString = require('../internals/to-string');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar advanceStringIndex = require('../internals/advance-string-index');\nvar regExpExec = require('../internals/regexp-exec-abstract');\n\n// @@match logic\nfixRegExpWellKnownSymbolLogic('match', function (MATCH, nativeMatch, maybeCallNative) {\n return [\n // `String.prototype.match` method\n // https://tc39.es/ecma262/#sec-string.prototype.match\n function match(regexp) {\n var O = requireObjectCoercible(this);\n var matcher = regexp == undefined ? undefined : regexp[MATCH];\n return matcher !== undefined ? matcher.call(regexp, O) : new RegExp(regexp)[MATCH](toString(O));\n },\n // `RegExp.prototype[@@match]` method\n // https://tc39.es/ecma262/#sec-regexp.prototype-@@match\n function (string) {\n var rx = anObject(this);\n var S = toString(string);\n var res = maybeCallNative(nativeMatch, rx, S);\n\n if (res.done) return res.value;\n\n if (!rx.global) return regExpExec(rx, S);\n\n var fullUnicode = rx.unicode;\n rx.lastIndex = 0;\n var A = [];\n var n = 0;\n var result;\n while ((result = regExpExec(rx, S)) !== null) {\n var matchStr = toString(result[0]);\n A[n] = matchStr;\n if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n n++;\n }\n return n === 0 ? null : A;\n }\n ];\n});\n"],"names":["jQuery","extend","BookReader","defaultOptions","enableUrlPlugin","bookId","defaults","updateWindowTitle","urlMode","urlHistoryBasePath","urlTrackedParams","urlTrackIndex0","prototype","setup","super_","options","call","locationPollId","oldLocationHash","oldUserHash","init","bind","eventNames","PostInit","document","title","shortTitle","bookTitle","urlStartLocationPolling","fragmentChange","urlUpdateFragment","maximumCharacters","length","substr","urlReadFragment","clearInterval","updateHash","newFragment","hasFragmentChange","params","paramsFromFragment","updateParams","updateFromParams","trigger","stop","animating","autoStop","animationFinishedCallback","setInterval","allParams","paramsFromCurrent","index","page","reduce","validParams","paramName","fragmentFromParams","currFragment","currQueryString","getLocationSearch","newQueryString","queryStringFromParams","window","history","replaceState","baseWithoutSlash","replace","newFragmentWithSlash","newUrlPath","newQueryStringSearch","urlParamsFiltersOnlySearch","readQueryString","location","url","URLSearchParams","has","q","get","pathname","hash","urlReadHashFragment","UrlPlugin","bookReaderOptions","urlSchema","name","position","default","deprecated_for","urlState","urlLocationPollId","searchParams","pathParams","Object","keys","forEach","key","schema","find","schemaKey","append","strPathParams","filter","s","map","join","strStrippedTrailingSlash","concatenatedPath","toString","urlString","urlPath","URL","console","log","urlSearchParamsObj","fromEntries","entries","urlStrSplitSlashObj","match","x","split","doesKeyExists","_object","_key","some","value","hasPropertyKey","hasDeprecatedKey","isBooleanValue","pushToAddressBar","urlStrPath","urlStateToUrlString","urlStringToUrlState","path","search","BookreaderUrlPlugin","urlPlugin","listenForHashChanges"],"sourceRoot":""}
|
package/package.json
CHANGED
@@ -37,7 +37,7 @@ export default class VolumesProvider {
|
|
37
37
|
this.icon = html`${volumesIcon}`;
|
38
38
|
|
39
39
|
// get sort state from query param
|
40
|
-
this.bookreader.urlPlugin.pullFromAddressBar(
|
40
|
+
this.bookreader.urlPlugin.pullFromAddressBar();
|
41
41
|
const urlSortValue = this.bookreader.urlPlugin.getUrlParam('sort');
|
42
42
|
console.log('urlSortValue: ', urlSortValue);
|
43
43
|
if (urlSortValue === sortType.title_asc || urlSortValue === sortType.title_desc) {
|
package/src/BookReader.js
CHANGED
@@ -63,10 +63,6 @@ if (location.toString().indexOf('_debugShowConsole=true') != -1) {
|
|
63
63
|
*/
|
64
64
|
export default function BookReader(overrides = {}) {
|
65
65
|
const options = jQuery.extend(true, {}, BookReader.defaultOptions, overrides, BookReader.optionOverrides);
|
66
|
-
|
67
|
-
/** @type {import('./plugins/plugin.url').UrlPlugin | null} */
|
68
|
-
this.urlPlugin = null;
|
69
|
-
|
70
66
|
this.setup(options);
|
71
67
|
}
|
72
68
|
|
@@ -200,6 +200,7 @@ export class UrlPlugin {
|
|
200
200
|
constructor(options = {}) {
|
201
201
|
this.bookReaderOptions = options;
|
202
202
|
|
203
|
+
// the canonical order of elements is important in the path and query string
|
203
204
|
this.urlSchema = [
|
204
205
|
{ name: 'page', position: 'path', default: 'n0' },
|
205
206
|
{ name: 'mode', position: 'path', default: '2up' },
|
@@ -211,7 +212,7 @@ export class UrlPlugin {
|
|
211
212
|
];
|
212
213
|
|
213
214
|
this.urlState = {};
|
214
|
-
this.urlMode = 'hash';
|
215
|
+
this.urlMode = this.options.urlMode || 'hash';
|
215
216
|
this.urlHistoryBasePath = '/';
|
216
217
|
this.urlLocationPollId = null;
|
217
218
|
this.oldLocationHash = null;
|
@@ -221,17 +222,17 @@ export class UrlPlugin {
|
|
221
222
|
/**
|
222
223
|
* Parse JSON object URL state to string format
|
223
224
|
* Arrange path names in an order that it is positioned on the urlSchema
|
224
|
-
* @param {
|
225
|
+
* @param {string} urlState
|
225
226
|
* @returns {string}
|
226
227
|
*/
|
227
|
-
urlStateToUrlString(
|
228
|
+
urlStateToUrlString(urlState) {
|
228
229
|
const searchParams = new URLSearchParams();
|
229
230
|
const pathParams = {};
|
230
231
|
|
231
232
|
Object.keys(urlState).forEach(key => {
|
232
|
-
let schema = urlSchema.find(schema => schema.name === key);
|
233
|
+
let schema = this.urlSchema.find(schema => schema.name === key);
|
233
234
|
if (schema?.deprecated_for) {
|
234
|
-
schema = urlSchema.find(schemaKey => schemaKey.name === schema.deprecated_for);
|
235
|
+
schema = this.urlSchema.find(schemaKey => schemaKey.name === schema.deprecated_for);
|
235
236
|
}
|
236
237
|
if (schema?.position == 'path') {
|
237
238
|
pathParams[schema?.name] = urlState[key];
|
@@ -240,7 +241,7 @@ export class UrlPlugin {
|
|
240
241
|
}
|
241
242
|
});
|
242
243
|
|
243
|
-
const strPathParams = urlSchema
|
244
|
+
const strPathParams = this.urlSchema
|
244
245
|
.filter(s => s.position == 'path')
|
245
246
|
.map(schema => pathParams[schema.name] ? `${schema.name}/${pathParams[schema.name]}` : '')
|
246
247
|
.join('/');
|
@@ -255,16 +256,16 @@ export class UrlPlugin {
|
|
255
256
|
* Example:
|
256
257
|
* /page/n7/mode/2up => {page: 'n7', mode: '2up'}
|
257
258
|
* /page/n7/mode/2up/search/hello => {page: 'n7', mode: '2up', q: 'hello'}
|
258
|
-
* @param {
|
259
|
-
* @param {string} str
|
259
|
+
* @param {string} urlString
|
260
260
|
* @returns {object}
|
261
261
|
*/
|
262
|
-
urlStringToUrlState(
|
262
|
+
urlStringToUrlState(urlString) {
|
263
263
|
const urlState = {};
|
264
264
|
|
265
|
-
// Fetch searchParams from given {
|
265
|
+
// Fetch searchParams from given {urlString}
|
266
266
|
// Note: whole URL path is needed for URLSearchParams
|
267
|
-
const urlPath = new URL(
|
267
|
+
const urlPath = new URL(urlString, 'http://example.com');
|
268
|
+
console.log('urlSearch: ', urlPath.searchParams, ' urlPath: ', urlPath.pathname);
|
268
269
|
const urlSearchParamsObj = Object.fromEntries(urlPath.searchParams.entries());
|
269
270
|
const urlStrSplitSlashObj = Object.fromEntries(urlPath.pathname
|
270
271
|
.match(/[^\\/]+\/[^\\/]+/g)
|
@@ -274,7 +275,8 @@ export class UrlPlugin {
|
|
274
275
|
return Object.keys(_object).some(value => value == _key);
|
275
276
|
};
|
276
277
|
|
277
|
-
|
278
|
+
// Add path objects to urlState
|
279
|
+
this.urlSchema
|
278
280
|
.filter(schema => schema.position == 'path')
|
279
281
|
.forEach(schema => {
|
280
282
|
if (!urlStrSplitSlashObj[schema.name] && schema.default) {
|
@@ -283,19 +285,23 @@ export class UrlPlugin {
|
|
283
285
|
const hasPropertyKey = doesKeyExists(urlStrSplitSlashObj, schema.name);
|
284
286
|
const hasDeprecatedKey = doesKeyExists(schema, 'deprecated_for') && hasPropertyKey;
|
285
287
|
|
286
|
-
if (hasDeprecatedKey)
|
287
|
-
|
288
|
+
if (hasDeprecatedKey) {
|
289
|
+
urlState[schema.deprecated_for] = urlStrSplitSlashObj[schema.name];
|
290
|
+
return;
|
291
|
+
}
|
288
292
|
|
289
|
-
if (hasPropertyKey)
|
290
|
-
|
293
|
+
if (hasPropertyKey) {
|
294
|
+
urlState[schema.name] = urlStrSplitSlashObj[schema.name];
|
295
|
+
return;
|
296
|
+
}
|
291
297
|
});
|
292
298
|
|
293
299
|
// Add searchParams to urlState
|
294
300
|
// Check if Object value is a Boolean and convert value to Boolean
|
295
301
|
// Otherwise, return Object value
|
296
|
-
const
|
302
|
+
const isBooleanValue = value => value === 'true' || (value === 'false' ? false : value);
|
297
303
|
Object.entries(urlSearchParamsObj).forEach(([key, value]) => {
|
298
|
-
urlState[key] =
|
304
|
+
urlState[key] = isBooleanValue(value);
|
299
305
|
});
|
300
306
|
|
301
307
|
return urlState;
|
@@ -372,16 +378,16 @@ export class UrlPlugin {
|
|
372
378
|
|
373
379
|
/**
|
374
380
|
* Will read either the hash or URL and return the bookreader fragment
|
375
|
-
* @param {string} location
|
376
|
-
* @return {string}
|
377
381
|
*/
|
378
|
-
pullFromAddressBar (location) {
|
382
|
+
pullFromAddressBar (location = window.location) {
|
379
383
|
const path = this.urlMode === 'history'
|
380
|
-
? location.substr(this.urlHistoryBasePath.length)
|
381
|
-
: location.substr(1);
|
384
|
+
? (location.pathname.substr(this.urlHistoryBasePath.length) + location.search)
|
385
|
+
: location.hash.substr(1);
|
386
|
+
console.log('path: ', path);
|
382
387
|
this.urlState = this.urlStringToUrlState(this.urlSchema, path);
|
383
388
|
}
|
384
389
|
}
|
390
|
+
|
385
391
|
export class BookreaderUrlPlugin extends BookReader {
|
386
392
|
|
387
393
|
init() {
|