commit
78233b25b7
7 changed files with 155 additions and 20 deletions
@ -1,8 +0,0 @@ |
||||
const prev = (win) => { |
||||
win.history.back(); |
||||
}; |
||||
const next = (win) => { |
||||
win.history.forward(); |
||||
}; |
||||
|
||||
export { prev, next }; |
@ -0,0 +1,70 @@ |
||||
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(); |
||||
}; |
||||
|
||||
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(); |
||||
} |
||||
}; |
||||
|
||||
const parent = (win) => { |
||||
let loc = win.location; |
||||
if (loc.hash !== '') { |
||||
loc.hash = ''; |
||||
return; |
||||
} else if (loc.search !== '') { |
||||
loc.search = ''; |
||||
return; |
||||
} |
||||
|
||||
const basenamePattern = /\/[^/]+$/; |
||||
const lastDirPattern = /\/[^/]+\/$/; |
||||
if (basenamePattern.test(loc.pathname)) { |
||||
loc.pathname = loc.pathname.replace(basenamePattern, '/'); |
||||
} else if (lastDirPattern.test(loc.pathname)) { |
||||
loc.pathname = loc.pathname.replace(lastDirPattern, '/'); |
||||
} |
||||
}; |
||||
|
||||
const root = (win) => { |
||||
win.location = win.location.origin; |
||||
}; |
||||
|
||||
export { historyPrev, historyNext, linkPrev, linkNext, parent, root }; |
@ -0,0 +1,56 @@ |
||||
import { expect } from "chai"; |
||||
import * as navigates from '../../src/content/navigates'; |
||||
|
||||
describe('navigates module', () => { |
||||
describe('#linkPrev', () => { |
||||
it('clicks prev link by text content', (done) => { |
||||
document.body.innerHTML = '<a href="#dummy">xprevx</a> <a href="#prev">go to prev</a>'; |
||||
navigates.linkPrev(window); |
||||
setTimeout(() => { |
||||
expect(document.location.hash).to.equal('#prev'); |
||||
done(); |
||||
}, 0); |
||||
}); |
||||
|
||||
it('clicks a[rel=prev] element preferentially', (done) => { |
||||
document.body.innerHTML = '<a href="#dummy">prev</a> <a rel="prev" href="#prev">rel</a>'; |
||||
navigates.linkPrev(window); |
||||
setTimeout(() => { |
||||
expect(document.location.hash).to.equal('#prev'); |
||||
done(); |
||||
}, 0); |
||||
}); |
||||
}); |
||||
|
||||
|
||||
describe('#linkNext', () => { |
||||
it('clicks next link by text content', (done) => { |
||||
document.body.innerHTML = '<a href="#dummy">xnextx</a> <a href="#next">go to next</a>'; |
||||
navigates.linkNext(window); |
||||
setTimeout(() => { |
||||
expect(document.location.hash).to.equal('#next'); |
||||
done(); |
||||
}, 0); |
||||
}); |
||||
|
||||
it('clicks a[rel=next] element preferentially', (done) => { |
||||
document.body.innerHTML = '<a href="#dummy">next</a> <a rel="next" href="#next">rel</a>'; |
||||
navigates.linkNext(window); |
||||
setTimeout(() => { |
||||
expect(document.location.hash).to.equal('#next'); |
||||
done(); |
||||
}, 0); |
||||
}); |
||||
}); |
||||
|
||||
describe('#parent', () => { |
||||
// NOTE: not able to test location
|
||||
it('removes hash', () => { |
||||
window.location.hash = "#section-1"; |
||||
navigates.parent(window); |
||||
expect(document.location.hash).to.be.empty; |
||||
}); |
||||
}); |
||||
}); |
||||
|
||||
|
Reference in new issue