mirror of
https://github.com/gryf/pentadactyl-pm.git
synced 2025-12-20 12:38:00 +01:00
Search in reverse document order for next/previous links
This commit is contained in:
@@ -892,7 +892,7 @@ function Buffer() //{{{
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
asIterator ? XPathResult.UNORDERED_NODE_ITERATOR_TYPE : XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
|
asIterator ? XPathResult.ORDERED_NODE_ITERATOR_TYPE : XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,
|
||||||
null
|
null
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -959,100 +959,57 @@ function Buffer() //{{{
|
|||||||
elem.dispatchEvent(evt);
|
elem.dispatchEvent(evt);
|
||||||
},
|
},
|
||||||
|
|
||||||
followDocumentRelationship: function (relationship)
|
followDocumentRelationship: function (rel)
|
||||||
{
|
{
|
||||||
function followFrameRelationship(relationship, parsedFrame)
|
let regexps = options.get(rel + "pattern").values
|
||||||
{
|
.map(function (re) RegExp(re, "i"));
|
||||||
var regexps;
|
|
||||||
var relText;
|
|
||||||
var patternText;
|
|
||||||
var revString;
|
|
||||||
switch (relationship)
|
|
||||||
{
|
|
||||||
case "next":
|
|
||||||
regexps = options.get("nextpattern").values;
|
|
||||||
revString = "previous";
|
|
||||||
break;
|
|
||||||
case "previous":
|
|
||||||
// TODO: accept prev\%[ious]
|
|
||||||
regexps = options.get("previouspattern").values;
|
|
||||||
revString = "next";
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
liberator.echoerr("Bad document relationship: " + relationship);
|
|
||||||
}
|
|
||||||
|
|
||||||
relText = new RegExp(relationship, "i");
|
function followFrame(frame)
|
||||||
revText = new RegExp(revString, "i");
|
{
|
||||||
var elems = parsedFrame.document.getElementsByTagName("link");
|
function iter(elems) (e for ([i, e] in Iterator(elems)) if (e.rel.toLowerCase() == rel || e.rev.toLowerCase() == rel));
|
||||||
// links have higher priority than normal <a> hrefs
|
|
||||||
for (let i = 0; i < elems.length; i++)
|
// <link>s have higher priority than normal <a> hrefs
|
||||||
|
let elems = frame.document.getElementsByTagName("link");
|
||||||
|
for (let elem in iter(elems))
|
||||||
{
|
{
|
||||||
if (relText.test(elems[i].rel) || revText.test(elems[i].rev))
|
liberator.open(elem.href);
|
||||||
{
|
return true;
|
||||||
liberator.open(elems[i].href);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// no links? ok, look for hrefs
|
// no links? ok, look for hrefs
|
||||||
elems = parsedFrame.document.getElementsByTagName("a");
|
elems = frame.document.getElementsByTagName("a");
|
||||||
for (let i = 0; i < elems.length; i++)
|
for (let elem in iter(elems))
|
||||||
{
|
{
|
||||||
if (relText.test(elems[i].rel) || revText.test(elems[i].rev))
|
buffer.followLink(elems[i], liberator.CURRENT_TAB);
|
||||||
{
|
return true;
|
||||||
buffer.followLink(elems[i], liberator.CURRENT_TAB);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (let pattern = 0; pattern < regexps.length; pattern++)
|
let res = buffer.evaluateXPath(options["hinttags"], frame.document);
|
||||||
|
for (let [,regex] in Iterator(regexps))
|
||||||
{
|
{
|
||||||
patternText = new RegExp(regexps[pattern], "i");
|
for (let i in util.range(res.snapshotLength, 0, true))
|
||||||
for (let i = 0; i < elems.length; i++)
|
|
||||||
{
|
{
|
||||||
if (patternText.test(elems[i].textContent))
|
let elem = res.snapshotItem(i);
|
||||||
|
if (regex.test(elem.textContent))
|
||||||
{
|
{
|
||||||
buffer.followLink(elems[i], liberator.CURRENT_TAB);
|
buffer.followLink(elem, liberator.CURRENT_TAB);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else
|
// images with alt text being href
|
||||||
|
if (Array.some(elem.childNodes, function (child) regex.test(child.alt)))
|
||||||
{
|
{
|
||||||
// images with alt text being href
|
buffer.followLink(elem, liberator.CURRENT_TAB);
|
||||||
var children = elems[i].childNodes;
|
return true;
|
||||||
for (let j = 0; j < children.length; j++)
|
|
||||||
{
|
|
||||||
if (patternText.test(children[j].alt))
|
|
||||||
{
|
|
||||||
buffer.followLink(elems[i], liberator.CURRENT_TAB);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
var retVal;
|
let retVal = followFrame(window.content);
|
||||||
if (window.content.frames.length != 0)
|
if (!retVal)
|
||||||
{
|
// only loop through frames if the main content didnt match
|
||||||
retVal = followFrameRelationship(relationship, window.content);
|
retVal = Array.some(window.content.frames, followFrame);
|
||||||
if (!retVal)
|
|
||||||
{
|
|
||||||
// only loop through frames if the main content didnt match
|
|
||||||
for (let i = 0; i < window.content.frames.length; i++)
|
|
||||||
{
|
|
||||||
retVal = followFrameRelationship(relationship, window.content.frames[i]);
|
|
||||||
if (retVal)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
retVal = followFrameRelationship(relationship, window.content);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!retVal)
|
if (!retVal)
|
||||||
liberator.beep();
|
liberator.beep();
|
||||||
|
|||||||
Reference in New Issue
Block a user