From 1ae96590afb894a9ba7a07730db43cbf66515078 Mon Sep 17 00:00:00 2001 From: Jonathan Hunt Date: Sat, 23 May 2026 10:18:28 +1200 Subject: [PATCH 1/9] #75 Return OpenSeadragon viewer object --- js/openseadragon_viewer.js | 1 + 1 file changed, 1 insertion(+) diff --git a/js/openseadragon_viewer.js b/js/openseadragon_viewer.js index f6d6fb0..7883887 100644 --- a/js/openseadragon_viewer.js +++ b/js/openseadragon_viewer.js @@ -124,5 +124,6 @@ }); } + return viewer; }; })(once); From 51ec570ac575265edc129f8e7031eaaddadadc35 Mon Sep 17 00:00:00 2001 From: Jonathan Hunt Date: Sat, 23 May 2026 10:55:35 +1200 Subject: [PATCH 2/9] #66 Initial commit of bookmark-url as submodule --- .../js/drupal-openseadragon-bookmark-url.js | 43 +++++++ .../js/openseadragon-bookmark-url.js | 112 ++++++++++++++++++ .../openseadragon_bookmark_url.info.yml | 7 ++ .../openseadragon_bookmark_url.libraries.yml | 9 ++ .../openseadragon_bookmark_url.module | 17 +++ 5 files changed, 188 insertions(+) create mode 100644 modules/openseadragon_bookmark_url/js/drupal-openseadragon-bookmark-url.js create mode 100644 modules/openseadragon_bookmark_url/js/openseadragon-bookmark-url.js create mode 100644 modules/openseadragon_bookmark_url/openseadragon_bookmark_url.info.yml create mode 100644 modules/openseadragon_bookmark_url/openseadragon_bookmark_url.libraries.yml create mode 100644 modules/openseadragon_bookmark_url/openseadragon_bookmark_url.module diff --git a/modules/openseadragon_bookmark_url/js/drupal-openseadragon-bookmark-url.js b/modules/openseadragon_bookmark_url/js/drupal-openseadragon-bookmark-url.js new file mode 100644 index 0000000..75ff66b --- /dev/null +++ b/modules/openseadragon_bookmark_url/js/drupal-openseadragon-bookmark-url.js @@ -0,0 +1,43 @@ +/*jslint browser: true*/ +/*global OpenSeadragon, Drupal*/ +/** + * @file + * Attaches openseadragon-bookmark-url to OpenSeadragon viewer. + */ +(function($, Drupal, drupalSettings, once) { + 'use strict'; + + /** + * The DOM element that represents the Singleton Instance of this class. + * @type {string} + */ + var base = '#openseadragon-viewer'; + + /** + * Invoke bookmark url and log any viewer changes in URL. + */ + Drupal.behaviors.openSeadragonBookmarkURL = { + attach: function(context, settings) { + Object.keys(settings.openseadragon).forEach(function(osdViewerId) { + // Use custom element #id if set. + base = '#' + osdViewerId; + once('openSeadragonViewerBookmarkURL', base, context).forEach(function () { + Drupal.openSeadragonViewer[base].addHandler('bookmark-url-change', displayNewUrl); + Drupal.openSeadragonViewer[base].bookmarkUrl(); + }); + }); + }, + detach: function(context, settings, trigger) { + Object.keys(settings.openseadragon).forEach(function(osdViewerId) { + // Use custom element #id if set. + base = '#' + osdViewerId; + Drupal.openSeadragonViewer[base].removeHandler('bookmark-url-change', displayNewUrl); + }); + } + }; + + function displayNewUrl(event) { + console.log('New URL:', event.url); + } + +})($, Drupal, drupalSettings, once); diff --git a/modules/openseadragon_bookmark_url/js/openseadragon-bookmark-url.js b/modules/openseadragon_bookmark_url/js/openseadragon-bookmark-url.js new file mode 100644 index 0000000..a611942 --- /dev/null +++ b/modules/openseadragon_bookmark_url/js/openseadragon-bookmark-url.js @@ -0,0 +1,112 @@ +// OpenSeadragon Bookmark URL plugin 0.0.4 + +(function() { + + var $ = window.OpenSeadragon; + + if (!$) { + $ = require('openseadragon'); + if (!$) { + throw new Error('OpenSeadragon is missing.'); + } + } + + // ---------- + $.Viewer.prototype.bookmarkUrl = function(options) { + options = options || {}; + var trackPage = options.trackPage || false; + + var self = this; + + var updateTimeout; + + var parseHash = function() { + var params = {}; + var hash = window.location.hash.replace(/^#/, ''); + if (hash) { + var parts = hash.split('&'); + parts.forEach(function(part) { + var subparts = part.split('='); + var key = subparts[0]; + var value = parseFloat(subparts[1]); + if (!key || isNaN(value)) { + console.error('bad hash param', part); + } else { + params[key] = value; + } + }); + } + + return params; + }; + + var updateUrl = function() { + // We only update once it's settled, so we're not constantly flashing the URL. + clearTimeout(updateTimeout); + updateTimeout = setTimeout(function() { + var zoom = self.viewport.getZoom(); + var pan = self.viewport.getCenter(); + var page = self.currentPage(); + var oldUrl = location.pathname + location.hash; + var search = location.search; + var url = location.pathname + search + '#zoom=' + zoom + '&x=' + pan.x + '&y=' + pan.y; + if (trackPage) { + url = url + '&page=' + page; + } + history.replaceState({}, '', url); + + if (url !== oldUrl) { + self.raiseEvent('bookmark-url-change', { url: location.href }); + } + }, 100); + }; + + var useParams = function(params) { + var zoom = self.viewport.getZoom(); + var pan = self.viewport.getCenter(); + var page = self.currentPage(); + + if (trackPage && params.page !== undefined && params.page !== page) { + self.goToPage(params.page); + self.addOnceHandler('open', function() { + if (params.zoom !== undefined) { + self.viewport.zoomTo(params.zoom, null, true); + } + if (params.x !== undefined && params.y !== undefined && (params.x !== pan.x || params.y !== pan.y)) { + self.viewport.panTo(new $.Point(params.x, params.y), true); + } + }); + } else { + if (params.zoom !== undefined && params.zoom !== zoom) { + self.viewport.zoomTo(params.zoom, null, true); + } + if (params.x !== undefined && params.y !== undefined && (params.x !== pan.x || params.y !== pan.y)) { + self.viewport.panTo(new $.Point(params.x, params.y), true); + } + } + }; + + var params = parseHash(); + + if (this.world.getItemCount() === 0) { + this.addOnceHandler('open', function() { + useParams(params); + }); + } else { + useParams(params); + } + + this.addHandler('zoom', updateUrl); + this.addHandler('pan', updateUrl); + if (trackPage) { + this.addHandler('page', updateUrl); + } + + // Note that out own replaceState calls don't trigger hashchange events, so this is only if + // the user has modified the URL (by pasting one in, for instance). + window.addEventListener('hashchange', function() { + useParams(parseHash()); + }, false); + }; + +})(); diff --git a/modules/openseadragon_bookmark_url/openseadragon_bookmark_url.info.yml b/modules/openseadragon_bookmark_url/openseadragon_bookmark_url.info.yml new file mode 100644 index 0000000..98a4ddd --- /dev/null +++ b/modules/openseadragon_bookmark_url/openseadragon_bookmark_url.info.yml @@ -0,0 +1,7 @@ +name: 'OpenSeadragon Bookmark URL' +type: module +description: 'Wrapper for https://github.com/openseadragon/bookmark-url library' +package: Media +core_version_requirement: ^10 || ^11 +dependencies: + - openseadragon:openseadragon diff --git a/modules/openseadragon_bookmark_url/openseadragon_bookmark_url.libraries.yml b/modules/openseadragon_bookmark_url/openseadragon_bookmark_url.libraries.yml new file mode 100644 index 0000000..10d7b17 --- /dev/null +++ b/modules/openseadragon_bookmark_url/openseadragon_bookmark_url.libraries.yml @@ -0,0 +1,9 @@ +openseadragon_bookmark_url: + js: + js/drupal-openseadragon-bookmark-url.js: {} + js/openseadragon-bookmark-url.js: {} + dependencies: + - core/drupal + - core/once + - core/drupalSettings + - openseadragon/openseadragon diff --git a/modules/openseadragon_bookmark_url/openseadragon_bookmark_url.module b/modules/openseadragon_bookmark_url/openseadragon_bookmark_url.module new file mode 100644 index 0000000..d300e10 --- /dev/null +++ b/modules/openseadragon_bookmark_url/openseadragon_bookmark_url.module @@ -0,0 +1,17 @@ + Date: Sat, 23 May 2026 11:38:39 +1200 Subject: [PATCH 3/9] #66 Improve code style --- .../openseadragon_bookmark_url.module | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/openseadragon_bookmark_url/openseadragon_bookmark_url.module b/modules/openseadragon_bookmark_url/openseadragon_bookmark_url.module index d300e10..7fa7ea4 100644 --- a/modules/openseadragon_bookmark_url/openseadragon_bookmark_url.module +++ b/modules/openseadragon_bookmark_url/openseadragon_bookmark_url.module @@ -8,7 +8,7 @@ /** * Attach openseadragon-bookmark-url.js to all pages. * - * @todo: It would be good to target this better? + * @todo: It would be good to target this better, e.g. load only when OSD is loaded. * * {@inheritDoc} */ From a1a05b46e7020cd651be47dbb78e9f18eb3cd839 Mon Sep 17 00:00:00 2001 From: Jonathan Hunt Date: Sat, 23 May 2026 11:54:37 +1200 Subject: [PATCH 4/9] #66 Improve code style --- .../openseadragon_bookmark_url.module | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/openseadragon_bookmark_url/openseadragon_bookmark_url.module b/modules/openseadragon_bookmark_url/openseadragon_bookmark_url.module index 7fa7ea4..644a77f 100644 --- a/modules/openseadragon_bookmark_url/openseadragon_bookmark_url.module +++ b/modules/openseadragon_bookmark_url/openseadragon_bookmark_url.module @@ -8,7 +8,7 @@ /** * Attach openseadragon-bookmark-url.js to all pages. * - * @todo: It would be good to target this better, e.g. load only when OSD is loaded. + * @todo It would be good to target this better, e.g. load only when OSD is loaded. * * {@inheritDoc} */ From 6d99755277b2376892cc51c88abc70ba88fdbf4f Mon Sep 17 00:00:00 2001 From: Jonathan Hunt Date: Mon, 25 May 2026 10:49:43 +1200 Subject: [PATCH 5/9] #66 Remove local openseadragon-bookmark-url.js in favour of CDN --- .../js/drupal-openseadragon-bookmark-url.js | 14 +-- .../js/openseadragon-bookmark-url.js | 112 ------------------ .../openseadragon_bookmark_url.libraries.yml | 16 ++- 3 files changed, 16 insertions(+), 126 deletions(-) delete mode 100644 modules/openseadragon_bookmark_url/js/openseadragon-bookmark-url.js diff --git a/modules/openseadragon_bookmark_url/js/drupal-openseadragon-bookmark-url.js b/modules/openseadragon_bookmark_url/js/drupal-openseadragon-bookmark-url.js index 75ff66b..1f618b7 100644 --- a/modules/openseadragon_bookmark_url/js/drupal-openseadragon-bookmark-url.js +++ b/modules/openseadragon_bookmark_url/js/drupal-openseadragon-bookmark-url.js @@ -14,7 +14,7 @@ var base = '#openseadragon-viewer'; /** - * Invoke bookmark url and log any viewer changes in URL. + * Invoke bookmark url plugin. */ Drupal.behaviors.openSeadragonBookmarkURL = { attach: function(context, settings) { @@ -22,22 +22,10 @@ // Use custom element #id if set. base = '#' + osdViewerId; once('openSeadragonViewerBookmarkURL', base, context).forEach(function () { - Drupal.openSeadragonViewer[base].addHandler('bookmark-url-change', displayNewUrl); Drupal.openSeadragonViewer[base].bookmarkUrl(); }); }); - }, - detach: function(context, settings, trigger) { - Object.keys(settings.openseadragon).forEach(function(osdViewerId) { - // Use custom element #id if set. - base = '#' + osdViewerId; - Drupal.openSeadragonViewer[base].removeHandler('bookmark-url-change', displayNewUrl); - }); } }; - function displayNewUrl(event) { - console.log('New URL:', event.url); - } - })($, Drupal, drupalSettings, once); diff --git a/modules/openseadragon_bookmark_url/js/openseadragon-bookmark-url.js b/modules/openseadragon_bookmark_url/js/openseadragon-bookmark-url.js deleted file mode 100644 index a611942..0000000 --- a/modules/openseadragon_bookmark_url/js/openseadragon-bookmark-url.js +++ /dev/null @@ -1,112 +0,0 @@ -// OpenSeadragon Bookmark URL plugin 0.0.4 - -(function() { - - var $ = window.OpenSeadragon; - - if (!$) { - $ = require('openseadragon'); - if (!$) { - throw new Error('OpenSeadragon is missing.'); - } - } - - // ---------- - $.Viewer.prototype.bookmarkUrl = function(options) { - options = options || {}; - var trackPage = options.trackPage || false; - - var self = this; - - var updateTimeout; - - var parseHash = function() { - var params = {}; - var hash = window.location.hash.replace(/^#/, ''); - if (hash) { - var parts = hash.split('&'); - parts.forEach(function(part) { - var subparts = part.split('='); - var key = subparts[0]; - var value = parseFloat(subparts[1]); - if (!key || isNaN(value)) { - console.error('bad hash param', part); - } else { - params[key] = value; - } - }); - } - - return params; - }; - - var updateUrl = function() { - // We only update once it's settled, so we're not constantly flashing the URL. - clearTimeout(updateTimeout); - updateTimeout = setTimeout(function() { - var zoom = self.viewport.getZoom(); - var pan = self.viewport.getCenter(); - var page = self.currentPage(); - var oldUrl = location.pathname + location.hash; - var search = location.search; - var url = location.pathname + search + '#zoom=' + zoom + '&x=' + pan.x + '&y=' + pan.y; - if (trackPage) { - url = url + '&page=' + page; - } - history.replaceState({}, '', url); - - if (url !== oldUrl) { - self.raiseEvent('bookmark-url-change', { url: location.href }); - } - }, 100); - }; - - var useParams = function(params) { - var zoom = self.viewport.getZoom(); - var pan = self.viewport.getCenter(); - var page = self.currentPage(); - - if (trackPage && params.page !== undefined && params.page !== page) { - self.goToPage(params.page); - self.addOnceHandler('open', function() { - if (params.zoom !== undefined) { - self.viewport.zoomTo(params.zoom, null, true); - } - if (params.x !== undefined && params.y !== undefined && (params.x !== pan.x || params.y !== pan.y)) { - self.viewport.panTo(new $.Point(params.x, params.y), true); - } - }); - } else { - if (params.zoom !== undefined && params.zoom !== zoom) { - self.viewport.zoomTo(params.zoom, null, true); - } - if (params.x !== undefined && params.y !== undefined && (params.x !== pan.x || params.y !== pan.y)) { - self.viewport.panTo(new $.Point(params.x, params.y), true); - } - } - }; - - var params = parseHash(); - - if (this.world.getItemCount() === 0) { - this.addOnceHandler('open', function() { - useParams(params); - }); - } else { - useParams(params); - } - - this.addHandler('zoom', updateUrl); - this.addHandler('pan', updateUrl); - if (trackPage) { - this.addHandler('page', updateUrl); - } - - // Note that out own replaceState calls don't trigger hashchange events, so this is only if - // the user has modified the URL (by pasting one in, for instance). - window.addEventListener('hashchange', function() { - useParams(parseHash()); - }, false); - }; - -})(); diff --git a/modules/openseadragon_bookmark_url/openseadragon_bookmark_url.libraries.yml b/modules/openseadragon_bookmark_url/openseadragon_bookmark_url.libraries.yml index 10d7b17..ce22ba3 100644 --- a/modules/openseadragon_bookmark_url/openseadragon_bookmark_url.libraries.yml +++ b/modules/openseadragon_bookmark_url/openseadragon_bookmark_url.libraries.yml @@ -1,9 +1,23 @@ +plugin: + remote: https://github.com/openseadragon/bookmark-url + version: "0.0.5" + license: + name: BSD-3-Clause + url: https://github.com/openseadragon/bookmark-url/blob/master/LICENSE + gpl-compatible: true + js: + https://cdn.jsdelivr.net/gh/openseadragon/bookmark-url@13c534c6ad7078fa44675f23185b75ee760d659c/openseadragon-bookmark-url.js: + type: external + minified: false + attributes: + integrity: "sha256-RDZWd2DzG9Asb3Pf3U0UrC0wKEGVJaC3D00Z9mqN63w=" + crossorigin: anonymous openseadragon_bookmark_url: js: js/drupal-openseadragon-bookmark-url.js: {} - js/openseadragon-bookmark-url.js: {} dependencies: - core/drupal - core/once - core/drupalSettings - openseadragon/openseadragon + - openseadragon_bookmark_url/plugin From 510339cf657a42dc15fe2e34d29e8a6c6933f0e9 Mon Sep 17 00:00:00 2001 From: Jonathan Hunt Date: Mon, 25 May 2026 16:51:18 +1200 Subject: [PATCH 6/9] #66 Load openseadragon_bookmark_url js when openseadragon_formatter is used --- .../openseadragon_bookmark_url.module | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/modules/openseadragon_bookmark_url/openseadragon_bookmark_url.module b/modules/openseadragon_bookmark_url/openseadragon_bookmark_url.module index 644a77f..f74eb9c 100644 --- a/modules/openseadragon_bookmark_url/openseadragon_bookmark_url.module +++ b/modules/openseadragon_bookmark_url/openseadragon_bookmark_url.module @@ -6,12 +6,18 @@ */ /** - * Attach openseadragon-bookmark-url.js to all pages. + * Attach openseadragon_bookmark_url js if openseadragon_formatter used. * - * @todo It would be good to target this better, e.g. load only when OSD is loaded. + * Implements hook_preprocess_HOOK(). * * {@inheritDoc} */ -function openseadragon_bookmark_url_page_attachments(array &$page) { - $page['#attached']['library'][] = 'openseadragon_bookmark_url/openseadragon_bookmark_url'; +function openseadragon_bookmark_url_preprocess_field(&$variables) { + if (isset($variables['items'])) { + foreach ($variables['items'] as $item) { + if (isset($item['content']['#theme']) && $item['content']['#theme'] == 'openseadragon_formatter') { + $variables['#attached']['library'][] = 'openseadragon_bookmark_url/openseadragon_bookmark_url'; + } + } + } } From 158788273d60c7a854efc077b524b121e34f3e26 Mon Sep 17 00:00:00 2001 From: Jonathan Hunt Date: Tue, 26 May 2026 08:43:27 +1200 Subject: [PATCH 7/9] #66 Improve code style --- .../openseadragon_bookmark_url.module | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/openseadragon_bookmark_url/openseadragon_bookmark_url.module b/modules/openseadragon_bookmark_url/openseadragon_bookmark_url.module index f74eb9c..78b7351 100644 --- a/modules/openseadragon_bookmark_url/openseadragon_bookmark_url.module +++ b/modules/openseadragon_bookmark_url/openseadragon_bookmark_url.module @@ -16,7 +16,7 @@ function openseadragon_bookmark_url_preprocess_field(&$variables) { if (isset($variables['items'])) { foreach ($variables['items'] as $item) { if (isset($item['content']['#theme']) && $item['content']['#theme'] == 'openseadragon_formatter') { - $variables['#attached']['library'][] = 'openseadragon_bookmark_url/openseadragon_bookmark_url'; + $variables['#attached']['library'][] = 'openseadragon_bookmark_url/openseadragon_bookmark_url'; } } } From be89e9aeedf892fae854d4dbf8b50785aa0348e8 Mon Sep 17 00:00:00 2001 From: Jonathan Hunt Date: Tue, 26 May 2026 11:55:21 +1200 Subject: [PATCH 8/9] #66 Add README. Add configuration for media type and bookmark url field --- modules/openseadragon_bookmark_url/README.md | 21 +++++++ .../openseadragon_bookmark_url.settings.yml | 5 ++ .../openseadragon_bookmark_url.schema.yml | 22 +++++++ .../js/drupal-openseadragon-bookmark-url.js | 13 +++- .../openseadragon_bookmark_url.module | 15 +++++ .../openseadragon_bookmark_url.services.yml | 5 ++ .../src/BookmarkUrlConfig.php | 61 +++++++++++++++++++ 7 files changed, 141 insertions(+), 1 deletion(-) create mode 100644 modules/openseadragon_bookmark_url/README.md create mode 100644 modules/openseadragon_bookmark_url/config/install/openseadragon_bookmark_url.settings.yml create mode 100644 modules/openseadragon_bookmark_url/config/schema/openseadragon_bookmark_url.schema.yml create mode 100644 modules/openseadragon_bookmark_url/openseadragon_bookmark_url.services.yml create mode 100644 modules/openseadragon_bookmark_url/src/BookmarkUrlConfig.php diff --git a/modules/openseadragon_bookmark_url/README.md b/modules/openseadragon_bookmark_url/README.md new file mode 100644 index 0000000..7876f96 --- /dev/null +++ b/modules/openseadragon_bookmark_url/README.md @@ -0,0 +1,21 @@ +# OpenSeadragon Bookmark URL + +Enables the OpenSeadragon Bookmark URL plugin that tracks OpenSeadragon zoom level and coordinates to allow sharing of a display via URL. + +This module assumes you have added a string field to a media type that can hold the bookmark fragment, e.g. +`file` with `field_bookmark_url`. + +## Requirements +- [OpenSeadragon](https://www.drupal.org/project/openseadragon) + +## Installation + +Install as you would normally install a contributed Drupal module. For further information, see +[Installing Drupal Modules](https://www.drupal.org/docs/extending-drupal/installing-modules). + +## Configuration +Currently, no UI exists for configuration. + +Create an openseadragon_bookmark_url.settings.yml file and set `bookmark_url_bundle` to the media type, e.g. `file`, and `bookmark_url_field` to the field. The value from the specific media and field are inject into the Drupal settings available to javascript. +* `bookmark_url_bundle`: `file` +* `bookmark_url_field`: `field_bookmark_url` diff --git a/modules/openseadragon_bookmark_url/config/install/openseadragon_bookmark_url.settings.yml b/modules/openseadragon_bookmark_url/config/install/openseadragon_bookmark_url.settings.yml new file mode 100644 index 0000000..774f308 --- /dev/null +++ b/modules/openseadragon_bookmark_url/config/install/openseadragon_bookmark_url.settings.yml @@ -0,0 +1,5 @@ +# Default configuration for the OpenSeadragon Bookmark URL submodule. +# These values are intentionally empty; an administrator must choose the +# appropriate content type and field for their site via the settings form. +bookmark_url_bundle: '' +bookmark_url_field: '' diff --git a/modules/openseadragon_bookmark_url/config/schema/openseadragon_bookmark_url.schema.yml b/modules/openseadragon_bookmark_url/config/schema/openseadragon_bookmark_url.schema.yml new file mode 100644 index 0000000..8cc8d2a --- /dev/null +++ b/modules/openseadragon_bookmark_url/config/schema/openseadragon_bookmark_url.schema.yml @@ -0,0 +1,22 @@ +# Schema for openseadragon_bookmark_url.settings config object. + +openseadragon_bookmark_url.settings: + type: config_object + label: 'OpenSeadragon Bookmark URL settings' + mapping: + bookmark_url_bundle: + type: string + label: 'Content type (bundle) machine name' + constraints: + # Must be a valid (media) bundle machine name or empty string. + Regex: + pattern: '/^[a-z0-9_]*$/' + message: 'The bundle must be a valid machine name (lowercase letters, digits, and underscores only).' + + bookmark_url_field: + type: string + label: 'Field machine name that stores the bookmark URL' + constraints: + Regex: + pattern: '/^[a-z0-9_]*$/' + message: 'The field name must be a valid machine name (lowercase letters, digits, and underscores only).' diff --git a/modules/openseadragon_bookmark_url/js/drupal-openseadragon-bookmark-url.js b/modules/openseadragon_bookmark_url/js/drupal-openseadragon-bookmark-url.js index 1f618b7..ed1986c 100644 --- a/modules/openseadragon_bookmark_url/js/drupal-openseadragon-bookmark-url.js +++ b/modules/openseadragon_bookmark_url/js/drupal-openseadragon-bookmark-url.js @@ -22,7 +22,18 @@ // Use custom element #id if set. base = '#' + osdViewerId; once('openSeadragonViewerBookmarkURL', base, context).forEach(function () { - Drupal.openSeadragonViewer[base].bookmarkUrl(); + // Load bookmark url, but without page tracking, to allow hash to be set. + Drupal.openSeadragonViewer[base].bookmarkUrl({trackPage: false}); + if (window.location.hash === '') { + var hash = settings.openseadragon[osdViewerId].openseadragonBookmarkUrl; + if (hash !== '') { + window.location.hash = hash; + } + } + // With hash set or not, once OSD loaded, begin page tracking. + Drupal.openSeadragonViewer[base].addOnceHandler('open', function(){ + Drupal.openSeadragonViewer[base].bookmarkUrl({trackPage: true}); + }); }); }); } diff --git a/modules/openseadragon_bookmark_url/openseadragon_bookmark_url.module b/modules/openseadragon_bookmark_url/openseadragon_bookmark_url.module index 78b7351..cfcc1a8 100644 --- a/modules/openseadragon_bookmark_url/openseadragon_bookmark_url.module +++ b/modules/openseadragon_bookmark_url/openseadragon_bookmark_url.module @@ -17,6 +17,21 @@ function openseadragon_bookmark_url_preprocess_field(&$variables) { foreach ($variables['items'] as $item) { if (isset($item['content']['#theme']) && $item['content']['#theme'] == 'openseadragon_formatter') { $variables['#attached']['library'][] = 'openseadragon_bookmark_url/openseadragon_bookmark_url'; + + // Inject bookmark URL into settings for later reference in js. + $config = \Drupal::config('openseadragon_bookmark_url.settings'); + $bookmark_url_bundle = $config->get('bookmark_url_bundle'); + $bookmark_url_field = $config->get('bookmark_url_field'); + if (isset($item['content']['#entity'])) { + $entity = $item['content']['#entity']; + if ($entity->bundle() == $bookmark_url_bundle) { + $openseadragon_viewer_id = 'openseadragon-viewer-' . $entity->id(); + if ($entity->hasField($bookmark_url_field)) { + $fragment = $entity->get($bookmark_url_field)->value; + $variables['#attached']['drupalSettings']['openseadragon'][$openseadragon_viewer_id]['openseadragonBookmarkUrl'] = $fragment; + } + } + } } } } diff --git a/modules/openseadragon_bookmark_url/openseadragon_bookmark_url.services.yml b/modules/openseadragon_bookmark_url/openseadragon_bookmark_url.services.yml new file mode 100644 index 0000000..6eca5c9 --- /dev/null +++ b/modules/openseadragon_bookmark_url/openseadragon_bookmark_url.services.yml @@ -0,0 +1,5 @@ +services: + openseadragon_bookmark_url.config: + class: Drupal\openseadragon_bookmark_url\BookmarkUrlConfig + arguments: + - '@config.factory' diff --git a/modules/openseadragon_bookmark_url/src/BookmarkUrlConfig.php b/modules/openseadragon_bookmark_url/src/BookmarkUrlConfig.php new file mode 100644 index 0000000..ee36701 --- /dev/null +++ b/modules/openseadragon_bookmark_url/src/BookmarkUrlConfig.php @@ -0,0 +1,61 @@ +getBundle(); + * $field = $bm_config->getField(); + * @endcode + */ +final class BookmarkUrlConfig { + + private const CONFIG_NAME = 'openseadragon_bookmark_url.settings'; + + private ImmutableConfig $config; + + /** + * Constructs a BookmarkUrlConfig instance. + * + * @param \Drupal\Core\Config\ConfigFactoryInterface $configFactory + * The Drupal config factory service. + */ + public function __construct(ConfigFactoryInterface $configFactory) { + $this->config = $configFactory->get(self::CONFIG_NAME); + } + + /** + * Returns the configured node bundle machine name, or an empty string. + */ + public function getBundle(): string { + return $this->config->get('bookmark_url_bundle') ?? ''; + } + + /** + * Returns the configured field machine name, or an empty string. + */ + public function getField(): string { + return $this->config->get('bookmark_url_field') ?? ''; + } + + /** + * Returns TRUE when both bundle and field have been set by an administrator. + */ + public function isConfigured(): bool { + return $this->getBundle() !== '' && $this->getField() !== ''; + } + +} From fe3c041dc7d64978569e73951c3e61f7ffa4dc5a Mon Sep 17 00:00:00 2001 From: Jonathan Hunt Date: Tue, 26 May 2026 12:16:37 +1200 Subject: [PATCH 9/9] #66 Add variable doc comment --- .../src/BookmarkUrlConfig.php | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/modules/openseadragon_bookmark_url/src/BookmarkUrlConfig.php b/modules/openseadragon_bookmark_url/src/BookmarkUrlConfig.php index ee36701..3fbca09 100644 --- a/modules/openseadragon_bookmark_url/src/BookmarkUrlConfig.php +++ b/modules/openseadragon_bookmark_url/src/BookmarkUrlConfig.php @@ -10,21 +10,22 @@ /** * Typed accessor service for openseadragon_bookmark_url.settings. * - * Centralizes all reads of the submodule's config so that callers never - * need to remember the config object name or key names, and so that the - * config object is only loaded once per request. - * * Usage (from a service or controller): * @code - * $bm_config = \Drupal::service('openseadragon_bookmark_url.config'); - * $bundle = $bm_config->getBundle(); - * $field = $bm_config->getField(); + * $config = \Drupal::service('openseadragon_bookmark_url.config'); + * $bundle = $config->getBundle(); + * $field = $config->getField(); * @endcode */ final class BookmarkUrlConfig { private const CONFIG_NAME = 'openseadragon_bookmark_url.settings'; + /** + * The openseadragon bookmark url config. + * + * @var \Drupal\Core\Config\ImmutableConfig + */ private ImmutableConfig $config; /**