[C++] 329 BBS閲覧アプリの製作 その15 Fl_Help_Viewでレス表示

[M1 Mac, MacOS Ventura 13.3.1, clang 14.0.3]

これまでスレッドのレスはFl_Text_Displayで表示していましたが、フォントのサイズや色設定をしたいのでFl_Help_Viewに変更しました。

datファイルをHTML形式に変換しています。

ただしFl_Help_ViewはHTMLの簡易的なビューアのため、CSSは使えず右端の折り返しも不可です。日本語フォントの設定も不可で、強制的に明朝体になります。FLTKの限界と言ったところでしょうか。wxWidgetsでもCSSはほとんど使えないようです。

C++での開発はこれで打ち切りとし、SwiftあるいはObjective-C++へ移植の予定です。

Objective-C++では過去に1つだけ簡単なGUIアプリを作りましたが、AppDelegateファイルでしんどい思いをしたので、このファイルを使わずに済ませる方法を探します。もちろん非Xcode環境で開発します。

void button_cb(Fl_Widget *w, void* userData) {
    int postNum;

    int rowPos = *static_cast<int*>(userData);
    postNum = stoi(std::get<3>(numTitlePostnumID[rowPos]));
    cout << "postNum: " << to_string(postNum) << endl;

<中略>

    string html;
    string line;

    string header = R"(
    <html lang="ja"><HEAD>
    <link rel="stylesheet" href="currentThread.css">
    <STYLE TYPE="text/css">
    A:link {    color: #0000ff;
                text-decoration: none; }
    A:visited { color: #008080;
                text-decoration: none; }
    A:hover {   color: #ff0000;
                text-decoration: underline; }
    body {
        margin-left: 20px;
    }

    </STYLE>
    </HEAD>
    <BODY bgcolor="#ffffff"><font face="ヒラギノ角ゴ">)";

    std::ifstream datFile0(filename);
    if (!datFile.is_open()) {
        cout << "ファイルopen失敗" << endl;

        return;
    }

    int resNum = 1;    
    while (std::getline(datFile, line)) {
        string sage;

        // mailNameを抽出
        size_t pos = line.find("<>sage<>", 0);
        if (pos != std::string::npos) {
            sage += " sage ";
        }

        size_t posAngle1 = line.find("<>");
        string mailName = line.substr(0, posAngle1);
        mailName += sage;

        cout << "resNum: " << resNum << endl;
        cout << "mailName: " << mailName << endl;

        // 日付を抽出
        size_t posAngle2 = line.find("<>", posAngle1 + 2);
        size_t posAngle3 = line.find("<>", posAngle2 + 2);

        string date = line.substr(posAngle2 + 2, posAngle3 - posAngle2 - 2);

        cout << "date: " << date << endl;

        // メッセージを抽出
        size_t posAngle4 = line.find("<>", posAngle3 + 2);
        string msg = line.substr(posAngle3 + 2, posAngle4 - posAngle3 - 2);

        cout << "msg1: " << msg << endl;

        string res;
        if (resNum == 1){
            res = header + "<p><font size=\"4\" color=\"#008080\">" + to_string(resNum) + " : " + mailName + "<br></font>" +
            "<font size=\"4\" color=\"#000080\">" + date + "<br></font>" +
            "<p> </p>" +
            "<font size=\"4\" color=\"#000B00\">" + msg  + "</font></p>";
        } else if (resNum != postNum){
            res = "<p><font size=\"4\" color=\"#008080\">" + to_string(resNum) + " : " + mailName + "<br></font>" +
            "<font size=\"4\" color=\"#000080\">" + date + "<br></font>" +
            "<p> </p>" +
            "<font size=\"4\" color=\"#000B00\">" + msg  + "</font></p>";
        } else{
            res = "<p><font size=\"4\" color=\"#008080\">" + to_string(resNum) + " : " + mailName + "<br></font>" +
            "<font size=\"4\" color=\"#000080\">" + date + "<br></font>" +
            "<p> </p>" +
            "<font size=\"4\" color=\"#000B00\">" + msg  + "</font></p></font></BODY></html>";
        }

        cout << "res:\n" << res << endl;

        html += res;

        resNum += 1;
    }

    cout << "html:\n" << html << endl;

    // htmlファイル保存
    std::ofstream outputFile("/BBS_Browser/html/currentThread.html");
    if (outputFile.is_open()) {
        outputFile << html;
        outputFile.close();
        std::cout << "HTMLファイルに変換しました。" << std::endl;
    } else {
        std::cerr << "ファイルを開けませんでした。" << std::endl;
        return;
    }

    // // htmlファイルを表示
    htmlView->load("/BBS_Browser/html/currentThread.html");

    return;
}