質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

1回答

4492閲覧

JavaScriptでIMEの注目文節を取得したい

raccy

総合スコア21737

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

1グッド

2クリップ

投稿2016/12/18 01:09

###前提・実現したいこと
HTMLの<input type="text">等で日本語を入力するとき、IME(Input Method Editor)を使っていると思います。IMEでは、入力中->文節変換->(文節確定)->全文確定という流れになっています。

さて、変更される文字列、入力中の文字列、文節変換中の文字列、全文確定後の文字列はComposition Eventsを使えば取得できます。

UI Events#4.7. Composition Events
CompositionEvent - Web APIs | MDN
CompositionEvent - Web API インターフェイス | MDN

しかし、これらのイベントで取得できるのは全ての文字列であるため、文節変換中の注目文節(アンダーバーが太かったり、色が変わったりしている部分)を区別して取得することができません。

注目文節を取得する方法は無いのでしょうか?特にChrome(正確にはChromium)で。

###発生している問題・エラーメッセージ
Composition Eventsでは文節変換途中の注目文節がどこなのかわからない!

###該当のソースコード
CompositonEventの動きを試す場合はこちらを使ってください。(注意: IEでは動きません)
https://jsbin.com/tuhojibumu/edit?html,output

HTML

1<!DOCTYPE html> 2<html> 3<head> 4 <meta charset="utf-8"> 5 <title>IMEから取得したい</title> 6 <style> 7 ul#log { 8 border: 1px solid; 9 padding-left: 0; 10 list-style-type: none; 11 overflow: scroll; 12 height: 30rem; 13 } 14 ul#log li { 15 white-space: pre; 16 font-family: monospace; 17 } 18 </style> 19</head> 20<body> 21 <input id="input" type="text"> 22 <ul id="log"></ul> 23 <script> 24 const addLog = (node, msg) => { 25 const logNode = document.createElement("li"); 26 logNode.textContent = msg; 27 node.appendChild(logNode); 28 }; 29 const inputNode = document.getElementById("input"); 30 const logNode = document.getElementById("log"); 31 inputNode.addEventListener("compositionstart", ({data}) => { 32 addLog(logNode, `start: ${data}`); 33 }); 34 inputNode.addEventListener("compositionupdate", ({data}) => { 35 addLog(logNode, `update: ${data}`); 36 }); 37 inputNode.addEventListener("compositionend", ({data}) => { 38 addLog(logNode, `end: ${data}`); 39 }); 40 </script> 41</body> 42</html>

###試したこと
Input Method Editor APIというWDがあるのですが、現在実装しているのはIEとEdgeのみとなっています。Chromeは開発中のようです。

これを使えば解決できそうな気もしますが、Chromeでの開発がいつ完了するかもわかりません。

###補足情報(言語/FW/ツール等のバージョンなど)
最終的な目標はAtomで注目文節がわかるようにすることです。現在のAtomでは、インプットを見せずに、Composition Eventsを利用して取得した文字列をエディタ内に表示する方法を取っています。しかし、文節変換では注目文節がどこかわからず、未確定と確定しか区別できません。これをなんとかしたいというのが今回の質問の目的です。なので、AtomというかElecrtronというかChromiumでできることが前提となります。

同じElectron製のVisual Studio Codeはインプットを上に被せる形で表示するため、区別が付きます(ただ、デフォルトのテーマだと凄く見づらいですけど)。

hgforteratail👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

raccy

2016/12/29 22:27

「やってほしいことだけ」と指摘された方へ。あと、一体何をやれば良いのかを教えてください。
guest

回答1

0

chromiumのソースを見ましたが、
代替できそうなものは見受けられませんでした。
変換という文化が世界共通ではないからですかねぇ。

chromium - イベントリスナーリスト
chromium - IMEInputEventクラス

https://jsbin.com/tuhojibumu/edit?html,output
Windows7, Windows10, Mac(sierra)で確認しましたが、
IMEのバージョンや種類、OS?によって挙動が変わるみたいです。

OK - Windows7(Google日本語入力) NG - Windows10(Google日本語入力) NG - MacOS(標準IME) OK - 部分的に取得が可能 NG - 全文字列が取得される

OKと記載していますが嘘です。
というのは動作を見る限り、内部では文字列比較を行っているように見受けられました。
(ソースまでは見てませんが。。)
下記は、「テスト」の候補で変換しています。

1: てすとだよ
2: テストだよ => テスト
3: てストだよ => て ※本来は「てスト」が表示されるべき

上記の仕様の場合、
代替としてパッと思いつくのは、
keyupイベント等で変更される値を比較する。
ですが、意味をなさないですね。

回答ではないですが、ご参考までに。。

投稿2016/12/19 14:04

編集2016/12/19 14:42
mukkun

総合スコア882

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

raccy

2016/12/19 14:14

ぬぬぬ、Chromiumではやはりまだ開発途中という段階なのでしょうか… 解析しても考えたのですが、形態素解析するのにMeCabでも入れておくのか?ってぐらい現実的じゃ無いかなと思っています。macOSでさえ動けばもうどうでも良いんですねー。ここはChromiumにパッチを…うー、オラの技術力じゃ無理っす><
mukkun

2016/12/19 14:35

形態素解析は処理がきつそうで現実的ではないですよねぇ。 単純にキャレットみたく、検索候補の範囲か位置を取得できれば楽なんですが、 これも調べた限りはなさそうなんですよね。(もしかしたらあるかも) 空いた時間で調べてみて解明したら展開しますね。 有識者が現れることを祈りましょう( ̄人 ̄)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問