kidscipher 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs.js CHANGED
@@ -27,7 +27,7 @@ function styleInject(css, ref) {
27
27
  }
28
28
  }
29
29
 
30
- var css_248z = "@font-face{font-family:Kidscipher;font-style:normal;font-weight:400;src:url(data:font/woff2;base64,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) format(\"woff2\")}";
30
+ var css_248z = "@font-face{font-family:Kidscipher;font-style:normal;font-weight:400;src:url(data:font/woff2;base64,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) format(\"woff2\")}";
31
31
  styleInject(css_248z);
32
32
 
33
33
  var KidscipherGlyphs_1;
@@ -314,7 +314,32 @@ function requireKidscipherGlyphs () {
314
314
  CHINESE_Z_6: '\u{e112}',
315
315
  CHINESE_Z_7: '\u{e113}',
316
316
  CHINESE_Z_8: '\u{e114}',
317
- CHINESE_Z_9: '\u{e115}'
317
+ CHINESE_Z_9: '\u{e115}',
318
+ FRACTION_1_1: '\u{e116}',
319
+ FRACTION_1_2: '\u{e117}',
320
+ FRACTION_1_3: '\u{e118}',
321
+ FRACTION_1_4: '\u{e119}',
322
+ FRACTION_1_5: '\u{e11a}',
323
+ FRACTION_2_1: '\u{e11b}',
324
+ FRACTION_2_2: '\u{e11c}',
325
+ FRACTION_2_3: '\u{e11d}',
326
+ FRACTION_2_4: '\u{e11e}',
327
+ FRACTION_2_5: '\u{e11f}',
328
+ FRACTION_3_1: '\u{e120}',
329
+ FRACTION_3_2: '\u{e121}',
330
+ FRACTION_3_3: '\u{e122}',
331
+ FRACTION_3_4: '\u{e123}',
332
+ FRACTION_3_5: '\u{e124}',
333
+ FRACTION_4_1: '\u{e125}',
334
+ FRACTION_4_2: '\u{e126}',
335
+ FRACTION_4_3: '\u{e127}',
336
+ FRACTION_4_4: '\u{e128}',
337
+ FRACTION_4_5: '\u{e129}',
338
+ FRACTION_5_1: '\u{e12a}',
339
+ FRACTION_5_2: '\u{e12b}',
340
+ FRACTION_5_3: '\u{e12c}',
341
+ FRACTION_5_4: '\u{e12d}',
342
+ FRACTION_5_5: '\u{e12e}'
318
343
  });
319
344
  KidscipherGlyphs_1 = { KidscipherGlyphs };
320
345
  return KidscipherGlyphs_1;
