123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- 'use strict';
- var randomFromSeed = require('./random/random-from-seed');
- var ORIGINAL = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_-';
- var alphabet;
- var previousSeed;
- var shuffled;
- function reset() {
- shuffled = false;
- }
- function setCharacters(_alphabet_) {
- if (!_alphabet_) {
- if (alphabet !== ORIGINAL) {
- alphabet = ORIGINAL;
- reset();
- }
- return;
- }
- if (_alphabet_ === alphabet) {
- return;
- }
- if (_alphabet_.length !== ORIGINAL.length) {
- throw new Error('Custom alphabet for shortid must be ' + ORIGINAL.length + ' unique characters. You submitted ' + _alphabet_.length + ' characters: ' + _alphabet_);
- }
- var unique = _alphabet_.split('').filter(function(item, ind, arr){
- return ind !== arr.lastIndexOf(item);
- });
- if (unique.length) {
- throw new Error('Custom alphabet for shortid must be ' + ORIGINAL.length + ' unique characters. These characters were not unique: ' + unique.join(', '));
- }
- alphabet = _alphabet_;
- reset();
- }
- function characters(_alphabet_) {
- setCharacters(_alphabet_);
- return alphabet;
- }
- function setSeed(seed) {
- randomFromSeed.seed(seed);
- if (previousSeed !== seed) {
- reset();
- previousSeed = seed;
- }
- }
- function shuffle() {
- if (!alphabet) {
- setCharacters(ORIGINAL);
- }
- var sourceArray = alphabet.split('');
- var targetArray = [];
- var r = randomFromSeed.nextValue();
- var characterIndex;
- while (sourceArray.length > 0) {
- r = randomFromSeed.nextValue();
- characterIndex = Math.floor(r * sourceArray.length);
- targetArray.push(sourceArray.splice(characterIndex, 1)[0]);
- }
- return targetArray.join('');
- }
- function getShuffled() {
- if (shuffled) {
- return shuffled;
- }
- shuffled = shuffle();
- return shuffled;
- }
- /**
- * lookup shuffled letter
- * @param index
- * @returns {string}
- */
- function lookup(index) {
- var alphabetShuffled = getShuffled();
- return alphabetShuffled[index];
- }
- function get () {
- return alphabet || ORIGINAL;
- }
- module.exports = {
- get: get,
- characters: characters,
- seed: setSeed,
- lookup: lookup,
- shuffled: getShuffled
- };
|