FromMorseCode.mjs 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. /**
  2. * @author tlwr [toby@toby.codes]
  3. * @copyright Crown Copyright 2017
  4. * @license Apache-2.0
  5. */
  6. import Operation from "../Operation";
  7. import Utils from "../Utils";
  8. import {LETTER_DELIM_OPTIONS, WORD_DELIM_OPTIONS} from "../lib/Delim";
  9. /**
  10. * From Morse Code operation
  11. */
  12. class FromMorseCode extends Operation {
  13. /**
  14. * FromMorseCode constructor
  15. */
  16. constructor() {
  17. super();
  18. this.name = "From Morse Code";
  19. this.module = "Default";
  20. this.description = "Translates Morse Code into (upper case) alphanumeric characters.";
  21. this.inputType = "string";
  22. this.outputType = "string";
  23. this.args = [
  24. {
  25. "name": "Letter delimiter",
  26. "type": "option",
  27. "value": LETTER_DELIM_OPTIONS
  28. },
  29. {
  30. "name": "Word delimiter",
  31. "type": "option",
  32. "value": WORD_DELIM_OPTIONS
  33. }
  34. ];
  35. this.patterns = [
  36. {
  37. match: "(?:^[-. \\n]{5,}$|^[_. \\n]{5,}$|^(?:dash|dot| |\\n){5,}$)",
  38. flags: "i",
  39. args: ["Space", "Line feed"]
  40. },
  41. ];
  42. }
  43. /**
  44. * @param {string} input
  45. * @param {Object[]} args
  46. * @returns {string}
  47. */
  48. run(input, args) {
  49. if (!this.reversedTable) {
  50. this.reverseTable();
  51. }
  52. const letterDelim = Utils.charRep(args[0]);
  53. const wordDelim = Utils.charRep(args[1]);
  54. input = input.replace(/-|‐|−|_|–|—|dash/ig, "<dash>"); //hyphen-minus|hyphen|minus-sign|undersore|en-dash|em-dash
  55. input = input.replace(/\.|·|dot/ig, "<dot>");
  56. let words = input.split(wordDelim);
  57. const self = this;
  58. words = Array.prototype.map.call(words, function(word) {
  59. const signals = word.split(letterDelim);
  60. const letters = signals.map(function(signal) {
  61. return self.reversedTable[signal];
  62. });
  63. return letters.join("");
  64. });
  65. words = words.join(" ");
  66. return words;
  67. }
  68. /**
  69. * Reverses the Morse Code lookup table
  70. */
  71. reverseTable() {
  72. this.reversedTable = {};
  73. for (const letter in MORSE_TABLE) {
  74. const signal = MORSE_TABLE[letter];
  75. this.reversedTable[signal] = letter;
  76. }
  77. }
  78. }
  79. const MORSE_TABLE = {
  80. "A": "<dot><dash>",
  81. "B": "<dash><dot><dot><dot>",
  82. "C": "<dash><dot><dash><dot>",
  83. "D": "<dash><dot><dot>",
  84. "E": "<dot>",
  85. "F": "<dot><dot><dash><dot>",
  86. "G": "<dash><dash><dot>",
  87. "H": "<dot><dot><dot><dot>",
  88. "I": "<dot><dot>",
  89. "J": "<dot><dash><dash><dash>",
  90. "K": "<dash><dot><dash>",
  91. "L": "<dot><dash><dot><dot>",
  92. "M": "<dash><dash>",
  93. "N": "<dash><dot>",
  94. "O": "<dash><dash><dash>",
  95. "P": "<dot><dash><dash><dot>",
  96. "Q": "<dash><dash><dot><dash>",
  97. "R": "<dot><dash><dot>",
  98. "S": "<dot><dot><dot>",
  99. "T": "<dash>",
  100. "U": "<dot><dot><dash>",
  101. "V": "<dot><dot><dot><dash>",
  102. "W": "<dot><dash><dash>",
  103. "X": "<dash><dot><dot><dash>",
  104. "Y": "<dash><dot><dash><dash>",
  105. "Z": "<dash><dash><dot><dot>",
  106. "1": "<dot><dash><dash><dash><dash>",
  107. "2": "<dot><dot><dash><dash><dash>",
  108. "3": "<dot><dot><dot><dash><dash>",
  109. "4": "<dot><dot><dot><dot><dash>",
  110. "5": "<dot><dot><dot><dot><dot>",
  111. "6": "<dash><dot><dot><dot><dot>",
  112. "7": "<dash><dash><dot><dot><dot>",
  113. "8": "<dash><dash><dash><dot><dot>",
  114. "9": "<dash><dash><dash><dash><dot>",
  115. "0": "<dash><dash><dash><dash><dash>",
  116. ".": "<dot><dash><dot><dash><dot><dash>",
  117. ",": "<dash><dash><dot><dot><dash><dash>",
  118. ":": "<dash><dash><dash><dot><dot><dot>",
  119. ";": "<dash><dot><dash><dot><dash><dot>",
  120. "!": "<dash><dot><dash><dot><dash><dash>",
  121. "?": "<dot><dot><dash><dash><dot><dot>",
  122. "'": "<dot><dash><dash><dash><dash><dot>",
  123. "\"": "<dot><dash><dot><dot><dash><dot>",
  124. "/": "<dash><dot><dot><dash><dot>",
  125. "-": "<dash><dot><dot><dot><dot><dash>",
  126. "+": "<dot><dash><dot><dash><dot>",
  127. "(": "<dash><dot><dash><dash><dot>",
  128. ")": "<dash><dot><dash><dash><dot><dash>",
  129. "@": "<dot><dash><dash><dot><dash><dot>",
  130. "=": "<dash><dot><dot><dot><dash>",
  131. "&": "<dot><dash><dot><dot><dot>",
  132. "_": "<dot><dot><dash><dash><dot><dash>",
  133. "$": "<dot><dot><dot><dash><dot><dot><dash>"
  134. };
  135. export default FromMorseCode;