@ -1,18 +1,18 @@
const PREV _LINK _PATTERNS = [
/\bprev\b/i , /\bprevious\b/i , /\bback\b /i,
/</ , /\u2039/ , /\u2190/ , /\xab/ , /\u226a/ , /<</
] ;
const NEXT _LINK _PATTERNS = [
/\bnext\b/i ,
/>/ , /\u203a/ , /\u2192/ , /\xbb/ , /\u226b/ , />>/
] ;
const findLinkByPatterns = ( win , patterns ) => {
const links = win . document . getElementsByTagName ( 'a' ) ;
return Array . prototype . find . call ( links , ( link ) => {
return patterns . some ( ptn => ptn . test ( link . textContent ) ) ;
} ) ;
const REL _PATTERN = {
prev : /^(?:prev(?:ious)?|older)\b|\u2039|\u2190|\xab|\u226a|<< /i,
next : /^(?:next|newer)\b|\u203a|\u2192|\xbb|\u226b|>>/i ,
} ;
// Return the last element in the document matching the supplied selector
// and the optional filter, or null if there are no matches.
const selectLast = ( win , selector , filter ) => {
let nodes = win . document . querySelectorAll ( selector ) ;
if ( filter ) {
nodes = Array . from ( nodes ) . filter ( filter ) ;
}
return nodes . length ? nodes [ nodes . length - 1 ] : null ;
} ;
const historyPrev = ( win ) => {
@ -23,16 +23,21 @@ const historyNext = (win) => {
win . history . forward ( ) ;
} ;
const linkCommon = ( win , rel , patterns ) => {
let link = win . document . querySelector ( ` link[rel~= ${ rel } ][href] ` ) ;
// Code common to linkPrev and linkNext which navigates to the specified page.
const linkRel = ( win , rel ) => {
let link = selectLast ( win , ` link[rel~= ${ rel } ][href] ` ) ;
if ( link ) {
win . location = link . getAttribute ( ' href' ) ;
win . location = link . href ;
return ;
}
link = win . document . querySelector ( ` a[rel~= ${ rel } ] ` ) ||
findLinkByPatterns ( win , patterns ) ;
const pattern = REL _PATTERN [ rel ] ;
link = selectLast ( win , ` a[rel~= ${ rel } ][href] ` ) ||
// `innerText` is much slower than `textContent`, but produces much better
// (i.e. less unexpected) results
selectLast ( win , 'a[href]' , lnk => pattern . test ( lnk . innerText ) ) ;
if ( link ) {
link . click ( ) ;
@ -40,11 +45,11 @@ const linkCommon = (win, rel, patterns) => {
} ;
const linkPrev = ( win ) => {
linkCommon ( win , 'prev' , PREV _LINK _PATTERNS ) ;
linkRel ( win , 'prev' ) ;
} ;
const linkNext = ( win ) => {
linkCommon ( win , 'next' , NEXT _LINK _PATTERNS ) ;
linkRel ( win , 'next' ) ;
} ;
const parent = ( win ) => {