[C++] 275 FLTK : ChatGPTアプリの製作 その4 JSONを見やすくする

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

GUI右側のFl_Browserは右端の折り返しが出来ないのでFl_Text_Displayに変更しました。

動作は遅くなってしまいましたが、断然見やすくなりました。

驚いたことにChatGPTはマイナーなライブラリであるFLTKの機能にかなり精通しています。

void sendCB(Fl_Widget*, void*) {
    // 開始時間取得
    if (sendNum == 0){
        auto now = std::chrono::system_clock::now();
        auto time_t = std::chrono::system_clock::to_time_t(now);
        std::tm tm = *std::localtime(&time_t);

        // 日時を指定されたフォーマットで文字列に変換する
        std::stringstream ss;
        ss << std::put_time(&tm, "%y%m%d_%H%M%S");
        startTime = ss.str();

        sendNum++;
    }

    const char* system = sysInput -> value();
    systemStr = string(system);

    const char* question0 = nullptr;
    question0 = input -> value();
	string question(question0);
	json response = chatWithOpenAI(question);
	string resDump = response.dump();
	cout << resDump << endl;

    string content = response["choices"][0]["message"]["content"].get<string>();
    cout << content << endl;

    while (!content.empty() && content.front() == '\n') {
        content.erase(0, 1);
    }

    size_t pos = 0;
    while ((pos = content.find('"', pos)) != string::npos) {
        content.replace(pos, 1, "\\\"");
        pos += 2;
    }

    pos = 0;
    while ((pos = content.find('\n', pos)) != string::npos) {
        content.replace(pos, 1, "\\n");
        pos += 2;
    }

    string res = R"({"role":"assistant","content":")" + content + R"("})";
    json resJson = json::parse(res);

    jsonData = json::parse(requestData);
    jsonData["messages"].push_back(resJson);

    cout << "回答追加後jsonData: " << jsonData.dump() << endl;

    // jsonファイル化
    jsonFileName = "/Users/[ユーザID]/ChatGPT/" + startTime + "_ChatGPT.json";
    std::ofstream ofs(jsonFileName, std::ios::out | std::ios::trunc);
    ofs << std::setw(2) << jsonData << std::endl;
    ofs.close();

	Fl_Text_Buffer*buffer = new Fl_Text_Buffer();
	buffer -> text(content.c_str());
	output -> buffer(buffer);
	output -> wrap_mode(Fl_Text_Display::WRAP_AT_BOUNDS, 5);

    // JSON表示
    std::ifstream ifs(jsonFileName);
    json jsonData = json::parse(ifs);

    // Convert json to string with pretty-print
    string jsonString = jsonData.dump(2);

    Fl_Text_Buffer*buffer2 = new Fl_Text_Buffer();
	buffer2 -> text(jsonString.c_str());
	jsonDisplay -> buffer(buffer2);
	jsonDisplay -> wrap_mode(Fl_Text_Display::WRAP_AT_BOUNDS, 5);

    // 現在の行数を取得
    int lineCount = jsonDisplay->buffer()->count_lines(0, jsonDisplay->buffer()->length());

    // 最終行が見えるようにスクロールを設定
    jsonDisplay->scroll(lineCount, 0);
}