kidscipher 0.5.0 → 0.7.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/README.md +31 -19
- package/dist/assets/Kidscipher.ttf +0 -0
- package/dist/assets/Kidscipher.woff +0 -0
- package/dist/assets/Kidscipher.woff2 +0 -0
- package/dist/font.cjs.js +1 -1
- package/dist/font.esm.js +1 -1
- package/dist/index.cjs.js +312 -255
- package/dist/index.esm.js +312 -256
- package/dist/types/cipher/Cipher.d.ts +7 -0
- package/dist/types/cipher/morsecode/MorseCodeAlphabet.d.ts +16 -0
- package/dist/types/cipher/morsecode/MorseCodeCipher.d.ts +27 -9
- package/dist/types/cipher/number/LetterNumberCipher.d.ts +11 -0
- package/dist/types/cipher/shift/ShiftAlphabetCipher.d.ts +1 -2
- package/dist/types/cipher/shift/ShiftCipher.d.ts +8 -13
- package/dist/types/cipher/shift/ShiftRotorABCDCipher.d.ts +1 -1
- package/dist/types/cipher/shift/ShiftRotorCipher.d.ts +6 -15
- package/dist/types/cipher/substitution/SubstitutionCipher.d.ts +4 -0
- package/dist/types/cipher/substitution/SubstitutionCyclicCipher.d.ts +4 -0
- package/dist/types/core/alphabet/MapCz.d.ts +47 -0
- package/dist/types/core/alphabet/MapEn.d.ts +30 -0
- package/dist/types/core/alphabet/MapNumbers.d.ts +14 -0
- package/dist/types/font.d.ts +3 -0
- package/dist/types/index.d.ts +1 -0
- package/package.json +10 -3
package/dist/index.esm.js
CHANGED
|
@@ -25,7 +25,7 @@ function styleInject(css, ref) {
|
|
|
25
25
|
}
|
|
26
26
|
}
|
|
27
27
|
|
|
28
|
-
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\")}";
|
|
28
|
+
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\")}";
|
|
29
29
|
styleInject(css_248z);
|
|
30
30
|
|
|
31
31
|
var KidscipherGlyphs_1;
|
|
@@ -482,6 +482,30 @@ const processingPipeline = (text, processors) => {
|
|
|
482
482
|
};
|
|
483
483
|
|
|
484
484
|
class Cipher {
|
|
485
|
+
/**
|
|
486
|
+
* Tokenize input using a dictionary of valid tokens.
|
|
487
|
+
* Longest tokens win.
|
|
488
|
+
*/
|
|
489
|
+
tokenize(input, tokens) {
|
|
490
|
+
const result = [];
|
|
491
|
+
let i = 0;
|
|
492
|
+
while (i < input.length) {
|
|
493
|
+
let matched = false;
|
|
494
|
+
for (const token of tokens) {
|
|
495
|
+
if (input.startsWith(token, i)) {
|
|
496
|
+
result.push(token);
|
|
497
|
+
i += token.length;
|
|
498
|
+
matched = true;
|
|
499
|
+
break;
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
if (!matched) {
|
|
503
|
+
result.push(input[i]);
|
|
504
|
+
i++;
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
return result;
|
|
508
|
+
}
|
|
485
509
|
encode(input, configuration, opts) {
|
|
486
510
|
const { caseSensitive = false, normalizeDiacritics = true, letterSeparator: inputLetterSeparator = '', wordSeparator: inputWordSeparator = '///', } = opts?.input || {};
|
|
487
511
|
const { casing = 'original', letterSeparator: outputLetterSeparator = '', wordSeparator: outputWordSeparator = ' ', } = opts?.output || {};
|
|
@@ -491,16 +515,19 @@ class Cipher {
|
|
|
491
515
|
// normalize input into words and letters
|
|
492
516
|
const words = preprocessedInput.split(inputWordSeparator);
|
|
493
517
|
const encodedWords = words.map((word) => {
|
|
494
|
-
const
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
.
|
|
499
|
-
|
|
500
|
-
|
|
518
|
+
const normalizedWord = caseSensitive ? word : word.toUpperCase();
|
|
519
|
+
// tokenize the word
|
|
520
|
+
// eg. [".-", "-...", ...] or ["A", "B", "CH", ...]
|
|
521
|
+
const tokens = inputLetterSeparator
|
|
522
|
+
? normalizedWord.split(inputLetterSeparator)
|
|
523
|
+
: this.tokenize(normalizedWord, this.getEncodeTokens());
|
|
524
|
+
// console.log('Tokenized letters:', tokens);
|
|
525
|
+
return tokens
|
|
526
|
+
.map((token) => {
|
|
527
|
+
if (/\s/.test(token)) {
|
|
528
|
+
return token;
|
|
501
529
|
}
|
|
502
|
-
|
|
503
|
-
let encoded = this.encodeToken(c, configuration);
|
|
530
|
+
let encoded = this.encodeToken(token, configuration);
|
|
504
531
|
if (casing === 'upper')
|
|
505
532
|
encoded = encoded.toUpperCase();
|
|
506
533
|
if (casing === 'lower')
|
|
@@ -544,7 +571,15 @@ class SubstitutionCipher extends Cipher {
|
|
|
544
571
|
constructor(encodeMap) {
|
|
545
572
|
super();
|
|
546
573
|
this.encodeMap = encodeMap;
|
|
547
|
-
this.decodeMap = Object.entries(encodeMap).
|
|
574
|
+
this.decodeMap = Object.fromEntries(Object.entries(encodeMap).map(([k, v]) => [v, k]));
|
|
575
|
+
this.encodeTokens = Object.keys(this.encodeMap).sort((a, b) => b.length - a.length);
|
|
576
|
+
this.decodeTokens = Object.keys(this.decodeMap).sort((a, b) => b.length - a.length);
|
|
577
|
+
}
|
|
578
|
+
getEncodeTokens() {
|
|
579
|
+
return this.encodeTokens;
|
|
580
|
+
}
|
|
581
|
+
getDecodeTokens() {
|
|
582
|
+
return this.decodeTokens;
|
|
548
583
|
}
|
|
549
584
|
encodeToken(token) {
|
|
550
585
|
return this.encodeMap[token] ?? '';
|
|
@@ -575,9 +610,70 @@ function withDefaultCipherOptions(opts, defaults) {
|
|
|
575
610
|
};
|
|
576
611
|
}
|
|
577
612
|
|
|
613
|
+
const INTERNATIONAL_MORSE = {
|
|
614
|
+
A: '.-',
|
|
615
|
+
B: '-...',
|
|
616
|
+
C: '-.-.',
|
|
617
|
+
D: '-..',
|
|
618
|
+
E: '.',
|
|
619
|
+
F: '..-.',
|
|
620
|
+
G: '--.',
|
|
621
|
+
H: '....',
|
|
622
|
+
I: '..',
|
|
623
|
+
J: '.---',
|
|
624
|
+
K: '-.-',
|
|
625
|
+
L: '.-..',
|
|
626
|
+
M: '--',
|
|
627
|
+
N: '-.',
|
|
628
|
+
O: '---',
|
|
629
|
+
P: '.--.',
|
|
630
|
+
Q: '--.-',
|
|
631
|
+
R: '.-.',
|
|
632
|
+
S: '...',
|
|
633
|
+
T: '-',
|
|
634
|
+
U: '..-',
|
|
635
|
+
V: '...-',
|
|
636
|
+
W: '.--',
|
|
637
|
+
X: '-..-',
|
|
638
|
+
Y: '-.--',
|
|
639
|
+
Z: '--..',
|
|
640
|
+
'0': '-----',
|
|
641
|
+
'1': '.----',
|
|
642
|
+
'2': '..---',
|
|
643
|
+
'3': '...--',
|
|
644
|
+
'4': '....-',
|
|
645
|
+
'5': '.....',
|
|
646
|
+
'6': '-....',
|
|
647
|
+
'7': '--...',
|
|
648
|
+
'8': '---..',
|
|
649
|
+
'9': '----.',
|
|
650
|
+
};
|
|
651
|
+
const CZECH_MORSE = {
|
|
652
|
+
CH: '----',
|
|
653
|
+
};
|
|
654
|
+
const GERMAN_MORSE = {
|
|
655
|
+
Ä: '.-.-',
|
|
656
|
+
Ö: '---.',
|
|
657
|
+
Ü: '..--',
|
|
658
|
+
ß: '...--..',
|
|
659
|
+
};
|
|
660
|
+
const SPANISH_MORSE = {
|
|
661
|
+
Ñ: '--.--',
|
|
662
|
+
};
|
|
663
|
+
const MORSE_CODE_ALPHABETS = {
|
|
664
|
+
intl: INTERNATIONAL_MORSE,
|
|
665
|
+
cs: { ...INTERNATIONAL_MORSE, ...CZECH_MORSE },
|
|
666
|
+
de: { ...INTERNATIONAL_MORSE, ...GERMAN_MORSE },
|
|
667
|
+
es: { ...INTERNATIONAL_MORSE, ...SPANISH_MORSE },
|
|
668
|
+
};
|
|
669
|
+
|
|
578
670
|
class MorseCodeCipher extends SubstitutionCipher {
|
|
579
|
-
constructor() {
|
|
580
|
-
super(MorseCodeCipher.
|
|
671
|
+
constructor({ alphabetVariant = 'intl', dotDashMapping = { dot: '.', dash: '-' }, } = {}) {
|
|
672
|
+
super(MorseCodeCipher.ALPHABETS[alphabetVariant ?? 'intl']);
|
|
673
|
+
this.dotDashMapping = {
|
|
674
|
+
dot: dotDashMapping.dot ?? '.',
|
|
675
|
+
dash: dotDashMapping.dash ?? '-',
|
|
676
|
+
};
|
|
581
677
|
}
|
|
582
678
|
encode(input, configuration, opts) {
|
|
583
679
|
const { dotDashMapping = { dot: '.', dash: '-' } } = configuration || {};
|
|
@@ -599,9 +695,9 @@ class MorseCodeCipher extends SubstitutionCipher {
|
|
|
599
695
|
.split('')
|
|
600
696
|
.map((char) => {
|
|
601
697
|
if (char === '.')
|
|
602
|
-
return dotDashMapping.dot;
|
|
698
|
+
return this.dotDashMapping.dot;
|
|
603
699
|
if (char === '-')
|
|
604
|
-
return dotDashMapping.dash;
|
|
700
|
+
return this.dotDashMapping.dash;
|
|
605
701
|
return char;
|
|
606
702
|
})
|
|
607
703
|
.join('');
|
|
@@ -624,9 +720,9 @@ class MorseCodeCipher extends SubstitutionCipher {
|
|
|
624
720
|
normalized = input
|
|
625
721
|
.split('')
|
|
626
722
|
.map((char) => {
|
|
627
|
-
if (char === dotDashMapping.dot)
|
|
723
|
+
if (char === this.dotDashMapping.dot)
|
|
628
724
|
return '.';
|
|
629
|
-
if (char === dotDashMapping.dash)
|
|
725
|
+
if (char === this.dotDashMapping.dash)
|
|
630
726
|
return '-';
|
|
631
727
|
return char;
|
|
632
728
|
})
|
|
@@ -635,44 +731,7 @@ class MorseCodeCipher extends SubstitutionCipher {
|
|
|
635
731
|
return super.decode(normalized, configuration, mergedOpts);
|
|
636
732
|
}
|
|
637
733
|
}
|
|
638
|
-
MorseCodeCipher.
|
|
639
|
-
A: '.-',
|
|
640
|
-
B: '-...',
|
|
641
|
-
C: '-.-.',
|
|
642
|
-
D: '-..',
|
|
643
|
-
E: '.',
|
|
644
|
-
F: '..-.',
|
|
645
|
-
G: '--.',
|
|
646
|
-
H: '....',
|
|
647
|
-
I: '..',
|
|
648
|
-
J: '.---',
|
|
649
|
-
K: '-.-',
|
|
650
|
-
L: '.-..',
|
|
651
|
-
M: '--',
|
|
652
|
-
N: '-.',
|
|
653
|
-
O: '---',
|
|
654
|
-
P: '.--.',
|
|
655
|
-
Q: '--.-',
|
|
656
|
-
R: '.-.',
|
|
657
|
-
S: '...',
|
|
658
|
-
T: '-',
|
|
659
|
-
U: '..-',
|
|
660
|
-
V: '...-',
|
|
661
|
-
W: '.--',
|
|
662
|
-
X: '-..-',
|
|
663
|
-
Y: '-.--',
|
|
664
|
-
Z: '--..',
|
|
665
|
-
'0': '-----',
|
|
666
|
-
'1': '.----',
|
|
667
|
-
'2': '..---',
|
|
668
|
-
'3': '...--',
|
|
669
|
-
'4': '....-',
|
|
670
|
-
'5': '.....',
|
|
671
|
-
'6': '-....',
|
|
672
|
-
'7': '--...',
|
|
673
|
-
'8': '---..',
|
|
674
|
-
'9': '----.',
|
|
675
|
-
};
|
|
734
|
+
MorseCodeCipher.ALPHABETS = MORSE_CODE_ALPHABETS;
|
|
676
735
|
|
|
677
736
|
class MobileCipher extends SubstitutionCipher {
|
|
678
737
|
constructor() {
|
|
@@ -688,7 +747,7 @@ class MobileCipher extends SubstitutionCipher {
|
|
|
688
747
|
output: {
|
|
689
748
|
casing: 'original',
|
|
690
749
|
letterSeparator: ' ',
|
|
691
|
-
wordSeparator: '
|
|
750
|
+
wordSeparator: ' 1 ',
|
|
692
751
|
},
|
|
693
752
|
});
|
|
694
753
|
return super.encode(input, configuration, mergedOpts);
|
|
@@ -698,7 +757,7 @@ class MobileCipher extends SubstitutionCipher {
|
|
|
698
757
|
input: {
|
|
699
758
|
caseSensitive: false,
|
|
700
759
|
letterSeparator: ' ',
|
|
701
|
-
wordSeparator: '
|
|
760
|
+
wordSeparator: ' 1 ',
|
|
702
761
|
},
|
|
703
762
|
output: {
|
|
704
763
|
casing: 'lower',
|
|
@@ -746,22 +805,31 @@ class SubstitutionCyclicCipher extends Cipher {
|
|
|
746
805
|
this.counters[key] = 0;
|
|
747
806
|
}
|
|
748
807
|
};
|
|
749
|
-
//
|
|
808
|
+
// normalize encode map to arrays
|
|
750
809
|
this.encodeMap = Object.fromEntries(Object.entries(encodeMap).map(([key, value]) => [
|
|
751
810
|
key,
|
|
752
811
|
Array.isArray(value) ? value : [value],
|
|
753
812
|
]));
|
|
754
|
-
// decode map
|
|
813
|
+
// build decode map
|
|
755
814
|
this.decodeMap = {};
|
|
756
815
|
for (const [key, values] of Object.entries(this.encodeMap)) {
|
|
757
816
|
for (const val of values) {
|
|
758
817
|
this.decodeMap[val] = key;
|
|
759
818
|
}
|
|
760
819
|
}
|
|
761
|
-
//
|
|
820
|
+
// tokenize keys (longest first)
|
|
821
|
+
this.encodeTokens = Object.keys(this.encodeMap).sort((a, b) => b.length - a.length);
|
|
822
|
+
this.decodeTokens = Object.keys(this.decodeMap).sort((a, b) => b.length - a.length);
|
|
823
|
+
// initialize counters
|
|
762
824
|
this.counters = {};
|
|
763
825
|
this.resetCounters();
|
|
764
826
|
}
|
|
827
|
+
getEncodeTokens() {
|
|
828
|
+
return this.encodeTokens;
|
|
829
|
+
}
|
|
830
|
+
getDecodeTokens() {
|
|
831
|
+
return this.decodeTokens;
|
|
832
|
+
}
|
|
765
833
|
encodeToken(token) {
|
|
766
834
|
const options = this.encodeMap[token];
|
|
767
835
|
if (!options || options.length === 0)
|
|
@@ -990,29 +1058,29 @@ class FractionCipher extends SubstitutionCipher {
|
|
|
990
1058
|
}
|
|
991
1059
|
FractionCipher.FRACTION_MAP = {
|
|
992
1060
|
A: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_1_1,
|
|
993
|
-
B: KidscipherGlyphsExports.KidscipherGlyphs.
|
|
994
|
-
C: KidscipherGlyphsExports.KidscipherGlyphs.
|
|
995
|
-
D: KidscipherGlyphsExports.KidscipherGlyphs.
|
|
996
|
-
E: KidscipherGlyphsExports.KidscipherGlyphs.
|
|
997
|
-
F: KidscipherGlyphsExports.KidscipherGlyphs.
|
|
1061
|
+
B: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_2_1,
|
|
1062
|
+
C: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_3_1,
|
|
1063
|
+
D: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_4_1,
|
|
1064
|
+
E: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_5_1,
|
|
1065
|
+
F: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_1_2,
|
|
998
1066
|
G: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_2_2,
|
|
999
|
-
H: KidscipherGlyphsExports.KidscipherGlyphs.
|
|
1000
|
-
I: KidscipherGlyphsExports.KidscipherGlyphs.
|
|
1001
|
-
J: KidscipherGlyphsExports.KidscipherGlyphs.
|
|
1002
|
-
K: KidscipherGlyphsExports.KidscipherGlyphs.
|
|
1003
|
-
L: KidscipherGlyphsExports.KidscipherGlyphs.
|
|
1067
|
+
H: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_3_2,
|
|
1068
|
+
I: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_4_2,
|
|
1069
|
+
J: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_5_2,
|
|
1070
|
+
K: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_1_3,
|
|
1071
|
+
L: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_2_3,
|
|
1004
1072
|
M: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_3_3,
|
|
1005
|
-
N: KidscipherGlyphsExports.KidscipherGlyphs.
|
|
1006
|
-
O: KidscipherGlyphsExports.KidscipherGlyphs.
|
|
1007
|
-
P: KidscipherGlyphsExports.KidscipherGlyphs.
|
|
1008
|
-
Q: KidscipherGlyphsExports.KidscipherGlyphs.
|
|
1009
|
-
R: KidscipherGlyphsExports.KidscipherGlyphs.
|
|
1073
|
+
N: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_4_3,
|
|
1074
|
+
O: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_5_3,
|
|
1075
|
+
P: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_1_4,
|
|
1076
|
+
Q: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_2_4,
|
|
1077
|
+
R: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_3_4,
|
|
1010
1078
|
S: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_4_4,
|
|
1011
|
-
T: KidscipherGlyphsExports.KidscipherGlyphs.
|
|
1012
|
-
U: KidscipherGlyphsExports.KidscipherGlyphs.
|
|
1013
|
-
V: KidscipherGlyphsExports.KidscipherGlyphs.
|
|
1014
|
-
X: KidscipherGlyphsExports.KidscipherGlyphs.
|
|
1015
|
-
Y: KidscipherGlyphsExports.KidscipherGlyphs.
|
|
1079
|
+
T: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_5_4,
|
|
1080
|
+
U: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_1_5,
|
|
1081
|
+
V: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_2_5,
|
|
1082
|
+
X: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_3_5,
|
|
1083
|
+
Y: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_4_5,
|
|
1016
1084
|
Z: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_5_5,
|
|
1017
1085
|
};
|
|
1018
1086
|
|
|
@@ -1037,56 +1105,65 @@ class ChineseCipher extends SubstitutionCyclicCipher {
|
|
|
1037
1105
|
}
|
|
1038
1106
|
ChineseCipher.CHINESE_MAP = ChineseCipher.generateMap();
|
|
1039
1107
|
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1108
|
+
const ALPHABET_EN = {
|
|
1109
|
+
A: 'A',
|
|
1110
|
+
B: 'B',
|
|
1111
|
+
C: 'C',
|
|
1112
|
+
D: 'D',
|
|
1113
|
+
E: 'E',
|
|
1114
|
+
F: 'F',
|
|
1115
|
+
G: 'G',
|
|
1116
|
+
H: 'H',
|
|
1117
|
+
I: 'I',
|
|
1118
|
+
J: 'J',
|
|
1119
|
+
K: 'K',
|
|
1120
|
+
L: 'L',
|
|
1121
|
+
M: 'M',
|
|
1122
|
+
N: 'N',
|
|
1123
|
+
O: 'O',
|
|
1124
|
+
P: 'P',
|
|
1125
|
+
Q: 'Q',
|
|
1126
|
+
R: 'R',
|
|
1127
|
+
S: 'S',
|
|
1128
|
+
T: 'T',
|
|
1129
|
+
U: 'U',
|
|
1130
|
+
V: 'V',
|
|
1131
|
+
W: 'W',
|
|
1132
|
+
X: 'X',
|
|
1133
|
+
Y: 'Y',
|
|
1134
|
+
Z: 'Z',
|
|
1135
|
+
};
|
|
1136
|
+
const ALPHABET_EN_ARRAY = Object.values(ALPHABET_EN);
|
|
1137
|
+
|
|
1138
|
+
class ShiftCipher extends SubstitutionCipher {
|
|
1139
|
+
constructor(alphabet, shift, inputMode = 'letter', outputMode = 'letter') {
|
|
1140
|
+
let encodeMap = {};
|
|
1141
|
+
for (let i = 0; i < alphabet.length; i++) {
|
|
1142
|
+
let fromChar;
|
|
1143
|
+
let toChar;
|
|
1144
|
+
switch (inputMode) {
|
|
1145
|
+
case 'index':
|
|
1146
|
+
fromChar = i.toString();
|
|
1147
|
+
break;
|
|
1148
|
+
case 'letter':
|
|
1149
|
+
fromChar = alphabet[i];
|
|
1150
|
+
break;
|
|
1052
1151
|
}
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
? shiftedIndex.toString()
|
|
1062
|
-
: this.alphabet[shiftedIndex];
|
|
1063
|
-
}
|
|
1064
|
-
decodeToken(token, configuration) {
|
|
1065
|
-
const { shift, inputAsIndex, outputAsIndex } = configuration;
|
|
1066
|
-
let index;
|
|
1067
|
-
if (inputAsIndex) {
|
|
1068
|
-
index = parseInt(token, 10);
|
|
1069
|
-
if (isNaN(index) || index < 0 || index >= this.alphabet.length) {
|
|
1070
|
-
return ''; // invalid index
|
|
1152
|
+
const normalizedShiftedIndex = (((i + shift) % alphabet.length) + alphabet.length) % alphabet.length;
|
|
1153
|
+
switch (outputMode) {
|
|
1154
|
+
case 'index':
|
|
1155
|
+
toChar = normalizedShiftedIndex.toString();
|
|
1156
|
+
break;
|
|
1157
|
+
case 'letter':
|
|
1158
|
+
toChar = alphabet[normalizedShiftedIndex];
|
|
1159
|
+
break;
|
|
1071
1160
|
}
|
|
1161
|
+
encodeMap[fromChar] = toChar;
|
|
1072
1162
|
}
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
}
|
|
1078
|
-
const shiftedIndex = (index - shift + this.alphabet.length) % this.alphabet.length;
|
|
1079
|
-
return outputAsIndex
|
|
1080
|
-
? shiftedIndex.toString()
|
|
1081
|
-
: this.alphabet[shiftedIndex];
|
|
1082
|
-
}
|
|
1083
|
-
getAllTokenIndexes(token, shift) {
|
|
1084
|
-
if (!this.alphabet.includes(token))
|
|
1085
|
-
return []; // invalid token
|
|
1086
|
-
const indexes = this.alphabet.flatMap((ch, i) => ch === token
|
|
1087
|
-
? [(i - shift + this.alphabet.length) % this.alphabet.length]
|
|
1088
|
-
: []);
|
|
1089
|
-
return indexes;
|
|
1163
|
+
super(encodeMap);
|
|
1164
|
+
this.alphabet = alphabet;
|
|
1165
|
+
this.inputMode = inputMode;
|
|
1166
|
+
this.outputMode = outputMode;
|
|
1090
1167
|
}
|
|
1091
1168
|
encode(input, configuration, opts) {
|
|
1092
1169
|
const mergedOpts = withDefaultCipherOptions(opts, {
|
|
@@ -1105,97 +1182,47 @@ class ShiftCipher extends Cipher {
|
|
|
1105
1182
|
}
|
|
1106
1183
|
|
|
1107
1184
|
class ShiftAlphabetCipher extends ShiftCipher {
|
|
1108
|
-
constructor() {
|
|
1109
|
-
super(
|
|
1185
|
+
constructor(shift = 1) {
|
|
1186
|
+
super(ALPHABET_EN_ARRAY, shift);
|
|
1110
1187
|
}
|
|
1111
1188
|
}
|
|
1112
|
-
ShiftAlphabetCipher.DEFAULT_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
|
-
];
|
|
1140
1189
|
|
|
1141
|
-
|
|
1142
|
-
|
|
1143
|
-
|
|
1190
|
+
const ALPHABET_NUMBERS = {
|
|
1191
|
+
'0': '0',
|
|
1192
|
+
'1': '1',
|
|
1193
|
+
'2': '2',
|
|
1194
|
+
'3': '3',
|
|
1195
|
+
'4': '4',
|
|
1196
|
+
'5': '5',
|
|
1197
|
+
'6': '6',
|
|
1198
|
+
'7': '7',
|
|
1199
|
+
'8': '8',
|
|
1200
|
+
'9': '9',
|
|
1201
|
+
};
|
|
1202
|
+
const ALPHABET_NUMBERS_ARRAY = Object.values(ALPHABET_NUMBERS);
|
|
1203
|
+
|
|
1204
|
+
class ShiftRotorCipher extends SubstitutionCipher {
|
|
1205
|
+
constructor(baseAlphabet, rotors, shifts) {
|
|
1206
|
+
let encodeMap = {};
|
|
1207
|
+
if (rotors.length !== shifts.length) {
|
|
1208
|
+
throw new Error(`Invalid number of shifts: expected ${rotors.length}, got ${shifts.length}`);
|
|
1209
|
+
}
|
|
1144
1210
|
if (rotors.length === 0)
|
|
1145
1211
|
throw new Error('At least one rotor is required');
|
|
1146
|
-
|
|
1147
|
-
|
|
1148
|
-
}
|
|
1149
|
-
encodeToken(token, configuration) {
|
|
1150
|
-
const { shifts = [], outputAsIndex, inputAsIndex } = configuration;
|
|
1151
|
-
let results = [];
|
|
1152
|
-
let lastSymbol = token;
|
|
1153
|
-
const baseSymbolIndex = this.baseAlphabet.encodeToken(lastSymbol, {
|
|
1154
|
-
shift: 0,
|
|
1155
|
-
inputAsIndex: false,
|
|
1156
|
-
outputAsIndex: true,
|
|
1157
|
-
});
|
|
1158
|
-
for (let i = 0; i < this.rotors.length; i++) {
|
|
1159
|
-
const rotor = this.rotors[i];
|
|
1160
|
-
const shift = shifts[i % shifts.length] ?? 0;
|
|
1161
|
-
lastSymbol = rotor.encodeToken(baseSymbolIndex, {
|
|
1162
|
-
shift,
|
|
1163
|
-
inputAsIndex: true,
|
|
1164
|
-
outputAsIndex: false,
|
|
1165
|
-
});
|
|
1166
|
-
results.push(lastSymbol);
|
|
1212
|
+
if (rotors.some((rotor) => rotor.length !== baseAlphabet.length)) {
|
|
1213
|
+
throw new Error('All rotors must have the same length as the base alphabet');
|
|
1167
1214
|
}
|
|
1168
|
-
|
|
1169
|
-
|
|
1170
|
-
|
|
1171
|
-
|
|
1172
|
-
|
|
1173
|
-
|
|
1174
|
-
|
|
1175
|
-
|
|
1176
|
-
|
|
1177
|
-
let includesIn = [];
|
|
1178
|
-
// Reverse through rotors for decoding
|
|
1179
|
-
for (let i = this.rotors.length - 1; i >= 0; i--) {
|
|
1180
|
-
const rotor = this.rotors[i];
|
|
1181
|
-
const shift = shifts[i % shifts.length] ?? 0;
|
|
1182
|
-
const symbol = symbols[i];
|
|
1183
|
-
const ocurencies = rotor.getAllTokenIndexes(symbol, shift);
|
|
1184
|
-
includesIn.push(ocurencies);
|
|
1185
|
-
}
|
|
1186
|
-
// Find intersection of all arrays (items common to all rotors)
|
|
1187
|
-
const intersection = includesIn.reduce((acc, arr) => acc.filter((x) => arr.includes(x)));
|
|
1188
|
-
// If there is exactly one common index, decode it
|
|
1189
|
-
if (intersection.length !== 1) {
|
|
1190
|
-
throw new Error(`Invalid decoding — intersection size is ${intersection.length}`);
|
|
1215
|
+
for (let i = 0; i < baseAlphabet.length; i++) {
|
|
1216
|
+
let fromChar = baseAlphabet[i];
|
|
1217
|
+
let toChar = '';
|
|
1218
|
+
for (let j = 0; j < rotors.length; j++) {
|
|
1219
|
+
const rotor = rotors[j];
|
|
1220
|
+
const normalizedShiftedIndex = (((i + shifts[j]) % rotor.length) + rotor.length) % rotor.length;
|
|
1221
|
+
toChar += rotor[normalizedShiftedIndex];
|
|
1222
|
+
}
|
|
1223
|
+
encodeMap[fromChar] = toChar;
|
|
1191
1224
|
}
|
|
1192
|
-
|
|
1193
|
-
const result = this.baseAlphabet.decodeToken(finalIndex.toString(), {
|
|
1194
|
-
shift: 0,
|
|
1195
|
-
inputAsIndex: true,
|
|
1196
|
-
outputAsIndex: outputAsIndex,
|
|
1197
|
-
});
|
|
1198
|
-
return result;
|
|
1225
|
+
super(encodeMap);
|
|
1199
1226
|
}
|
|
1200
1227
|
encode(input, configuration, opts) {
|
|
1201
1228
|
const mergedOpts = withDefaultCipherOptions(opts, {
|
|
@@ -1222,53 +1249,17 @@ class ShiftRotorCipher extends Cipher {
|
|
|
1222
1249
|
}
|
|
1223
1250
|
|
|
1224
1251
|
class ShiftRotorABCDCipher extends ShiftRotorCipher {
|
|
1225
|
-
constructor() {
|
|
1252
|
+
constructor(shifts) {
|
|
1226
1253
|
const rotors = [];
|
|
1227
|
-
const baseAlphabet =
|
|
1254
|
+
const baseAlphabet = ShiftRotorABCDCipher.BASE_ALPHABET;
|
|
1228
1255
|
for (let i = 0; i < ShiftRotorABCDCipher.ROTOR_ALPHABETS.length; i++) {
|
|
1229
|
-
rotors.push(
|
|
1256
|
+
rotors.push(ShiftRotorABCDCipher.ROTOR_ALPHABETS[i]);
|
|
1230
1257
|
}
|
|
1231
|
-
super(baseAlphabet, rotors);
|
|
1258
|
+
super(baseAlphabet, rotors, shifts);
|
|
1232
1259
|
}
|
|
1233
1260
|
}
|
|
1234
|
-
|
|
1235
|
-
|
|
1236
|
-
'B',
|
|
1237
|
-
'C',
|
|
1238
|
-
'D',
|
|
1239
|
-
'E',
|
|
1240
|
-
'F',
|
|
1241
|
-
'G',
|
|
1242
|
-
'H',
|
|
1243
|
-
'I',
|
|
1244
|
-
'J',
|
|
1245
|
-
'K',
|
|
1246
|
-
'L',
|
|
1247
|
-
'M',
|
|
1248
|
-
'N',
|
|
1249
|
-
'O',
|
|
1250
|
-
'P',
|
|
1251
|
-
'Q',
|
|
1252
|
-
'R',
|
|
1253
|
-
'S',
|
|
1254
|
-
'T',
|
|
1255
|
-
'U',
|
|
1256
|
-
'V',
|
|
1257
|
-
'W',
|
|
1258
|
-
'X',
|
|
1259
|
-
'Y',
|
|
1260
|
-
'Z',
|
|
1261
|
-
'0',
|
|
1262
|
-
'1',
|
|
1263
|
-
'2',
|
|
1264
|
-
'3',
|
|
1265
|
-
'4',
|
|
1266
|
-
'5',
|
|
1267
|
-
'6',
|
|
1268
|
-
'7',
|
|
1269
|
-
'8',
|
|
1270
|
-
'9',
|
|
1271
|
-
];
|
|
1261
|
+
// base alphabet: A-Z + 0-9
|
|
1262
|
+
ShiftRotorABCDCipher.BASE_ALPHABET = [...ALPHABET_EN_ARRAY, ...ALPHABET_NUMBERS_ARRAY];
|
|
1272
1263
|
ShiftRotorABCDCipher.REPEAT_ALPHABET = ['A', 'B', 'C', 'D'];
|
|
1273
1264
|
ShiftRotorABCDCipher.generateRepeatRotorAlphabet = (repeatAlphabet, repeat) => {
|
|
1274
1265
|
let output = [];
|
|
@@ -1282,9 +1273,9 @@ ShiftRotorABCDCipher.generateRepeatRotorAlphabet = (repeatAlphabet, repeat) => {
|
|
|
1282
1273
|
return output;
|
|
1283
1274
|
};
|
|
1284
1275
|
ShiftRotorABCDCipher.ROTOR_ALPHABETS = [
|
|
1285
|
-
ShiftRotorABCDCipher.generateRepeatRotorAlphabet(ShiftRotorABCDCipher.REPEAT_ALPHABET, 1),
|
|
1286
|
-
ShiftRotorABCDCipher.generateRepeatRotorAlphabet(ShiftRotorABCDCipher.REPEAT_ALPHABET, 3),
|
|
1287
1276
|
ShiftRotorABCDCipher.generateRepeatRotorAlphabet(ShiftRotorABCDCipher.REPEAT_ALPHABET, 9),
|
|
1277
|
+
ShiftRotorABCDCipher.generateRepeatRotorAlphabet(ShiftRotorABCDCipher.REPEAT_ALPHABET, 3),
|
|
1278
|
+
ShiftRotorABCDCipher.generateRepeatRotorAlphabet(ShiftRotorABCDCipher.REPEAT_ALPHABET, 1),
|
|
1288
1279
|
];
|
|
1289
1280
|
|
|
1290
1281
|
class Substitution2DCipher extends SubstitutionCyclicCipher {
|
|
@@ -1384,6 +1375,7 @@ class ChessCipher extends Substitution2DCipher {
|
|
|
1384
1375
|
super(encodeAlphabet2D, horizontalKey, verticalKey);
|
|
1385
1376
|
}
|
|
1386
1377
|
}
|
|
1378
|
+
// base alphabet: A-Z + 0-9
|
|
1387
1379
|
ChessCipher.BASE_ALPHABET = [
|
|
1388
1380
|
'A',
|
|
1389
1381
|
'B',
|
|
@@ -1423,4 +1415,68 @@ ChessCipher.BASE_ALPHABET = [
|
|
|
1423
1415
|
'9',
|
|
1424
1416
|
];
|
|
1425
1417
|
|
|
1426
|
-
|
|
1418
|
+
class LetterNumberCipher extends SubstitutionCipher {
|
|
1419
|
+
constructor() {
|
|
1420
|
+
super(LetterNumberCipher.ALPHABET);
|
|
1421
|
+
}
|
|
1422
|
+
encode(input, configuration, opts) {
|
|
1423
|
+
const mergedOpts = withDefaultCipherOptions(opts, {
|
|
1424
|
+
input: {
|
|
1425
|
+
caseSensitive: false,
|
|
1426
|
+
letterSeparator: '',
|
|
1427
|
+
wordSeparator: ' ',
|
|
1428
|
+
},
|
|
1429
|
+
output: {
|
|
1430
|
+
casing: 'original',
|
|
1431
|
+
letterSeparator: '-',
|
|
1432
|
+
wordSeparator: '---',
|
|
1433
|
+
},
|
|
1434
|
+
});
|
|
1435
|
+
return super.encode(input, configuration, mergedOpts);
|
|
1436
|
+
}
|
|
1437
|
+
decode(input, configuration, opts) {
|
|
1438
|
+
const mergedOpts = withDefaultCipherOptions(opts, {
|
|
1439
|
+
input: {
|
|
1440
|
+
caseSensitive: false,
|
|
1441
|
+
letterSeparator: '-',
|
|
1442
|
+
wordSeparator: '---',
|
|
1443
|
+
},
|
|
1444
|
+
output: {
|
|
1445
|
+
casing: 'lower',
|
|
1446
|
+
letterSeparator: '',
|
|
1447
|
+
wordSeparator: ' ',
|
|
1448
|
+
},
|
|
1449
|
+
});
|
|
1450
|
+
return super.decode(input, configuration, mergedOpts);
|
|
1451
|
+
}
|
|
1452
|
+
}
|
|
1453
|
+
LetterNumberCipher.ALPHABET = {
|
|
1454
|
+
A: '1',
|
|
1455
|
+
B: '2',
|
|
1456
|
+
C: '3',
|
|
1457
|
+
D: '4',
|
|
1458
|
+
E: '5',
|
|
1459
|
+
F: '6',
|
|
1460
|
+
G: '7',
|
|
1461
|
+
H: '8',
|
|
1462
|
+
I: '9',
|
|
1463
|
+
J: '10',
|
|
1464
|
+
K: '11',
|
|
1465
|
+
L: '12',
|
|
1466
|
+
M: '13',
|
|
1467
|
+
N: '14',
|
|
1468
|
+
O: '15',
|
|
1469
|
+
P: '16',
|
|
1470
|
+
Q: '17',
|
|
1471
|
+
R: '18',
|
|
1472
|
+
S: '19',
|
|
1473
|
+
T: '20',
|
|
1474
|
+
U: '21',
|
|
1475
|
+
V: '22',
|
|
1476
|
+
W: '23',
|
|
1477
|
+
X: '24',
|
|
1478
|
+
Y: '25',
|
|
1479
|
+
Z: '26',
|
|
1480
|
+
};
|
|
1481
|
+
|
|
1482
|
+
export { ChessCipher, ChineseCipher, Cipher, DifferentCrossCipher, FractionCipher, HebrewCrossCipher, LetterNumberCipher, MobileCipher, MorseCodeCipher, PolandCrossCipher, ShiftAlphabetCipher, ShiftRotorABCDCipher, SmallCrossCipher, SpiderCipher, Substitution2DCipher, SubstitutionCipher, TableKeyFiveToFiveCipher };
|