From 56b44097a8308e155a26a41e922396bb0aaa013f Mon Sep 17 00:00:00 2001 From: Jack Reed Date: Fri, 24 Jul 2020 11:17:40 -0600 Subject: [PATCH] Support multiple selectors for WebAnnotations --- __tests__/src/lib/AnnotationItem.test.js | 12 +++++++++++- src/lib/AnnotationItem.js | 11 +++++------ 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/__tests__/src/lib/AnnotationItem.test.js b/__tests__/src/lib/AnnotationItem.test.js index 999b4ae775..daa1d4d3e9 100644 --- a/__tests__/src/lib/AnnotationItem.test.js +++ b/__tests__/src/lib/AnnotationItem.test.js @@ -105,6 +105,12 @@ describe('AnnotationItem', () => { it('returns the on string (for simple fragment selector)', () => { expect(new AnnotationItem({ target: 'yolo' }).selector).toEqual('yolo'); }); + it('returns objects wrapped in an array', () => { + expect(new AnnotationItem({ target: { selector: 'yolo' } }).selector).toEqual(['yolo']); + }); + it('handles multiple selectors', () => { + expect(new AnnotationItem({ target: { selector: ['yolo', 'foo'] } }).selector).toEqual(['yolo', 'foo']); + }); }); describe('chars', () => { it('with no resource', () => { @@ -124,6 +130,10 @@ describe('AnnotationItem', () => { expect(new AnnotationItem({ target: 'www.example.com/#xywh=10,10,100,200' }) .fragmentSelector).toEqual([10, 10, 100, 200]); }); + it('multiple selectors', () => { + expect(new AnnotationItem({ target: { selector: [{ type: 'FragmentSelector', value: 'www.example.com/#xywh=10,10,100,200' }] } }) + .fragmentSelector).toEqual([10, 10, 100, 200]); + }); it('url without a fragment', () => { expect(new AnnotationItem({ target: 'www.example.com' }) .fragmentSelector).toEqual(null); @@ -142,7 +152,7 @@ describe('AnnotationItem', () => { it('without specified type', () => { expect(new AnnotationItem({ target: { selector: { } } }) - .svgSelector).toEqual(null); + .svgSelector).toEqual(undefined); }); }); }); diff --git a/src/lib/AnnotationItem.js b/src/lib/AnnotationItem.js index 9c3d0060f4..e28458f264 100644 --- a/src/lib/AnnotationItem.js +++ b/src/lib/AnnotationItem.js @@ -78,7 +78,7 @@ export default class AnnotationItem { case 'string': return target; case 'object': - return target.selector; + return flatten(compact(new Array(target.selector))); default: return null; } @@ -91,10 +91,7 @@ export default class AnnotationItem { case 'string': return null; case 'object': - if (selector.type && selector.type === 'SvgSelector') { - return selector; - } - return null; + return selector.find(s => s.type && s.type === 'SvgSelector'); default: return null; } @@ -105,13 +102,15 @@ export default class AnnotationItem { const { selector } = this; let match; + let fragmentSelector; switch (typeof selector) { case 'string': match = selector.match(/xywh=(.*)$/); break; case 'object': - match = selector.value.match(/xywh=(.*)$/); + fragmentSelector = selector.find(s => s.type && s.type === 'FragmentSelector'); + match = fragmentSelector && fragmentSelector.value.match(/xywh=(.*)$/); break; default: return null;