This is an automated email from the ASF dual-hosted git repository.

gerben pushed a commit to branch simpler-matcher-creation
in repository https://gitbox.apache.org/repos/asf/incubator-annotator.git

commit d896d01154263f80af37a81b62e47b9265224112
Author: Gerben <[email protected]>
AuthorDate: Thu Sep 3 23:03:45 2020 +0200

    Make rangeSelector work as a plugin
    
    This is why the plugin/middleware is needed: rangeSelector needs to
    access the outermost matcherCreator function, so that its inner
    selectors can also be refined.
    
    Range implementation is currently DOM-specific, so I suppose it has to
    be a plugin from the dom package. Not sure if we will be able to change
    that any time soon. (would require abstracting Range, I suppose..)
    A downside is that types are a mess; luckily the demo is not yet in TS,
    but I expect many red squiggly lines..
---
 packages/dom/src/range/match.ts | 16 +++++++++++++++-
 packages/selector/src/index.ts  |  3 +--
 web/demo/index.js               |  6 +++---
 3 files changed, 19 insertions(+), 6 deletions(-)

diff --git a/packages/dom/src/range/match.ts b/packages/dom/src/range/match.ts
index df87db7..87f54b4 100644
--- a/packages/dom/src/range/match.ts
+++ b/packages/dom/src/range/match.ts
@@ -18,7 +18,7 @@
  * under the License.
  */
 
-import type { RangeSelector, Selector } from '@annotator/selector';
+import type { RangeSelector, Selector, MatcherCreator, Plugin } from 
'@annotator/selector';
 
 import { ownerDocument } from '../scope';
 import type { DomMatcher, DomScope } from '../types';
@@ -51,3 +51,17 @@ export function makeCreateRangeSelectorMatcher(
     };
   };
 }
+
+export const supportRangeSelector: Plugin<DomScope, Range> = function 
supportRangeSelectorPlugin(
+  next,
+  recurse,
+) {
+  const createRangeSelectorMatcher = makeCreateRangeSelectorMatcher(recurse);
+  return function (selector: Selector) {
+    if (selector.type === 'RangeSelector') {
+      return createRangeSelectorMatcher(selector as RangeSelector);
+    } else {
+      return next(selector);
+    }
+  };
+};
diff --git a/packages/selector/src/index.ts b/packages/selector/src/index.ts
index 8752abf..2214711 100644
--- a/packages/selector/src/index.ts
+++ b/packages/selector/src/index.ts
@@ -20,8 +20,7 @@
 
 import type { Matcher, Selector, SelectorType, MatcherCreator, Plugin } from 
'./types';
 
-export type { Matcher, Selector } from './types';
-export type { CssSelector, RangeSelector, TextQuoteSelector } from './types';
+export * from './types';
 
 interface TypeToMatcherCreatorMap<TScope, TMatch> {
   // [K: SelectorType]: MatcherCreator<TScope, TMatch>; // Gives errors 
further down. TypeScript’s fault?
diff --git a/web/demo/index.js b/web/demo/index.js
index 098b51a..fd5050e 100644
--- a/web/demo/index.js
+++ b/web/demo/index.js
@@ -27,12 +27,12 @@
 import {
   createTextQuoteSelectorMatcher,
   describeTextQuote,
+  supportRangeSelector,
   highlightRange,
 } from '@annotator/dom';
 import {
   composeMatcherCreator,
   mapSelectorTypes,
-  // supportRangeSelector,
   supportRefinement,
 } from '@annotator/selector';
 
@@ -100,8 +100,8 @@ function cleanup() {
 }
 
 const createMatcher = composeMatcherCreator(
-  supportRefinement,
-  // supportRangeSelector,
+  supportRefinement, // this plugin must come first: it needs to access the 
result of the ones below.
+  supportRangeSelector,
   mapSelectorTypes({
     TextQuoteSelector: createTextQuoteSelectorMatcher,
   }),

Reply via email to