mirror of
https://github.com/gryf/pentadactyl-pm.git
synced 2026-02-05 03:05:47 +01:00
Add 'hintinputs' to provide text hints for inputs
If <label> elements are found use them, else use the value in the box (current behaviour) or if you add 'name' to 'hintinputs' then it will allow you to select by the name of the field. For values that are not displayed on the input field, it adds the value to the red hint icon.
This commit is contained in:
@@ -131,13 +131,15 @@ function Hints() //{{{
|
||||
|
||||
let baseNodeAbsolute = util.xmlToDom(<span highlight="Hint"/>, doc);
|
||||
|
||||
let elem, tagname, text, span, rect;
|
||||
let elem, tagname, text, span, rect, showtext;
|
||||
let res = buffer.evaluateXPath(hintMode.tags(), doc, null, true);
|
||||
|
||||
let fragment = util.xmlToDom(<div highlight="hints"/>, doc);
|
||||
let start = pageHints.length;
|
||||
for (let elem in res)
|
||||
{
|
||||
showtext = false;
|
||||
|
||||
// TODO: for iframes, this calculation is wrong
|
||||
rect = elem.getBoundingClientRect();
|
||||
if (!rect || rect.top > height || rect.bottom < 0 || rect.left > width || rect.right < 0)
|
||||
@@ -152,14 +154,75 @@ function Hints() //{{{
|
||||
continue;
|
||||
|
||||
tagname = elem.localName.toLowerCase();
|
||||
if (tagname == "input" || tagname == "textarea")
|
||||
text = elem.value;
|
||||
else if (tagname == "select")
|
||||
if (tagname == "input" || tagname == "select" || tagname == "textarea")
|
||||
{
|
||||
if (elem.selectedIndex >= 0)
|
||||
text = elem.item(elem.selectedIndex).text;
|
||||
//TODO: Split this out somewhere...
|
||||
// <input type="submit|button|reset"> Always use the value
|
||||
// <input type="radio|checkbox"> Use the value if it is not numeric or label or name
|
||||
// <input type="password"> Never use the value, use label or name
|
||||
// <input type="text|file"> <textarea> Use value if set or label or name
|
||||
// <input type="image"> Use the alt text if present (showtext) or label or name
|
||||
// <input type="hidden"> Never gets here
|
||||
// <select> Use the text of the selected item or label or name
|
||||
text = "";
|
||||
let type = elem.type ? elem.type.toLowerCase() : "";
|
||||
|
||||
if (tagname == "input" && (type == "submit" || type == "button" || type == "reset"))
|
||||
{
|
||||
text = elem.value
|
||||
}
|
||||
else
|
||||
text = "";
|
||||
{
|
||||
for each (let option in options["hintinputs"].split(","))
|
||||
{
|
||||
if (option == "value")
|
||||
{
|
||||
if (tagname == "select")
|
||||
{
|
||||
if (elem.selectedIndex >= 0)
|
||||
text = elem.item(elem.selectedIndex).text;
|
||||
}
|
||||
else if (type == "image")
|
||||
{
|
||||
if (elem.alt)
|
||||
{
|
||||
text = elem.alt;
|
||||
showtext = true;
|
||||
}
|
||||
}
|
||||
else if (elem.value && type != "password")
|
||||
{
|
||||
// radio's and checkboxes often use internal ids as values - maybe make this an option too...
|
||||
if (! ((type == "radio" || type == "checkbox") && !isNaN(elem.value)))
|
||||
{
|
||||
text = elem.value
|
||||
showtext = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (option == "label")
|
||||
{
|
||||
if (elem.id)
|
||||
{
|
||||
//TODO: (possibly) do some guess work for label-like objects
|
||||
let label = buffer.evaluateXPath("//label[@for='"+elem.id+"']", doc).snapshotItem(0);
|
||||
if (label)
|
||||
{
|
||||
text = label.textContent.toLowerCase();
|
||||
showtext = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (option == "name")
|
||||
{
|
||||
text = elem.name;
|
||||
showtext = true;
|
||||
}
|
||||
|
||||
if(text)
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
text = elem.textContent.toLowerCase();
|
||||
@@ -237,7 +300,7 @@ function Hints() //{{{
|
||||
span.style.top = toppos + "px";
|
||||
fragment.appendChild(span);
|
||||
|
||||
pageHints.push([elem, text, span, null, elem.style.backgroundColor, elem.style.color]);
|
||||
pageHints.push([elem, text, span, null, elem.style.backgroundColor, elem.style.color, showtext]);
|
||||
}
|
||||
|
||||
if (doc.body)
|
||||
@@ -276,7 +339,7 @@ function Hints() //{{{
|
||||
function showHints()
|
||||
{
|
||||
|
||||
let elem, tagname, text, rect, span, imgspan;
|
||||
let elem, tagname, text, rect, span, imgspan, _a, _b, showtext;
|
||||
let hintnum = 1;
|
||||
let validHint = hintMatcher(hintString.toLowerCase());
|
||||
let activeHint = hintNumber || 1;
|
||||
@@ -291,7 +354,7 @@ function Hints() //{{{
|
||||
for (let i in (util.interruptibleRange(start, end + 1, 500)))
|
||||
{
|
||||
let hint = pageHints[i];
|
||||
[elem, text, span, imgspan] = hint;
|
||||
[elem, text, span, imgspan, _a, _b, showtext] = hint;
|
||||
|
||||
let valid = validHint(text);
|
||||
span.style.display = (valid ? "" : "none");
|
||||
@@ -324,7 +387,7 @@ function Hints() //{{{
|
||||
setClass(imgspan, activeHint == hintnum);
|
||||
}
|
||||
|
||||
span.setAttribute("number", hintnum);
|
||||
span.setAttribute("number", showtext ? hintnum + ": " + text.substr(0,50): hintnum);
|
||||
if (imgspan)
|
||||
imgspan.setAttribute("number", hintnum);
|
||||
else
|
||||
@@ -616,6 +679,19 @@ function Hints() //{{{
|
||||
"How words are split for hintmatching",
|
||||
"string", '[.,!?:;/"^$%&?()[\\]{}<>#*+|=~ _-]');
|
||||
|
||||
options.add(["hintinputs", "hi"],
|
||||
"How text inputs are hinted",
|
||||
"stringlist", "label,value",
|
||||
{
|
||||
completer: function (context) [
|
||||
["value", "Match against the value contained by the input field"],
|
||||
["label", "Match against the value of a label for the input field, if one can be found"],
|
||||
["name", "Match against the name of an input field, only if neither a name or value could be found."]
|
||||
],
|
||||
validator: Option.validateCompleter
|
||||
});
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////}}}
|
||||
////////////////////// MAPPINGS ////////////////////////////////////////////////
|
||||
/////////////////////////////////////////////////////////////////////////////{{{
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
2009-XX-XX:
|
||||
* version 2.1 (probably)
|
||||
* add 'hintinputs'
|
||||
* add :silent
|
||||
* add $MY_VIMPERATORRC
|
||||
* add ' and " local marks
|
||||
|
||||
@@ -316,6 +316,22 @@ want to stay in Normal mode when browsing between web sites. When "on", it
|
||||
blurs any textbox which often is automatically focused on page load.
|
||||
If you usually like 'focuscontent' but sometimes you'd like to focus the
|
||||
first input field, you can use [m]gi[m] to jump to it.
|
||||
|
||||
____
|
||||
|
||||
|
||||
|\'fh'| |\'followhints'|
|
||||
||'followhints' 'fh'|| number (default: 0)
|
||||
____
|
||||
|
||||
Change the behaviour of [m]<Return>[m] in Hints mode. Possible values:
|
||||
|
||||
`---------`----------------------------------------------------------
|
||||
*0* Follow the first hint as soon as typed text uniquely identifies it.
|
||||
*1* Follow the selected hint on [m]<Return>[m].
|
||||
*2* Follow the selected hint on [m]<Return>[m] only if it's been [m]<Tab>[m]-selected.
|
||||
---------------------------------------------------------------------
|
||||
|
||||
____
|
||||
|
||||
|
||||
@@ -324,6 +340,7 @@ ____
|
||||
____
|
||||
Show the current window fullscreen. Also hide certain GUI elements like the
|
||||
statusline.
|
||||
|
||||
____
|
||||
|
||||
|
||||
@@ -355,6 +372,23 @@ displayed in the status line when viewing the page.
|
||||
____
|
||||
|
||||
|
||||
|\'hin'| |\'hintinputs'|
|
||||
||'hintinputs' 'hin'|| stringlist (default: "label,value")
|
||||
____
|
||||
When generating hints for input elements that do not have an explicit caption,
|
||||
this specifies the methods to try and generate a textual hint. It tries the
|
||||
options in the order that you give, and uses the first that it finds.
|
||||
|
||||
`--------------------`---------------------------------------------------------
|
||||
*value* The hint is the value displayed in a text input, or the selected option for a dropdown.
|
||||
*label* The value of an explicit label for the input, this will not match most manually added labels that are found on sites.
|
||||
*name* The name of the input will be used, although the name is not designed for user consumption, it is frequently very similar to the label.
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
____
|
||||
|
||||
|
||||
|\'hm'| |\'hintmatching'|
|
||||
||'hintmatching' 'hm'|| string (default: contains)
|
||||
____
|
||||
@@ -371,22 +405,6 @@ Change the hint matching algorithm during Hints mode. Possible values:
|
||||
____
|
||||
|
||||
|
||||
|\'fh'| |\'followhints'|
|
||||
||'followhints' 'fh'|| number (default: 0)
|
||||
____
|
||||
|
||||
Change the behaviour of [m]<Return>[m] in Hints mode. Possible values:
|
||||
|
||||
`---------`----------------------------------------------------------
|
||||
*0* Follow the first hint as soon as typed text uniquely identifies it.
|
||||
Follow the selected hint on [m]<Return>[m].
|
||||
*1* Follow the selected hint on [m]<Return>[m].
|
||||
*2* Follow the selected hint on [m]<Return>[m] only if it's been [m]<Tab>[m]-selected.
|
||||
---------------------------------------------------------------------
|
||||
|
||||
____
|
||||
|
||||
|
||||
|\'ht'| |\'hinttags'|
|
||||
||'hinttags' 'ht'|| string
|
||||
____
|
||||
|
||||
Reference in New Issue
Block a user