Chrome 拡張機能を使ってウェブページのテキストをモールス符号に変換して、その場で再生できるか試しています。前回までの記事でモールス符号を再生できることまで確認しました。
この時点ではまだ自分でテキストを入力するか、ページからコピー&ペーストするしかないので面倒です。たとえば、選択された範囲のテキストがそのまま拡張機能に取り込まれるようにすると楽になりそうです。今回はこれにチャレンジしてみます。
Chrome 拡張機能については次のドキュメントが公開されています。
選択された範囲はdocument.getSelection()
で取得できますが、これは文字列を選択しているページのdocument
ではありません。ポップアップ画面からは現在表示されているページを直接操作できないため、メッセージングを用いてページとやり取りします。
ポップアップ画面からは次のように現在アクティブなタブを取得します。このタブにメッセージを送信して選択されたテキストを返すように依頼します。
const [tab] = await chrome.tabs.query({ active: true, currentWindow: true }) chrome.tabs.sendMessage(tab.id, { type: "GET_SELECTED_TEXT" }) .then(res => { text.value = res.value }) .catch(e => { console.log(e) })
メッセージを受け取ったページの方は次のようにして選択されたテキストを返します。
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => { if (message.type === "GET_SELECTED_TEXT") { sendResponse({ value: document.getSelection().toString() }) } return true })
これをcontent.js
というファイルに保存し、ページが表示されたときにインジェクトされるようにします。manifest.json のcontent_scripts
に次のように設定します。
"content_scripts": [ { "js": ["assets/scripts/content.js"], "matches": [ "https://*/*", "http://*/*" ] } ]
これで準備は完了です。
テストには A1 CLUB のサイトで公開されているモールス符号練習ページを利用しました。次のように電文を選択して Chrome 拡張機能を起動すると、選択されたテキストがテキストエリアに取り込まれました。
これで
和文はルビが振ってあるウェブサイトであれば、この機能を利用して一応再生はできます。ただ、jscwlib は漢字の部分はスキップせず無音になるので間が開いてしまいます。取り込むときに漢字を取り除けばよさそうです。今後はルビを振っていないサイトにも対応できたらと思っています。
これで受信練習のテキスト素材の準備がだいぶ楽になりました。
JI1JDI
ゆるく楽しくアマチュア無線とプログラミングを楽しんでいます。 scrapbox.io