1 HINTCHARS = 'asdfghjkl;'
2 CONTAINER_ID = 'vimffHintMarkerContainer'
4 { interfaces: Ci } = Components
5 HTMLDocument = Ci.nsIDOMHTMLDocument
6 { Marker, getElementRect } = require 'marker'
8 indexToHint = (i, chars) ->
12 l = Math.floor(i / n); k = i % n;
14 return indexToHint(l - 1, chars) + chars[k]
16 hintToIndex = (hint, chars) ->
17 return -1 if hint.length < 1
19 n = chars.length; m = hint.length
21 i = chars.indexOf(hint[m - 1])
23 base = hintToIndex(hint.slice(0, m - 1), chars)
28 getHintsContainer = (document) ->
29 document.getElementById CONTAINER_ID
31 createHintsContainer = (document) ->
32 container = document.createElement 'div'
33 container.id = CONTAINER_ID
36 hasHints = (document) ->
37 document.getUserData 'vimff.has_hints'
39 addHints = (document, cb) ->
43 if document instanceof HTMLDocument
44 container = createHintsContainer document
46 start = new Date().getTime()
49 for link in document.links
50 if rect = getElementRect link
51 hint = indexToHint(i++, HINTCHARS)
52 marker = new Marker(link, container)
53 marker.setPosition rect
55 markers[hint] = marker
57 console.log new Date().getTime() - start, 'aaaaa'
59 document.setUserData 'vimff.has_hints', true, null
60 document.setUserData 'vimff.markers', markers, null
62 document.body.appendChild container
64 removeHints = (document) ->
65 console.log hasHints document
67 document.setUserData 'vimff.has_hints', undefined, null
68 document.setUserData 'vimff.markers', undefined, null
70 document.body.removeChild container if container = getHintsContainer document
72 exports.addHints = addHints
73 exports.removeHints = removeHints
74 exports.hasHints = removeHints