データ構造

unknown: html => {"type":"html","value":"<!-- truncate -->","position":{"start":{"line":4,"column":1,"offset":8},"end":{"line":4,"column":18,"offset":25}}}

TabBuffer

link list。たぶん左から順番。

first         current      last
|             |            |
V             v            v
+TabBuffer+  +TabBuffer+  +TabBuffer+
|next     |->|next     |->|next     |--> nullptr
+---------+  +---------+  +---------+

Buffer

TabBuffer 毎。 link list。

TabBuffer  TabBuffer TabBuffer
first      current   last
|          |         |
V          v         v
+Buffer+  +Buffer+  +Buffer+
|next  |->|next  |->|next  |--> nullptr
+------+  +------+  +------+

next を辿るのが browser の back

これがひとつの WebBrowser を表している。 cmd_loadURL 関数が url を load して buffer を history に追加する基本型。

わりと難解

TabBuffer と Buffer のリンクリストの取り回しが、w3m でも屈指の 難解さです。 buffer を作って目的地に link を追加するという動作なのだけど、 link list を足したり引いたり、あと端と中間の場合分けや、 Current の調整が入り乱れていてよく分からない。

標準の動作で buffer / tab を変化させてから、 後で不要なものを削除する場合なども動作がよくわかりません。 local CGI の履歴操作も難解です。

難解な操作の何割かがコマンドライン引き数で、 複数タブを操作するなど変ったことをするときに起きます。 コマンドライン引数を削除して楽をすることにしました。 第1引数を URL open するだけにシンプル化。

  auto res = loadGeneralFile(argv[1], {}, {.referer = NO_REFERER}, {});
  if (!res) {
    return 2;
  }

  // main loop

tab

tab で開くときに、tab を開く、 失敗したら tab を消す。 という挙動がわかりにくさの原因のひとつだった。 成功したら tab を作るという挙動に変えるとシンプルになる。