KDP(電子出版)のメモ 急急如律令

Amazon Kindleダイレクト・パブリッシングでの電子出版や電子書籍の作成販売について、文章やイラストの作成や編集方法について書いています。

HTMLのパーサーをChatGPTに書かせてみた

 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);

stackoverflow.com

rbタグがないルビへ対応するために、ルビへの処理方法を丸ごと変えてみた。 github.com