JavaよりJSのほうが慣れているので、JSで書いてからJavaに置き換えることが多いので、二回書く必要が生じている。そこでJSからJavaをChatGPTにやってもらおうと思った。実際にやってみた問題点など。
ChatGPTに「下記のコードをJavaに書き換えて」で出力されたが思っていたのと違ったので、「下記のコードをJsoupのライブラリを使ったJavaに書き換えて」と直した。
下記のコードをJsoupのライブラリを使ったJavaに書き換えて for (let i = 0; i < ruby.childNodes.length; i++) { switch (ruby.childNodes[i].nodeName) { case '#text': bw = bw + '|' + ruby.childNodes[i].textContent break; case 'RP': break; case 'RT': bw = bw + '《' + ruby.childNodes[i].textContent + '》' break; case 'RB': bw = bw + '|' + ruby.childNodes[i].textContent break; default: console.log("未定義"); } }
ChatGPTの出力したコードの問題点はタグが大文字のままなので小文字にしないと動作しない。あと、childNode instanceof ElementでElementに限定しているので、TextNodeが取得できなかった。ChatGPTは便利だけどなんか嵌り方が余計難しくしている感じがある。でも、結局のところ時短にはなったのでは。
import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.nodes.Node; import org.jsoup.select.NodeFilter; import org.jsoup.select.NodeTraversor; // JsoupのDocumentオブジェクトとルビ要素を仮定 Document doc = ...; // ドキュメントを取得するコードを追加する必要があります Element ruby = ...; // ルビ要素を取得するコードを追加する必要があります NodeTraversor.traverse(new NodeFilter() { @Override public FilterResult head(Node node, int depth) { if (node instanceof Element) { Element element = (Element) node; switch (element.nodeName()) { case "#text": bw = bw + "|" + element.text(); break; case "RP": break; case "RT": bw = bw + "《" + element.text() + "》"; break; case "RB": bw = bw + "|" + element.text(); break; default: System.out.println("未定義"); } } return FilterResult.CONTINUE; } @Override public FilterResult tail(Node node, int depth) { return FilterResult.CONTINUE; } }, ruby);
rbタグがないルビへ対応するために、ルビへの処理方法を丸ごと変えてみた。 github.com