[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;
}