A fork of https://github.com/ueokande/vim-vixen
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
64 lines
1.3 KiB
64 lines
1.3 KiB
import Key, * as keyUtils from './Key'; |
|
|
|
export default class KeySequence { |
|
private keys: Key[]; |
|
|
|
private constructor(keys: Key[]) { |
|
this.keys = keys; |
|
} |
|
|
|
static from(keys: Key[]): KeySequence { |
|
return new KeySequence(keys); |
|
} |
|
|
|
push(key: Key): number { |
|
return this.keys.push(key); |
|
} |
|
|
|
length(): number { |
|
return this.keys.length; |
|
} |
|
|
|
startsWith(o: KeySequence): boolean { |
|
if (this.keys.length < o.keys.length) { |
|
return false; |
|
} |
|
for (let i = 0; i < o.keys.length; ++i) { |
|
if (!keyUtils.equals(this.keys[i], o.keys[i])) { |
|
return false; |
|
} |
|
} |
|
return true; |
|
} |
|
|
|
getKeyArray(): Key[] { |
|
return this.keys; |
|
} |
|
} |
|
|
|
export const fromMapKeys = (keys: string): KeySequence => { |
|
const fromMapKeysRecursive = ( |
|
remainings: string, mappedKeys: Key[], |
|
): Key[] => { |
|
if (remainings.length === 0) { |
|
return mappedKeys; |
|
} |
|
|
|
let nextPos = 1; |
|
if (remainings.startsWith('<')) { |
|
let ltPos = remainings.indexOf('>'); |
|
if (ltPos > 0) { |
|
nextPos = ltPos + 1; |
|
} |
|
} |
|
|
|
return fromMapKeysRecursive( |
|
remainings.slice(nextPos), |
|
mappedKeys.concat([keyUtils.fromMapKey(remainings.slice(0, nextPos))]) |
|
); |
|
}; |
|
|
|
let data = fromMapKeysRecursive(keys, []); |
|
return KeySequence.from(data); |
|
}; |
|
|
|
|