aboutsummaryrefslogtreecommitdiffstats
path: root/node_modules/abbrev/lib
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/abbrev/lib')
-rw-r--r--node_modules/abbrev/lib/index.js53
1 files changed, 53 insertions, 0 deletions
diff --git a/node_modules/abbrev/lib/index.js b/node_modules/abbrev/lib/index.js
new file mode 100644
index 0000000..f7bee0c
--- /dev/null
+++ b/node_modules/abbrev/lib/index.js
@@ -0,0 +1,53 @@
+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
+}