Spaces:
Sleeping
Sleeping
| module.exports = abbrev | |
| function abbrev (...args) { | |
| let list = args.length === 1 || Array.isArray(args[0]) ? args[0] : args | |
| 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 | |
| } | |