2024
0308
ftxui のdom
tui 描画に ftxui の Screen を取り入れたが、 さらに dom もとり入れた。
unknown: html => {"type":"html","value":"<!-- truncate -->","position":{"start":{"line":5,"column":1,"offset":50},"end":{"line":5,"column":18,"offset":67}}}
ftxui の dom は、 HTML の dom とは無関係で、描画レイアウトの node tree 。
using Element = std::shared_ptr<Node>
となっていて Screen に対して描画できる。
auto screen = ftxui::Screen::Create(ftxui::Dimension::Full());
ftxui::Element tree = dom();
ftxui::Render(screen, tree);必要に応じてカスタムの Node を作る。 レイアウトを ftxui に任せて、cell 描画だけカスタムすることが可能だ。
class Content : public ftxui::Node{
void Render(ftxui::Screen &screen) override;
};縦に、tabbar - content(flex) - statusbar というレイアウトを組めた。 content は 独立したローカル Screen を持つようになったので、 Screen 原点の管理を省略できる。
スクロールとカーソル管理を書き直す必要があるが、 この機に w3m のわりと複雑なロジックを単純なものに変えてしまう。
Content COLS/LINES ScrollViewport xywh Cursor XY
の8つの int を数字で管理するだけでよいのではないか。 Line のリンクリストに対する pointer よりもシンプルに。 カーソル周辺の cell の文字幅が得られればいいので以下のような関数で 都度取得すればよいでしょう。
using GetCellWidth = std::function<int (int row, int col)>;2024
0311
HtmlParser 整理に着手
2024
0225