{"id":66,"date":"2025-10-28T15:24:54","date_gmt":"2025-10-28T11:54:54","guid":{"rendered":"https:\/\/mbahrani.yclass2.ir\/?page_id=66"},"modified":"2025-12-23T17:37:03","modified_gmt":"2025-12-23T14:07:03","slug":"morse-code-translator","status":"publish","type":"page","link":"https:\/\/mbahrani.yclass2.ir\/?page_id=66","title":{"rendered":"Morse Code Translator"},"content":{"rendered":"\n<div style=\"font-family:Consolas; max-width:600px; margin:auto;\">\n  <h2>Morse \u21c4 Text Translator<\/h2>\n  <label for=\"input\">Input:<\/label><br>\n  <textarea id=\"input\" rows=\"5\" style=\"width:100%; font-size:14px;\"><\/textarea><br><br>\n\n  <label for=\"output\">Output:<\/label><br>\n  <textarea id=\"output\" rows=\"5\" style=\"width:100%; font-size:14px;\" readonly><\/textarea><br><br>\n\n  <button onclick=\"toggleDirection()\" style=\"width:120px;\">Direction: Text \u2192 Morse<\/button>\n  <button onclick=\"playMorse()\" style=\"width:120px;\">Play Morse<\/button>\n  <button onclick=\"copyOutput()\" style=\"width:120px;\">Copy Output<\/button>\n<\/div>\n\n<script>\nconst morseMap = {\n  \"A\": \".-\", \"B\": \"-...\", \"C\": \"-.-.\", \"D\": \"-..\", \"E\": \".\", \"F\": \"..-.\",\n  \"G\": \"--.\", \"H\": \"....\", \"I\": \"..\", \"J\": \".---\", \"K\": \"-.-\", \"L\": \".-..\",\n  \"M\": \"--\", \"N\": \"-.\", \"O\": \"---\", \"P\": \".--.\", \"Q\": \"--.-\", \"R\": \".-.\",\n  \"S\": \"...\", \"T\": \"-\", \"U\": \"..-\", \"V\": \"...-\", \"W\": \".--\", \"X\": \"-..-\",\n  \"Y\": \"-.--\", \"Z\": \"--..\", \"0\": \"-----\", \"1\": \".----\", \"2\": \"..---\",\n  \"3\": \"...--\", \"4\": \"....-\", \"5\": \".....\", \"6\": \"-....\", \"7\": \"--...\",\n  \"8\": \"---..\", \"9\": \"----.\", \" \": \"\/\"\n};\nconst reverseMap = Object.fromEntries(Object.entries(morseMap).map(([k,v]) => [v,k]));\nlet direction = \"text-to-morse\";\n\ndocument.getElementById(\"input\").addEventListener(\"input\", translate);\n\nfunction translate() {\n  const input = document.getElementById(\"input\").value.trim();\n  let output = \"\";\n  if (direction === \"text-to-morse\") {\n    output = input.toUpperCase().split(\"\").map(c => morseMap[c] || \"\").join(\" \");\n  } else {\n    output = input.split(\" \/ \").map(word =>\n      word.split(\" \").map(code => reverseMap[code] || \"\").join(\"\")\n    ).join(\" \");\n  }\n  document.getElementById(\"output\").value = output;\n}\n\nfunction toggleDirection() {\n  direction = direction === \"text-to-morse\" ? \"morse-to-text\" : \"text-to-morse\";\n  document.querySelector(\"button\").innerText = direction === \"text-to-morse\" ? \"Direction: Text \u2192 Morse\" : \"Direction: Morse \u2192 Text\";\n  translate();\n}\n\nfunction copyOutput() {\n  const out = document.getElementById(\"output\");\n  out.select();\n  document.execCommand(\"copy\");\n  alert(\"Output copied!\");\n}\n\nfunction playMorse() {\n  const morse = document.getElementById(\"output\").value.trim();\n  const ctx = new (window.AudioContext || window.webkitAudioContext)();\n  let t = ctx.currentTime;\n\n  for (let char of morse) {\n    if (char === \".\") {\n      beep(ctx, t, 0.1); t += 0.15;\n    } else if (char === \"-\") {\n      beep(ctx, t, 0.3); t += 0.35;\n    } else if (char === \"\/\") {\n      t += 0.7;\n    } else {\n      t += 0.15;\n    }\n  }\n}\n\nfunction beep(ctx, start, duration) {\n  const osc = ctx.createOscillator();\n  const gain = ctx.createGain();\n  osc.frequency.value = 700;\n  osc.connect(gain);\n  gain.connect(ctx.destination);\n  osc.start(start);\n  osc.stop(start + duration);\n}\n<\/script>\n\n\n\n<style>\n  \/* Default light mode *\/\n  body {\n    background-color: #ffffff;\n    color: #000000;\n    transition: background-color 0.3s, color 0.3s;\n    font-family: Consolas, sans-serif;\n  }\n\n  \/* Dark mode *\/\n  body.dark-mode {\n    background-color: #121212;\n    color: #f0f0f0;\n  }\n\n  \/* Toggle button styling *\/\n  #modeToggle {\n    position: fixed;\n    top: 10px;\n    right: 10px;\n    padding: 8px 12px;\n    background: #0078d7;\n    color: #fff;\n    border: none;\n    border-radius: 4px;\n    cursor: pointer;\n    font-size: 14px;\n    z-index: 9999;\n  }\n\n  #modeToggle:hover {\n    background: #005a9e;\n  }\n<\/style>\n\n<button id=\"modeToggle\">Dark Mode<\/button>\n\n<script>\n  const toggleBtn = document.getElementById(\"modeToggle\");\n  toggleBtn.addEventListener(\"click\", () => {\n    document.body.classList.toggle(\"dark-mode\");\n    toggleBtn.textContent = \n      document.body.classList.contains(\"dark-mode\") \n        ? \"Light Mode\" \n        : \"Dark Mode\";\n  });\n<\/script>\n\n\n\n\n<!-- In <head> -->\n<style>\n  :root {\n    --bg: #ffffff;\n    --text: #000000;\n    --panel: #f7f7f7;\n    --border: #d0d0d0;\n    --btn-bg: #0078d7;\n    --btn-text: #ffffff;\n  }\n  :root.dark {\n    --bg: #121212;\n    --text: #f0f0f0;\n    --panel: #1c1c1c;\n    --border: #2a2a2a;\n    --btn-bg: #2d7df4;\n    --btn-text: #ffffff;\n  }\n\n  html, body {\n    background: var(--bg);\n    color: var(--text);\n    transition: background 0.25s, color 0.25s;\n    min-height: 100%;\n  }\n\n  \/* Make sure the button is always on top and clickable *\/\n  #modeToggle {\n    position: fixed;\n    top: 10px;\n    right: 10px;\n    padding: 8px 12px;\n    background: var(--btn-bg);\n    color: var(--btn-text);\n    border: none;\n    border-radius: 6px;\n    cursor: pointer;\n    font-size: 14px;\n    z-index: 2147483647; \/* max int-ish *\/\n    pointer-events: auto;\n    box-shadow: 0 2px 8px rgba(0,0,0,0.25);\n  }\n\n  \/* Ensure panels\/inputs reflect the theme *\/\n  .panel, textarea, input, select, button:not(#modeToggle) {\n    background: var(--panel);\n    color: var(--text);\n    border: 1px solid var(--border);\n    transition: background 0.25s, color 0.25s, border-color 0.25s;\n  }\n<\/style>\n\n<!-- Place this anywhere inside <body>, ideally near the end -->\n<button id=\"modeToggle\" onclick=\"window.__toggleTheme &#038;&#038; window.__toggleTheme()\">\n  \ud83c\udf19 Dark mode\n<\/button>\n\n<script>\n  \/\/ Safe init: won\u2019t throw if run early\/late\n  (function initThemeToggle() {\n    const root = document.documentElement;\n    const btn = document.getElementById('modeToggle');\n\n    \/\/ Define toggle as a global fallback for inline onclick\n    window.__toggleTheme = function () {\n      root.classList.toggle('dark');\n      const dark = root.classList.contains('dark');\n      localStorage.setItem('theme', dark ? 'dark' : 'light');\n      if (btn) btn.textContent = dark ? '\ud83d\udd06 Light mode' : '\ud83c\udf19 Dark mode';\n    };\n\n    \/\/ Apply saved preference immediately\n    try {\n      const saved = localStorage.getItem('theme');\n      if (saved === 'dark') root.classList.add('dark');\n    } catch (e) { \/* ignore storage issues *\/ }\n\n    \/\/ Update label\n    if (btn) {\n      const dark = root.classList.contains('dark');\n      btn.textContent = dark ? '\ud83d\udd06 Light mode' : '\ud83c\udf19 Dark mode';\n\n      \/\/ Redundant listener as backup (in case onclick is stripped)\n      btn.addEventListener('click', window.__toggleTheme);\n    }\n  })();\n<\/script>\n\n","protected":false},"excerpt":{"rendered":"<p>Morse \u21c4 Text Translator Input: Output: Direction: Text \u2192 Morse Play Morse Copy Output Dark Mode \ud83c\udf19 Dark mode<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-66","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.6 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Morse Code Translator - \u0637\u0631\u0627\u062d\u06cc<\/title>\n<meta name=\"robots\" content=\"noindex, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Morse Code Translator - \u0637\u0631\u0627\u062d\u06cc\" \/>\n<meta property=\"og:description\" content=\"Morse \u21c4 Text Translator Input: Output: Direction: Text \u2192 Morse Play Morse Copy Output Dark Mode \ud83c\udf19 Dark mode\" \/>\n<meta property=\"og:url\" content=\"https:\/\/mbahrani.yclass2.ir\/?page_id=66\" \/>\n<meta property=\"og:site_name\" content=\"\u0637\u0631\u0627\u062d\u06cc\" \/>\n<meta property=\"article:modified_time\" content=\"2025-12-23T14:07:03+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"1 minute\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/mbahrani.yclass2.ir\/?page_id=66\",\"url\":\"https:\/\/mbahrani.yclass2.ir\/?page_id=66\",\"name\":\"Morse Code Translator - \u0637\u0631\u0627\u062d\u06cc\",\"isPartOf\":{\"@id\":\"https:\/\/mbahrani.yclass2.ir\/#website\"},\"datePublished\":\"2025-10-28T11:54:54+00:00\",\"dateModified\":\"2025-12-23T14:07:03+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/mbahrani.yclass2.ir\/?page_id=66#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/mbahrani.yclass2.ir\/?page_id=66\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/mbahrani.yclass2.ir\/?page_id=66#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/mbahrani.yclass2.ir\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Morse Code Translator\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/mbahrani.yclass2.ir\/#website\",\"url\":\"https:\/\/mbahrani.yclass2.ir\/\",\"name\":\"\u0637\u0631\u0627\u062d\u06cc\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/mbahrani.yclass2.ir\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Morse Code Translator - \u0637\u0631\u0627\u062d\u06cc","robots":{"index":"noindex","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"og_locale":"en_US","og_type":"article","og_title":"Morse Code Translator - \u0637\u0631\u0627\u062d\u06cc","og_description":"Morse \u21c4 Text Translator Input: Output: Direction: Text \u2192 Morse Play Morse Copy Output Dark Mode \ud83c\udf19 Dark mode","og_url":"https:\/\/mbahrani.yclass2.ir\/?page_id=66","og_site_name":"\u0637\u0631\u0627\u062d\u06cc","article_modified_time":"2025-12-23T14:07:03+00:00","twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"1 minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/mbahrani.yclass2.ir\/?page_id=66","url":"https:\/\/mbahrani.yclass2.ir\/?page_id=66","name":"Morse Code Translator - \u0637\u0631\u0627\u062d\u06cc","isPartOf":{"@id":"https:\/\/mbahrani.yclass2.ir\/#website"},"datePublished":"2025-10-28T11:54:54+00:00","dateModified":"2025-12-23T14:07:03+00:00","breadcrumb":{"@id":"https:\/\/mbahrani.yclass2.ir\/?page_id=66#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/mbahrani.yclass2.ir\/?page_id=66"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/mbahrani.yclass2.ir\/?page_id=66#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/mbahrani.yclass2.ir\/"},{"@type":"ListItem","position":2,"name":"Morse Code Translator"}]},{"@type":"WebSite","@id":"https:\/\/mbahrani.yclass2.ir\/#website","url":"https:\/\/mbahrani.yclass2.ir\/","name":"\u0637\u0631\u0627\u062d\u06cc","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/mbahrani.yclass2.ir\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"}]}},"_links":{"self":[{"href":"https:\/\/mbahrani.yclass2.ir\/index.php?rest_route=\/wp\/v2\/pages\/66","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mbahrani.yclass2.ir\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/mbahrani.yclass2.ir\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/mbahrani.yclass2.ir\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/mbahrani.yclass2.ir\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=66"}],"version-history":[{"count":9,"href":"https:\/\/mbahrani.yclass2.ir\/index.php?rest_route=\/wp\/v2\/pages\/66\/revisions"}],"predecessor-version":[{"id":161,"href":"https:\/\/mbahrani.yclass2.ir\/index.php?rest_route=\/wp\/v2\/pages\/66\/revisions\/161"}],"wp:attachment":[{"href":"https:\/\/mbahrani.yclass2.ir\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=66"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}