kidscipher 0.2.0 → 0.4.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,58 @@ 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}',
343
+ SMALL_CROSS_A: '\u{e12f}',
344
+ SMALL_CROSS_B: '\u{e130}',
345
+ SMALL_CROSS_C: '\u{e131}',
346
+ SMALL_CROSS_D: '\u{e132}',
347
+ SMALL_CROSS_E: '\u{e133}',
348
+ SMALL_CROSS_F: '\u{e134}',
349
+ SMALL_CROSS_G: '\u{e135}',
350
+ SMALL_CROSS_H: '\u{e136}',
351
+ SMALL_CROSS_I: '\u{e137}',
352
+ SMALL_CROSS_J: '\u{e138}',
353
+ SMALL_CROSS_K: '\u{e139}',
354
+ SMALL_CROSS_L: '\u{e13a}',
355
+ SMALL_CROSS_M: '\u{e13b}',
356
+ SMALL_CROSS_N: '\u{e13c}',
357
+ SMALL_CROSS_O: '\u{e13d}',
358
+ SMALL_CROSS_P: '\u{e13e}',
359
+ SMALL_CROSS_Q: '\u{e13f}',
360
+ SMALL_CROSS_R: '\u{e140}',
361
+ SMALL_CROSS_S: '\u{e141}',
362
+ SMALL_CROSS_T: '\u{e142}',
363
+ SMALL_CROSS_U: '\u{e143}',
364
+ SMALL_CROSS_V: '\u{e144}',
365
+ SMALL_CROSS_W: '\u{e145}',
366
+ SMALL_CROSS_X: '\u{e146}',
367
+ SMALL_CROSS_Y: '\u{e147}',
368
+ SMALL_CROSS_Z: '\u{e148}'
318
369
  });
319
370
  KidscipherGlyphs_1 = { KidscipherGlyphs };
320
371
  return KidscipherGlyphs_1;
