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, }),
