MorseCode.js 5.6 KB

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