@@ -322,12 +373,71 @@ function requireKidscipherGlyphs () {
322
373
 
323
374
  var KidscipherGlyphsExports = requireKidscipherGlyphs();
324
375
 
376
+ const ignoreCasingSensitive = (caseSensitive) => {
377
+ return (text) => (caseSensitive ? text : text.toUpperCase());
378
+ };
379
+ const casing = (casingOption) => {
380
+ return (text) => {
381
+ switch (casingOption) {
382
+ case 'upper':
383
+ return text.toUpperCase();
384
+ case 'lower':
385
+ return text.toLowerCase();
386
+ case 'original':
387
+ return text;
388
+ default:
389
+ throw new Error(`Invalid output casing option: ${casingOption}`);
390
+ }
391
+ };
392
+ };
393
+ const normalizeDiacritics = (normalize) => {
394
+ return (text) => {
395
+ return normalize
396
+ ? text
397
+ // normalize Unicode chars (etc. "é" → "e" + "´")
398
+ .normalize('NFD')
399
+ // remove diacritic symbols
400
+ .replace(/[\u0300-\u036f]/g, '')
401
+ // exceptions which are normally not normalized
402
+ .replace(/ß/g, 'ss')
403
+ .replace(/ø/g, 'o')
404
+ .replace(/Ø/g, 'O')
405
+ .replace(/đ/g, 'd')
406
+ .replace(/Đ/g, 'D')
407
+ .replace(/ł/g, 'l')
408
+ .replace(/Ł/g, 'L')
409
+ .replace(/æ/g, 'ae')
410
+ .replace(/Æ/g, 'AE')
411
+ .replace(/œ/g, 'oe')
412
+ .replace(/Œ/g, 'OE')
413
+ .replace(/ð/g, 'd')
414
+ .replace(/Ð/g, 'D')
415
+ .replace(/þ/g, 'th')
416
+ .replace(/Þ/g, 'Th')
417
+ .replace(/ñ/g, 'n')
418
+ .replace(/Ñ/g, 'N')
419
+ : text;
420
+ };
421
+ };
422
+ const Processor = {
423
+ ignoreCasingSensitive,
424
+ casing,
425
+ normalizeDiacritics,
426
+ };
427
+
428
+ const processingPipeline = (text, processors) => {
429
+ return processors.reduce((acc, processor) => processor(acc), text);
430
+ };
431
+
325
432
  class Cipher {
326
433
  encode(input, configuration, opts) {
327
- const { caseSensitive = false, letterSeparator: inputLetterSeparator = '', wordSeparator: inputWordSeparator = '///', } = opts?.input || {};
434
+ const { caseSensitive = false, normalizeDiacritics = true, letterSeparator: inputLetterSeparator = '', wordSeparator: inputWordSeparator = '///', } = opts?.input || {};
328
435
  const { casing = 'original', letterSeparator: outputLetterSeparator = '', wordSeparator: outputWordSeparator = ' ', } = opts?.output || {};
436
+ const preprocessedInput = processingPipeline(input, [
437
+ Processor.normalizeDiacritics(normalizeDiacritics),
438
+ ]);
329
439
  // normalize input into words and letters
330
- const words = input.split(inputWordSeparator);
440
+ const words = preprocessedInput.split(inputWordSeparator);
331
441
  const encodedWords = words.map((word) => {
332
442
  const letters = inputLetterSeparator
333
443
  ? word.split(inputLetterSeparator)
@@ -350,10 +460,13 @@ class Cipher {
350
460
  return encodedWords.join(outputWordSeparator);
351
461
  }
352
462
  decode(input, configuration, opts) {
353
- const { caseSensitive = false, letterSeparator: inputLetterSeparator = '', wordSeparator: inputWordSeparator = ' ', } = opts?.input || {};
463
+ const { caseSensitive = false, normalizeDiacritics = false, letterSeparator: inputLetterSeparator = '', wordSeparator: inputWordSeparator = ' ', } = opts?.input || {};
354
464
  const { casing = 'original', letterSeparator: outputLetterSeparator = '', wordSeparator: outputWordSeparator = ' ', } = opts?.output || {};
465
+ const preprocessedInput = processingPipeline(input, [
466
+ Processor.normalizeDiacritics(normalizeDiacritics),
467
+ ]);
355
468
  // split encoded text into words
356
- const words = input.split(inputWordSeparator);
469
+ const words = preprocessedInput.split(inputWordSeparator);
357
470
  const decodedWords = words.map((word) => {
358
471
  const symbols = word.split(inputLetterSeparator);
359
472
  return symbols
@@ -394,6 +507,7 @@ function withDefaultCipherOptions(opts, defaults) {
394
507
  return {
395
508
  input: {
396
509
  caseSensitive: false,
510
+ normalizeDiacritics: false,
397
511
  letterSeparator: '',
398
512
  wordSeparator: ' ',
399
513
  ...defaults?.input,
@@ -508,6 +622,209 @@ MorseCodeCipher.MORSE_CODE_MAP = {
508
622
  '9': '----.',
509
623
  };
510
624
 
625
+ class MobileCipher extends SubstitutionCipher {
626
+ constructor() {
627
+ super(MobileCipher.MOBILE_KEYPAD_MAP);
628
+ }
629
+ encode(input, configuration, opts) {
630
+ const mergedOpts = withDefaultCipherOptions(opts, {
631
+ input: {
632
+ caseSensitive: false,
633
+ letterSeparator: '',
634
+ wordSeparator: ' ',
635
+ },
636
+ output: {
637
+ casing: 'original',
638
+ letterSeparator: ' ',
639
+ wordSeparator: ' | ',
640
+ },
641
+ });
642
+ return super.encode(input, configuration, mergedOpts);
643
+ }
644
+ decode(input, configuration, opts) {
645
+ const mergedOpts = withDefaultCipherOptions(opts, {
646
+ input: {
647
+ caseSensitive: false,
648
+ letterSeparator: ' ',
649
+ wordSeparator: ' | ',
650
+ },
651
+ output: {
652
+ casing: 'lower',
653
+ letterSeparator: '',
654
+ wordSeparator: ' ',
655
+ },
656
+ });
657
+ return super.decode(input, configuration, mergedOpts);
658
+ }
659
+ }
660
+ MobileCipher.MOBILE_KEYPAD_MAP = {
661
+ A: '2',
662
+ B: '22',
663
+ C: '222',
664
+ D: '3',
665
+ E: '33',
666
+ F: '333',
667
+ G: '4',
668
+ H: '44',
669
+ I: '444',
670
+ J: '5',
671
+ K: '55',
672
+ L: '555',
673
+ M: '6',
674
+ N: '66',
675
+ O: '666',
676
+ P: '7',
677
+ Q: '77',
678
+ R: '777',
679
+ S: '7777',
680
+ T: '8',
681
+ U: '88',
682
+ V: '888',
683
+ W: '9',
684
+ X: '99',
685
+ Y: '999',
686
+ Z: '9999',
687
+ };
688
+
689
+ class SubstitutionCyclicCipher extends Cipher {
690
+ constructor(encodeMap) {
691
+ super();
692
+ this.resetCounters = () => {
693
+ for (const key of Object.keys(this.encodeMap)) {
694
+ this.counters[key] = 0;
695
+ }
696
+ };
697
+ // chech encodeMap
698
+ this.encodeMap = Object.fromEntries(Object.entries(encodeMap).map(([key, value]) => [
699
+ key,
700
+ Array.isArray(value) ? value : [value],
701
+ ]));
702
+ // decode map
703
+ this.decodeMap = {};
704
+ for (const [key, values] of Object.entries(this.encodeMap)) {
705
+ for (const val of values) {
706
+ this.decodeMap[val] = key;
707
+ }
708
+ }
709
+ // inialization counters
710
+ this.counters = {};
711
+ this.resetCounters();
712
+ }
713
+ encodeToken(token) {
714
+ const options = this.encodeMap[token];
715
+ if (!options || options.length === 0)
716
+ return '';
717
+ const index = this.counters[token] % options.length; // cyclic
718
+ this.counters[token] += 1;
719
+ return options[index];
720
+ }
721
+ encode(input, configuration, opts) {
722
+ const value = super.encode(input, configuration, opts);
723
+ this.resetCounters();
724
+ return value;
725
+ }
726
+ decodeToken(token) {
727
+ return this.decodeMap[token] ?? '';
728
+ }
729
+ }
730
+
731
+ class SpiderCipher extends SubstitutionCyclicCipher {
732
+ constructor() {
733
+ super(SpiderCipher.SPIDER_MAP);
734
+ }
735
+ encode(input, configuration, opts) {
736
+ const mergedOpts = withDefaultCipherOptions(opts, {
737
+ input: {
738
+ caseSensitive: false,
739
+ letterSeparator: '',
740
+ wordSeparator: ' ',
741
+ },
742
+ output: {
743
+ casing: 'upper',
744
+ letterSeparator: ' ',
745
+ wordSeparator: ' | ',
746
+ },
747
+ });
748
+ return super.encode(input, configuration, mergedOpts);
749
+ }
750
+ decode(input, configuration, opts) {
751
+ const mergedOpts = withDefaultCipherOptions(opts, {
752
+ input: {
753
+ caseSensitive: false,
754
+ letterSeparator: ' ',
755
+ wordSeparator: ' | ',
756
+ },
757
+ output: {
758
+ casing: 'lower',
759
+ letterSeparator: '',
760
+ wordSeparator: ' ',
761
+ },
762
+ });
763
+ return super.decode(input, configuration, mergedOpts);
764
+ }
765
+ }
766
+ SpiderCipher.SPIDER_MAP = {
767
+ A: ['BC', 'JX'],
768
+ B: ['AC', 'EH'],
769
+ C: ['AB', 'OZ'],
770
+ D: ['EF', 'KT'],
771
+ E: ['BH', 'DF'],
772
+ F: ['DE', 'NV'],
773
+ G: ['HI', 'LP'],
774
+ H: ['BE', 'GI'],
775
+ I: ['GH', 'MS'],
776
+ J: ['AX', 'KL'],
777
+ K: ['DT', 'JL'],
778
+ L: ['GP', 'JK'],
779
+ M: ['IS', 'NO'],
780
+ N: ['FV', 'MO'],
781
+ O: ['CZ', 'MN'],
782
+ P: ['GL', 'RS'],
783
+ // Q: ["Q"], // cipher can't Q
784
+ R: ['PS', 'UY'],
785
+ S: ['IM', 'PR'],
786
+ T: ['DK', 'UV'],
787
+ U: ['TV', 'RY'],
788
+ V: ['FN', 'TU'],
789
+ // W: ["W"], // cipher can't W
790
+ X: ['AJ', 'YZ'],
791
+ Y: ['RU', 'XZ'],
792
+ Z: ['CO', 'XY'],
793
+ };
794
+
795
+ class FractionCipher extends SubstitutionCipher {
796
+ constructor() {
797
+ super(FractionCipher.FRACTION_MAP);
798
+ }
799
+ }
800
+ FractionCipher.FRACTION_MAP = {
801
+ A: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_1_1,
802
+ B: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_1_2,
803
+ C: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_1_3,
804
+ D: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_1_4,
805
+ E: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_1_5,
806
+ F: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_2_1,
807
+ G: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_2_2,
808
+ H: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_2_3,
809
+ I: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_2_4,
810
+ J: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_2_5,
811
+ K: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_3_1,
812
+ L: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_3_2,
813
+ M: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_3_3,
814
+ N: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_3_4,
815
+ O: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_3_5,
816
+ P: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_4_1,
817
+ Q: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_4_2,
818
+ R: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_4_3,
819
+ S: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_4_4,
820
+ T: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_4_5,
821
+ U: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_5_1,
822
+ V: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_5_2,
823
+ X: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_5_3,
824
+ Y: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_5_4,
825
+ Z: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_5_5,
826
+ };
827
+
511
828
  class PolandCrossCipher extends SubstitutionCipher {
512
829
  constructor() {
513
830
  super(PolandCrossCipher.POLAND_CROSS_MAP);
@@ -543,92 +860,336 @@ PolandCrossCipher.POLAND_CROSS_MAP = {
543
860
  Z: KidscipherGlyphsExports.KidscipherGlyphs.POLAND_CROSS_Z,
544
861
  };
545
862
 
863
+ class SmallCrossCipher extends SubstitutionCipher {
864
+ constructor() {
865
+ super(SmallCrossCipher.SMALL_CROSS_MAP);
866
+ }
867
+ }
868
+ SmallCrossCipher.SMALL_CROSS_MAP = {
869
+ A: KidscipherGlyphsExports.KidscipherGlyphs.SMALL_CROSS_A,
870
+ B: KidscipherGlyphsExports.KidscipherGlyphs.SMALL_CROSS_B,
871
+ C: KidscipherGlyphsExports.KidscipherGlyphs.SMALL_CROSS_C,
872
+ D: KidscipherGlyphsExports.KidscipherGlyphs.SMALL_CROSS_D,
873
+ E: KidscipherGlyphsExports.KidscipherGlyphs.SMALL_CROSS_E,
874
+ F: KidscipherGlyphsExports.KidscipherGlyphs.SMALL_CROSS_F,
875
+ G: KidscipherGlyphsExports.KidscipherGlyphs.SMALL_CROSS_G,
876
+ H: KidscipherGlyphsExports.KidscipherGlyphs.SMALL_CROSS_H,
877
+ I: KidscipherGlyphsExports.KidscipherGlyphs.SMALL_CROSS_I,
878
+ J: KidscipherGlyphsExports.KidscipherGlyphs.SMALL_CROSS_J,
879
+ K: KidscipherGlyphsExports.KidscipherGlyphs.SMALL_CROSS_K,
880
+ L: KidscipherGlyphsExports.KidscipherGlyphs.SMALL_CROSS_L,
881
+ M: KidscipherGlyphsExports.KidscipherGlyphs.SMALL_CROSS_M,
882
+ N: KidscipherGlyphsExports.KidscipherGlyphs.SMALL_CROSS_N,
883
+ O: KidscipherGlyphsExports.KidscipherGlyphs.SMALL_CROSS_O,
884
+ P: KidscipherGlyphsExports.KidscipherGlyphs.SMALL_CROSS_P,
885
+ Q: KidscipherGlyphsExports.KidscipherGlyphs.SMALL_CROSS_Q,
886
+ R: KidscipherGlyphsExports.KidscipherGlyphs.SMALL_CROSS_R,
887
+ S: KidscipherGlyphsExports.KidscipherGlyphs.SMALL_CROSS_S,
888
+ T: KidscipherGlyphsExports.KidscipherGlyphs.SMALL_CROSS_T,
889
+ U: KidscipherGlyphsExports.KidscipherGlyphs.SMALL_CROSS_U,
890
+ V: KidscipherGlyphsExports.KidscipherGlyphs.SMALL_CROSS_V,
891
+ W: KidscipherGlyphsExports.KidscipherGlyphs.SMALL_CROSS_W,
892
+ X: KidscipherGlyphsExports.KidscipherGlyphs.SMALL_CROSS_X,
893
+ Y: KidscipherGlyphsExports.KidscipherGlyphs.SMALL_CROSS_Y,
894
+ Z: KidscipherGlyphsExports.KidscipherGlyphs.SMALL_CROSS_Z,
895
+ };
896
+
897
+ class ChineseCipher extends SubstitutionCyclicCipher {
898
+ static generateMap() {
899
+ const map = {};
900
+ // considering that chinese symbol have this format CHINESE_<LETTER>_<NUMBER>
901
+ for (const key of Object.keys(KidscipherGlyphsExports.KidscipherGlyphs)) {
902
+ const match = key.match(/^CHINESE_([A-Z])_\d+$/);
903
+ if (match) {
904
+ const letter = match[1];
905
+ if (!map[letter])
906
+ map[letter] = [];
907
+ map[letter].push(KidscipherGlyphsExports.KidscipherGlyphs[key]);
908
+ }
909
+ }
910
+ return map;
911
+ }
912
+ constructor() {
913
+ super(ChineseCipher.CHINESE_MAP);
914
+ }
915
+ }
916
+ ChineseCipher.CHINESE_MAP = ChineseCipher.generateMap();
917
+
546
918
  class ShiftCipher extends Cipher {
547
- constructor(baseAlphabet, rotors) {
919
+ constructor(alphabet) {
548
920
  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');
921
+ this.alphabet = alphabet;
922
+ }
923
+ encodeToken(token, configuration) {
924
+ const { shift, outputAsIndex, inputAsIndex } = configuration;
925
+ let index;
926
+ if (inputAsIndex) {
927
+ index = parseInt(token, 10);
928
+ if (isNaN(index) || index < 0 || index >= this.alphabet.length) {
929
+ return token; // invalid index
553
930
  }
554
931
  }
932
+ else {
933
+ if (!this.alphabet.includes(token))
934
+ return ''; // invalid token
935
+ index = this.alphabet.indexOf(token);
936
+ }
937
+ const shiftedIndex = (index + shift) % this.alphabet.length;
938
+ return outputAsIndex
939
+ ? shiftedIndex.toString()
940
+ : this.alphabet[shiftedIndex];
941
+ }
942
+ decodeToken(token, configuration) {
943
+ const { shift, inputAsIndex, outputAsIndex } = configuration;
944
+ let index;
945
+ if (inputAsIndex) {
946
+ index = parseInt(token, 10);
947
+ if (isNaN(index) || index < 0 || index >= this.alphabet.length) {
948
+ return ''; // invalid index
949
+ }
950
+ }
951
+ else {
952
+ if (!this.alphabet.includes(token))
953
+ return ''; // invalid token
954
+ index = this.alphabet.indexOf(token);
955
+ }
956
+ const shiftedIndex = (index - shift + this.alphabet.length) % this.alphabet.length;
957
+ return outputAsIndex
958
+ ? shiftedIndex.toString()
959
+ : this.alphabet[shiftedIndex];
960
+ }
961
+ getAllTokenIndexes(token, shift) {
962
+ if (!this.alphabet.includes(token))
963
+ return []; // invalid token
964
+ const indexes = this.alphabet.flatMap((ch, i) => ch === token
965
+ ? [(i - shift + this.alphabet.length) % this.alphabet.length]
966
+ : []);
967
+ return indexes;
968
+ }
969
+ encode(input, configuration, opts) {
970
+ const mergedOpts = withDefaultCipherOptions(opts, {
971
+ input: { caseSensitive: false, letterSeparator: '', wordSeparator: ' ' },
972
+ output: { casing: 'original', letterSeparator: '', wordSeparator: ' ' },
973
+ });
974
+ return super.encode(input, configuration, mergedOpts);
975
+ }
976
+ decode(input, configuration, opts) {
977
+ const mergedOpts = withDefaultCipherOptions(opts, {
978
+ input: { caseSensitive: false, letterSeparator: '', wordSeparator: ' ' },
979
+ output: { casing: 'original', letterSeparator: '', wordSeparator: ' ' },
980
+ });
981
+ return super.decode(input, configuration, mergedOpts);
982
+ }
983
+ }
984
+
985
+ class ShiftAlphabetCipher extends ShiftCipher {
986
+ constructor() {
987
+ super(ShiftAlphabetCipher.DEFAULT_ALPHABET);
988
+ }
989
+ }
990
+ ShiftAlphabetCipher.DEFAULT_ALPHABET = [
991
+ 'A',
992
+ 'B',
993
+ 'C',
994
+ 'D',
995
+ 'E',
996
+ 'F',
997
+ 'G',
998
+ 'H',
999
+ 'I',
1000
+ 'J',
1001
+ 'K',
1002
+ 'L',
1003
+ 'M',
1004
+ 'N',
1005
+ 'O',
1006
+ 'P',
1007
+ 'Q',
1008
+ 'R',
1009
+ 'S',
1010
+ 'T',
1011
+ 'U',
1012
+ 'V',
1013
+ 'W',
1014
+ 'X',
1015
+ 'Y',
1016
+ 'Z',
1017
+ ];
1018
+
1019
+ class ShiftRotorCipher extends Cipher {
1020
+ constructor(baseAlphabet, rotors) {
1021
+ super();
1022
+ if (rotors.length === 0)
1023
+ throw new Error('At least one rotor is required');
555
1024
  this.baseAlphabet = baseAlphabet;
556
1025
  this.rotors = rotors;
557
1026
  }
558
1027
  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];
567
- }
1028
+ const { shifts = [], outputAsIndex, inputAsIndex } = configuration;
1029
+ let results = [];
1030
+ let lastSymbol = token;
1031
+ const baseSymbolIndex = this.baseAlphabet.encodeToken(lastSymbol, {
1032
+ shift: 0,
1033
+ inputAsIndex: false,
1034
+ outputAsIndex: true,
1035
+ });
1036
+ for (let i = 0; i < this.rotors.length; i++) {
1037
+ const rotor = this.rotors[i];
1038
+ const shift = shifts[i % shifts.length] ?? 0;
1039
+ lastSymbol = rotor.encodeToken(baseSymbolIndex, {
1040
+ shift,
1041
+ inputAsIndex: true,
1042
+ outputAsIndex: false,
1043
+ });
1044
+ results.push(lastSymbol);
568
1045
  }
569
- return encoded;
1046
+ // we need to reverse it
1047
+ return results.reverse().join('');
1048
+ }
1049
+ decodeToken(token, configuration) {
1050
+ const { shifts = [], outputAsIndex, inputAsIndex } = configuration;
1051
+ const symbols = token.split('').reverse();
1052
+ if (symbols.length != this.rotors.length) {
1053
+ throw new Error('Invalid symbol length');
1054
+ }
1055
+ let includesIn = [];
1056
+ // Reverse through rotors for decoding
1057
+ for (let i = this.rotors.length - 1; i >= 0; i--) {
1058
+ const rotor = this.rotors[i];
1059
+ const shift = shifts[i % shifts.length] ?? 0;
1060
+ const symbol = symbols[i];
1061
+ const ocurencies = rotor.getAllTokenIndexes(symbol, shift);
1062
+ includesIn.push(ocurencies);
1063
+ }
1064
+ // Find intersection of all arrays (items common to all rotors)
1065
+ const intersection = includesIn.reduce((acc, arr) => acc.filter((x) => arr.includes(x)));
1066
+ // If there is exactly one common index, decode it
1067
+ if (intersection.length !== 1) {
1068
+ throw new Error(`Invalid decoding — intersection size is ${intersection.length}`);
1069
+ }
1070
+ const finalIndex = intersection[0];
1071
+ const result = this.baseAlphabet.decodeToken(finalIndex.toString(), {
1072
+ shift: 0,
1073
+ inputAsIndex: true,
1074
+ outputAsIndex: outputAsIndex,
1075
+ });
1076
+ return result;
570
1077
  }
571
1078
  encode(input, configuration, opts) {
572
1079
  const mergedOpts = withDefaultCipherOptions(opts, {
573
- input: {
574
- caseSensitive: false,
575
- letterSeparator: '',
576
- wordSeparator: ' ',
577
- },
1080
+ input: { caseSensitive: false, letterSeparator: '', wordSeparator: ' ' },
578
1081
  output: {
579
1082
  casing: 'original',
580
- letterSeparator: '',
581
- wordSeparator: ' ',
1083
+ letterSeparator: ' ',
1084
+ wordSeparator: ' | ',
582
1085
  },
583
1086
  });
584
1087
  return super.encode(input, configuration, mergedOpts);
585
1088
  }
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
1089
  decode(input, configuration, opts) {
608
1090
  const mergedOpts = withDefaultCipherOptions(opts, {
609
1091
  input: {
610
1092
  caseSensitive: false,
611
- letterSeparator: '',
612
- wordSeparator: ' ',
613
- },
614
- output: {
615
- casing: 'original',
616
- letterSeparator: '',
617
- wordSeparator: ' ',
1093
+ letterSeparator: ' ',
1094
+ wordSeparator: ' | ',
618
1095
  },
1096
+ output: { casing: 'original', letterSeparator: '', wordSeparator: ' ' },
619
1097
  });
620
1098
  return super.decode(input, configuration, mergedOpts);
621
1099
  }
622
1100
  }
623
1101
 
624
- class ShiftAlphabetCipher extends ShiftCipher {
625
- constructor(alphabet) {
626
- if (!alphabet) {
627
- alphabet = ShiftAlphabetCipher.DEFAULT_ALPHABET;
1102
+ class ShiftRotorABCDCipher extends ShiftRotorCipher {
1103
+ constructor() {
1104
+ const rotors = [];
1105
+ const baseAlphabet = new ShiftCipher(ShiftRotorABCDCipher.BASE_ALPHABET);
1106
+ for (let i = 0; i < ShiftRotorABCDCipher.ROTOR_ALPHABETS.length; i++) {
1107
+ rotors.push(new ShiftCipher(ShiftRotorABCDCipher.ROTOR_ALPHABETS[i]));
1108
+ }
1109
+ super(baseAlphabet, rotors);
1110
+ }
1111
+ }
1112
+ ShiftRotorABCDCipher.BASE_ALPHABET = [
1113
+ 'A',
1114
+ 'B',
1115
+ 'C',
1116
+ 'D',
1117
+ 'E',
1118
+ 'F',
1119
+ 'G',
1120
+ 'H',
1121
+ 'I',
1122
+ 'J',
1123
+ 'K',
1124
+ 'L',
1125
+ 'M',
1126
+ 'N',
1127
+ 'O',
1128
+ 'P',
1129
+ 'Q',
1130
+ 'R',
1131
+ 'S',
1132
+ 'T',
1133
+ 'U',
1134
+ 'V',
1135
+ 'W',
1136
+ 'X',
1137
+ 'Y',
1138
+ 'Z',
1139
+ '0',
1140
+ '1',
1141
+ '2',
1142
+ '3',
1143
+ '4',
1144
+ '5',
1145
+ '6',
1146
+ '7',
1147
+ '8',
1148
+ '9',
1149
+ ];
1150
+ ShiftRotorABCDCipher.REPEAT_ALPHABET = ['A', 'B', 'C', 'D'];
1151
+ ShiftRotorABCDCipher.generateRepeatRotorAlphabet = (repeatAlphabet, repeat) => {
1152
+ let output = [];
1153
+ while (output.length < ShiftRotorABCDCipher.BASE_ALPHABET.length) {
1154
+ for (let i = 0; i < repeatAlphabet.length; i++) {
1155
+ for (let k = 0; k < repeat; k++) {
1156
+ output.push(repeatAlphabet[i]);
1157
+ }
628
1158
  }
629
- super(alphabet, [alphabet]);
630
1159
  }
631
- encode(input, { shift }, opts) {
1160
+ return output;
1161
+ };
1162
+ ShiftRotorABCDCipher.ROTOR_ALPHABETS = [
1163
+ ShiftRotorABCDCipher.generateRepeatRotorAlphabet(ShiftRotorABCDCipher.REPEAT_ALPHABET, 1),
1164
+ ShiftRotorABCDCipher.generateRepeatRotorAlphabet(ShiftRotorABCDCipher.REPEAT_ALPHABET, 3),
1165
+ ShiftRotorABCDCipher.generateRepeatRotorAlphabet(ShiftRotorABCDCipher.REPEAT_ALPHABET, 9),
1166
+ ];
1167
+
1168
+ class Substitution2DCipher extends SubstitutionCyclicCipher {
1169
+ constructor(alphabet, horizontalKey, verticalKey) {
1170
+ // Validation checks
1171
+ if (alphabet.length !== verticalKey.length) {
1172
+ throw new Error(`Alphabet row count (${alphabet.length}) must match verticalKey length (${verticalKey.length})`);
1173
+ }
1174
+ for (const [rowIndex, row] of alphabet.entries()) {
1175
+ if (row.length !== horizontalKey.length) {
1176
+ throw new Error(`Alphabet column count in row ${rowIndex} (${row.length}) must match horizontalKey length (${horizontalKey.length})`);
1177
+ }
1178
+ }
1179
+ const encodeMap = {};
1180
+ // Build the coordinate map
1181
+ for (const [rowIndex, rowKey] of verticalKey.entries()) {
1182
+ for (const [colIndex, colKey] of horizontalKey.entries()) {
1183
+ const value = alphabet[rowIndex][colIndex];
1184
+ const coord = `${rowKey}${colKey}`;
1185
+ if (!encodeMap[value])
1186
+ encodeMap[value] = [];
1187
+ encodeMap[value].push(coord);
1188
+ }
1189
+ }
1190
+ super(encodeMap);
1191
+ }
1192
+ encode(input, configuration, opts) {
632
1193
  const mergedOpts = withDefaultCipherOptions(opts, {
633
1194
  input: {
634
1195
  caseSensitive: false,
@@ -637,29 +1198,71 @@ class ShiftAlphabetCipher extends ShiftCipher {
637
1198
  },
638
1199
  output: {
639
1200
  casing: 'original',
640
- letterSeparator: '',
641
- wordSeparator: ' ',
1201
+ letterSeparator: ' ',
1202
+ wordSeparator: ' | ',
642
1203
  },
643
1204
  });
644
- return super.encode(input, { shifts: [shift] }, mergedOpts);
1205
+ return super.encode(input, configuration, mergedOpts);
645
1206
  }
646
- decode(input, { shift }, opts) {
1207
+ decode(input, configuration, opts) {
647
1208
  const mergedOpts = withDefaultCipherOptions(opts, {
648
1209
  input: {
649
- caseSensitive: false,
650
- letterSeparator: '',
651
- wordSeparator: ' ',
1210
+ caseSensitive: true,
1211
+ letterSeparator: ' ',
1212
+ wordSeparator: ' | ',
652
1213
  },
653
1214
  output: {
654
- casing: 'original',
1215
+ casing: 'lower',
655
1216
  letterSeparator: '',
656
1217
  wordSeparator: ' ',
657
1218
  },
658
1219
  });
659
- return super.decode(input, { shifts: [shift] }, mergedOpts);
1220
+ return super.decode(input, configuration, mergedOpts);
660
1221
  }
661
1222
  }
662
- ShiftAlphabetCipher.DEFAULT_ALPHABET = [
1223
+
1224
+ class TableKeyFiveToFiveCipher extends Substitution2DCipher {
1225
+ constructor(horizontalKey, verticalKey) {
1226
+ super(TableKeyFiveToFiveCipher.ALPHABET, horizontalKey, verticalKey);
1227
+ }
1228
+ }
1229
+ TableKeyFiveToFiveCipher.ALPHABET = [
1230
+ ['A', 'B', 'C', 'D', 'E'],
1231
+ ['F', 'G', 'H', 'I', 'J'],
1232
+ ['K', 'L', 'M', 'N', 'O'],
1233
+ ['P', 'R', 'S', 'T', 'U'],
1234
+ ['V', 'W', 'X', 'Y', 'Z'],
1235
+ ];
1236
+
1237
+ class ChessCipher extends Substitution2DCipher {
1238
+ constructor(height, width) {
1239
+ const totalCells = height * width;
1240
+ if (totalCells < ChessCipher.BASE_ALPHABET.length) {
1241
+ throw new Error(`Invalid board size: ${height}x${width} = ${totalCells} cells, but alphabet requires at least ${ChessCipher.BASE_ALPHABET.length} cells.`);
1242
+ }
1243
+ // horizontal key (rows 1, 2, 3, …)
1244
+ const horizontalKey = [];
1245
+ for (let i = 0; i < width; i++) {
1246
+ horizontalKey.push((i + 1).toString());
1247
+ }
1248
+ // vertical key (columns A, B, C, …)
1249
+ const verticalKey = [];
1250
+ for (let i = 0; i < height; i++) {
1251
+ verticalKey.push(String.fromCharCode('A'.charCodeAt(0) + i));
1252
+ }
1253
+ // create 2D table
1254
+ const encodeAlphabet2D = [];
1255
+ for (let row = 0; row < height; row++) {
1256
+ encodeAlphabet2D[row] = [];
1257
+ for (let col = 0; col < width; col++) {
1258
+ const index = (row * width + col) % ChessCipher.BASE_ALPHABET.length; // repeat alphabet
1259
+ encodeAlphabet2D[row][col] = ChessCipher.BASE_ALPHABET[index];
1260
+ }
1261
+ }
1262
+ super(encodeAlphabet2D, horizontalKey, verticalKey);
1263
+ }
1264
+ }
1265
+ ChessCipher.BASE_ALPHABET = [
663
1266
  'A',
664
1267
  'B',
665
1268
  'C',
@@ -686,66 +1289,29 @@ ShiftAlphabetCipher.DEFAULT_ALPHABET = [
686
1289
  'X',
687
1290
  'Y',
688
1291
  'Z',
1292
+ '0',
1293
+ '1',
1294
+ '2',
1295
+ '3',
1296
+ '4',
1297
+ '5',
1298
+ '6',
1299
+ '7',
1300
+ '8',
1301
+ '9',
689
1302
  ];
690
1303
 
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]);
736
- }
737
- }
738
- return map;
739
- }
740
- constructor() {
741
- super(ChineseCipher.CHINESE_MAP);
742
- }
743
- }
744
- ChineseCipher.CHINESE_MAP = ChineseCipher.generateMap();
745
-
1304
+ exports.ChessCipher = ChessCipher;
746
1305
  exports.ChineseCipher = ChineseCipher;
747
1306
  exports.Cipher = Cipher;
1307
+ exports.FractionCipher = FractionCipher;
1308
+ exports.MobileCipher = MobileCipher;
748
1309
  exports.MorseCodeCipher = MorseCodeCipher;
749
1310
  exports.PolandCrossCipher = PolandCrossCipher;
750
1311
  exports.ShiftAlphabetCipher = ShiftAlphabetCipher;
1312
+ exports.ShiftRotorABCDCipher = ShiftRotorABCDCipher;
1313
+ exports.SmallCrossCipher = SmallCrossCipher;
1314
+ exports.SpiderCipher = SpiderCipher;
1315
+ exports.Substitution2DCipher = Substitution2DCipher;
751
1316
  exports.SubstitutionCipher = SubstitutionCipher;
1317
+ exports.TableKeyFiveToFiveCipher = TableKeyFiveToFiveCipher;