Skip to content

Instantly share code, notes, and snippets.

@dicenull
Created June 21, 2018 05:18
Show Gist options
  • Save dicenull/2345ca91ca7f87e70763248a87e4c8bf to your computer and use it in GitHub Desktop.
Save dicenull/2345ca91ca7f87e70763248a87e4c8bf to your computer and use it in GitHub Desktop.
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>モールス信号変換</title>
<style>
/* CSSはココ */
input {
width: 50px;
height: 20px;
}
input[type="text"] {
width: 300px;
height: 20px;
}
</style>
</head>
<body>
<h1>モールス信号変換</h1>
<input type="checkbox" id="kana_enabled" size="50">和文モールス符号を使う<br>
和文モールスを使う場合、全角カナで入力してください<br>
<h3>文字 → モールス信号</h3>
文字を入力して変換ボタンを押してください:
<br>
<input type="text" id="string_input" value="SOS" size="50">
<br>
<input type="button" value="変換" onclick="string_to_morse()">
<br> ↓ </br>
<div id="morse_output">ここに出ます</div>
<h3>モールス信号 → 文字</h3>
モールス信号を入力して変換ボタンを押してください:
<br>
<input type="text" id="morse_input" value="・・・ ーーー ・・・" size="50">
<br>
<input type="button" value="変換" onclick="morse_to_string()">
<br> ↓ </br>
<div id="string_output">ここに出ます</div>
<script>
// JavaScript はココ
var CodeData = (function() {
// 文字からモールス符号のコードへの変換表
var code_table =
[
{
// アルファベット
'A': '01', 'B': '1000', 'C': '1010', 'D': '100', 'E': '0',
'F': '0010', 'G': '110', 'H': '0000', 'I': '00', 'J': '0111',
'K': '101', 'L': '0100', 'M': '11', 'N': '10', 'O': '111',
'P': '0110', 'Q': '1101', 'R': '010', 'S': '000', 'T': '1',
'U': '001', 'V': '0001', 'W': '011', 'X': '1001', 'Y': '1011',
'Z': '1100'
,
// 記号
'.': '010101', ',': '110011', '?': '001100', '!': '101011',
'-': '100001', '/': '10010', '@': '011010', '(': '10110',
')': '101101'
},
{
// カタカナ
'ア': '11011', 'イ': '01', 'ウ': '001', 'エ': '10111', 'オ': '01000',
'カ': '0100', 'キ': '10100', 'ク': '0001', 'ケ': '1011', 'コ': '1111',
'サ': '10101', 'シ': '11010', 'ス': '11101', 'セ': '01110', 'ソ': '1110',
'タ': '10', 'チ': '0010', 'ツ': '0110', 'テ': '01011', 'ト': '00100',
'ナ': '010', 'ニ': '1010', 'ヌ': '0000', 'ネ': '1101', 'ノ': '0011',
'ハ': '1000', 'ヒ': '11001', 'フ': '1100', 'ヘ': '0', 'ホ': '100',
'マ': '1001', 'ミ': '00101', 'ム': '1', 'メ': '10001', 'モ': '10010',
'ヤ': '011', 'ユ': '10011', 'ヨ': '11',
'ラ': '000', 'リ': '110', 'ル': '10110', 'レ': '111', 'ロ': '0101',
'ワ': '101', 'ヲ': '0111', 'ン': '01010', '゛': '00', '゜': '00110'
,
// 記号
'ー': '01101', '、': '010101', '(': '101101',
')': '010010'
}
];
return {
// 文字からコードを取得するテーブル
CodeTable: function (kana_enabled) {
return code_table[kana_enabled];
},
// コードから文字を取得するテーブル
CharacterTable: function (kana_enabled) {
// モールス符号のコードから文字への変換表
var character_table = [];
for (var code_key in code_table[kana_enabled]) {
// code_tableのkeyとvalueを入れ替える
character_table[code_table[kana_enabled][code_key]] = code_key;
}
return character_table;
}
};
})();
// モールスを文字に変換
function morse_to_string() {
var morseStr = convert_to_string(document.getElementById("morse_input").value)
document.querySelector('#string_output').innerHTML = morseStr
}
// 文字をモールスに変換
function string_to_morse() {
var morseStr = convert_to_morse(document.getElementById("string_input").value)
document.querySelector('#morse_output').innerHTML = morseStr
}
function convert_to_string(morse) {
// 和文と英文どちらで変換するかを取得する
var kana_enabled = 0;
if (document.getElementById("kana_enabled").checked) {
kana_enabled = 1;
}
var output = '';
var codes = to_code(morse);
var character_table = CodeData.CharacterTable(kana_enabled);
for (var i = 0; i < codes.length; i++) {
output += character_table[codes[i]];
}
return output;
}
function convert_to_morse(string) {
// 和文と英文どちらで変換するかを取得する
var kana_enabled = 0;
if (document.getElementById("kana_enabled").checked) {
kana_enabled = 1;
}
// - 入力文字をモールス信号に変換
var output = '';
for (var i = 0; i < string.length; i++) {
// モールス符号の間を空けることで読みやすくする
if (i > 0) {
output += ' ';
}
// 小文字を大文字に変換することで大文字小文字どちらにも対応
var character_key = string[i].toUpperCase();
// モールス符号のない文字をある文字の組み合わせに置換
character_key = to_convertible_kana(character_key);
var code_table = CodeData.CodeTable(kana_enabled);
for (var k = 0; k < character_key.length; k++) {
if (k > 0) {
output += ' ';
}
output += to_morse(code_table[character_key[k]]);
}
}
return output;
}
// モールス符号にできない文字を変換可能な文字に置き換える
function to_convertible_kana(kana) {
var conv_kana = '';
switch (kana) {
case 'ガ':
case 'ギ':
case 'グ':
case 'ゲ':
case 'ゴ':
case 'ザ':
case 'ジ':
case 'ズ':
case 'ゼ':
case 'ゾ':
case 'ダ':
case 'ヂ':
case 'ヅ':
case 'デ':
case 'ド':
case 'バ':
case 'ビ':
case 'ブ':
case 'ベ':
case 'ボ':
// 濁点付き文字を分離
conv_kana += String.fromCharCode(kana.charCodeAt(0) - 1);
conv_kana += '゛';
break;
case 'パ':
case 'ピ':
case 'プ':
case 'ペ':
case 'ポ':
// 半濁点付き文字を分離
conv_kana += String.fromCharCode(kana.charCodeAt(0) - 2);
conv_kana += '゜';
break;
case 'ァ':
case 'ィ':
case 'ゥ':
case 'ェ':
case 'ォ':
case 'ャ':
case 'ュ':
case 'ョ':
case 'ッ':
// 小文字を大文字に変換
conv_kana += String.fromCharCode(kana.charCodeAt(0) + 1);
break;
default:
conv_kana += kana;
break;
}
return conv_kana;
}
// 01コードからモールス符号に変換する
function to_morse(code) {
var morse_code = '';
for (var i = 0; i < code.length; i++) {
switch (code[i]) {
case '0':
morse_code += '・';
break;
case '1':
morse_code += 'ー';
break;
}
}
return morse_code;
}
// モールス信号から01コードに変換する
function to_code(morse) {
var code = '';
var codes = [];
for (var i = 0; i < morse.length; i++) {
switch (morse[i]) {
case ' ':
case ' ':
codes.push(code);
code = '';
break;
case '・':
code += '0';
break;
case 'ー':
code += '1';
break;
}
}
if (code !== '') {
codes.push(code);
}
return codes;
}
</script>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment