sage

linkとかmetaとかHTMLでemptyなやつの小要素が正しくあつかえない。

<feed>
  <link>http://d.hatena.ne.jp/</link>
</feed>

これが

<feed>
  <link />
  http://d.hatena.ne.jp/
</feed>

こう解釈される。


ほんとにlibxmlのコードはとにかく動かすために書いてあるかんじ。100とかかいてあるしアルゴリズム的にはツリーなやつがNULL区切りで配列に詰めてあったりする。

    /* inefficient, but not a big deal */
    for (indx = 0; indx < 100; indx++) {
        closed = htmlStartCloseIndex[indx];
        if (closed == NULL)
            return (0);
        if (xmlStrEqual(BAD_CAST * closed, newtag))
            break;
    }

たぶん閉じ忘れた時になにを優先するかはルールがあってさらにコストも設定されてる。

static const elementPriority htmlEndPriority[] = {
    {"div",   150},
    {"td",    160},
    {"th",    160},
    {"tr",    170},
    {"thead", 180},
    {"tbody", 180},
    {"tfoot", 180},
    {"table", 190},
    {"head",  200},
    {"body",  200},
    {"html",  220},
    {NULL,    100} /* Default priority */
};