[C++] 280 FLTK : ChatGPTアプリの製作 その9 AIリネーム機能実装

[M1 Mac, Monterey 12.6.3, clang 13.0.0, FLTK 1.3.8, ChatGPT Plus, NO IDE]

せっかくAIを使っているのですから、作成しているJSONファイルの命名を手伝わせています。

指定の文字数は守らない、カギ括弧を付けるなと指示しても付けてくる、など全然ルールを守りませんが最低限のことはやってくれます。

カギ括弧はこちらで削除したいものの、良い方法が分からず模索中です。

void renameCB(Fl_Widget*, void*){
    input -> value("これまでの質問回答の内容から15文字程度で日本語タイトルを考えて下さい。英単語が混ざってもかまいません。");
    sendBtn->do_callback();

    
    Fl_Text_Buffer* buffer = output->buffer();
    title = buffer->text();

    cout << "title加工前: " << title << endl;
    // 先頭の半角スペースを削除する
    title.erase(title.begin(), std::find_if(title.begin(), title.end(), [](char c) {
        return !std::isspace(c);
    }));

    if (title.length() > 0) {
        char c = title[0];
        if ((c >= 0x21 && c <= 0x2F) || (c >= 0x3A && c <= 0x40) || (c >= 0x5B && c <= 0x60) || (c >= 0x7B && c <= 0x7E)|| c == static_cast<char>(0x300C) || c == static_cast<char>(0x300D)) {
            // 先頭の文字が記号である場合
            title.erase(title.begin(), title.begin() + 3);
        }
    }

   if (title.length() > 0) {
        char c = title.back();
        if ((c >= 0x21 && c <= 0x2F) || (c >= 0x3A && c <= 0x40) || (c >= 0x5B && c <= 0x60) || (c >= 0x7B && c <= 0x7E) || c == static_cast<char>(0x300C) || c == static_cast<char>(0x300D)) {
            // 末尾の文字が記号である場合(カギ括弧を含む)
            title.erase(title.end() - 3, title.end());
        }
    }

    cout << "title加工後: " << title << endl;

    vector<string> tokens;
    string delimiter = ".";
    size_t pos = 0;
    string token;
    string jsonFileStr = string(jsonFile);
    while ((pos = jsonFileStr.find(delimiter)) != string::npos) {
        token = jsonFileStr.substr(0, pos);
        tokens.push_back(token);
        jsonFileStr.erase(0, pos + delimiter.length());
    }
    tokens.push_back(jsonFile);

    string jsonFileNew = tokens[0] + "_" + title + ".json";

    cout << "jsonFileNew: " << jsonFileNew << endl;

    int result = std::rename(jsonFile.c_str(), jsonFileNew.c_str());
    if (result == 0) {
        std::printf("File renamed successfully.\n");
    } else {
        std::printf("Error renaming file.\n");
    }

    Fl_Text_Buffer* bufferNotice = new Fl_Text_Buffer();
    string notice = "JSONファイルをリネームしました。\n" + jsonFileNew;
    bufferNotice -> text(notice.c_str());
    noticeDisplay -> buffer(bufferNotice);
}