kidscipher 0.1.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,15 +27,391 @@ function styleInject(css, ref) {
27
27
  }
28
28
  }
29
29
 
30
- var css_248z = "@import './Kidscipher.css';\r\n";
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
+ var KidscipherGlyphs_1;
34
+ var hasRequiredKidscipherGlyphs;
35
+
36
+ function requireKidscipherGlyphs () {
37
+ if (hasRequiredKidscipherGlyphs) return KidscipherGlyphs_1;
38
+ hasRequiredKidscipherGlyphs = 1;
39
+ // Auto-generated by generate-font
40
+ const KidscipherGlyphs = Object.freeze({
41
+ POLAND_CROSS_A: '\u{e001}',
42
+ POLAND_CROSS_B: '\u{e002}',
43
+ POLAND_CROSS_C: '\u{e003}',
44
+ POLAND_CROSS_CH: '\u{e004}',
45
+ POLAND_CROSS_D: '\u{e005}',
46
+ POLAND_CROSS_E: '\u{e006}',
47
+ POLAND_CROSS_F: '\u{e007}',
48
+ POLAND_CROSS_G: '\u{e008}',
49
+ POLAND_CROSS_H: '\u{e009}',
50
+ POLAND_CROSS_I: '\u{e00a}',
51
+ POLAND_CROSS_J: '\u{e00b}',
52
+ POLAND_CROSS_K: '\u{e00c}',
53
+ POLAND_CROSS_L: '\u{e00d}',
54
+ POLAND_CROSS_M: '\u{e00e}',
55
+ POLAND_CROSS_N: '\u{e00f}',
56
+ POLAND_CROSS_O: '\u{e010}',
57
+ POLAND_CROSS_P: '\u{e011}',
58
+ POLAND_CROSS_Q: '\u{e012}',
59
+ POLAND_CROSS_R: '\u{e013}',
60
+ POLAND_CROSS_S: '\u{e014}',
61
+ POLAND_CROSS_T: '\u{e015}',
62
+ POLAND_CROSS_U: '\u{e016}',
63
+ POLAND_CROSS_V: '\u{e017}',
64
+ POLAND_CROSS_W: '\u{e018}',
65
+ POLAND_CROSS_X: '\u{e019}',
66
+ POLAND_CROSS_Y: '\u{e01a}',
67
+ POLAND_CROSS_Z: '\u{e01b}',
68
+ CHINESE_A_1: '\u{e01c}',
69
+ CHINESE_A_10: '\u{e01d}',
70
+ CHINESE_A_2: '\u{e01e}',
71
+ CHINESE_A_3: '\u{e01f}',
72
+ CHINESE_A_4: '\u{e020}',
73
+ CHINESE_A_5: '\u{e021}',
74
+ CHINESE_A_6: '\u{e022}',
75
+ CHINESE_A_7: '\u{e023}',
76
+ CHINESE_A_8: '\u{e024}',
77
+ CHINESE_A_9: '\u{e025}',
78
+ CHINESE_B_1: '\u{e026}',
79
+ CHINESE_B_10: '\u{e027}',
80
+ CHINESE_B_2: '\u{e028}',
81
+ CHINESE_B_3: '\u{e029}',
82
+ CHINESE_B_4: '\u{e02a}',
83
+ CHINESE_B_5: '\u{e02b}',
84
+ CHINESE_B_6: '\u{e02c}',
85
+ CHINESE_B_7: '\u{e02d}',
86
+ CHINESE_B_8: '\u{e02e}',
87
+ CHINESE_B_9: '\u{e02f}',
88
+ CHINESE_C_1: '\u{e030}',
89
+ CHINESE_C_10: '\u{e031}',
90
+ CHINESE_C_2: '\u{e032}',
91
+ CHINESE_C_3: '\u{e033}',
92
+ CHINESE_C_4: '\u{e034}',
93
+ CHINESE_C_5: '\u{e035}',
94
+ CHINESE_C_6: '\u{e036}',
95
+ CHINESE_C_7: '\u{e037}',
96
+ CHINESE_C_8: '\u{e038}',
97
+ CHINESE_C_9: '\u{e039}',
98
+ CHINESE_D_1: '\u{e03a}',
99
+ CHINESE_D_10: '\u{e03b}',
100
+ CHINESE_D_2: '\u{e03c}',
101
+ CHINESE_D_3: '\u{e03d}',
102
+ CHINESE_D_4: '\u{e03e}',
103
+ CHINESE_D_5: '\u{e03f}',
104
+ CHINESE_D_6: '\u{e040}',
105
+ CHINESE_D_7: '\u{e041}',
106
+ CHINESE_D_8: '\u{e042}',
107
+ CHINESE_D_9: '\u{e043}',
108
+ CHINESE_E_1: '\u{e044}',
109
+ CHINESE_E_10: '\u{e045}',
110
+ CHINESE_E_2: '\u{e046}',
111
+ CHINESE_E_3: '\u{e047}',
112
+ CHINESE_E_4: '\u{e048}',
113
+ CHINESE_E_5: '\u{e049}',
114
+ CHINESE_E_6: '\u{e04a}',
115
+ CHINESE_E_7: '\u{e04b}',
116
+ CHINESE_E_8: '\u{e04c}',
117
+ CHINESE_E_9: '\u{e04d}',
118
+ CHINESE_F_1: '\u{e04e}',
119
+ CHINESE_F_10: '\u{e04f}',
120
+ CHINESE_F_2: '\u{e050}',
121
+ CHINESE_F_3: '\u{e051}',
122
+ CHINESE_F_4: '\u{e052}',
123
+ CHINESE_F_5: '\u{e053}',
124
+ CHINESE_F_6: '\u{e054}',
125
+ CHINESE_F_7: '\u{e055}',
126
+ CHINESE_F_8: '\u{e056}',
127
+ CHINESE_F_9: '\u{e057}',
128
+ CHINESE_G_1: '\u{e058}',
129
+ CHINESE_G_10: '\u{e059}',
130
+ CHINESE_G_2: '\u{e05a}',
131
+ CHINESE_G_3: '\u{e05b}',
132
+ CHINESE_G_4: '\u{e05c}',
133
+ CHINESE_G_5: '\u{e05d}',
134
+ CHINESE_G_6: '\u{e05e}',
135
+ CHINESE_G_7: '\u{e05f}',
136
+ CHINESE_G_8: '\u{e060}',
137
+ CHINESE_G_9: '\u{e061}',
138
+ CHINESE_H_1: '\u{e062}',
139
+ CHINESE_H_10: '\u{e063}',
140
+ CHINESE_H_2: '\u{e064}',
141
+ CHINESE_H_3: '\u{e065}',
142
+ CHINESE_H_4: '\u{e066}',
143
+ CHINESE_H_5: '\u{e067}',
144
+ CHINESE_H_6: '\u{e068}',
145
+ CHINESE_H_7: '\u{e069}',
146
+ CHINESE_H_8: '\u{e06a}',
147
+ CHINESE_H_9: '\u{e06b}',
148
+ CHINESE_I_1: '\u{e06c}',
149
+ CHINESE_I_10: '\u{e06d}',
150
+ CHINESE_I_2: '\u{e06e}',
151
+ CHINESE_I_3: '\u{e06f}',
152
+ CHINESE_I_4: '\u{e070}',
153
+ CHINESE_I_5: '\u{e071}',
154
+ CHINESE_I_6: '\u{e072}',
155
+ CHINESE_I_7: '\u{e073}',
156
+ CHINESE_I_8: '\u{e074}',
157
+ CHINESE_I_9: '\u{e075}',
158
+ CHINESE_J_1: '\u{e076}',
159
+ CHINESE_J_10: '\u{e077}',
160
+ CHINESE_J_2: '\u{e078}',
161
+ CHINESE_J_3: '\u{e079}',
162
+ CHINESE_J_4: '\u{e07a}',
163
+ CHINESE_J_5: '\u{e07b}',
164
+ CHINESE_J_6: '\u{e07c}',
165
+ CHINESE_J_7: '\u{e07d}',
166
+ CHINESE_J_8: '\u{e07e}',
167
+ CHINESE_J_9: '\u{e07f}',
168
+ CHINESE_K_1: '\u{e080}',
169
+ CHINESE_K_10: '\u{e081}',
170
+ CHINESE_K_2: '\u{e082}',
171
+ CHINESE_K_3: '\u{e083}',
172
+ CHINESE_K_4: '\u{e084}',
173
+ CHINESE_K_5: '\u{e085}',
174
+ CHINESE_K_6: '\u{e086}',
175
+ CHINESE_K_7: '\u{e087}',
176
+ CHINESE_K_8: '\u{e088}',
177
+ CHINESE_K_9: '\u{e089}',
178
+ CHINESE_L_1: '\u{e08a}',
179
+ CHINESE_L_10: '\u{e08b}',
180
+ CHINESE_L_2: '\u{e08c}',
181
+ CHINESE_L_3: '\u{e08d}',
182
+ CHINESE_L_4: '\u{e08e}',
183
+ CHINESE_L_5: '\u{e08f}',
184
+ CHINESE_L_6: '\u{e090}',
185
+ CHINESE_L_7: '\u{e091}',
186
+ CHINESE_L_8: '\u{e092}',
187
+ CHINESE_L_9: '\u{e093}',
188
+ CHINESE_M_1: '\u{e094}',
189
+ CHINESE_M_10: '\u{e095}',
190
+ CHINESE_M_2: '\u{e096}',
191
+ CHINESE_M_3: '\u{e097}',
192
+ CHINESE_M_4: '\u{e098}',
193
+ CHINESE_M_5: '\u{e099}',
194
+ CHINESE_M_6: '\u{e09a}',
195
+ CHINESE_M_7: '\u{e09b}',
196
+ CHINESE_M_8: '\u{e09c}',
197
+ CHINESE_M_9: '\u{e09d}',
198
+ CHINESE_N_1: '\u{e09e}',
199
+ CHINESE_N_10: '\u{e09f}',
200
+ CHINESE_N_2: '\u{e0a0}',
201
+ CHINESE_N_3: '\u{e0a1}',
202
+ CHINESE_N_4: '\u{e0a2}',
203
+ CHINESE_N_5: '\u{e0a3}',
204
+ CHINESE_N_6: '\u{e0a4}',
205
+ CHINESE_N_7: '\u{e0a5}',
206
+ CHINESE_N_8: '\u{e0a6}',
207
+ CHINESE_N_9: '\u{e0a7}',
208
+ CHINESE_O_1: '\u{e0a8}',
209
+ CHINESE_O_10: '\u{e0a9}',
210
+ CHINESE_O_2: '\u{e0aa}',
211
+ CHINESE_O_3: '\u{e0ab}',
212
+ CHINESE_O_4: '\u{e0ac}',
213
+ CHINESE_O_5: '\u{e0ad}',
214
+ CHINESE_O_6: '\u{e0ae}',
215
+ CHINESE_O_7: '\u{e0af}',
216
+ CHINESE_O_8: '\u{e0b0}',
217
+ CHINESE_O_9: '\u{e0b1}',
218
+ CHINESE_P_1: '\u{e0b2}',
219
+ CHINESE_P_10: '\u{e0b3}',
220
+ CHINESE_P_2: '\u{e0b4}',
221
+ CHINESE_P_3: '\u{e0b5}',
222
+ CHINESE_P_4: '\u{e0b6}',
223
+ CHINESE_P_5: '\u{e0b7}',
224
+ CHINESE_P_6: '\u{e0b8}',
225
+ CHINESE_P_7: '\u{e0b9}',
226
+ CHINESE_P_8: '\u{e0ba}',
227
+ CHINESE_P_9: '\u{e0bb}',
228
+ CHINESE_R_1: '\u{e0bc}',
229
+ CHINESE_R_10: '\u{e0bd}',
230
+ CHINESE_R_2: '\u{e0be}',
231
+ CHINESE_R_3: '\u{e0bf}',
232
+ CHINESE_R_4: '\u{e0c0}',
233
+ CHINESE_R_5: '\u{e0c1}',
234
+ CHINESE_R_6: '\u{e0c2}',
235
+ CHINESE_R_7: '\u{e0c3}',
236
+ CHINESE_R_8: '\u{e0c4}',
237
+ CHINESE_R_9: '\u{e0c5}',
238
+ CHINESE_S_1: '\u{e0c6}',
239
+ CHINESE_S_10: '\u{e0c7}',
240
+ CHINESE_S_2: '\u{e0c8}',
241
+ CHINESE_S_3: '\u{e0c9}',
242
+ CHINESE_S_4: '\u{e0ca}',
243
+ CHINESE_S_5: '\u{e0cb}',
244
+ CHINESE_S_6: '\u{e0cc}',
245
+ CHINESE_S_7: '\u{e0cd}',
246
+ CHINESE_S_8: '\u{e0ce}',
247
+ CHINESE_S_9: '\u{e0cf}',
248
+ CHINESE_T_1: '\u{e0d0}',
249
+ CHINESE_T_10: '\u{e0d1}',
250
+ CHINESE_T_2: '\u{e0d2}',
251
+ CHINESE_T_3: '\u{e0d3}',
252
+ CHINESE_T_4: '\u{e0d4}',
253
+ CHINESE_T_5: '\u{e0d5}',
254
+ CHINESE_T_6: '\u{e0d6}',
255
+ CHINESE_T_7: '\u{e0d7}',
256
+ CHINESE_T_8: '\u{e0d8}',
257
+ CHINESE_T_9: '\u{e0d9}',
258
+ CHINESE_U_1: '\u{e0da}',
259
+ CHINESE_U_10: '\u{e0db}',
260
+ CHINESE_U_2: '\u{e0dc}',
261
+ CHINESE_U_3: '\u{e0dd}',
262
+ CHINESE_U_4: '\u{e0de}',
263
+ CHINESE_U_5: '\u{e0df}',
264
+ CHINESE_U_6: '\u{e0e0}',
265
+ CHINESE_U_7: '\u{e0e1}',
266
+ CHINESE_U_8: '\u{e0e2}',
267
+ CHINESE_U_9: '\u{e0e3}',
268
+ CHINESE_V_1: '\u{e0e4}',
269
+ CHINESE_V_10: '\u{e0e5}',
270
+ CHINESE_V_2: '\u{e0e6}',
271
+ CHINESE_V_3: '\u{e0e7}',
272
+ CHINESE_V_4: '\u{e0e8}',
273
+ CHINESE_V_5: '\u{e0e9}',
274
+ CHINESE_V_6: '\u{e0ea}',
275
+ CHINESE_V_7: '\u{e0eb}',
276
+ CHINESE_V_8: '\u{e0ec}',
277
+ CHINESE_V_9: '\u{e0ed}',
278
+ CHINESE_W_1: '\u{e0ee}',
279
+ CHINESE_W_10: '\u{e0ef}',
280
+ CHINESE_W_2: '\u{e0f0}',
281
+ CHINESE_W_3: '\u{e0f1}',
282
+ CHINESE_W_4: '\u{e0f2}',
283
+ CHINESE_W_5: '\u{e0f3}',
284
+ CHINESE_W_6: '\u{e0f4}',
285
+ CHINESE_W_7: '\u{e0f5}',
286
+ CHINESE_W_8: '\u{e0f6}',
287
+ CHINESE_W_9: '\u{e0f7}',
288
+ CHINESE_X_1: '\u{e0f8}',
289
+ CHINESE_X_10: '\u{e0f9}',
290
+ CHINESE_X_2: '\u{e0fa}',
291
+ CHINESE_X_3: '\u{e0fb}',
292
+ CHINESE_X_4: '\u{e0fc}',
293
+ CHINESE_X_5: '\u{e0fd}',
294
+ CHINESE_X_6: '\u{e0fe}',
295
+ CHINESE_X_7: '\u{e0ff}',
296
+ CHINESE_X_8: '\u{e100}',
297
+ CHINESE_X_9: '\u{e101}',
298
+ CHINESE_Y_1: '\u{e102}',
299
+ CHINESE_Y_10: '\u{e103}',
300
+ CHINESE_Y_2: '\u{e104}',
301
+ CHINESE_Y_3: '\u{e105}',
302
+ CHINESE_Y_4: '\u{e106}',
303
+ CHINESE_Y_5: '\u{e107}',
304
+ CHINESE_Y_6: '\u{e108}',
305
+ CHINESE_Y_7: '\u{e109}',
306
+ CHINESE_Y_8: '\u{e10a}',
307
+ CHINESE_Y_9: '\u{e10b}',
308
+ CHINESE_Z_1: '\u{e10c}',
309
+ CHINESE_Z_10: '\u{e10d}',
310
+ CHINESE_Z_2: '\u{e10e}',
311
+ CHINESE_Z_3: '\u{e10f}',
312
+ CHINESE_Z_4: '\u{e110}',
313
+ CHINESE_Z_5: '\u{e111}',
314
+ CHINESE_Z_6: '\u{e112}',
315
+ CHINESE_Z_7: '\u{e113}',
316
+ CHINESE_Z_8: '\u{e114}',
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
+ });
344
+ KidscipherGlyphs_1 = { KidscipherGlyphs };
345
+ return KidscipherGlyphs_1;
346
+ }
347
+
348
+ var KidscipherGlyphsExports = requireKidscipherGlyphs();
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
+
33
406
  class Cipher {
34
407
  encode(input, configuration, opts) {
35
- const { caseSensitive = false, letterSeparator: inputLetterSeparator = '', wordSeparator: inputWordSeparator = '///', } = opts?.input || {};
408
+ const { caseSensitive = false, normalizeDiacritics = true, letterSeparator: inputLetterSeparator = '', wordSeparator: inputWordSeparator = '///', } = opts?.input || {};
36
409
  const { casing = 'original', letterSeparator: outputLetterSeparator = '', wordSeparator: outputWordSeparator = ' ', } = opts?.output || {};
410
+ const preprocessedInput = processingPipeline(input, [
411
+ Processor.normalizeDiacritics(normalizeDiacritics),
412
+ ]);
37
413
  // normalize input into words and letters
38
- const words = input.split(inputWordSeparator);
414
+ const words = preprocessedInput.split(inputWordSeparator);
39
415
  const encodedWords = words.map((word) => {
40
416
  const letters = inputLetterSeparator
41
417
  ? word.split(inputLetterSeparator)
@@ -58,10 +434,13 @@ class Cipher {
58
434
  return encodedWords.join(outputWordSeparator);
59
435
  }
60
436
  decode(input, configuration, opts) {
61
- const { caseSensitive = false, letterSeparator: inputLetterSeparator = '', wordSeparator: inputWordSeparator = ' ', } = opts?.input || {};
437
+ const { caseSensitive = false, normalizeDiacritics = false, letterSeparator: inputLetterSeparator = '', wordSeparator: inputWordSeparator = ' ', } = opts?.input || {};
62
438
  const { casing = 'original', letterSeparator: outputLetterSeparator = '', wordSeparator: outputWordSeparator = ' ', } = opts?.output || {};
439
+ const preprocessedInput = processingPipeline(input, [
440
+ Processor.normalizeDiacritics(normalizeDiacritics),
441
+ ]);
63
442
  // split encoded text into words
64
- const words = input.split(inputWordSeparator);
443
+ const words = preprocessedInput.split(inputWordSeparator);
65
444
  const decodedWords = words.map((word) => {
66
445
  const symbols = word.split(inputLetterSeparator);
67
446
  return symbols
@@ -102,6 +481,7 @@ function withDefaultCipherOptions(opts, defaults) {
102
481
  return {
103
482
  input: {
104
483
  caseSensitive: false,
484
+ normalizeDiacritics: false,
105
485
  letterSeparator: '',
106
486
  wordSeparator: ' ',
107
487
  ...defaults?.input,
@@ -125,7 +505,7 @@ class MorseCodeCipher extends SubstitutionCipher {
125
505
  const { dotDashMapping = { dot: '.', dash: '-' } } = configuration || {};
126
506
  const mergedOpts = withDefaultCipherOptions(opts, {
127
507
  input: {
128
- caseSensitive: true,
508
+ caseSensitive: false,
129
509
  letterSeparator: '',
130
510
  wordSeparator: ' ',
131
511
  },
@@ -154,7 +534,7 @@ class MorseCodeCipher extends SubstitutionCipher {
154
534
  const { dotDashMapping = { dot: '.', dash: '-' } } = configuration || {};
155
535
  const mergedOpts = withDefaultCipherOptions(opts, {
156
536
  input: {
157
- caseSensitive: true,
537
+ caseSensitive: false,
158
538
  letterSeparator: '/',
159
539
  wordSeparator: '///',
160
540
  },
@@ -216,47 +596,208 @@ MorseCodeCipher.MORSE_CODE_MAP = {
216
596
  '9': '----.',
217
597
  };
218
598
 
219
- var KidscipherGlyphs_1;
220
- var hasRequiredKidscipherGlyphs;
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
+ };
221
662
 
222
- function requireKidscipherGlyphs () {
223
- if (hasRequiredKidscipherGlyphs) return KidscipherGlyphs_1;
224
- hasRequiredKidscipherGlyphs = 1;
225
- // Auto-generated by generate-font
226
- const KidscipherGlyphs = Object.freeze({
227
- POLAND_CROSS_A: '\u{64}',
228
- POLAND_CROSS_B: '\u{65}',
229
- POLAND_CROSS_C: '\u{66}',
230
- POLAND_CROSS_CH: '\u{67}',
231
- POLAND_CROSS_D: '\u{68}',
232
- POLAND_CROSS_E: '\u{69}',
233
- POLAND_CROSS_F: '\u{6a}',
234
- POLAND_CROSS_G: '\u{6b}',
235
- POLAND_CROSS_H: '\u{6c}',
236
- POLAND_CROSS_I: '\u{6d}',
237
- POLAND_CROSS_J: '\u{6e}',
238
- POLAND_CROSS_K: '\u{6f}',
239
- POLAND_CROSS_L: '\u{70}',
240
- POLAND_CROSS_M: '\u{71}',
241
- POLAND_CROSS_N: '\u{72}',
242
- POLAND_CROSS_O: '\u{73}',
243
- POLAND_CROSS_P: '\u{74}',
244
- POLAND_CROSS_Q: '\u{75}',
245
- POLAND_CROSS_R: '\u{76}',
246
- POLAND_CROSS_S: '\u{77}',
247
- POLAND_CROSS_T: '\u{78}',
248
- POLAND_CROSS_U: '\u{79}',
249
- POLAND_CROSS_V: '\u{7a}',
250
- POLAND_CROSS_W: '\u{7b}',
251
- POLAND_CROSS_X: '\u{7c}',
252
- POLAND_CROSS_Y: '\u{7d}',
253
- POLAND_CROSS_Z: '\u{7e}'
254
- });
255
- KidscipherGlyphs_1 = { KidscipherGlyphs };
256
- return KidscipherGlyphs_1;
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
+ }
257
703
  }
258
704
 
259
- var KidscipherGlyphsExports = requireKidscipherGlyphs();
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
+ };
260
801
 
261
802
  class PolandCrossCipher extends SubstitutionCipher {
262
803
  constructor() {
@@ -293,123 +834,222 @@ PolandCrossCipher.POLAND_CROSS_MAP = {
293
834
  Z: KidscipherGlyphsExports.KidscipherGlyphs.POLAND_CROSS_Z,
294
835
  };
295
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
+
296
858
  class ShiftCipher extends Cipher {
297
- constructor(baseAlphabet, rotors) {
859
+ constructor(alphabet) {
298
860
  super();
299
- // Check all alphabets have the same length
300
- for (const alpha of rotors) {
301
- if (alpha.length !== baseAlphabet.length) {
302
- 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
303
870
  }
304
871
  }
305
- this.baseAlphabet = baseAlphabet;
306
- 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];
307
881
  }
308
- encodeToken(token, configuration) {
309
- const { shifts } = configuration;
310
- let encoded = '';
311
- if (this.baseAlphabet.includes(token)) {
312
- const index = this.baseAlphabet.indexOf(token);
313
- for (let i = 0; i < this.rotors.length; i++) {
314
- const wheel = this.rotors[i];
315
- const shiftedIndex = (index + shifts[i]) % wheel.length;
316
- 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
317
889
  }
318
890
  }
319
- 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;
320
908
  }
321
909
  encode(input, configuration, opts) {
322
910
  const mergedOpts = withDefaultCipherOptions(opts, {
323
- input: {
324
- caseSensitive: false,
325
- letterSeparator: '',
326
- wordSeparator: ' ',
327
- },
328
- output: {
329
- casing: 'original',
330
- letterSeparator: '',
331
- wordSeparator: ' ',
332
- },
911
+ input: { caseSensitive: false, letterSeparator: '', wordSeparator: ' ' },
912
+ output: { casing: 'original', letterSeparator: '', wordSeparator: ' ' },
333
913
  });
334
914
  return super.encode(input, configuration, mergedOpts);
335
915
  }
336
- decodeToken(token, configuration) {
337
- const { shifts } = configuration;
338
- let encoded = '';
339
- if (token.length === this.rotors.length) {
340
- let currentIndex = -1;
341
- for (let i = this.rotors.length - 1; 0 <= i; i--) {
342
- if (this.rotors[i].includes(token[i])) {
343
- currentIndex = this.rotors[i].indexOf(token[i]);
344
- currentIndex =
345
- (currentIndex - shifts[i] + this.baseAlphabet.length) %
346
- this.baseAlphabet.length;
347
- }
348
- else {
349
- // invalid token
350
- return '';
351
- }
352
- }
353
- encoded = this.baseAlphabet[currentIndex];
354
- }
355
- return encoded;
356
- }
357
916
  decode(input, configuration, opts) {
358
917
  const mergedOpts = withDefaultCipherOptions(opts, {
359
- input: {
360
- caseSensitive: false,
361
- letterSeparator: '',
362
- wordSeparator: ' ',
363
- },
364
- output: {
365
- casing: 'original',
366
- letterSeparator: '',
367
- wordSeparator: ' ',
368
- },
918
+ input: { caseSensitive: false, letterSeparator: '', wordSeparator: ' ' },
919
+ output: { casing: 'original', letterSeparator: '', wordSeparator: ' ' },
369
920
  });
370
921
  return super.decode(input, configuration, mergedOpts);
371
922
  }
372
923
  }
373
924
 
374
925
  class ShiftAlphabetCipher extends ShiftCipher {
375
- constructor(alphabet) {
376
- if (!alphabet) {
377
- 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);
378
985
  }
379
- super(alphabet, [alphabet]);
986
+ // we need to reverse it
987
+ return results.reverse().join('');
380
988
  }
381
- encode(input, { shift }, opts) {
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);
1003
+ }
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;
1017
+ }
1018
+ encode(input, configuration, opts) {
382
1019
  const mergedOpts = withDefaultCipherOptions(opts, {
383
- input: {
384
- caseSensitive: false,
385
- letterSeparator: '',
386
- wordSeparator: ' ',
387
- },
1020
+ input: { caseSensitive: false, letterSeparator: '', wordSeparator: ' ' },
388
1021
  output: {
389
1022
  casing: 'original',
390
- letterSeparator: '',
391
- wordSeparator: ' ',
1023
+ letterSeparator: ' ',
1024
+ wordSeparator: ' | ',
392
1025
  },
393
1026
  });
394
- return super.encode(input, { shifts: [shift] }, mergedOpts);
1027
+ return super.encode(input, configuration, mergedOpts);
395
1028
  }
396
- decode(input, { shift }, opts) {
1029
+ decode(input, configuration, opts) {
397
1030
  const mergedOpts = withDefaultCipherOptions(opts, {
398
1031
  input: {
399
1032
  caseSensitive: false,
400
- letterSeparator: '',
401
- wordSeparator: ' ',
402
- },
403
- output: {
404
- casing: 'original',
405
- letterSeparator: '',
406
- wordSeparator: ' ',
1033
+ letterSeparator: ' ',
1034
+ wordSeparator: ' | ',
407
1035
  },
1036
+ output: { casing: 'original', letterSeparator: '', wordSeparator: ' ' },
408
1037
  });
409
- return super.decode(input, { shifts: [shift] }, mergedOpts);
1038
+ return super.decode(input, configuration, mergedOpts);
410
1039
  }
411
1040
  }
412
- 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 = [
413
1053
  'A',
414
1054
  'B',
415
1055
  'C',
@@ -436,9 +1076,42 @@ ShiftAlphabetCipher.DEFAULT_ALPHABET = [
436
1076
  'X',
437
1077
  'Y',
438
1078
  'Z',
1079
+ '0',
1080
+ '1',
1081
+ '2',
1082
+ '3',
1083
+ '4',
1084
+ '5',
1085
+ '6',
1086
+ '7',
1087
+ '8',
1088
+ '9',
1089
+ ];
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]);
1097
+ }
1098
+ }
1099
+ }
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),
439
1106
  ];
440
1107
 
1108
+ exports.ChineseCipher = ChineseCipher;
1109
+ exports.Cipher = Cipher;
1110
+ exports.FractionCipher = FractionCipher;
1111
+ exports.MobileCipher = MobileCipher;
441
1112
  exports.MorseCodeCipher = MorseCodeCipher;
442
1113
  exports.PolandCrossCipher = PolandCrossCipher;
443
1114
  exports.ShiftAlphabetCipher = ShiftAlphabetCipher;
1115
+ exports.ShiftRotorABCDCipher = ShiftRotorABCDCipher;
1116
+ exports.SpiderCipher = SpiderCipher;
444
1117
  exports.SubstitutionCipher = SubstitutionCipher;