diff options
Diffstat (limited to 'src/content')
-rw-r--r-- | src/content/index.js | 4 | ||||
-rw-r--r-- | src/content/navigates.js | 41 |
2 files changed, 44 insertions, 1 deletions
diff --git a/src/content/index.js b/src/content/index.js index be01089..0e4f7e1 100644 --- a/src/content/index.js +++ b/src/content/index.js @@ -39,6 +39,10 @@ const execOperation = (operation) => { return navigates.historyPrev(window); case operations.NAVIGATE_HISTORY_NEXT: return navigates.historyNext(window); + case operations.NAVIGATE_LINK_PREV: + return navigates.linkPrev(window); + case operations.NAVIGATE_LINK_NEXT: + return navigates.linkNext(window); } }; diff --git a/src/content/navigates.js b/src/content/navigates.js index 28f34c5..b68052d 100644 --- a/src/content/navigates.js +++ b/src/content/navigates.js @@ -1,8 +1,47 @@ +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) => { + let links = win.document.getElementsByTagName('a'); + return Array.prototype.find.call(links, (link) => { + return patterns.some(ptn => ptn.test(link.textContent)); + }); +}; + const historyPrev = (win) => { win.history.back(); }; + const historyNext = (win) => { win.history.forward(); }; -export { historyPrev, historyNext }; +const linkPrev = (win) => { + let link = win.document.querySelector('a[rel=prev]'); + if (link) { + return link.click(); + } + link = findLinkByPatterns(win, PREV_LINK_PATTERNS); + if (link) { + link.click(); + } +}; + +const linkNext = (win) => { + let link = win.document.querySelector('a[rel=next]'); + if (link) { + return link.click(); + } + link = findLinkByPatterns(win, NEXT_LINK_PATTERNS); + if (link) { + link.click(); + } +}; + +export { historyPrev, historyNext, linkPrev, linkNext }; |