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