@@ -322,12 +347,71 @@ function requireKidscipherGlyphs () {
322
347
 
323
348
  var KidscipherGlyphsExports = requireKidscipherGlyphs();
324
349
 
350
+ const ignoreCasingSensitive = (caseSensitive) => {
351
+ return (text) => (caseSensitive ? text : text.toUpperCase());
352
+ };
353
+ const casing = (casingOption) => {
354
+ return (text) => {
355
+ switch (casingOption) {
356
+ case 'upper':
357
+ return text.toUpperCase();
358
+ case 'lower':
359
+ return text.toLowerCase();
360
+ case 'original':
361
+ return text;
362
+ default:
363
+ throw new Error(`Invalid output casing option: ${casingOption}`);
364
+ }
365
+ };
366
+ };
367
+ const normalizeDiacritics = (normalize) => {
368
+ return (text) => {
369
+ return normalize
370
+ ? text
371
+ // normalize Unicode chars (etc. "é" → "e" + "´")
372
+ .normalize('NFD')
373
+ // remove diacritic symbols
374
+ .replace(/[\u0300-\u036f]/g, '')
375
+ // exceptions which are normally not normalized
376
+ .replace(/ß/g, 'ss')
377
+ .replace(/ø/g, 'o')
378
+ .replace(/Ø/g, 'O')
379
+ .replace(/đ/g, 'd')
380
+ .replace(/Đ/g, 'D')
381
+ .replace(/ł/g, 'l')
382
+ .replace(/Ł/g, 'L')
383
+ .replace(/æ/g, 'ae')
384
+ .replace(/Æ/g, 'AE')
385
+ .replace(/œ/g, 'oe')
386
+ .replace(/Œ/g, 'OE')
387
+ .replace(/ð/g, 'd')
388
+ .replace(/Ð/g, 'D')
389
+ .replace(/þ/g, 'th')
390
+ .replace(/Þ/g, 'Th')
391
+ .replace(/ñ/g, 'n')
392
+ .replace(/Ñ/g, 'N')
393
+ : text;
394
+ };
395
+ };
396
+ const Processor = {
397
+ ignoreCasingSensitive,
398
+ casing,
399
+ normalizeDiacritics,
400
+ };
401
+
402
+ const processingPipeline = (text, processors) => {
403
+ return processors.reduce((acc, processor) => processor(acc), text);
404
+ };
405
+
325
406
  class Cipher {
326
407
  encode(input, configuration, opts) {
327
- const { caseSensitive = false, letterSeparator: inputLetterSeparator = '', wordSeparator: inputWordSeparator = '///', } = opts?.input || {};
408
+ const { caseSensitive = false, normalizeDiacritics = true, letterSeparator: inputLetterSeparator = '', wordSeparator: inputWordSeparator = '///', } = opts?.input || {};
328
409
  const { casing = 'original', letterSeparator: outputLetterSeparator = '', wordSeparator: outputWordSeparator = ' ', } = opts?.output || {};
410
+ const preprocessedInput = processingPipeline(input, [
411
+ Processor.normalizeDiacritics(normalizeDiacritics),
412
+ ]);
329
413
  // normalize input into words and letters
330
- const words = input.split(inputWordSeparator);
414
+ const words = preprocessedInput.split(inputWordSeparator);
331
415
  const encodedWords = words.map((word) => {
332
416
  const letters = inputLetterSeparator
333
417
  ? word.split(inputLetterSeparator)
@@ -350,10 +434,13 @@ class Cipher {
350
434
  return encodedWords.join(outputWordSeparator);
351
435
  }
352
436
  decode(input, configuration, opts) {
353
- const { caseSensitive = false, letterSeparator: inputLetterSeparator = '', wordSeparator: inputWordSeparator = ' ', } = opts?.input || {};
437
+ const { caseSensitive = false, normalizeDiacritics = false, letterSeparator: inputLetterSeparator = '', wordSeparator: inputWordSeparator = ' ', } = opts?.input || {};
354
438
  const { casing = 'original', letterSeparator: outputLetterSeparator = '', wordSeparator: outputWordSeparator = ' ', } = opts?.output || {};
439
+ const preprocessedInput = processingPipeline(input, [
440
+ Processor.normalizeDiacritics(normalizeDiacritics),
441
+ ]);
355
442
  // split encoded text into words
356
- const words = input.split(inputWordSeparator);
443
+ const words = preprocessedInput.split(inputWordSeparator);
357
444
  const decodedWords = words.map((word) => {
358
445
  const symbols = word.split(inputLetterSeparator);
359
446
  return symbols
@@ -394,6 +481,7 @@ function withDefaultCipherOptions(opts, defaults) {
394
481
  return {
395
482
  input: {
396
483
  caseSensitive: false,
484
+ normalizeDiacritics: false,
397
485
  letterSeparator: '',
398
486
  wordSeparator: ' ',
399
487
  ...defaults?.input,
@@ -508,6 +596,209 @@ MorseCodeCipher.MORSE_CODE_MAP = {
508
596
  '9': '----.',
509
597
  };
510
598
 
599
+ class MobileCipher extends SubstitutionCipher {
600
+ constructor() {
601
+ super(MobileCipher.MOBILE_KEYPAD_MAP);
602
+ }
603
+ encode(input, configuration, opts) {
604
+ const mergedOpts = withDefaultCipherOptions(opts, {
605
+ input: {
606
+ caseSensitive: false,
607
+ letterSeparator: '',
608
+ wordSeparator: ' ',
609
+ },
610
+ output: {
611
+ casing: 'original',
612
+ letterSeparator: ' ',
613
+ wordSeparator: ' | ',
614
+ },
615
+ });
616
+ return super.encode(input, configuration, mergedOpts);
617
+ }
618
+ decode(input, configuration, opts) {
619
+ const mergedOpts = withDefaultCipherOptions(opts, {
620
+ input: {
621
+ caseSensitive: false,
622
+ letterSeparator: ' ',
623
+ wordSeparator: ' | ',
624
+ },
625
+ output: {
626
+ casing: 'lower',
627
+ letterSeparator: '',
628
+ wordSeparator: ' ',
629
+ },
630
+ });
631
+ return super.decode(input, configuration, mergedOpts);
632
+ }
633
+ }
634
+ MobileCipher.MOBILE_KEYPAD_MAP = {
635
+ A: '2',
636
+ B: '22',
637
+ C: '222',
638
+ D: '3',
639
+ E: '33',
640
+ F: '333',
641
+ G: '4',
642
+ H: '44',
643
+ I: '444',
644
+ J: '5',
645
+ K: '55',
646
+ L: '555',
647
+ M: '6',
648
+ N: '66',
649
+ O: '666',
650
+ P: '7',
651
+ Q: '77',
652
+ R: '777',
653
+ S: '7777',
654
+ T: '8',
655
+ U: '88',
656
+ V: '888',
657
+ W: '9',
658
+ X: '99',
659
+ Y: '999',
660
+ Z: '9999',
661
+ };
662
+
663
+ class SubstitutionCyclicCipher extends Cipher {
664
+ constructor(encodeMap) {
665
+ super();
666
+ this.resetCounters = () => {
667
+ for (const key of Object.keys(this.encodeMap)) {
668
+ this.counters[key] = 0;
669
+ }
670
+ };
671
+ // chech encodeMap
672
+ this.encodeMap = Object.fromEntries(Object.entries(encodeMap).map(([key, value]) => [
673
+ key,
674
+ Array.isArray(value) ? value : [value],
675
+ ]));
676
+ // decode map
677
+ this.decodeMap = {};
678
+ for (const [key, values] of Object.entries(this.encodeMap)) {
679
+ for (const val of values) {
680
+ this.decodeMap[val] = key;
681
+ }
682
+ }
683
+ // inialization counters
684
+ this.counters = {};
685
+ this.resetCounters();
686
+ }
687
+ encodeToken(token) {
688
+ const options = this.encodeMap[token];
689
+ if (!options || options.length === 0)
690
+ return '';
691
+ const index = this.counters[token] % options.length; // cyclic
692
+ this.counters[token] += 1;
693
+ return options[index];
694
+ }
695
+ encode(input, configuration, opts) {
696
+ const value = super.encode(input, configuration, opts);
697
+ this.resetCounters();
698
+ return value;
699
+ }
700
+ decodeToken(token) {
701
+ return this.decodeMap[token] ?? '';
702
+ }
703
+ }
704
+
705
+ class SpiderCipher extends SubstitutionCyclicCipher {
706
+ constructor() {
707
+ super(SpiderCipher.SPIDER_MAP);
708
+ }
709
+ encode(input, configuration, opts) {
710
+ const mergedOpts = withDefaultCipherOptions(opts, {
711
+ input: {
712
+ caseSensitive: false,
713
+ letterSeparator: '',
714
+ wordSeparator: ' ',
715
+ },
716
+ output: {
717
+ casing: 'upper',
718
+ letterSeparator: ' ',
719
+ wordSeparator: ' | ',
720
+ },
721
+ });
722
+ return super.encode(input, configuration, mergedOpts);
723
+ }
724
+ decode(input, configuration, opts) {
725
+ const mergedOpts = withDefaultCipherOptions(opts, {
726
+ input: {
727
+ caseSensitive: false,
728
+ letterSeparator: ' ',
729
+ wordSeparator: ' | ',
730
+ },
731
+ output: {
732
+ casing: 'lower',
733
+ letterSeparator: '',
734
+ wordSeparator: ' ',
735
+ },
736
+ });
737
+ return super.decode(input, configuration, mergedOpts);
738
+ }
739
+ }
740
+ SpiderCipher.SPIDER_MAP = {
741
+ A: ['BC', 'JX'],
742
+ B: ['AC', 'EH'],
743
+ C: ['AB', 'OZ'],
744
+ D: ['EF', 'KT'],
745
+ E: ['BH', 'DF'],
746
+ F: ['DE', 'NV'],
747
+ G: ['HI', 'LP'],
748
+ H: ['BE', 'GI'],
749
+ I: ['GH', 'MS'],
750
+ J: ['AX', 'KL'],
751
+ K: ['DT', 'JL'],
752
+ L: ['GP', 'JK'],
753
+ M: ['IS', 'NO'],
754
+ N: ['FV', 'MO'],
755
+ O: ['CZ', 'MN'],
756
+ P: ['GL', 'RS'],
757
+ // Q: ["Q"], // cipher can't Q
758
+ R: ['PS', 'UY'],
759
+ S: ['IM', 'PR'],
760
+ T: ['DK', 'UV'],
761
+ U: ['TV', 'RY'],
762
+ V: ['FN', 'TU'],
763
+ // W: ["W"], // cipher can't W
764
+ X: ['AJ', 'YZ'],
765
+ Y: ['RU', 'XZ'],
766
+ Z: ['CO', 'XY'],
767
+ };
768
+
769
+ class FractionCipher extends SubstitutionCipher {
770
+ constructor() {
771
+ super(FractionCipher.FRACTION_MAP);
772
+ }
773
+ }
774
+ FractionCipher.FRACTION_MAP = {
775
+ A: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_1_1,
776
+ B: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_1_2,
777
+ C: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_1_3,
778
+ D: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_1_4,
779
+ E: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_1_5,
780
+ F: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_2_1,
781
+ G: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_2_2,
782
+ H: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_2_3,
783
+ I: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_2_4,
784
+ J: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_2_5,
785
+ K: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_3_1,
786
+ L: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_3_2,
787
+ M: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_3_3,
788
+ N: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_3_4,
789
+ O: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_3_5,
790
+ P: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_4_1,
791
+ Q: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_4_2,
792
+ R: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_4_3,
793
+ S: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_4_4,
794
+ T: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_4_5,
795
+ U: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_5_1,
796
+ V: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_5_2,
797
+ X: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_5_3,
798
+ Y: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_5_4,
799
+ Z: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_5_5,
800
+ };
801
+
511
802
  class PolandCrossCipher extends SubstitutionCipher {
512
803
  constructor() {
513
804
  super(PolandCrossCipher.POLAND_CROSS_MAP);
@@ -543,123 +834,222 @@ PolandCrossCipher.POLAND_CROSS_MAP = {
543
834
  Z: KidscipherGlyphsExports.KidscipherGlyphs.POLAND_CROSS_Z,
544
835
  };
545
836
 
837
+ class ChineseCipher extends SubstitutionCyclicCipher {
838
+ static generateMap() {
839
+ const map = {};
840
+ // considering that chinese symbol have this format CHINESE_<LETTER>_<NUMBER>
841
+ for (const key of Object.keys(KidscipherGlyphsExports.KidscipherGlyphs)) {
842
+ const match = key.match(/^CHINESE_([A-Z])_\d+$/);
843
+ if (match) {
844
+ const letter = match[1];
845
+ if (!map[letter])
846
+ map[letter] = [];
847
+ map[letter].push(KidscipherGlyphsExports.KidscipherGlyphs[key]);
848
+ }
849
+ }
850
+ return map;
851
+ }
852
+ constructor() {
853
+ super(ChineseCipher.CHINESE_MAP);
854
+ }
855
+ }
856
+ ChineseCipher.CHINESE_MAP = ChineseCipher.generateMap();
857
+
546
858
  class ShiftCipher extends Cipher {
547
- constructor(baseAlphabet, rotors) {
859
+ constructor(alphabet) {
548
860
  super();
549
- // Check all alphabets have the same length
550
- for (const alpha of rotors) {
551
- if (alpha.length !== baseAlphabet.length) {
552
- throw new Error('All alphabets must have the same length');
861
+ this.alphabet = alphabet;
862
+ }
863
+ encodeToken(token, configuration) {
864
+ const { shift, outputAsIndex, inputAsIndex } = configuration;
865
+ let index;
866
+ if (inputAsIndex) {
867
+ index = parseInt(token, 10);
868
+ if (isNaN(index) || index < 0 || index >= this.alphabet.length) {
869
+ return token; // invalid index
553
870
  }
554
871
  }
555
- this.baseAlphabet = baseAlphabet;
556
- this.rotors = rotors;
872
+ else {
873
+ if (!this.alphabet.includes(token))
874
+ return ''; // invalid token
875
+ index = this.alphabet.indexOf(token);
876
+ }
877
+ const shiftedIndex = (index + shift) % this.alphabet.length;
878
+ return outputAsIndex
879
+ ? shiftedIndex.toString()
880
+ : this.alphabet[shiftedIndex];
557
881
  }
558
- encodeToken(token, configuration) {
559
- const { shifts } = configuration;
560
- let encoded = '';
561
- if (this.baseAlphabet.includes(token)) {
562
- const index = this.baseAlphabet.indexOf(token);
563
- for (let i = 0; i < this.rotors.length; i++) {
564
- const wheel = this.rotors[i];
565
- const shiftedIndex = (index + shifts[i]) % wheel.length;
566
- encoded += wheel[shiftedIndex];
882
+ decodeToken(token, configuration) {
883
+ const { shift, inputAsIndex, outputAsIndex } = configuration;
884
+ let index;
885
+ if (inputAsIndex) {
886
+ index = parseInt(token, 10);
887
+ if (isNaN(index) || index < 0 || index >= this.alphabet.length) {
888
+ return ''; // invalid index
567
889
  }
568
890
  }
569
- return encoded;
891
+ else {
892
+ if (!this.alphabet.includes(token))
893
+ return ''; // invalid token
894
+ index = this.alphabet.indexOf(token);
895
+ }
896
+ const shiftedIndex = (index - shift + this.alphabet.length) % this.alphabet.length;
897
+ return outputAsIndex
898
+ ? shiftedIndex.toString()
899
+ : this.alphabet[shiftedIndex];
900
+ }
901
+ getAllTokenIndexes(token, shift) {
902
+ if (!this.alphabet.includes(token))
903
+ return []; // invalid token
904
+ const indexes = this.alphabet.flatMap((ch, i) => ch === token
905
+ ? [(i - shift + this.alphabet.length) % this.alphabet.length]
906
+ : []);
907
+ return indexes;
570
908
  }
571
909
  encode(input, configuration, opts) {
572
910
  const mergedOpts = withDefaultCipherOptions(opts, {
573
- input: {
574
- caseSensitive: false,
575
- letterSeparator: '',
576
- wordSeparator: ' ',
577
- },
578
- output: {
579
- casing: 'original',
580
- letterSeparator: '',
581
- wordSeparator: ' ',
582
- },
911
+ input: { caseSensitive: false, letterSeparator: '', wordSeparator: ' ' },
912
+ output: { casing: 'original', letterSeparator: '', wordSeparator: ' ' },
583
913
  });
584
914
  return super.encode(input, configuration, mergedOpts);
585
915
  }
586
- decodeToken(token, configuration) {
587
- const { shifts } = configuration;
588
- let encoded = '';
589
- if (token.length === this.rotors.length) {
590
- let currentIndex = -1;
591
- for (let i = this.rotors.length - 1; 0 <= i; i--) {
592
- if (this.rotors[i].includes(token[i])) {
593
- currentIndex = this.rotors[i].indexOf(token[i]);
594
- currentIndex =
595
- (currentIndex - shifts[i] + this.baseAlphabet.length) %
596
- this.baseAlphabet.length;
597
- }
598
- else {
599
- // invalid token
600
- return '';
601
- }
602
- }
603
- encoded = this.baseAlphabet[currentIndex];
604
- }
605
- return encoded;
606
- }
607
916
  decode(input, configuration, opts) {
608
917
  const mergedOpts = withDefaultCipherOptions(opts, {
609
- input: {
610
- caseSensitive: false,
611
- letterSeparator: '',
612
- wordSeparator: ' ',
613
- },
614
- output: {
615
- casing: 'original',
616
- letterSeparator: '',
617
- wordSeparator: ' ',
618
- },
918
+ input: { caseSensitive: false, letterSeparator: '', wordSeparator: ' ' },
919
+ output: { casing: 'original', letterSeparator: '', wordSeparator: ' ' },
619
920
  });
620
921
  return super.decode(input, configuration, mergedOpts);
621
922
  }
622
923
  }
623
924
 
624
925
  class ShiftAlphabetCipher extends ShiftCipher {
625
- constructor(alphabet) {
626
- if (!alphabet) {
627
- alphabet = ShiftAlphabetCipher.DEFAULT_ALPHABET;
926
+ constructor() {
927
+ super(ShiftAlphabetCipher.DEFAULT_ALPHABET);
928
+ }
929
+ }
930
+ ShiftAlphabetCipher.DEFAULT_ALPHABET = [
931
+ 'A',
932
+ 'B',
933
+ 'C',
934
+ 'D',
935
+ 'E',
936
+ 'F',
937
+ 'G',
938
+ 'H',
939
+ 'I',
940
+ 'J',
941
+ 'K',
942
+ 'L',
943
+ 'M',
944
+ 'N',
945
+ 'O',
946
+ 'P',
947
+ 'Q',
948
+ 'R',
949
+ 'S',
950
+ 'T',
951
+ 'U',
952
+ 'V',
953
+ 'W',
954
+ 'X',
955
+ 'Y',
956
+ 'Z',
957
+ ];
958
+
959
+ class ShiftRotorCipher extends Cipher {
960
+ constructor(baseAlphabet, rotors) {
961
+ super();
962
+ if (rotors.length === 0)
963
+ throw new Error('At least one rotor is required');
964
+ this.baseAlphabet = baseAlphabet;
965
+ this.rotors = rotors;
966
+ }
967
+ encodeToken(token, configuration) {
968
+ const { shifts = [], outputAsIndex, inputAsIndex } = configuration;
969
+ let results = [];
970
+ let lastSymbol = token;
971
+ const baseSymbolIndex = this.baseAlphabet.encodeToken(lastSymbol, {
972
+ shift: 0,
973
+ inputAsIndex: false,
974
+ outputAsIndex: true,
975
+ });
976
+ for (let i = 0; i < this.rotors.length; i++) {
977
+ const rotor = this.rotors[i];
978
+ const shift = shifts[i % shifts.length] ?? 0;
979
+ lastSymbol = rotor.encodeToken(baseSymbolIndex, {
980
+ shift,
981
+ inputAsIndex: true,
982
+ outputAsIndex: false,
983
+ });
984
+ results.push(lastSymbol);
985
+ }
986
+ // we need to reverse it
987
+ return results.reverse().join('');
988
+ }
989
+ decodeToken(token, configuration) {
990
+ const { shifts = [], outputAsIndex, inputAsIndex } = configuration;
991
+ const symbols = token.split('').reverse();
992
+ if (symbols.length != this.rotors.length) {
993
+ throw new Error('Invalid symbol length');
994
+ }
995
+ let includesIn = [];
996
+ // Reverse through rotors for decoding
997
+ for (let i = this.rotors.length - 1; i >= 0; i--) {
998
+ const rotor = this.rotors[i];
999
+ const shift = shifts[i % shifts.length] ?? 0;
1000
+ const symbol = symbols[i];
1001
+ const ocurencies = rotor.getAllTokenIndexes(symbol, shift);
1002
+ includesIn.push(ocurencies);
628
1003
  }
629
- super(alphabet, [alphabet]);
1004
+ // Find intersection of all arrays (items common to all rotors)
1005
+ const intersection = includesIn.reduce((acc, arr) => acc.filter((x) => arr.includes(x)));
1006
+ // If there is exactly one common index, decode it
1007
+ if (intersection.length !== 1) {
1008
+ throw new Error(`Invalid decoding — intersection size is ${intersection.length}`);
1009
+ }
1010
+ const finalIndex = intersection[0];
1011
+ const result = this.baseAlphabet.decodeToken(finalIndex.toString(), {
1012
+ shift: 0,
1013
+ inputAsIndex: true,
1014
+ outputAsIndex: outputAsIndex,
1015
+ });
1016
+ return result;
630
1017
  }
631
- encode(input, { shift }, opts) {
1018
+ encode(input, configuration, opts) {
632
1019
  const mergedOpts = withDefaultCipherOptions(opts, {
633
- input: {
634
- caseSensitive: false,
635
- letterSeparator: '',
636
- wordSeparator: ' ',
637
- },
1020
+ input: { caseSensitive: false, letterSeparator: '', wordSeparator: ' ' },
638
1021
  output: {
639
1022
  casing: 'original',
640
- letterSeparator: '',
641
- wordSeparator: ' ',
1023
+ letterSeparator: ' ',
1024
+ wordSeparator: ' | ',
642
1025
  },
643
1026
  });
644
- return super.encode(input, { shifts: [shift] }, mergedOpts);
1027
+ return super.encode(input, configuration, mergedOpts);
645
1028
  }
646
- decode(input, { shift }, opts) {
1029
+ decode(input, configuration, opts) {
647
1030
  const mergedOpts = withDefaultCipherOptions(opts, {
648
1031
  input: {
649
1032
  caseSensitive: false,
650
- letterSeparator: '',
651
- wordSeparator: ' ',
652
- },
653
- output: {
654
- casing: 'original',
655
- letterSeparator: '',
656
- wordSeparator: ' ',
1033
+ letterSeparator: ' ',
1034
+ wordSeparator: ' | ',
657
1035
  },
1036
+ output: { casing: 'original', letterSeparator: '', wordSeparator: ' ' },
658
1037
  });
659
- return super.decode(input, { shifts: [shift] }, mergedOpts);
1038
+ return super.decode(input, configuration, mergedOpts);
660
1039
  }
661
1040
  }
662
- ShiftAlphabetCipher.DEFAULT_ALPHABET = [
1041
+
1042
+ class ShiftRotorABCDCipher extends ShiftRotorCipher {
1043
+ constructor() {
1044
+ const rotors = [];
1045
+ const baseAlphabet = new ShiftCipher(ShiftRotorABCDCipher.BASE_ALPHABET);
1046
+ for (let i = 0; i < ShiftRotorABCDCipher.ROTOR_ALPHABETS.length; i++) {
1047
+ rotors.push(new ShiftCipher(ShiftRotorABCDCipher.ROTOR_ALPHABETS[i]));
1048
+ }
1049
+ super(baseAlphabet, rotors);
1050
+ }
1051
+ }
1052
+ ShiftRotorABCDCipher.BASE_ALPHABET = [
663
1053
  'A',
664
1054
  'B',
665
1055
  'C',
@@ -686,66 +1076,42 @@ ShiftAlphabetCipher.DEFAULT_ALPHABET = [
686
1076
  'X',
687
1077
  'Y',
688
1078
  'Z',
1079
+ '0',
1080
+ '1',
1081
+ '2',
1082
+ '3',
1083
+ '4',
1084
+ '5',
1085
+ '6',
1086
+ '7',
1087
+ '8',
1088
+ '9',
689
1089
  ];
690
-
691
- class SubstitutionCyclicCipher extends Cipher {
692
- constructor(encodeMap) {
693
- super();
694
- // chech encodeMap
695
- this.encodeMap = Object.fromEntries(Object.entries(encodeMap).map(([key, value]) => [
696
- key,
697
- Array.isArray(value) ? value : [value],
698
- ]));
699
- // decode map
700
- this.decodeMap = {};
701
- for (const [key, values] of Object.entries(this.encodeMap)) {
702
- for (const val of values) {
703
- this.decodeMap[val] = key;
704
- }
705
- }
706
- // inialization counters
707
- this.counters = {};
708
- for (const key of Object.keys(this.encodeMap)) {
709
- this.counters[key] = 0;
710
- }
711
- }
712
- encodeToken(token) {
713
- const options = this.encodeMap[token];
714
- if (!options || options.length === 0)
715
- return '';
716
- const index = this.counters[token] % options.length; // cyclic
717
- this.counters[token] += 1;
718
- return options[index];
719
- }
720
- decodeToken(token) {
721
- return this.decodeMap[token] ?? '';
722
- }
723
- }
724
-
725
- class ChineseCipher extends SubstitutionCyclicCipher {
726
- static generateMap() {
727
- const map = {};
728
- // considering that chinese symbol have this format CHINESE_<LETTER>_<NUMBER>
729
- for (const key of Object.keys(KidscipherGlyphsExports.KidscipherGlyphs)) {
730
- const match = key.match(/^CHINESE_([A-Z])_\d+$/);
731
- if (match) {
732
- const letter = match[1];
733
- if (!map[letter])
734
- map[letter] = [];
735
- map[letter].push(KidscipherGlyphsExports.KidscipherGlyphs[key]);
1090
+ ShiftRotorABCDCipher.REPEAT_ALPHABET = ['A', 'B', 'C', 'D'];
1091
+ ShiftRotorABCDCipher.generateRepeatRotorAlphabet = (repeatAlphabet, repeat) => {
1092
+ let output = [];
1093
+ while (output.length < ShiftRotorABCDCipher.BASE_ALPHABET.length) {
1094
+ for (let i = 0; i < repeatAlphabet.length; i++) {
1095
+ for (let k = 0; k < repeat; k++) {
1096
+ output.push(repeatAlphabet[i]);
736
1097
  }
737
1098
  }
738
- return map;
739
- }
740
- constructor() {
741
- super(ChineseCipher.CHINESE_MAP);
742
1099
  }
743
- }
744
- ChineseCipher.CHINESE_MAP = ChineseCipher.generateMap();
1100
+ return output;
1101
+ };
1102
+ ShiftRotorABCDCipher.ROTOR_ALPHABETS = [
1103
+ ShiftRotorABCDCipher.generateRepeatRotorAlphabet(ShiftRotorABCDCipher.REPEAT_ALPHABET, 1),
1104
+ ShiftRotorABCDCipher.generateRepeatRotorAlphabet(ShiftRotorABCDCipher.REPEAT_ALPHABET, 3),
1105
+ ShiftRotorABCDCipher.generateRepeatRotorAlphabet(ShiftRotorABCDCipher.REPEAT_ALPHABET, 9),
1106
+ ];
745
1107
 
746
1108
  exports.ChineseCipher = ChineseCipher;
747
1109
  exports.Cipher = Cipher;
1110
+ exports.FractionCipher = FractionCipher;
1111
+ exports.MobileCipher = MobileCipher;
748
1112
  exports.MorseCodeCipher = MorseCodeCipher;
749
1113
  exports.PolandCrossCipher = PolandCrossCipher;
750
1114
  exports.ShiftAlphabetCipher = ShiftAlphabetCipher;
1115
+ exports.ShiftRotorABCDCipher = ShiftRotorABCDCipher;
1116
+ exports.SpiderCipher = SpiderCipher;
751
1117
  exports.SubstitutionCipher = SubstitutionCipher;