1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 |
- module.exports = abbrev
- function abbrev (...args) {
- let list = args
- if (args.length === 1 && (Array.isArray(args[0]) || typeof args[0] === 'string')) {
- list = [].concat(args[0])
- }
- for (let i = 0, l = list.length; i < l; i++) {
- list[i] = typeof list[i] === 'string' ? list[i] : String(list[i])
- }
- // sort them lexicographically, so that they're next to their nearest kin
- list = list.sort(lexSort)
- // walk through each, seeing how much it has in common with the next and previous
- const abbrevs = {}
- let prev = ''
- for (let ii = 0, ll = list.length; ii < ll; ii++) {
- const current = list[ii]
- const next = list[ii + 1] || ''
- let nextMatches = true
- let prevMatches = true
- if (current === next) {
- continue
- }
- let j = 0
- const cl = current.length
- for (; j < cl; j++) {
- const curChar = current.charAt(j)
- nextMatches = nextMatches && curChar === next.charAt(j)
- prevMatches = prevMatches && curChar === prev.charAt(j)
- if (!nextMatches && !prevMatches) {
- j++
- break
- }
- }
- prev = current
- if (j === cl) {
- abbrevs[current] = current
- continue
- }
- for (let a = current.slice(0, j); j <= cl; j++) {
- abbrevs[a] = current
- a += current.charAt(j)
- }
- }
- return abbrevs
- }
- function lexSort (a, b) {
- return a === b ? 0 : a > b ? 1 : -1
- }
|