├── chrome-extension ├── icon.png ├── icon-32.png ├── manifest.json ├── background.js └── content.js ├── .editorconfig ├── .jshintrc ├── LICENSE.md ├── fragmention.min.js ├── fragmention.js ├── README.md └── example.html /chrome-extension/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microformats/fragmentions/master/chrome-extension/icon.png -------------------------------------------------------------------------------- /chrome-extension/icon-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microformats/fragmentions/master/chrome-extension/icon-32.png -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | [*] 2 | end_of_line = lf 3 | indent_style = tab 4 | insert_final_newline = true 5 | trim_trailing_whitespace = true 6 | 7 | [*.md] 8 | trim_trailing_whitespace = false 9 | -------------------------------------------------------------------------------- /.jshintrc: -------------------------------------------------------------------------------- 1 | { 2 | "boss": true, 3 | "camelcase": true, 4 | "curly": false, 5 | "devel": true, 6 | "eqeqeq": true, 7 | "newcap": true, 8 | "strict": false, 9 | "sub": true, 10 | "trailing": true, 11 | "validthis": true 12 | } 13 | -------------------------------------------------------------------------------- /chrome-extension/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "manifest_version": 2, 3 | "name": "Fragmentions", 4 | "short_name": "Fragmentions", 5 | "description": "Use # hash anchors as links to phrases in a document.", 6 | "version": "0.6.3", 7 | "permissions": ["contextMenus", "tabs"], 8 | "background": { 9 | "scripts": ["background.js"] 10 | }, 11 | "content_scripts": [{ 12 | "all_frames": true, 13 | "js": ["content.js"], 14 | "matches": [""], 15 | "run_at": "document_start" 16 | }], 17 | "icons": { 18 | "32": "icon-32.png", 19 | "128": "icon.png" 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /chrome-extension/background.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | /* global chrome */ 4 | 5 | chrome.contextMenus.create({ 6 | title: 'Create fragmention', 7 | contexts: ['selection'], 8 | onclick: function (event) { 9 | if (chrome.tabs) { 10 | chrome.tabs.query({ 11 | active: true, 12 | currentWindow: true 13 | }, function (tabs) { 14 | var 15 | tab = tabs[0], 16 | url = tab.url.replace(/#.*$/, ''), 17 | text = event.selectionText, 18 | hash = '#' + encodeURI(text.trim()).replace(/\+/g, '%2B'); 19 | 20 | chrome.tabs.update(tab.id, { 21 | url: url + hash 22 | }); 23 | }); 24 | } 25 | } 26 | }); 27 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | # CC0 1.0 Universal License 2 | Public Domain Dedication 3 | 4 | The person(s) who associated a work with this deed has dedicated the work to the public domain by waiving all of his or her rights to the work worldwide under copyright law, including all related and neighboring rights, to the extent allowed by law. 5 | 6 | You can copy, modify, distribute and perform the work, even for commercial purposes, all without asking permission. 7 | 8 | In no way are the patent or trademark rights of any person affected by CC0, nor are the rights that other persons may have in the work or in how the work is used, such as publicity or privacy rights. 9 | 10 | Unless expressly stated otherwise, the person(s) who associated a work with this deed makes no warranties about the work, and disclaims liability for all uses of the work, to the fullest extent permitted by applicable law. 11 | 12 | When using or citing the work, you should not imply endorsement by the author or the affirmer. 13 | 14 | This is a [human-readable summary of the Legal Code](//creativecommons.org/publicdomain/zero/1.0/) ([read the full text](//creativecommons.org/publicdomain/zero/1.0/)). 15 | -------------------------------------------------------------------------------- /fragmention.min.js: -------------------------------------------------------------------------------- 1 | if(!("fragmention"in window.location))(function(){location.fragmention=location.fragmention||"";function getElementsByText(scope,text){for(var all=scope.childNodes,index=0,element,list=[];element=all[index];++index){if(element.nodeType===1&&(element.innerText||element.textContent||"").replace(/\s+/g," ").indexOf(text)!==-1){list=list.concat(getElementsByText(element,text))}}return list.length?list:scope}function getAnchorableElementByName(fragment){var elements=document.getElementsByName(fragment),index=-1;while(elements[++index]&&!/^A(REA)?$/.test(elements[index].nodeName)){}return elements[index]}function onHashChange(){if(!/e/.test(document.readyState))return;var id=location.href.match(/#((?:#|%23)?)(.+)/)||[0,"",""],node=document.getElementById(id[1]+id[2])||getAnchorableElementByName(id[1]+id[2]),match=decodeURIComponent(id[2].replace(/\+/g," ")).split(" ");location.fragmention=match[0];location.fragmentionIndex=parseFloat(match[1])||0;if(element){element.removeAttribute("fragmention");if(element.runtimeStyle){element.runtimeStyle.windows=element.runtimeStyle.windows}}if(!node&&location.fragmention){var elements=getElementsByText(document,location.fragmention),length=elements.length,modulus=length&&location.fragmentionIndex%length,index=length&&modulus>=0?modulus:length+modulus;element=length&&elements[index];if(element){element.scrollIntoView();element.setAttribute("fragmention","");if(element.runtimeStyle){element.runtimeStyle.windows=element.runtimeStyle.windows}}else{element=null}}}var defaultListener="addEventListener",addEventListener=defaultListener in window?[defaultListener,""]:["attachEvent","on"],element;window[addEventListener[0]](addEventListener[1]+"hashchange",onHashChange);document[addEventListener[0]](addEventListener[1]+"readystatechange",onHashChange);onHashChange()})(); -------------------------------------------------------------------------------- /chrome-extension/content.js: -------------------------------------------------------------------------------- 1 | // detect native/existing fragmention support 2 | if (!('fragmention' in window.location)) (function () { 3 | // populate fragmention 4 | location.fragmention = location.fragmention || ''; 5 | 6 | // return first element in scope containing case-sensitive text 7 | function getElementsByText(scope, text) { 8 | // iterate descendants of scope 9 | for (var all = scope.childNodes, index = 0, element, list = []; (element = all[index]); ++index) { 10 | // conditionally return element containing visible, whitespace-insensitive, case-sensitive text (a match) 11 | if (element.nodeType === 1 && (element.innerText || element.textContent || '').replace(/\s+/g, ' ').indexOf(text) !== -1) { 12 | list = list.concat(getElementsByText(element, text)); 13 | } 14 | } 15 | 16 | // return scope (no match) 17 | return list.length ? list : scope; 18 | } 19 | 20 | // on dom ready or hash change 21 | function onHashChange() { 22 | // do nothing if the dom is not ready 23 | if (!/e/.test(document.readyState)) return; 24 | 25 | // set location fragmention as uri-decoded text (from href, as hash may be decoded) 26 | var 27 | id = location.href.match(/#((?:#|%23)?)(.+)/) || [0,'',''], 28 | node = document.getElementById(id[1]+id[2]), 29 | match = decodeURIComponent(id[2].replace(/\+/g, ' ')).split(' '); 30 | 31 | location.fragmention = match[0]; 32 | location.fragmentionIndex = parseFloat(match[1]) || 0; 33 | 34 | // conditionally remove stashed element fragmention attribute 35 | if (element) { 36 | element.removeAttribute('fragmention'); 37 | } 38 | 39 | // if fragmention exists 40 | if (!node && location.fragmention) { 41 | var 42 | // get all elements containing text (or document) 43 | elements = getElementsByText(document, location.fragmention), 44 | // get total number of elements 45 | length = elements.length, 46 | // get index of element 47 | modulus = length && location.fragmentionIndex % length, 48 | index = length && modulus >= 0 ? modulus : length + modulus; 49 | 50 | // get element 51 | element = length && elements[index]; 52 | 53 | // if element found 54 | if (element) { 55 | // scroll to element 56 | element.scrollIntoView(); 57 | 58 | // set fragmention attribute 59 | element.setAttribute('fragmention', ''); 60 | } 61 | // otherwise clear stashed element 62 | else { 63 | element = null; 64 | } 65 | } 66 | } 67 | 68 | var 69 | // set stashed element 70 | element; 71 | 72 | // add listeners 73 | document.addEventListener('DOMContentLoaded', onHashChange); 74 | window.addEventListener('hashchange', onHashChange); 75 | 76 | onHashChange(); 77 | })(); 78 | -------------------------------------------------------------------------------- /fragmention.js: -------------------------------------------------------------------------------- 1 | // detect native/existing fragmention support 2 | if (!('fragmention' in window.location)) (function () { 3 | // populate fragmention 4 | location.fragmention = location.fragmention || ''; 5 | 6 | // return first element in scope containing case-sensitive text 7 | function getElementsByText(scope, text) { 8 | // iterate descendants of scope 9 | for (var all = scope.childNodes, index = 0, element, list = []; (element = all[index]); ++index) { 10 | // conditionally return element containing visible, whitespace-insensitive, case-sensitive text (a match) 11 | if (element.nodeType === 1 && (element.innerText || element.textContent || '').replace(/\s+/g, ' ').indexOf(text) !== -1) { 12 | list = list.concat(getElementsByText(element, text)); 13 | } 14 | } 15 | 16 | // return scope (no match) 17 | return list.length ? list : scope; 18 | } 19 | 20 | function getAnchorableElementByName(fragment) { 21 | var elements = document.getElementsByName(fragment), index = -1; 22 | 23 | while (elements[++index] && !/^A(REA)?$/.test(elements[index].nodeName)) {} 24 | 25 | return elements[index]; 26 | } 27 | 28 | // on dom ready or hash change 29 | function onHashChange() { 30 | // do nothing if the dom is not ready 31 | if (!/e/.test(document.readyState)) return; 32 | 33 | // set location fragmention as uri-decoded text (from href, as hash may be decoded) 34 | var 35 | id = location.href.match(/#((?:#|%23)?)(.+)/) || [0,'',''], 36 | node = document.getElementById(id[1]+id[2]) || getAnchorableElementByName(id[1]+id[2]), 37 | match = decodeURIComponent(id[2].replace(/\+/g, ' ')).split(' '); 38 | 39 | location.fragmention = match[0]; 40 | location.fragmentionIndex = parseFloat(match[1]) || 0; 41 | 42 | // conditionally remove stashed element fragmention attribute 43 | if (element) { 44 | element.removeAttribute('fragmention'); 45 | 46 | // DEPRECATED: trigger style in IE8 47 | if (element.runtimeStyle) { 48 | element.runtimeStyle.windows = element.runtimeStyle.windows; 49 | } 50 | } 51 | 52 | // if fragmention exists 53 | if (!node && location.fragmention) { 54 | var 55 | // get all elements containing text (or document) 56 | elements = getElementsByText(document, location.fragmention), 57 | // get total number of elements 58 | length = elements.length, 59 | // get index of element 60 | modulus = length && location.fragmentionIndex % length, 61 | index = length && modulus >= 0 ? modulus : length + modulus; 62 | 63 | // get element 64 | element = length && elements[index]; 65 | 66 | // if element found 67 | if (element) { 68 | // scroll to element 69 | element.scrollIntoView(); 70 | 71 | // set fragmention attribute 72 | element.setAttribute('fragmention', ''); 73 | 74 | // DEPRECATED: trigger style in IE8 75 | if (element.runtimeStyle) { 76 | element.runtimeStyle.windows = element.runtimeStyle.windows; 77 | } 78 | } 79 | // otherwise clear stashed element 80 | else { 81 | element = null; 82 | } 83 | } 84 | } 85 | 86 | var 87 | // DEPRECATED: configure listeners 88 | defaultListener = 'addEventListener', 89 | addEventListener = defaultListener in window ? [defaultListener, ''] : ['attachEvent', 'on'], 90 | // set stashed element 91 | element; 92 | 93 | // add listeners 94 | window[addEventListener[0]](addEventListener[1] + 'hashchange', onHashChange); 95 | document[addEventListener[0]](addEventListener[1] + 'readystatechange', onHashChange); 96 | 97 | onHashChange(); 98 | })(); 99 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Fragmentions 2 | 3 | Fragmentions are anchors to phrases in a document. 4 | 5 | ```html 6 | Find this specific text 7 | ``` 8 | 9 | - [Google Chrome Extension](https://chrome.google.com/webstore/detail/fragmentions/pgajkeekgcmgglngchhmcmnkffnhihck) 10 | - [Indie Web Camp Article](http://indiewebcamp.com/fragmention) 11 | - [WordPress Plugin](https://christiaanconover.com/code/wp-fragmention) 12 | - [Drupal Module](https://drupal.org/node/2247785) 13 | 14 | ## Usage 15 | 16 | Fragmentions use **#** hash links to match words or phrases in a document, jumping to their corresponding element. Matches are case sensitive and whitespace insensitive. Corresponding elements may be spans, paragraphs, headings, buttons, inputs, or any other container element. 17 | 18 | In the following example, clicking **TL;DR** would jump to the `` element containing **Life, Liberty and the pursuit of Happiness**. 19 | 20 | ```html 21 |
22 |

23 | TL;DR 24 |

25 | 26 |

27 | When in the Course of human events, it becomes necessary for one people 28 | to dissolve the political bands which have connected them with another, 29 | and to assume among the powers of the earth, the separate and equal 30 | station to which the Laws of Nature and of Nature’s God entitle them, a 31 | decent respect to the opinions of mankind requires that they should 32 | declare the causes which impel them to the separation. 33 |

34 | 35 |

36 | We hold these truths to be self-evident, that all men are created 37 | equal, that they are endowed by their Creator with certain unalienable 38 | Rights, that among these are Life, Liberty and the pursuit of 39 | Happiness. 40 |

41 |
42 | ``` 43 | 44 | For another example, a #the%20right%20ones%20in%20the%20right%20order fragmention would jump to the paragraph in the `blockquote`: 45 | 46 | ```html 47 |

If I want to point you to Tom Stoppard's quote from The Real Thing: 48 | 49 |

I don’t think writers are sacred, but words are. 50 | They deserve respect. If you get the right ones in the right order, 51 | you can nudge the world a little or make a poem which children will 52 | speak for you when you’re dead.

53 | 54 | ``` 55 | 56 | Additionally, **location.fragmention** returns a decoded fragmention, in the same manner that **location.hash** returns a decoded fragment. 57 | 58 | While elements should not use IDs leading with a **#** single-hash, **##** double-hash fragments with a matching ID (e.g. **##term** and **id="#term"**) will not be interpreted as fragmentions. 59 | 60 | While fragmentions should start with a **#** single-hash, double-hash fragments with no matching ID (e.g. **##and+justice+for+all**) will be interpreted as fragmentions for backwards compatibility. 61 | 62 | ## JavaScript polyfill 63 | 64 | The [fragmention polyfill](https://github.com/chapmanu/fragmentions/blob/master/fragmention.js) lets documents respond to fragmentions. When a fragmention is detected, the document is searched for its matching text. If a match is found, the window jumps to its corresponding element, adding a **fragmention** attribute for styling. 65 | 66 | Additionally, the **window.location** object is given a **fragmention** property. 67 | 68 | ### Browser support 69 | 70 | The fragmention polyfill has been successfully tested in desktop Chrome, Firefox, Safari, Opera, and Internet Explorer, as well as Firefox on Android and Safari on iOS. Legacy Internet Explorer browsers (6-8) are also supported, but marked as deprecated. 71 | 72 | Notes: If existing fragmention support is detected on the **window.location** object, the polyfill is ignored. To work around an issue with Firefox decoding **location.hash**, **location.href** is used to interpret fragmentions instead. To work around various issues with old IE, light hacking ensues. 73 | 74 | ## Chrome extension 75 | 76 | The [fragmention extension](https://chrome.google.com/webstore/detail/fragmentions/pgajkeekgcmgglngchhmcmnkffnhihck) for Google Chrome duplicates the functionality of the JavaScript polyfill for all pages on the internet. Thanks to feature detection, the extension will not conflict with pages already using the JavaScript polyfill or future versions of Chrome that may support fragmentions. 77 | 78 | ## Challenges 79 | 80 | While most find the idea of fragmentions delightful, there are differing ideas on how they should work. We ask that contributors justify feature requests with concrete real world examples, as tests in the wild may reveal best practices. Otherwise, any of these challenges could be appended with, *“So, uh, what do you think?”* 81 | 82 | ### Double-hashes in the wild 83 | 84 | The current [URL specification](http://url.spec.whatwg.org/#url-code-points) *does not allow* fragments to contain **#** hashes, so links with double-hashes like `` will fail current validation. These specifications can be updated, and the *invaliding* weakness of **##** may be conversely interpreted as a *non-conflicting* quality. 85 | 86 | Because of this, we have switched to a single hash fragmention by default. 87 | 88 | Browsers, on the other hand, *do allow* hashes, so invalid links in the wild like `` might generate conflict. As a result, fragmentions will always defer to fragments with matching IDs. 89 | 90 | Other *spec-valid* alternatives to the **##** double-hash convention include **#@** (*hash + mention*) and **#*** (*hash + footnote*). 91 | 92 | ### Sensitivity 93 | 94 | Fragmentions are case sensitive, making it easier to target specific text. However, if fragmentions were to be case insensitive, it would be easier to write them by hand. At first, there was no consensus on which practice was better, and over time case sensitivity has been accepted as the better choice. 95 | 96 | ### Encoding 97 | 98 | Fragmentions are decoded before search, which means **+** plus signs are interpreted as spaces. This makes for prettier, conforming URLs, but may also be confusing for users targeting phrases using the space character. Therefore, plus signs in content must be escaped as **%2B**. 99 | 100 | ## Looks good to me 101 | 102 | Thanks, now [test it yourself](https://github.com/chapmanu/fragmentions/blob/master/example.html), [give us feedback](https://github.com/chapmanu/fragmentions/issues), and have fun! 103 | 104 | --- 105 | 106 | The fragmention script is 2.8KB or 578B minified + gzipped. 107 | -------------------------------------------------------------------------------- /example.html: -------------------------------------------------------------------------------- 1 | 2 | Fragmentions example 3 | 4 | 5 | 6 | 11 |
12 |

w3c Annotations meeting

13 | 14 |

A traditional link (uses ID)

15 |

A legacy link (uses NAME)

16 |

A fragmention link (uses text)

17 | 18 |
19 | 20 |

The first element mentioning “the”

21 | 22 |

The last element mentioning “the”

23 | 24 |

The last element mentioning “the” (single hash)

25 | 26 |

An element with an ID of “#b1”

27 | 28 |
29 | 30 |
31 |

32 | Randall Leeds: 33 |

34 |
35 |

36 | Annotations are additions - links, block quotes, inline - microformats and microdata; out of band webmention + pingback 37 |

38 |

39 | we want annotations to be decentralized, so they need to interoperate with a data model and component models 40 |

41 |

42 | We are going to need syndication and discovery for annotations 43 |

44 |

45 | we want a more read/write web - we deserve the freedom to reference, not overload URI syntax forever 46 |

47 |

48 | how do we go from out of band to inline? How do you show a remote annotation in the text you're reading 49 |

50 |

51 | existing event targets are DOM element, but we want to target the data -the text of the page idea: event.dataTarget 52 |

53 |

54 | how about a selection pseudo element - can we describe a selection, style it and not modify the DOM - like a:visited 55 |

56 |

57 | we need feed discovery - Activity Streams. Also we need to publish locally and use WebMention http://indiewebcamp.com/webmention 58 |

59 |

60 |

61 |
62 | Chris Gallello: 63 |
64 |

65 | I'm PM on Office Online, working on accessibility - we have annotations in Office and visual studio already 66 |

67 |

68 | red underlines in Word and breakpoints in Visual Studio are annotations form our point of view [machine generated] 69 |

70 |

71 | we've been thinking about how to connect screen readers to annotations - to know there is one, to jump in and out 72 |

73 |

74 | we can use an aria.annotationtype of "comment" and point to the element with the comment with aria.annotatedby 75 |

76 |

77 |

78 |
79 | Anna Gerber: 80 |
81 |

82 | Annotation is used throughout the research process, and for teaching not just as part of publications 83 |

84 |

85 | researchers need to annotate maps, 3D spaces, protein models, sensor data streams , textual variants 86 |

87 |

88 | scholary annotation requirements: citable; precise; of segments/regions; many data types; within dynamic web apps 89 |

90 |

91 | we need to migrate annotations across multiple copies of identical resources, or modified ones 92 |

93 |

94 | stand-off annotation is needed to maintain integrity of original resources 95 |

96 |

97 | we use the Annotea, OA model so have shared generic backend, but need protocols and APIs too 98 |

99 |

100 | the OA model is extremely flexible, but diffciult to implement as the queries are hard to write 101 |

102 |

103 |

104 |
105 | Sean Boisen: 106 |
107 |

108 | Logos is a digital library for biblical studies, with very rich annotation and cross referencing tools 109 |

110 |

111 | our app is not out on the web, but a desktop app you download. 112 |

113 |

114 | Bible has book/chapter/verse and we add word, but they are different between some bibles 115 |

116 |

117 | we care about cross-lingual word alignment for annotations, which requires extra standardizations 118 |

119 |

120 |

121 |
122 | Nick Stenning: 123 |
124 |

125 | data models are simple; protocols harder, but user interactions are hard enough that we'd take us years to agree 126 |

127 |

128 | a bookmarklet is basically a cross-site scripting attack. A standard known as content security policy breaks them 129 |

130 |

131 | Browser extensions are not standardised - every user agent has its own extension model 132 |

133 |

134 | Does anyone know for proposals to allow user-trusted code to run in the DOM in a standard way? Nope 135 |

136 |

137 | we either need to spec ALL the things, or build for pluralism so there are many ways to do it 138 |

139 |

140 |

141 |
142 | James Williamson: 143 |
144 |

145 | As a publisher, having notes you take on Kindle not translating to ibooks is really annoying 146 |

147 |

148 | we get complaints from readers all the time about the "1000 people marked this page" stuff in Kindle 149 |

150 |

151 | we do pop-ups of footnotes and publication history in our online journals 152 |

153 |

154 | we have third party annotations from reference management and social media crawling 155 |

156 |

157 | the only way to annotate our works is with the "contact us" button that emails the publisher- can take 2 years 158 |

159 |

160 | we have multiple different annotations at different levels of the publishing process paper/Word/PDF 161 |

162 |

163 | we have extensive annotations in our new journals online product , and for assignments and quizzes 164 |

165 |

166 | what happens to annotations when content has been deleted? Or out of print? [odd concept for web] 167 |

168 |

169 |

170 |
171 | Frederick Hirsch: 172 |
173 | 174 |

175 | people annotate books but also movies and sound too where you have to point at timestamps 176 |

177 |

178 | teachers comment on student assignments and students can respond inline 179 |

180 |

181 | provenance of annotations is important - this brings in identity issues. Iterating them is also hard 182 |

183 |

184 | I don't think we should rework the Open Annotation data model, but we need RESTful search and JSON-LD output 185 |

186 |

187 |

188 |
189 | Anna Gerber: 190 |
191 |

192 | we have covered the data model but not the protocol. 193 |

194 |

195 |

196 |
197 | Timothy Cole: 198 |
199 |

200 | for scholarly text we need individual words and phrases as anchors, even when adjacent content is updated 201 |

202 |

203 | correction of OCR and manual transcriptions, and of automated part-of-speech tagging 204 |

205 |

206 | we need proposed corrections to be able to be reviewed and annotated themselves 207 |

208 |

209 | for example we annotate the scan with the original OCR and the OCR with the corrections 210 |

211 |

212 |

213 |
214 | Eric Aubourg: 215 |
216 |

217 | STM is a small publisher with complex texts including arabic, hebrew and heiroglyphics 218 |

219 |

220 | our policy is ePub firts, no DRM, one purchase for all formats 221 |

222 |

223 | we have ePub with interactive maps of the Karnak temple that link to images of the wall paintings 224 |

225 |

226 | referencing other works is required for scholarly publications, but page number doesn't work across editions 227 |

228 |

229 | for epub we need something user-raedable and reader-processable - people like "page 23" not ids 230 |

231 |

232 | we need it to be independent of paper, pdf, epub that can survive reflowing, and human readable 233 |

234 |

235 | in epub you can mark the page boundaries of the original document in the HTML but doesn't go the other way 236 |

237 |

238 | numbered paragraphs within chapters can work for finished works - easy to quote 239 |

240 |

241 | we need readable shortcuts, not 64-character hashes - like link shorteners 242 |

243 |

244 | we want the target refernce to be human processable 245 |

246 |

247 |

248 |
249 | Kevin Marks: 250 |
251 |

252 | q: isn't a quotation from the work the most robust reference across paper+ edocs 10 words are unique? 253 |

254 |

255 |

256 |
257 | Eric Aubourg: 258 |
259 |

260 | yes, quotation is good and robust, and human readable, but it can be a bit long 261 |

262 |

263 |

264 |
265 | Fred Chasen: 266 |
267 |

268 | the interactions in the various different document viewers are cumbersome and inconsistent 269 |

270 |

271 | creating the notes content first and then anchoring to the document makes more sense 272 |

273 |

274 | robust note authoring shouldn't block what you are annotating. It should let you re-anchor after composition 275 |

276 |

277 | we need to account for longer notes, that may be longer than the entire text 278 |

279 |

280 | also define print styles for CSS so that users can print out the whole thing 281 |

282 |

283 |

284 |
285 | Kristof Csillag: 286 |
287 |

288 | at Hypothes.is we're working on an annotation system for the web and we have proposed solutions 289 |

290 |

291 | annotating web documentsnis good, but we added PDF, Epub and would like to add scribd and google docs too 292 |

293 |

294 | we define a target with generic selectors xpath, but also text position and text content selectors 295 |

296 |

297 | by having multiple selectors we can use fuzzy matching to find the parts we want 298 |

299 |

300 | there is a problem with dynamic sites, we need dynamic anchoring - comments can be oprhaned 301 |

302 |

303 | knowing what is actually the target across documents can be very hard 304 |

305 |

306 |

307 |
308 | Kevin Marks: 309 |
310 |

311 | if you remove annotations when the document referenced is edited can't unfavourable ones be removed? 312 |

313 |

314 |

315 |
316 | Kristof Csillag: 317 |
318 |

319 | yes, but we can keep orphaned annotations and possibly keep old versions 320 |

321 |

322 |

323 |
324 | Anna Gerber: 325 |
326 |

327 | how do you cope with copyright issues of keeping quotations? 328 |

329 |

330 |

331 |
332 | Kristof Csillag: 333 |
334 |

335 | right now we don't care about copyright - we are focused on making the annotations robust 336 |

337 |

338 |

339 |
340 | Nick Stenning: 341 |
342 |

343 | there are difficult problems around how you display disappeared content to the user, and how to reanchor 344 |

345 |

346 |

347 |
348 | Tantek Çelik: 349 |
350 |

351 | the anchoring problem is important - cool URLs don't change 352 |

353 |

354 | question the assumption of annotation providers, how about self-hosted annotation, anchor and context too 355 |

356 |

357 |

358 |
359 | Kevin Marks: 360 |
361 |

362 | we should standardize multiple anchor formats - link, cite, text, image, audio snippet rather than how to be fuzzy 363 |

364 |

365 |

366 |
367 | Anna Gerber: 368 |
369 |

370 | when thinking about anchoring, focus on the content, not just the document format 371 |

372 |

373 |

374 |
375 | Robert Casties: 376 |
377 |

378 | At the Max Planck Institute for the History of Science, we have historical sources in many forms 379 |

380 |

381 | we want to weave a web of knowledge as Jürgen Renn says 382 |

383 |

384 | when you can collect of all the annotations on a source you get a semantic network of the source 385 |

386 |

387 | we want to annotate images in a resolution independent way, we also want to show relationships and provenance 388 |

389 |

390 | we want more complex co-ordinates and representations [why not use http://dev.w3.org/html5/spec-preview/image-maps.html] ? 391 |

392 |

393 | we could use GeoJSON to point to images how would we add this as selectors? 394 |

395 |

396 |

397 |
398 | Raquel Alegre: 399 |
400 |

401 | at University of Reading, I work on CHARMe which annotates climate datasets 402 |

403 |

404 | Scientists get huge numbers of options for data from data providers, but the annotations aren't lined 405 |

406 |

407 | A climate Dataset may be a table, a time series, a map a 3d model or an animation 408 |

409 |

410 | climate data users reserach timing, specific areas of the world, and comparing datasets 411 |

412 |

413 | climate data comes in 2d, 3d and 4d formats - layers of images at different res or sensors 414 |

415 |

416 | we need ways to point to space and time -we have geolocation and time units for most of this 417 |

418 |

419 |

420 |
421 | Gregg Kellogg: 422 |
423 |

424 | how can I use an API without coding for it? Define operations on classes and properties 425 |

426 |

427 | annotations are the results of operations acting on entities 428 |

429 |

430 |

431 |
432 | Jason Haag: 433 |
434 |

435 | I'm from the IEEE Learning Technology Standards Committee and we are working on storage APIs 436 |

437 |

438 | our Tin Can API is based on activitystrea.ms - Actor, Verb, Object 439 |

440 |

441 | the xAPI records learning experiences using activites 442 |

443 |

444 | IEEE wants to use EPUB3 as sustainable format for technical content, with action tracking by xAPI 445 |

446 |

447 |

448 |
449 | Jake Hartnell: 450 |
451 |

452 | I'm a science fiction writer - heres a shameless plug for my book a 23rd century romance 453 |

454 |

455 | in 2018, web annotation will be implemented in the browser we can refer to anything 456 |

457 |

458 | the annotation document needs to be stored somewhere - think of it as channels 459 |

460 |

461 | the browser queries all the channels the user subscribes to, kinda like rss feeds and they load in a sidebar 462 |

463 |

464 | Annotation is a kind of advanced linking 465 |

466 |

467 | the browser should provide a space for these attached documents to live and be viewed 468 |

469 |

470 |

471 |
472 | Gerardo Capiel: 473 |
474 |

475 | annotation is a powerful tool for accessibility of non-textual content when authors forget to put it in 476 |

477 |

478 | images tend to lack proper descriptions and mathematics is often done as images, not MathML 479 |

480 |

481 | Video description has even less support 482 |

483 |

484 | today, Blind and vision impaired students get support by others annotating video and images 485 |

486 |

487 | we need unified standards for annotation so that the efforts of people who do accessible annotation this can spread 488 |

489 |

490 |

491 |
492 | Puneet Kishor: 493 |
494 |

495 | Copyright is a rats nest. I'm not a lawyer, I want to avoid unleashing the rats. I work at Creative Commons 496 |

497 |

498 | our job at Creative Commons is to keep this unfettered by the law 499 |

500 |

501 | annotations may not start out with enough original material to be copyrightable, but could grow into cliffs notes 502 |

503 |

504 | every annotation should carry the information with it to determine legal status [presumably cc license] 505 |

506 |

507 | people can assert what they want in the way of attribution and commercial use with CC license 508 |

509 |

510 | our latest version of Creative Commons, CC4 will cover database licences too, Should be stable to use now 511 |

512 |

513 | Creative Commons don't restrict people, they enable people. That's always the goal. 514 |

515 |

516 | you can only licence what you create, not someone else's stuff. The snippets [anchors] should be fair use 517 |

518 |

519 | copyright attaches to original authorship fixed in a tangible medium - CC lets you disclaim 520 |

521 |

522 |

523 |
524 | Tantek Çelik: 525 |
526 |

527 | both APA and MLA citation styles for tweets include the entire text of the tweet - they don't mention licensing 528 |

529 |
530 |
531 |
532 | --------------------------------------------------------------------------------