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.esm.js CHANGED
@@ -25,15 +25,391 @@ function styleInject(css, ref) {
25
25
  }
26
26
  }
27
27
 
28
- var css_248z = "@import './Kidscipher.css';\r\n";
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
+ var KidscipherGlyphs_1;
32
+ var hasRequiredKidscipherGlyphs;
33
+
34
+ function requireKidscipherGlyphs () {
35
+ if (hasRequiredKidscipherGlyphs) return KidscipherGlyphs_1;
36
+ hasRequiredKidscipherGlyphs = 1;
37
+ // Auto-generated by generate-font
38
+ const KidscipherGlyphs = Object.freeze({
39
+ POLAND_CROSS_A: '\u{e001}',
40
+ POLAND_CROSS_B: '\u{e002}',
41
+ POLAND_CROSS_C: '\u{e003}',
42
+ POLAND_CROSS_CH: '\u{e004}',
43
+ POLAND_CROSS_D: '\u{e005}',
44
+ POLAND_CROSS_E: '\u{e006}',
45
+ POLAND_CROSS_F: '\u{e007}',
46
+ POLAND_CROSS_G: '\u{e008}',
47
+ POLAND_CROSS_H: '\u{e009}',
48
+ POLAND_CROSS_I: '\u{e00a}',
49
+ POLAND_CROSS_J: '\u{e00b}',
50
+ POLAND_CROSS_K: '\u{e00c}',
51
+ POLAND_CROSS_L: '\u{e00d}',
52
+ POLAND_CROSS_M: '\u{e00e}',
53
+ POLAND_CROSS_N: '\u{e00f}',
54
+ POLAND_CROSS_O: '\u{e010}',
55
+ POLAND_CROSS_P: '\u{e011}',
56
+ POLAND_CROSS_Q: '\u{e012}',
57
+ POLAND_CROSS_R: '\u{e013}',
58
+ POLAND_CROSS_S: '\u{e014}',
59
+ POLAND_CROSS_T: '\u{e015}',
60
+ POLAND_CROSS_U: '\u{e016}',
61
+ POLAND_CROSS_V: '\u{e017}',
62
+ POLAND_CROSS_W: '\u{e018}',
63
+ POLAND_CROSS_X: '\u{e019}',
64
+ POLAND_CROSS_Y: '\u{e01a}',
65
+ POLAND_CROSS_Z: '\u{e01b}',
66
+ CHINESE_A_1: '\u{e01c}',
67
+ CHINESE_A_10: '\u{e01d}',
68
+ CHINESE_A_2: '\u{e01e}',
69
+ CHINESE_A_3: '\u{e01f}',
70
+ CHINESE_A_4: '\u{e020}',
71
+ CHINESE_A_5: '\u{e021}',
72
+ CHINESE_A_6: '\u{e022}',
73
+ CHINESE_A_7: '\u{e023}',
74
+ CHINESE_A_8: '\u{e024}',
75
+ CHINESE_A_9: '\u{e025}',
76
+ CHINESE_B_1: '\u{e026}',
77
+ CHINESE_B_10: '\u{e027}',
78
+ CHINESE_B_2: '\u{e028}',
79
+ CHINESE_B_3: '\u{e029}',
80
+ CHINESE_B_4: '\u{e02a}',
81
+ CHINESE_B_5: '\u{e02b}',
82
+ CHINESE_B_6: '\u{e02c}',
83
+ CHINESE_B_7: '\u{e02d}',
84
+ CHINESE_B_8: '\u{e02e}',
85
+ CHINESE_B_9: '\u{e02f}',
86
+ CHINESE_C_1: '\u{e030}',
87
+ CHINESE_C_10: '\u{e031}',
88
+ CHINESE_C_2: '\u{e032}',
89
+ CHINESE_C_3: '\u{e033}',
90
+ CHINESE_C_4: '\u{e034}',
91
+ CHINESE_C_5: '\u{e035}',
92
+ CHINESE_C_6: '\u{e036}',
93
+ CHINESE_C_7: '\u{e037}',
94
+ CHINESE_C_8: '\u{e038}',
95
+ CHINESE_C_9: '\u{e039}',
96
+ CHINESE_D_1: '\u{e03a}',
97
+ CHINESE_D_10: '\u{e03b}',
98
+ CHINESE_D_2: '\u{e03c}',
99
+ CHINESE_D_3: '\u{e03d}',
100
+ CHINESE_D_4: '\u{e03e}',
101
+ CHINESE_D_5: '\u{e03f}',
102
+ CHINESE_D_6: '\u{e040}',
103
+ CHINESE_D_7: '\u{e041}',
104
+ CHINESE_D_8: '\u{e042}',
105
+ CHINESE_D_9: '\u{e043}',
106
+ CHINESE_E_1: '\u{e044}',
107
+ CHINESE_E_10: '\u{e045}',
108
+ CHINESE_E_2: '\u{e046}',
109
+ CHINESE_E_3: '\u{e047}',
110
+ CHINESE_E_4: '\u{e048}',
111
+ CHINESE_E_5: '\u{e049}',
112
+ CHINESE_E_6: '\u{e04a}',
113
+ CHINESE_E_7: '\u{e04b}',
114
+ CHINESE_E_8: '\u{e04c}',
115
+ CHINESE_E_9: '\u{e04d}',
116
+ CHINESE_F_1: '\u{e04e}',
117
+ CHINESE_F_10: '\u{e04f}',
118
+ CHINESE_F_2: '\u{e050}',
119
+ CHINESE_F_3: '\u{e051}',
120
+ CHINESE_F_4: '\u{e052}',
121
+ CHINESE_F_5: '\u{e053}',
122
+ CHINESE_F_6: '\u{e054}',
123
+ CHINESE_F_7: '\u{e055}',
124
+ CHINESE_F_8: '\u{e056}',
125
+ CHINESE_F_9: '\u{e057}',
126
+ CHINESE_G_1: '\u{e058}',
127
+ CHINESE_G_10: '\u{e059}',
128
+ CHINESE_G_2: '\u{e05a}',
129
+ CHINESE_G_3: '\u{e05b}',
130
+ CHINESE_G_4: '\u{e05c}',
131
+ CHINESE_G_5: '\u{e05d}',
132
+ CHINESE_G_6: '\u{e05e}',
133
+ CHINESE_G_7: '\u{e05f}',
134
+ CHINESE_G_8: '\u{e060}',
135
+ CHINESE_G_9: '\u{e061}',
136
+ CHINESE_H_1: '\u{e062}',
137
+ CHINESE_H_10: '\u{e063}',
138
+ CHINESE_H_2: '\u{e064}',
139
+ CHINESE_H_3: '\u{e065}',
140
+ CHINESE_H_4: '\u{e066}',
141
+ CHINESE_H_5: '\u{e067}',
142
+ CHINESE_H_6: '\u{e068}',
143
+ CHINESE_H_7: '\u{e069}',
144
+ CHINESE_H_8: '\u{e06a}',
145
+ CHINESE_H_9: '\u{e06b}',
146
+ CHINESE_I_1: '\u{e06c}',
147
+ CHINESE_I_10: '\u{e06d}',
148
+ CHINESE_I_2: '\u{e06e}',
149
+ CHINESE_I_3: '\u{e06f}',
150
+ CHINESE_I_4: '\u{e070}',
151
+ CHINESE_I_5: '\u{e071}',
152
+ CHINESE_I_6: '\u{e072}',
153
+ CHINESE_I_7: '\u{e073}',
154
+ CHINESE_I_8: '\u{e074}',
155
+ CHINESE_I_9: '\u{e075}',
156
+ CHINESE_J_1: '\u{e076}',
157
+ CHINESE_J_10: '\u{e077}',
158
+ CHINESE_J_2: '\u{e078}',
159
+ CHINESE_J_3: '\u{e079}',
160
+ CHINESE_J_4: '\u{e07a}',
161
+ CHINESE_J_5: '\u{e07b}',
162
+ CHINESE_J_6: '\u{e07c}',
163
+ CHINESE_J_7: '\u{e07d}',
164
+ CHINESE_J_8: '\u{e07e}',
165
+ CHINESE_J_9: '\u{e07f}',
166
+ CHINESE_K_1: '\u{e080}',
167
+ CHINESE_K_10: '\u{e081}',
168
+ CHINESE_K_2: '\u{e082}',
169
+ CHINESE_K_3: '\u{e083}',
170
+ CHINESE_K_4: '\u{e084}',
171
+ CHINESE_K_5: '\u{e085}',
172
+ CHINESE_K_6: '\u{e086}',
173
+ CHINESE_K_7: '\u{e087}',
174
+ CHINESE_K_8: '\u{e088}',
175
+ CHINESE_K_9: '\u{e089}',
176
+ CHINESE_L_1: '\u{e08a}',
177
+ CHINESE_L_10: '\u{e08b}',
178
+ CHINESE_L_2: '\u{e08c}',
179
+ CHINESE_L_3: '\u{e08d}',
180
+ CHINESE_L_4: '\u{e08e}',
181
+ CHINESE_L_5: '\u{e08f}',
182
+ CHINESE_L_6: '\u{e090}',
183
+ CHINESE_L_7: '\u{e091}',
184
+ CHINESE_L_8: '\u{e092}',
185
+ CHINESE_L_9: '\u{e093}',
186
+ CHINESE_M_1: '\u{e094}',
187
+ CHINESE_M_10: '\u{e095}',
188
+ CHINESE_M_2: '\u{e096}',
189
+ CHINESE_M_3: '\u{e097}',
190
+ CHINESE_M_4: '\u{e098}',
191
+ CHINESE_M_5: '\u{e099}',
192
+ CHINESE_M_6: '\u{e09a}',
193
+ CHINESE_M_7: '\u{e09b}',
194
+ CHINESE_M_8: '\u{e09c}',
195
+ CHINESE_M_9: '\u{e09d}',
196
+ CHINESE_N_1: '\u{e09e}',
197
+ CHINESE_N_10: '\u{e09f}',
198
+ CHINESE_N_2: '\u{e0a0}',
199
+ CHINESE_N_3: '\u{e0a1}',
200
+ CHINESE_N_4: '\u{e0a2}',
201
+ CHINESE_N_5: '\u{e0a3}',
202
+ CHINESE_N_6: '\u{e0a4}',
203
+ CHINESE_N_7: '\u{e0a5}',
204
+ CHINESE_N_8: '\u{e0a6}',
205
+ CHINESE_N_9: '\u{e0a7}',
206
+ CHINESE_O_1: '\u{e0a8}',
207
+ CHINESE_O_10: '\u{e0a9}',
208
+ CHINESE_O_2: '\u{e0aa}',
209
+ CHINESE_O_3: '\u{e0ab}',
210
+ CHINESE_O_4: '\u{e0ac}',
211
+ CHINESE_O_5: '\u{e0ad}',
212
+ CHINESE_O_6: '\u{e0ae}',
213
+ CHINESE_O_7: '\u{e0af}',
214
+ CHINESE_O_8: '\u{e0b0}',
215
+ CHINESE_O_9: '\u{e0b1}',
216
+ CHINESE_P_1: '\u{e0b2}',
217
+ CHINESE_P_10: '\u{e0b3}',
218
+ CHINESE_P_2: '\u{e0b4}',
219
+ CHINESE_P_3: '\u{e0b5}',
220
+ CHINESE_P_4: '\u{e0b6}',
221
+ CHINESE_P_5: '\u{e0b7}',
222
+ CHINESE_P_6: '\u{e0b8}',
223
+ CHINESE_P_7: '\u{e0b9}',
224
+ CHINESE_P_8: '\u{e0ba}',
225
+ CHINESE_P_9: '\u{e0bb}',
226
+ CHINESE_R_1: '\u{e0bc}',
227
+ CHINESE_R_10: '\u{e0bd}',
228
+ CHINESE_R_2: '\u{e0be}',
229
+ CHINESE_R_3: '\u{e0bf}',
230
+ CHINESE_R_4: '\u{e0c0}',
231
+ CHINESE_R_5: '\u{e0c1}',
232
+ CHINESE_R_6: '\u{e0c2}',
233
+ CHINESE_R_7: '\u{e0c3}',
234
+ CHINESE_R_8: '\u{e0c4}',
235
+ CHINESE_R_9: '\u{e0c5}',
236
+ CHINESE_S_1: '\u{e0c6}',
237
+ CHINESE_S_10: '\u{e0c7}',
238
+ CHINESE_S_2: '\u{e0c8}',
239
+ CHINESE_S_3: '\u{e0c9}',
240
+ CHINESE_S_4: '\u{e0ca}',
241
+ CHINESE_S_5: '\u{e0cb}',
242
+ CHINESE_S_6: '\u{e0cc}',
243
+ CHINESE_S_7: '\u{e0cd}',
244
+ CHINESE_S_8: '\u{e0ce}',
245
+ CHINESE_S_9: '\u{e0cf}',
246
+ CHINESE_T_1: '\u{e0d0}',
247
+ CHINESE_T_10: '\u{e0d1}',
248
+ CHINESE_T_2: '\u{e0d2}',
249
+ CHINESE_T_3: '\u{e0d3}',
250
+ CHINESE_T_4: '\u{e0d4}',
251
+ CHINESE_T_5: '\u{e0d5}',
252
+ CHINESE_T_6: '\u{e0d6}',
253
+ CHINESE_T_7: '\u{e0d7}',
254
+ CHINESE_T_8: '\u{e0d8}',
255
+ CHINESE_T_9: '\u{e0d9}',
256
+ CHINESE_U_1: '\u{e0da}',
257
+ CHINESE_U_10: '\u{e0db}',
258
+ CHINESE_U_2: '\u{e0dc}',
259
+ CHINESE_U_3: '\u{e0dd}',
260
+ CHINESE_U_4: '\u{e0de}',
261
+ CHINESE_U_5: '\u{e0df}',
262
+ CHINESE_U_6: '\u{e0e0}',
263
+ CHINESE_U_7: '\u{e0e1}',
264
+ CHINESE_U_8: '\u{e0e2}',
265
+ CHINESE_U_9: '\u{e0e3}',
266
+ CHINESE_V_1: '\u{e0e4}',
267
+ CHINESE_V_10: '\u{e0e5}',
268
+ CHINESE_V_2: '\u{e0e6}',
269
+ CHINESE_V_3: '\u{e0e7}',
270
+ CHINESE_V_4: '\u{e0e8}',
271
+ CHINESE_V_5: '\u{e0e9}',
272
+ CHINESE_V_6: '\u{e0ea}',
273
+ CHINESE_V_7: '\u{e0eb}',
274
+ CHINESE_V_8: '\u{e0ec}',
275
+ CHINESE_V_9: '\u{e0ed}',
276
+ CHINESE_W_1: '\u{e0ee}',
277
+ CHINESE_W_10: '\u{e0ef}',
278
+ CHINESE_W_2: '\u{e0f0}',
279
+ CHINESE_W_3: '\u{e0f1}',
280
+ CHINESE_W_4: '\u{e0f2}',
281
+ CHINESE_W_5: '\u{e0f3}',
282
+ CHINESE_W_6: '\u{e0f4}',
283
+ CHINESE_W_7: '\u{e0f5}',
284
+ CHINESE_W_8: '\u{e0f6}',
285
+ CHINESE_W_9: '\u{e0f7}',
286
+ CHINESE_X_1: '\u{e0f8}',
287
+ CHINESE_X_10: '\u{e0f9}',
288
+ CHINESE_X_2: '\u{e0fa}',
289
+ CHINESE_X_3: '\u{e0fb}',
290
+ CHINESE_X_4: '\u{e0fc}',
291
+ CHINESE_X_5: '\u{e0fd}',
292
+ CHINESE_X_6: '\u{e0fe}',
293
+ CHINESE_X_7: '\u{e0ff}',
294
+ CHINESE_X_8: '\u{e100}',
295
+ CHINESE_X_9: '\u{e101}',
296
+ CHINESE_Y_1: '\u{e102}',
297
+ CHINESE_Y_10: '\u{e103}',
298
+ CHINESE_Y_2: '\u{e104}',
299
+ CHINESE_Y_3: '\u{e105}',
300
+ CHINESE_Y_4: '\u{e106}',
301
+ CHINESE_Y_5: '\u{e107}',
302
+ CHINESE_Y_6: '\u{e108}',
303
+ CHINESE_Y_7: '\u{e109}',
304
+ CHINESE_Y_8: '\u{e10a}',
305
+ CHINESE_Y_9: '\u{e10b}',
306
+ CHINESE_Z_1: '\u{e10c}',
307
+ CHINESE_Z_10: '\u{e10d}',
308
+ CHINESE_Z_2: '\u{e10e}',
309
+ CHINESE_Z_3: '\u{e10f}',
310
+ CHINESE_Z_4: '\u{e110}',
311
+ CHINESE_Z_5: '\u{e111}',
312
+ CHINESE_Z_6: '\u{e112}',
313
+ CHINESE_Z_7: '\u{e113}',
314
+ CHINESE_Z_8: '\u{e114}',
315
+ CHINESE_Z_9: '\u{e115}',
316
+ FRACTION_1_1: '\u{e116}',
317
+ FRACTION_1_2: '\u{e117}',
318
+ FRACTION_1_3: '\u{e118}',
319
+ FRACTION_1_4: '\u{e119}',
320
+ FRACTION_1_5: '\u{e11a}',
321
+ FRACTION_2_1: '\u{e11b}',
322
+ FRACTION_2_2: '\u{e11c}',
323
+ FRACTION_2_3: '\u{e11d}',
324
+ FRACTION_2_4: '\u{e11e}',
325
+ FRACTION_2_5: '\u{e11f}',
326
+ FRACTION_3_1: '\u{e120}',
327
+ FRACTION_3_2: '\u{e121}',
328
+ FRACTION_3_3: '\u{e122}',
329
+ FRACTION_3_4: '\u{e123}',
330
+ FRACTION_3_5: '\u{e124}',
331
+ FRACTION_4_1: '\u{e125}',
332
+ FRACTION_4_2: '\u{e126}',
333
+ FRACTION_4_3: '\u{e127}',
334
+ FRACTION_4_4: '\u{e128}',
335
+ FRACTION_4_5: '\u{e129}',
336
+ FRACTION_5_1: '\u{e12a}',
337
+ FRACTION_5_2: '\u{e12b}',
338
+ FRACTION_5_3: '\u{e12c}',
339
+ FRACTION_5_4: '\u{e12d}',
340
+ FRACTION_5_5: '\u{e12e}'
341
+ });
342
+ KidscipherGlyphs_1 = { KidscipherGlyphs };
343
+ return KidscipherGlyphs_1;
344
+ }
345
+
346
+ var KidscipherGlyphsExports = requireKidscipherGlyphs();
347
+
348
+ const ignoreCasingSensitive = (caseSensitive) => {
349
+ return (text) => (caseSensitive ? text : text.toUpperCase());
350
+ };
351
+ const casing = (casingOption) => {
352
+ return (text) => {
353
+ switch (casingOption) {
354
+ case 'upper':
355
+ return text.toUpperCase();
356
+ case 'lower':
357
+ return text.toLowerCase();
358
+ case 'original':
359
+ return text;
360
+ default:
361
+ throw new Error(`Invalid output casing option: ${casingOption}`);
362
+ }
363
+ };
364
+ };
365
+ const normalizeDiacritics = (normalize) => {
366
+ return (text) => {
367
+ return normalize
368
+ ? text
369
+ // normalize Unicode chars (etc. "é" → "e" + "´")
370
+ .normalize('NFD')
371
+ // remove diacritic symbols
372
+ .replace(/[\u0300-\u036f]/g, '')
373
+ // exceptions which are normally not normalized
374
+ .replace(/ß/g, 'ss')
375
+ .replace(/ø/g, 'o')
376
+ .replace(/Ø/g, 'O')
377
+ .replace(/đ/g, 'd')
378
+ .replace(/Đ/g, 'D')
379
+ .replace(/ł/g, 'l')
380
+ .replace(/Ł/g, 'L')
381
+ .replace(/æ/g, 'ae')
382
+ .replace(/Æ/g, 'AE')
383
+ .replace(/œ/g, 'oe')
384
+ .replace(/Œ/g, 'OE')
385
+ .replace(/ð/g, 'd')
386
+ .replace(/Ð/g, 'D')
387
+ .replace(/þ/g, 'th')
388
+ .replace(/Þ/g, 'Th')
389
+ .replace(/ñ/g, 'n')
390
+ .replace(/Ñ/g, 'N')
391
+ : text;
392
+ };
393
+ };
394
+ const Processor = {
395
+ ignoreCasingSensitive,
396
+ casing,
397
+ normalizeDiacritics,
398
+ };
399
+
400
+ const processingPipeline = (text, processors) => {
401
+ return processors.reduce((acc, processor) => processor(acc), text);
402
+ };
403
+
31
404
  class Cipher {
32
405
  encode(input, configuration, opts) {
33
- const { caseSensitive = false, letterSeparator: inputLetterSeparator = '', wordSeparator: inputWordSeparator = '///', } = opts?.input || {};
406
+ const { caseSensitive = false, normalizeDiacritics = true, letterSeparator: inputLetterSeparator = '', wordSeparator: inputWordSeparator = '///', } = opts?.input || {};
34
407
  const { casing = 'original', letterSeparator: outputLetterSeparator = '', wordSeparator: outputWordSeparator = ' ', } = opts?.output || {};
408
+ const preprocessedInput = processingPipeline(input, [
409
+ Processor.normalizeDiacritics(normalizeDiacritics),
410
+ ]);
35
411
  // normalize input into words and letters
36
- const words = input.split(inputWordSeparator);
412
+ const words = preprocessedInput.split(inputWordSeparator);
37
413
  const encodedWords = words.map((word) => {
38
414
  const letters = inputLetterSeparator
39
415
  ? word.split(inputLetterSeparator)
@@ -56,10 +432,13 @@ class Cipher {
56
432
  return encodedWords.join(outputWordSeparator);
57
433
  }
58
434
  decode(input, configuration, opts) {
59
- const { caseSensitive = false, letterSeparator: inputLetterSeparator = '', wordSeparator: inputWordSeparator = ' ', } = opts?.input || {};
435
+ const { caseSensitive = false, normalizeDiacritics = false, letterSeparator: inputLetterSeparator = '', wordSeparator: inputWordSeparator = ' ', } = opts?.input || {};
60
436
  const { casing = 'original', letterSeparator: outputLetterSeparator = '', wordSeparator: outputWordSeparator = ' ', } = opts?.output || {};
437
+ const preprocessedInput = processingPipeline(input, [
438
+ Processor.normalizeDiacritics(normalizeDiacritics),
439
+ ]);
61
440
  // split encoded text into words
62
- const words = input.split(inputWordSeparator);
441
+ const words = preprocessedInput.split(inputWordSeparator);
63
442
  const decodedWords = words.map((word) => {
64
443
  const symbols = word.split(inputLetterSeparator);
65
444
  return symbols
@@ -100,6 +479,7 @@ function withDefaultCipherOptions(opts, defaults) {
100
479
  return {
101
480
  input: {
102
481
  caseSensitive: false,
482
+ normalizeDiacritics: false,
103
483
  letterSeparator: '',
104
484
  wordSeparator: ' ',
105
485
  ...defaults?.input,
@@ -123,7 +503,7 @@ class MorseCodeCipher extends SubstitutionCipher {
123
503
  const { dotDashMapping = { dot: '.', dash: '-' } } = configuration || {};
124
504
  const mergedOpts = withDefaultCipherOptions(opts, {
125
505
  input: {
126
- caseSensitive: true,
506
+ caseSensitive: false,
127
507
  letterSeparator: '',
128
508
  wordSeparator: ' ',
129
509
  },
@@ -152,7 +532,7 @@ class MorseCodeCipher extends SubstitutionCipher {
152
532
  const { dotDashMapping = { dot: '.', dash: '-' } } = configuration || {};
153
533
  const mergedOpts = withDefaultCipherOptions(opts, {
154
534
  input: {
155
- caseSensitive: true,
535
+ caseSensitive: false,
156
536
  letterSeparator: '/',
157
537
  wordSeparator: '///',
158
538
  },
@@ -214,47 +594,208 @@ MorseCodeCipher.MORSE_CODE_MAP = {
214
594
  '9': '----.',
215
595
  };
216
596
 
217
- var KidscipherGlyphs_1;
218
- var hasRequiredKidscipherGlyphs;
597
+ class MobileCipher extends SubstitutionCipher {
598
+ constructor() {
599
+ super(MobileCipher.MOBILE_KEYPAD_MAP);
600
+ }
601
+ encode(input, configuration, opts) {
602
+ const mergedOpts = withDefaultCipherOptions(opts, {
603
+ input: {
604
+ caseSensitive: false,
605
+ letterSeparator: '',
606
+ wordSeparator: ' ',
607
+ },
608
+ output: {
609
+ casing: 'original',
610
+ letterSeparator: ' ',
611
+ wordSeparator: ' | ',
612
+ },
613
+ });
614
+ return super.encode(input, configuration, mergedOpts);
615
+ }
616
+ decode(input, configuration, opts) {
617
+ const mergedOpts = withDefaultCipherOptions(opts, {
618
+ input: {
619
+ caseSensitive: false,
620
+ letterSeparator: ' ',
621
+ wordSeparator: ' | ',
622
+ },
623
+ output: {
624
+ casing: 'lower',
625
+ letterSeparator: '',
626
+ wordSeparator: ' ',
627
+ },
628
+ });
629
+ return super.decode(input, configuration, mergedOpts);
630
+ }
631
+ }
632
+ MobileCipher.MOBILE_KEYPAD_MAP = {
633
+ A: '2',
634
+ B: '22',
635
+ C: '222',
636
+ D: '3',
637
+ E: '33',
638
+ F: '333',
639
+ G: '4',
640
+ H: '44',
641
+ I: '444',
642
+ J: '5',
643
+ K: '55',
644
+ L: '555',
645
+ M: '6',
646
+ N: '66',
647
+ O: '666',
648
+ P: '7',
649
+ Q: '77',
650
+ R: '777',
651
+ S: '7777',
652
+ T: '8',
653
+ U: '88',
654
+ V: '888',
655
+ W: '9',
656
+ X: '99',
657
+ Y: '999',
658
+ Z: '9999',
659
+ };
219
660
 
220
- function requireKidscipherGlyphs () {
221
- if (hasRequiredKidscipherGlyphs) return KidscipherGlyphs_1;
222
- hasRequiredKidscipherGlyphs = 1;
223
- // Auto-generated by generate-font
224
- const KidscipherGlyphs = Object.freeze({
225
- POLAND_CROSS_A: '\u{64}',
226
- POLAND_CROSS_B: '\u{65}',
227
- POLAND_CROSS_C: '\u{66}',
228
- POLAND_CROSS_CH: '\u{67}',
229
- POLAND_CROSS_D: '\u{68}',
230
- POLAND_CROSS_E: '\u{69}',
231
- POLAND_CROSS_F: '\u{6a}',
232
- POLAND_CROSS_G: '\u{6b}',
233
- POLAND_CROSS_H: '\u{6c}',
234
- POLAND_CROSS_I: '\u{6d}',
235
- POLAND_CROSS_J: '\u{6e}',
236
- POLAND_CROSS_K: '\u{6f}',
237
- POLAND_CROSS_L: '\u{70}',
238
- POLAND_CROSS_M: '\u{71}',
239
- POLAND_CROSS_N: '\u{72}',
240
- POLAND_CROSS_O: '\u{73}',
241
- POLAND_CROSS_P: '\u{74}',
242
- POLAND_CROSS_Q: '\u{75}',
243
- POLAND_CROSS_R: '\u{76}',
244
- POLAND_CROSS_S: '\u{77}',
245
- POLAND_CROSS_T: '\u{78}',
246
- POLAND_CROSS_U: '\u{79}',
247
- POLAND_CROSS_V: '\u{7a}',
248
- POLAND_CROSS_W: '\u{7b}',
249
- POLAND_CROSS_X: '\u{7c}',
250
- POLAND_CROSS_Y: '\u{7d}',
251
- POLAND_CROSS_Z: '\u{7e}'
252
- });
253
- KidscipherGlyphs_1 = { KidscipherGlyphs };
254
- return KidscipherGlyphs_1;
661
+ class SubstitutionCyclicCipher extends Cipher {
662
+ constructor(encodeMap) {
663
+ super();
664
+ this.resetCounters = () => {
665
+ for (const key of Object.keys(this.encodeMap)) {
666
+ this.counters[key] = 0;
667
+ }
668
+ };
669
+ // chech encodeMap
670
+ this.encodeMap = Object.fromEntries(Object.entries(encodeMap).map(([key, value]) => [
671
+ key,
672
+ Array.isArray(value) ? value : [value],
673
+ ]));
674
+ // decode map
675
+ this.decodeMap = {};
676
+ for (const [key, values] of Object.entries(this.encodeMap)) {
677
+ for (const val of values) {
678
+ this.decodeMap[val] = key;
679
+ }
680
+ }
681
+ // inialization counters
682
+ this.counters = {};
683
+ this.resetCounters();
684
+ }
685
+ encodeToken(token) {
686
+ const options = this.encodeMap[token];
687
+ if (!options || options.length === 0)
688
+ return '';
689
+ const index = this.counters[token] % options.length; // cyclic
690
+ this.counters[token] += 1;
691
+ return options[index];
692
+ }
693
+ encode(input, configuration, opts) {
694
+ const value = super.encode(input, configuration, opts);
695
+ this.resetCounters();
696
+ return value;
697
+ }
698
+ decodeToken(token) {
699
+ return this.decodeMap[token] ?? '';
700
+ }
255
701
  }
256
702
 
257
- var KidscipherGlyphsExports = requireKidscipherGlyphs();
703
+ class SpiderCipher extends SubstitutionCyclicCipher {
704
+ constructor() {
705
+ super(SpiderCipher.SPIDER_MAP);
706
+ }
707
+ encode(input, configuration, opts) {
708
+ const mergedOpts = withDefaultCipherOptions(opts, {
709
+ input: {
710
+ caseSensitive: false,
711
+ letterSeparator: '',
712
+ wordSeparator: ' ',
713
+ },
714
+ output: {
715
+ casing: 'upper',
716
+ letterSeparator: ' ',
717
+ wordSeparator: ' | ',
718
+ },
719
+ });
720
+ return super.encode(input, configuration, mergedOpts);
721
+ }
722
+ decode(input, configuration, opts) {
723
+ const mergedOpts = withDefaultCipherOptions(opts, {
724
+ input: {
725
+ caseSensitive: false,
726
+ letterSeparator: ' ',
727
+ wordSeparator: ' | ',
728
+ },
729
+ output: {
730
+ casing: 'lower',
731
+ letterSeparator: '',
732
+ wordSeparator: ' ',
733
+ },
734
+ });
735
+ return super.decode(input, configuration, mergedOpts);
736
+ }
737
+ }
738
+ SpiderCipher.SPIDER_MAP = {
739
+ A: ['BC', 'JX'],
740
+ B: ['AC', 'EH'],
741
+ C: ['AB', 'OZ'],
742
+ D: ['EF', 'KT'],
743
+ E: ['BH', 'DF'],
744
+ F: ['DE', 'NV'],
745
+ G: ['HI', 'LP'],
746
+ H: ['BE', 'GI'],
747
+ I: ['GH', 'MS'],
748
+ J: ['AX', 'KL'],
749
+ K: ['DT', 'JL'],
750
+ L: ['GP', 'JK'],
751
+ M: ['IS', 'NO'],
752
+ N: ['FV', 'MO'],
753
+ O: ['CZ', 'MN'],
754
+ P: ['GL', 'RS'],
755
+ // Q: ["Q"], // cipher can't Q
756
+ R: ['PS', 'UY'],
757
+ S: ['IM', 'PR'],
758
+ T: ['DK', 'UV'],
759
+ U: ['TV', 'RY'],
760
+ V: ['FN', 'TU'],
761
+ // W: ["W"], // cipher can't W
762
+ X: ['AJ', 'YZ'],
763
+ Y: ['RU', 'XZ'],
764
+ Z: ['CO', 'XY'],
765
+ };
766
+
767
+ class FractionCipher extends SubstitutionCipher {
768
+ constructor() {
769
+ super(FractionCipher.FRACTION_MAP);
770
+ }
771
+ }
772
+ FractionCipher.FRACTION_MAP = {
773
+ A: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_1_1,
774
+ B: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_1_2,
775
+ C: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_1_3,
776
+ D: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_1_4,
777
+ E: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_1_5,
778
+ F: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_2_1,
779
+ G: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_2_2,
780
+ H: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_2_3,
781
+ I: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_2_4,
782
+ J: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_2_5,
783
+ K: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_3_1,
784
+ L: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_3_2,
785
+ M: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_3_3,
786
+ N: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_3_4,
787
+ O: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_3_5,
788
+ P: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_4_1,
789
+ Q: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_4_2,
790
+ R: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_4_3,
791
+ S: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_4_4,
792
+ T: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_4_5,
793
+ U: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_5_1,
794
+ V: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_5_2,
795
+ X: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_5_3,
796
+ Y: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_5_4,
797
+ Z: KidscipherGlyphsExports.KidscipherGlyphs.FRACTION_5_5,
798
+ };
258
799
 
259
800
  class PolandCrossCipher extends SubstitutionCipher {
260
801
  constructor() {
@@ -291,123 +832,222 @@ PolandCrossCipher.POLAND_CROSS_MAP = {
291
832
  Z: KidscipherGlyphsExports.KidscipherGlyphs.POLAND_CROSS_Z,
292
833
  };
293
834
 
835
+ class ChineseCipher extends SubstitutionCyclicCipher {
836
+ static generateMap() {
837
+ const map = {};
838
+ // considering that chinese symbol have this format CHINESE_<LETTER>_<NUMBER>
839
+ for (const key of Object.keys(KidscipherGlyphsExports.KidscipherGlyphs)) {
840
+ const match = key.match(/^CHINESE_([A-Z])_\d+$/);
841
+ if (match) {
842
+ const letter = match[1];
843
+ if (!map[letter])
844
+ map[letter] = [];
845
+ map[letter].push(KidscipherGlyphsExports.KidscipherGlyphs[key]);
846
+ }
847
+ }
848
+ return map;
849
+ }
850
+ constructor() {
851
+ super(ChineseCipher.CHINESE_MAP);
852
+ }
853
+ }
854
+ ChineseCipher.CHINESE_MAP = ChineseCipher.generateMap();
855
+
294
856
  class ShiftCipher extends Cipher {
295
- constructor(baseAlphabet, rotors) {
857
+ constructor(alphabet) {
296
858
  super();
297
- // Check all alphabets have the same length
298
- for (const alpha of rotors) {
299
- if (alpha.length !== baseAlphabet.length) {
300
- throw new Error('All alphabets must have the same length');
859
+ this.alphabet = alphabet;
860
+ }
861
+ encodeToken(token, configuration) {
862
+ const { shift, outputAsIndex, inputAsIndex } = configuration;
863
+ let index;
864
+ if (inputAsIndex) {
865
+ index = parseInt(token, 10);
866
+ if (isNaN(index) || index < 0 || index >= this.alphabet.length) {
867
+ return token; // invalid index
301
868
  }
302
869
  }
303
- this.baseAlphabet = baseAlphabet;
304
- this.rotors = rotors;
870
+ else {
871
+ if (!this.alphabet.includes(token))
872
+ return ''; // invalid token
873
+ index = this.alphabet.indexOf(token);
874
+ }
875
+ const shiftedIndex = (index + shift) % this.alphabet.length;
876
+ return outputAsIndex
877
+ ? shiftedIndex.toString()
878
+ : this.alphabet[shiftedIndex];
305
879
  }
306
- encodeToken(token, configuration) {
307
- const { shifts } = configuration;
308
- let encoded = '';
309
- if (this.baseAlphabet.includes(token)) {
310
- const index = this.baseAlphabet.indexOf(token);
311
- for (let i = 0; i < this.rotors.length; i++) {
312
- const wheel = this.rotors[i];
313
- const shiftedIndex = (index + shifts[i]) % wheel.length;
314
- encoded += wheel[shiftedIndex];
880
+ decodeToken(token, configuration) {
881
+ const { shift, inputAsIndex, outputAsIndex } = configuration;
882
+ let index;
883
+ if (inputAsIndex) {
884
+ index = parseInt(token, 10);
885
+ if (isNaN(index) || index < 0 || index >= this.alphabet.length) {
886
+ return ''; // invalid index
315
887
  }
316
888
  }
317
- return encoded;
889
+ else {
890
+ if (!this.alphabet.includes(token))
891
+ return ''; // invalid token
892
+ index = this.alphabet.indexOf(token);
893
+ }
894
+ const shiftedIndex = (index - shift + this.alphabet.length) % this.alphabet.length;
895
+ return outputAsIndex
896
+ ? shiftedIndex.toString()
897
+ : this.alphabet[shiftedIndex];
898
+ }
899
+ getAllTokenIndexes(token, shift) {
900
+ if (!this.alphabet.includes(token))
901
+ return []; // invalid token
902
+ const indexes = this.alphabet.flatMap((ch, i) => ch === token
903
+ ? [(i - shift + this.alphabet.length) % this.alphabet.length]
904
+ : []);
905
+ return indexes;
318
906
  }
319
907
  encode(input, configuration, opts) {
320
908
  const mergedOpts = withDefaultCipherOptions(opts, {
321
- input: {
322
- caseSensitive: false,
323
- letterSeparator: '',
324
- wordSeparator: ' ',
325
- },
326
- output: {
327
- casing: 'original',
328
- letterSeparator: '',
329
- wordSeparator: ' ',
330
- },
909
+ input: { caseSensitive: false, letterSeparator: '', wordSeparator: ' ' },
910
+ output: { casing: 'original', letterSeparator: '', wordSeparator: ' ' },
331
911
  });
332
912
  return super.encode(input, configuration, mergedOpts);
333
913
  }
334
- decodeToken(token, configuration) {
335
- const { shifts } = configuration;
336
- let encoded = '';
337
- if (token.length === this.rotors.length) {
338
- let currentIndex = -1;
339
- for (let i = this.rotors.length - 1; 0 <= i; i--) {
340
- if (this.rotors[i].includes(token[i])) {
341
- currentIndex = this.rotors[i].indexOf(token[i]);
342
- currentIndex =
343
- (currentIndex - shifts[i] + this.baseAlphabet.length) %
344
- this.baseAlphabet.length;
345
- }
346
- else {
347
- // invalid token
348
- return '';
349
- }
350
- }
351
- encoded = this.baseAlphabet[currentIndex];
352
- }
353
- return encoded;
354
- }
355
914
  decode(input, configuration, opts) {
356
915
  const mergedOpts = withDefaultCipherOptions(opts, {
357
- input: {
358
- caseSensitive: false,
359
- letterSeparator: '',
360
- wordSeparator: ' ',
361
- },
362
- output: {
363
- casing: 'original',
364
- letterSeparator: '',
365
- wordSeparator: ' ',
366
- },
916
+ input: { caseSensitive: false, letterSeparator: '', wordSeparator: ' ' },
917
+ output: { casing: 'original', letterSeparator: '', wordSeparator: ' ' },
367
918
  });
368
919
  return super.decode(input, configuration, mergedOpts);
369
920
  }
370
921
  }
371
922
 
372
923
  class ShiftAlphabetCipher extends ShiftCipher {
373
- constructor(alphabet) {
374
- if (!alphabet) {
375
- alphabet = ShiftAlphabetCipher.DEFAULT_ALPHABET;
924
+ constructor() {
925
+ super(ShiftAlphabetCipher.DEFAULT_ALPHABET);
926
+ }
927
+ }
928
+ ShiftAlphabetCipher.DEFAULT_ALPHABET = [
929
+ 'A',
930
+ 'B',
931
+ 'C',
932
+ 'D',
933
+ 'E',
934
+ 'F',
935
+ 'G',
936
+ 'H',
937
+ 'I',
938
+ 'J',
939
+ 'K',
940
+ 'L',
941
+ 'M',
942
+ 'N',
943
+ 'O',
944
+ 'P',
945
+ 'Q',
946
+ 'R',
947
+ 'S',
948
+ 'T',
949
+ 'U',
950
+ 'V',
951
+ 'W',
952
+ 'X',
953
+ 'Y',
954
+ 'Z',
955
+ ];
956
+
957
+ class ShiftRotorCipher extends Cipher {
958
+ constructor(baseAlphabet, rotors) {
959
+ super();
960
+ if (rotors.length === 0)
961
+ throw new Error('At least one rotor is required');
962
+ this.baseAlphabet = baseAlphabet;
963
+ this.rotors = rotors;
964
+ }
965
+ encodeToken(token, configuration) {
966
+ const { shifts = [], outputAsIndex, inputAsIndex } = configuration;
967
+ let results = [];
968
+ let lastSymbol = token;
969
+ const baseSymbolIndex = this.baseAlphabet.encodeToken(lastSymbol, {
970
+ shift: 0,
971
+ inputAsIndex: false,
972
+ outputAsIndex: true,
973
+ });
974
+ for (let i = 0; i < this.rotors.length; i++) {
975
+ const rotor = this.rotors[i];
976
+ const shift = shifts[i % shifts.length] ?? 0;
977
+ lastSymbol = rotor.encodeToken(baseSymbolIndex, {
978
+ shift,
979
+ inputAsIndex: true,
980
+ outputAsIndex: false,
981
+ });
982
+ results.push(lastSymbol);
376
983
  }
377
- super(alphabet, [alphabet]);
984
+ // we need to reverse it
985
+ return results.reverse().join('');
378
986
  }
379
- encode(input, { shift }, opts) {
987
+ decodeToken(token, configuration) {
988
+ const { shifts = [], outputAsIndex, inputAsIndex } = configuration;
989
+ const symbols = token.split('').reverse();
990
+ if (symbols.length != this.rotors.length) {
991
+ throw new Error('Invalid symbol length');
992
+ }
993
+ let includesIn = [];
994
+ // Reverse through rotors for decoding
995
+ for (let i = this.rotors.length - 1; i >= 0; i--) {
996
+ const rotor = this.rotors[i];
997
+ const shift = shifts[i % shifts.length] ?? 0;
998
+ const symbol = symbols[i];
999
+ const ocurencies = rotor.getAllTokenIndexes(symbol, shift);
1000
+ includesIn.push(ocurencies);
1001
+ }
1002
+ // Find intersection of all arrays (items common to all rotors)
1003
+ const intersection = includesIn.reduce((acc, arr) => acc.filter((x) => arr.includes(x)));
1004
+ // If there is exactly one common index, decode it
1005
+ if (intersection.length !== 1) {
1006
+ throw new Error(`Invalid decoding — intersection size is ${intersection.length}`);
1007
+ }
1008
+ const finalIndex = intersection[0];
1009
+ const result = this.baseAlphabet.decodeToken(finalIndex.toString(), {
1010
+ shift: 0,
1011
+ inputAsIndex: true,
1012
+ outputAsIndex: outputAsIndex,
1013
+ });
1014
+ return result;
1015
+ }
1016
+ encode(input, configuration, opts) {
380
1017
  const mergedOpts = withDefaultCipherOptions(opts, {
381
- input: {
382
- caseSensitive: false,
383
- letterSeparator: '',
384
- wordSeparator: ' ',
385
- },
1018
+ input: { caseSensitive: false, letterSeparator: '', wordSeparator: ' ' },
386
1019
  output: {
387
1020
  casing: 'original',
388
- letterSeparator: '',
389
- wordSeparator: ' ',
1021
+ letterSeparator: ' ',
1022
+ wordSeparator: ' | ',
390
1023
  },
391
1024
  });
392
- return super.encode(input, { shifts: [shift] }, mergedOpts);
1025
+ return super.encode(input, configuration, mergedOpts);
393
1026
  }
394
- decode(input, { shift }, opts) {
1027
+ decode(input, configuration, opts) {
395
1028
  const mergedOpts = withDefaultCipherOptions(opts, {
396
1029
  input: {
397
1030
  caseSensitive: false,
398
- letterSeparator: '',
399
- wordSeparator: ' ',
400
- },
401
- output: {
402
- casing: 'original',
403
- letterSeparator: '',
404
- wordSeparator: ' ',
1031
+ letterSeparator: ' ',
1032
+ wordSeparator: ' | ',
405
1033
  },
1034
+ output: { casing: 'original', letterSeparator: '', wordSeparator: ' ' },
406
1035
  });
407
- return super.decode(input, { shifts: [shift] }, mergedOpts);
1036
+ return super.decode(input, configuration, mergedOpts);
408
1037
  }
409
1038
  }
410
- ShiftAlphabetCipher.DEFAULT_ALPHABET = [
1039
+
1040
+ class ShiftRotorABCDCipher extends ShiftRotorCipher {
1041
+ constructor() {
1042
+ const rotors = [];
1043
+ const baseAlphabet = new ShiftCipher(ShiftRotorABCDCipher.BASE_ALPHABET);
1044
+ for (let i = 0; i < ShiftRotorABCDCipher.ROTOR_ALPHABETS.length; i++) {
1045
+ rotors.push(new ShiftCipher(ShiftRotorABCDCipher.ROTOR_ALPHABETS[i]));
1046
+ }
1047
+ super(baseAlphabet, rotors);
1048
+ }
1049
+ }
1050
+ ShiftRotorABCDCipher.BASE_ALPHABET = [
411
1051
  'A',
412
1052
  'B',
413
1053
  'C',
@@ -434,6 +1074,33 @@ ShiftAlphabetCipher.DEFAULT_ALPHABET = [
434
1074
  'X',
435
1075
  'Y',
436
1076
  'Z',
1077
+ '0',
1078
+ '1',
1079
+ '2',
1080
+ '3',
1081
+ '4',
1082
+ '5',
1083
+ '6',
1084
+ '7',
1085
+ '8',
1086
+ '9',
1087
+ ];
1088
+ ShiftRotorABCDCipher.REPEAT_ALPHABET = ['A', 'B', 'C', 'D'];
1089
+ ShiftRotorABCDCipher.generateRepeatRotorAlphabet = (repeatAlphabet, repeat) => {
1090
+ let output = [];
1091
+ while (output.length < ShiftRotorABCDCipher.BASE_ALPHABET.length) {
1092
+ for (let i = 0; i < repeatAlphabet.length; i++) {
1093
+ for (let k = 0; k < repeat; k++) {
1094
+ output.push(repeatAlphabet[i]);
1095
+ }
1096
+ }
1097
+ }
1098
+ return output;
1099
+ };
1100
+ ShiftRotorABCDCipher.ROTOR_ALPHABETS = [
1101
+ ShiftRotorABCDCipher.generateRepeatRotorAlphabet(ShiftRotorABCDCipher.REPEAT_ALPHABET, 1),
1102
+ ShiftRotorABCDCipher.generateRepeatRotorAlphabet(ShiftRotorABCDCipher.REPEAT_ALPHABET, 3),
1103
+ ShiftRotorABCDCipher.generateRepeatRotorAlphabet(ShiftRotorABCDCipher.REPEAT_ALPHABET, 9),
437
1104
  ];
438
1105
 
439
- export { MorseCodeCipher, PolandCrossCipher, ShiftAlphabetCipher, SubstitutionCipher };
1106
+ export { ChineseCipher, Cipher, FractionCipher, MobileCipher, MorseCodeCipher, PolandCrossCipher, ShiftAlphabetCipher, ShiftRotorABCDCipher, SpiderCipher, SubstitutionCipher };