- From: Jacob via GitHub <sysbot+gh@w3.org>
- Date: Fri, 22 Jan 2016 16:05:01 +0000
- To: public-annotation@w3.org
@iherman, @azaroth42 Sorry to dodge @azaroth42 's request to repeat
all three patterns but only the first pattern is actually pertinent.
This is because the way that the UC3 example is written is that the
choice happens at the top level. So either you have the simple case of
the text quote selector or you have to follow the selector chain.
Since UC1 is what we're actually debating the following examples are
for UC1.
Generally speaking I think that nesting / chianing multiple selectors
beyond two levels of depth is going to be highly unlikely (probably
will occur > 1% of the time). So these four deep examples are extreme
edge cases (they are honestly outliers).
Thinking about a situation that might call for such heroic efforts to
dig, I looked at the HathiTrust Digital Library's infrastructure and
supposed that if I wanted to annotate a particular piece of text on a
particular page in a particular volume then I might have to do the
following -- I would specify a particular volume using a query to the
HTDL's DB (this isn't actually true -- we have persistent URIs for
everything at this level). Next I would specify what page of the
volume I wanted (necessary because each page is a distinct text--image
is also available--file; we know that our scholars want more granular
things than this and since we have the files in hand minting
identifiers for them seems to be a good next step to facilitate the
specification of even more granular things -- so this part is going
away too). Afterwards I specify a portion of the page and finally
apply the text position selector exactly as in the existing examples.
Rob's Proposed Solution:
{
"type": "SpecificResource",
"source": "http://example.org"
"selector":
{
"type": "foo:QuerySelector",
"value": "knownItem",
"subSelector": {
"type": "foo:PageSelector",
"value": "desiredPage",
"subSelector": {
"type": "FragmentSelector",
"value": "namedSection",
"subSelector": {
"type": "TextPositionSelector",
"start": 5 // relative to target#namedSelection
"end": 28
}
}
}
}
}
Hugo's Alternative (which I should note was proposed in academic
circles by Dubin, Jett & Senseney at the 2013 Balisage Conference)
appears as follows.
{
"@type": "SpecificResource",
"selector": {
"@type": "TextPositionSelector",
"start": 5, // relative to index.html#namedSection
"end": 28
},
"source": {
"@type": "SpecificResource",
"selector": {
"@type": "FragmentSelector",
"value": "namedSection",
},
"source": {
"@type": "SpecificResource",
"selector": {
"@type": "foo:PageSelector",
"value": "desiredPage",
}
"source" {
"@type": "SpecificResource",
"selector": {
"@type": "foo:QuerySelector",
"value": "knownItem",
}
"source": "http://example.org"
}
}
}
}
Now, while the structure that Hugo (and others) has proposed looks
more complex at first glance, the fact is that it is merely the
inversion of the first. By making explicit use of the oa:hasSource
property it has the added value that if at any time one of the
selectors cannot be resolved for some reason or another one of the
intermediary sources can still be rendered to the end user. Whereas
the structure Rob has proposed provides only all or nothing
functionality. Either I successfully apply all four selectors or I
resort to the base source. It has no options for graceful failure.
@iherman I should note that this isn't spaghetti code. It doesn't even
approach the definition for "spaghetti" and so I wish you wouldn't
use such a pejorative term. It makes you sound dismissive rather
engaged in the conversation (which I know isn't the case at all). Now
you might argue that it's less intuitive but that's true for most
inverted structures. Functionally this behaves precisely the same way
as Rob's proposed pattern. Other than the option for providing
graceful failure points through intermediate resources I don't see any
difference between the two proposals. They're both better than what
we have and I believe the crux of the debate should probably revolve
around what is going to best for the end user -- "all or nothing" or
"we got you half way there".
+1 for both solutions (and we might consider employing both patterns
since they are as similar as property/reciprocal property) with some
ground rules for providing info on which has been employed
(unfortunately json doesn't have a way to include remarks; pretty
extreme minus in my book but I digress and don't want to start a
documentation soap box -- apologies).
And apologies all for the tl:dr.
Regards,
Jacob
--
GitHub Notification of comment by jjett
Please view or discuss this issue at
https://github.com/w3c/web-annotation/issues/93#issuecomment-173962602
using your GitHub account
Received on Friday, 22 January 2016 16:05:05 UTC