]> git.donarmstrong.com Git - dactyl.git/blobdiff - common/content/hints.js
Import 1.0 supporting Firefox up to 14.*
[dactyl.git] / common / content / hints.js
index 004f90716208469a8c42eaa10e952bb680ed1f91..96fe44acbbbfa5399fa2a7aed63596d6fa999051 100644 (file)
@@ -301,7 +301,8 @@ var HintSession = Class("HintSession", CommandMode, {
 
             if (!rect.width || !rect.height)
                 if (!Array.some(elem.childNodes, function (elem) elem instanceof Element && DOM(elem).style.float != "none" && isVisible(elem)))
-                    return false;
+                    if (elem.textContent || !elem.name)
+                        return false;
 
             let computedStyle = doc.defaultView.getComputedStyle(elem, null);
             if (computedStyle.visibility != "visible" || computedStyle.display == "none")
@@ -532,6 +533,7 @@ var HintSession = Class("HintSession", CommandMode, {
      */
     removeHints: function _removeHints(timeout) {
         for (let { doc, start, end } in values(this.docs)) {
+            DOM(doc.documentElement).highlight.remove("Hinting");
             // Goddamn stupid fucking Gecko 1.x security manager bullshit.
             try { delete doc.dactylLabels; } catch (e) { doc.dactylLabels = undefined; }
 
@@ -574,6 +576,7 @@ var HintSession = Class("HintSession", CommandMode, {
         this.validHints = [];
 
         for (let { doc, start, end } in values(this.docs)) {
+            DOM(doc.documentElement).highlight.add("Hinting");
             let [offsetX, offsetY] = this.getContainerOffsets(doc);
 
         inner:
@@ -590,13 +593,13 @@ var HintSession = Class("HintSession", CommandMode, {
                         if (!rect)
                             continue;
 
-                        hint.imgSpan = util.xmlToDom(<span highlight="Hint" dactyl:hl="HintImage" xmlns:dactyl={NS}/>, doc);
-                        hint.imgSpan.style.display = "none";
-                        hint.imgSpan.style.left = (rect.left + offsetX) + "px";
-                        hint.imgSpan.style.top = (rect.top + offsetY) + "px";
-                        hint.imgSpan.style.width = (rect.right - rect.left) + "px";
-                        hint.imgSpan.style.height = (rect.bottom - rect.top) + "px";
-                        hint.span.parentNode.appendChild(hint.imgSpan);
+                        hint.imgSpan = DOM(<span highlight="Hint" dactyl:hl="HintImage" xmlns:dactyl={NS}/>, doc).css({
+                            display: "none",
+                            left: (rect.left + offsetX) + "px",
+                            top: (rect.top + offsetY) + "px",
+                            width: (rect.right - rect.left) + "px",
+                            height: (rect.bottom - rect.top) + "px"
+                        }).appendTo(hint.span.parentNode)[0];
                     }
                 }
 
@@ -720,7 +723,7 @@ var HintSession = Class("HintSession", CommandMode, {
      * Display the current status to the user.
      */
     updateStatusline: function _updateStatusline() {
-        statusline.inputBuffer = (this.escapeNumbers ? options["mapleader"] : "") +
+        statusline.inputBuffer = (this.escapeNumbers ? "\\" : "") +
                                  (this.hintNumber ? this.getHintString(this.hintNumber) : "");
     },
 });
@@ -759,6 +762,11 @@ var Hints = Module("hints", {
         this.addMode("V", "View hint source in external editor",  function (elem, loc) buffer.viewSource(loc, true));
         this.addMode("y", "Yank hint location",                   function (elem, loc) editor.setRegister(null, loc, true));
         this.addMode("Y", "Yank hint description",                function (elem) editor.setRegister(null, elem.textContent || "", true));
+        this.addMode("A", "Yank hint anchor url",                 function (elem) {
+            let uri = elem.ownerDocument.documentURIObject.clone();
+            uri.ref = elem.id || elem.name;
+            dactyl.clipboardWrite(uri.spec, true);
+        });
         this.addMode("c", "Open context menu",                    function (elem) DOM(elem).contextmenu());
         this.addMode("i", "Show image",                           function (elem) dactyl.open(elem.src));
         this.addMode("I", "Show image in a new tab",              function (elem) dactyl.open(elem.src, dactyl.NEW_TAB));
@@ -1020,7 +1028,7 @@ var Hints = Module("hints", {
 
         let indexOf = String.indexOf;
         if (options.get("hintmatching").has("transliterated"))
-            indexOf = Hints.indexOf;
+            indexOf = Hints.closure.indexOf;
 
         switch (options["hintmatching"][0]) {
         case "contains"      : return containsMatcher(hintString);
@@ -1169,7 +1177,7 @@ var Hints = Module("hints", {
             [0x24d0, 0x24e9, "a"],
             [0xfb00, 0xfb06, ["ff", "fi", "fl", "ffi", "ffl", "st", "st"]],
             [0xff21, 0xff3a, "A"], [0xff41, 0xff5a, "a"]
-        ].forEach(function (start, stop, val) {
+        ].forEach(function ([start, stop, val]) {
             if (typeof val != "string")
                 for (let i = start; i <= stop; i++)
                     table[String.fromCharCode(i)] = val[(i - start) % val.length];
@@ -1187,7 +1195,7 @@ var Hints = Module("hints", {
         if (src.length == 0)
             return 0;
     outer:
-        for (var i = 0; i < end; i++) {
+        for (var i = 0; i <= end; i++) {
                 var j = i;
                 for (var k = 0; k < src.length;) {
                     var s = dest[j++];
@@ -1259,7 +1267,7 @@ var Hints = Module("hints", {
             "Delete the previous character",
             function ({ self }) self.backspace());
 
-        bind(["<Leader>"],
+        bind(["\\"],
             "Toggle hint filtering",
             function ({ self }) { self.escapeNumbers = !self.escapeNumbers; });
     },
@@ -1267,8 +1275,10 @@ var Hints = Module("hints", {
         options.add(["extendedhinttags", "eht"],
             "XPath or CSS selector strings of hintable elements for extended hint modes",
             "regexpmap", {
+                // Make sure to update the docs when you change this.
                 "[iI]": "img",
                 "[asOTvVWy]": [":-moz-any-link", "area[href]", "img[src]", "iframe[src]"],
+                "[A]": ["[id]", "a[name]"],
                 "[f]": "body",
                 "[F]": ["body", "code", "div", "html", "p", "pre", "span"],
                 "[S]": ["input:not([type=hidden])", "textarea", "button", "select"]
@@ -1278,16 +1288,19 @@ var Hints = Module("hints", {
                 getKey: function (val, default_)
                     let (res = array.nth(this.value, function (re) let (match = re.exec(val)) match && match[0] == val, 0))
                         res ? res.matcher : default_,
-                setter: function (vals) {
+                parse: function parse(val) {
+                    let vals = parse.supercall(this, val);
                     for (let value in values(vals))
                         value.matcher = DOM.compileMatcher(Option.splitList(value.result));
                     return vals;
                 },
+                testValues: function testValues(vals, validator) vals.every(function (re) Option.splitList(re).every(validator)),
                 validator: DOM.validateMatcher
             });
 
         options.add(["hinttags", "ht"],
             "XPath or CSS selector strings of hintable elements for Hints mode",
+            // Make sure to update the docs when you change this.
             "stringlist", ":-moz-any-link,area,button,iframe,input:not([type=hidden]),select,textarea," +
                           "[onclick],[onmouseover],[onmousedown],[onmouseup],[oncommand]," +
                           "[tabindex],[role=link],[role=button],[contenteditable=true]",