[annotator-dev] Annotator architecture evolution
Robert Casties
casties at mpiwg-berlin.mpg.de
Mon Jun 24 17:27:22 UTC 2013
Hi Nick,
On 24.06.13 18:04, Nick Stenning wrote:
> My primary concern is making integrators' lives easier.
>
> Specifically, that means looking at how people currently use Annotator, and
> how with appropriate changes to the internal architecture they would be
> able to work faster and more productively.
That's really cool. I already liked the current architecture that
prevented me from having to write my own edit-annotation-text,
store-annotation and display-annotation-text code with optional markdown
for free!
But I had to hack some hooks into the core code when I tried to
integrate my digilib image annotation plugin with Annotator:
<https://github.com/robcast/annotator/blob/master/src/plugin/digilibintegrator.coffee>
and copy the auth plugin, to be able to send data (i.e. username and
password) and place a hook with the token request:
<https://github.com/robcast/annotator/blob/master/src/plugin/authlogin.coffee>
> # What's wrong right now?
>
> ## UI coupling
>
> Implementing your own UI is difficult. The current highlighter, editor and
> viewer are quite tightly bound to core Annotator and this has made life
> difficult for Hypothesis, AustESE, and others.
I had to integrate Annotator.js inside the digilib UI which in the end
was not as complicated as I initially thought ;-)
<http://hg.berlios.de/repos/digilib/file/d62806e28820/webapp/src/main/webapp/jquery/jquery.digilib.annotator.js>
But I had to do double bookkeeping to build a list of all annotations
(store plugin didn't offer this) and add my own local data to each
annotation.
> ## Inflexible matching
>
> Annotator only supports one kind of selector by default, the
> XPointer/TextPositionSelector method that it's used since day one.
And setupAnnotation assumes the existence of "highlight" and "range"
members on the annotation object...
> We need to provide native support for matcher plugins, which receive
> annotations at load time, add arbitrary data to those annotations (in the
> XPointer case, this might be an array of DOM textNodes) which can be used
> by view plugins (e.g. Highlighter, Viewer, etc.).
>
> This data wouldn't be serialized and as such we need a more general pattern
> for attaching local data to annotations. Something better than
>
>
> https://github.com/okfn/annotator/blob/8ff0778/src/plugin/store.coffee#L462-L473
>
> anyway.
Yep.
Would this also cover the creation of annotations by the user?
We would like to change the algorithm that produces a simple DOM-path
like "div[5]/div[3]/span[5]" to one that looks for the nearest element
with an ID like "div(@id=qxc123)/span[5]".
> 2. Store plugins
>
> Store plugins implement a common interface to CRUD and query operations on
> backend data stores. Each operation might succeed or fail due to model
> constraints, network outage, etc. A minimal interface might be:
>
> create :: obj -> Promise(ann)
> update :: ann -> Promise(ann)
> delete :: ann -> Promise(None)
> query :: id -> Promise(([ann], queryMeta))
I would also like a way to get a list of all current annotations to be
able to do my own display refresh.
Or another way to iterate through all annotations like a "refresh"
action and a hook for my display code.
> ## Asynchrony
>
> Things that need to be done asynchronously return Promises. 'Nuff said.
jQuery Promise? (I always thought I should finally try to understand
those...)
> This is, however, a big chunk of work, and I don't think it's going to be
> possible to do so without breaking some existing integrations. While
> obviously we should try and minimise breakage, I think it's possible that
> the result of some of this work will become Annotator v2.0.0 (for an
> explanation of why, see http://semver.org/).
I'm fine with with a 2.0.0 and I'm happy to throw my code away if the
new code is better :-)
Cheers
Robert
More information about the annotator-dev
mailing list