MorseCode.js 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. import Utils from "../Utils.js";
  2. /**
  3. * Morse Code translation operations.
  4. *
  5. * @author tlwr [toby@toby.codes]
  6. * @copyright Crown Copyright 2017
  7. * @license Apache-2.0
  8. *
  9. * @namespace
  10. */
  11. const MorseCode = {
  12. /**
  13. * @constant
  14. * @default
  15. */
  16. FORMAT_OPTIONS: ["-/.", "_/.", "Dash/Dot", "DASH/DOT", "dash/dot"],
  17. /**
  18. * @constant
  19. * @default
  20. */
  21. LETTER_DELIM_OPTIONS: ["Space", "Line feed", "CRLF", "Forward slash", "Backslash", "Comma", "Semi-colon", "Colon"],
  22. /**
  23. * @constant
  24. * @default
  25. */
  26. WORD_DELIM_OPTIONS: ["Line feed", "CRLF", "Forward slash", "Backslash", "Comma", "Semi-colon", "Colon"],
  27. /**
  28. * @constant
  29. * @default
  30. */
  31. MORSE_TABLE: {
  32. "A": "<dot><dash>",
  33. "B": "<dash><dot><dot><dot>",
  34. "C": "<dash><dot><dash><dot>",
  35. "D": "<dash><dot><dot>",
  36. "E": "<dot>",
  37. "F": "<dot><dot><dash><dot>",
  38. "G": "<dash><dash><dot>",
  39. "H": "<dot><dot><dot><dot>",
  40. "I": "<dot><dot>",
  41. "J": "<dot><dash><dash><dash>",
  42. "K": "<dash><dot><dash>",
  43. "L": "<dot><dash><dot><dot>",
  44. "M": "<dash><dash>",
  45. "N": "<dash><dot>",
  46. "O": "<dash><dash><dash>",
  47. "P": "<dot><dash><dash><dot>",
  48. "Q": "<dash><dash><dot><dash>",
  49. "R": "<dot><dash><dot>",
  50. "S": "<dot><dot><dot>",
  51. "T": "<dash>",
  52. "U": "<dot><dot><dash>",
  53. "V": "<dot><dot><dot><dash>",
  54. "W": "<dot><dash><dash>",
  55. "X": "<dash><dot><dot><dash>",
  56. "Y": "<dash><dot><dash><dash>",
  57. "Z": "<dash><dash><dot><dot>",
  58. "1": "<dot><dash><dash><dash><dash>",
  59. "2": "<dot><dot><dash><dash><dash>",
  60. "3": "<dot><dot><dot><dash><dash>",
  61. "4": "<dot><dot><dot><dot><dash>",
  62. "5": "<dot><dot><dot><dot><dot>",
  63. "6": "<dash><dot><dot><dot><dot>",
  64. "7": "<dash><dash><dot><dot><dot>",
  65. "8": "<dash><dash><dash><dot><dot>",
  66. "9": "<dash><dash><dash><dash><dot>",
  67. "0": "<dash><dash><dash><dash><dash>",
  68. ".": "<dot><dash><dot><dash><dot><dash>",
  69. ",": "<dash><dash><dot><dot><dash><dash>",
  70. ":": "<dash><dash><dash><dot><dot><dot>",
  71. ";": "<dash><dot><dash><dot><dash><dot>",
  72. "!": "<dash><dot><dash><dot><dash><dash>",
  73. "?": "<dot><dot><dash><dash><dot><dot>",
  74. "'": "<dot><dash><dash><dash><dash><dot>",
  75. "\"": "<dot><dash><dot><dot><dash><dot>",
  76. "/": "<dash><dot><dot><dash><dot>",
  77. "-": "<dash><dot><dot><dot><dot><dash>",
  78. "+": "<dot><dash><dot><dash><dot>",
  79. "(": "<dash><dot><dash><dash><dot>",
  80. ")": "<dash><dot><dash><dash><dot><dash>",
  81. "@": "<dot><dash><dash><dot><dash><dot>",
  82. "=": "<dash><dot><dot><dot><dash>",
  83. "&": "<dot><dash><dot><dot><dot>",
  84. "_": "<dot><dot><dash><dash><dot><dash>",
  85. "$": "<dot><dot><dot><dash><dot><dot><dash>"
  86. },
  87. /**
  88. * To Morse Code operation.
  89. *
  90. * @param {number} input
  91. * @param {Object[]} args
  92. * @returns {string}
  93. */
  94. runTo: function(input, args) {
  95. const format = args[0].split("/");
  96. const dash = format[0];
  97. const dot = format[1];
  98. const letterDelim = Utils.charRep[args[1]];
  99. const wordDelim = Utils.charRep[args[2]];
  100. input = input.split(/\r?\n/);
  101. input = Array.prototype.map.call(input, function(line) {
  102. let words = line.split(/ +/);
  103. words = Array.prototype.map.call(words, function(word) {
  104. const letters = Array.prototype.map.call(word, function(character) {
  105. const letter = character.toUpperCase();
  106. if (typeof MorseCode.MORSE_TABLE[letter] == "undefined") {
  107. return "";
  108. }
  109. return MorseCode.MORSE_TABLE[letter];
  110. });
  111. return letters.join("<ld>");
  112. });
  113. line = words.join("<wd>");
  114. return line;
  115. });
  116. input = input.join("\n");
  117. input = input.replace(
  118. /<dash>|<dot>|<ld>|<wd>/g,
  119. function(match) {
  120. switch (match) {
  121. case "<dash>": return dash;
  122. case "<dot>": return dot;
  123. case "<ld>": return letterDelim;
  124. case "<wd>": return wordDelim;
  125. }
  126. }
  127. );
  128. return input;
  129. },
  130. /**
  131. * From Morse Code operation.
  132. *
  133. * @param {string} input
  134. * @param {Object[]} args
  135. * @returns {string}
  136. */
  137. runFrom: (function() {
  138. let reversedTable = null;
  139. const reverseTable = function() {
  140. reversedTable = {};
  141. for (const letter in MorseCode.MORSE_TABLE) {
  142. const signal = MorseCode.MORSE_TABLE[letter];
  143. reversedTable[signal] = letter;
  144. }
  145. };
  146. return function(input, args) {
  147. if (reversedTable === null) {
  148. reverseTable();
  149. }
  150. const letterDelim = Utils.charRep[args[0]];
  151. const wordDelim = Utils.charRep[args[1]];
  152. input = input.replace(/-|‐|−|_|–|—|dash/ig, "<dash>"); //hyphen-minus|hyphen|minus-sign|undersore|en-dash|em-dash
  153. input = input.replace(/\.|·|dot/ig, "<dot>");
  154. let words = input.split(wordDelim);
  155. words = Array.prototype.map.call(words, function(word) {
  156. const signals = word.split(letterDelim);
  157. const letters = signals.map(function(signal) {
  158. return reversedTable[signal];
  159. });
  160. return letters.join("");
  161. });
  162. words = words.join(" ");
  163. return words;
  164. };
  165. })(),
  166. };
  167. export default MorseCode;