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")
*/
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; }
this.validHints = [];
for (let { doc, start, end } in values(this.docs)) {
+ DOM(doc.documentElement).highlight.add("Hinting");
let [offsetX, offsetY] = this.getContainerOffsets(doc);
inner:
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];
}
}
* 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) : "");
},
});
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));
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);
[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];
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++];
"Delete the previous character",
function ({ self }) self.backspace());
- bind(["<Leader>"],
+ bind(["\\"],
"Toggle hint filtering",
function ({ self }) { self.escapeNumbers = !self.escapeNumbers; });
},
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"]
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]",