2002-06-15

保存時に漢字コードが勝手にシフトJISにされてしまうことがあるという、XHTMLプラグインの謎の不具合。「なんでだろう」と自分のHTMLソースをいろいろいじってたら起こらない状態になってしまい、そのときは「meta要素のhttp-equiv属性が二重引用符で囲まれていな
いと起きる
のかな?」と考えたんですが、いまいじってみるとどうもそうでもないみたい……。

なにはともあれ、まず原因を特定できないと対策を講じようがないんですが、セーフファイルで当時のHTMLソースをひっぱりだしてきても再現しないんですよね……。

2002-06-12

唐突にHTMLの話題。

HTMLのclass属性には、スペースで区切って複数のクラス名を与えることができるんですね(7.5.2 Element identifiers: the id and class attributes – The global structure of an HTML document)。「Valid HTML 4.01!」などと偉そうにバナーを掲げてますが、知りませんでした。そうすると、以下のようなマークアップができることになります。

<p>

<acronym class="html index" title="HyperText Markup Language">HTML</acronym><samp 
class="html index attr">class</samp>属性には、...

</p>

(まあ、これはたぶんやりすぎですが、)そしてスタイルシートで、HTMLに関連する用語(htmlクラス)はグリーンの文字、属性名(attrクラス)はCourier Newフォントで表示させ、(そんなツールがあるかどうかは知りませんが、)indexクラスの単語を索引用に抽出する……、などということが可能(のはず)なわけです。

いままで「ひとつの要素に複数のクラスがふさわしい場合だってあるよなあ……。span要素とかで何重に囲むわけにもいくまい……。」とか思ってたのですが、たんに自分が無知なだけだったという。

HTML操作するようなマクロ書くときは気をつけねば。

2002-06-11

先日(6/8)の記事のつづき(2002/06/07(Fri)、 更新履歴 – Final β Laboratory)。

M.Shibataさんが作ってくれたgetDefaultHtmlFile関数を見て、一瞬「あれ、これのどこがsplit?」とか大ボケかましましたが、そうじゃなくて、そのものズバリなものを作って頂いたんですね(関数名で気付きなさいって)。

splitのような関数を作るにしても、デリミタを探してポインタをすすめていく……という処理の流れは同じようなものになるでしょう、ということで……。関数名は、「今回の予想される使いみち」から付けてしまったので、(関数の機能を説明するという面からすれば)本当はぴったりの名前ではないですね。

僕は関数名(や変数名やらその他もろもろのシンボル名)付けるのが下手な(というかまだ自分の命名スタイルが確立できてない)んで、いっつも苦労してます。ロジックより時間かかってたり(苦笑)。「長すぎ」とかコードのなかでひとり突っ込みしたくもなります(笑)。そういえば、DoSomething形式で命名した関数と、まったく同じ処理をするSomethingDo形式の名前の関数が、同じコードのなかに入ってたこともありました……。

2002-06-08

Final β Laboratoryの中村さんがXHTMLプラグインの不具合修正+改良版パッチを作られてます(2002/06/07(Fri)、 更新履歴 – Final β Laboratory)。不具合の原因とその対策の列挙に大興奮。気になっていたあたりはぜんぶ直ってしまいました。素敵!

セミコロン区切りとかで列挙されたファイル名を配列に分解するのって、どうするのがスマートなんだろうなあ。Perlならsplitで一発なのですが。

Perlのsplit、マクロ書いてて何度これが欲しくなったことか(笑)。それはさておき、スマートとはいえないかもしれませんが、とりあえず以下のような関数を書いてみました。

BOOL getDefaultHtmlFile(mchar *szbuff, mchar *szdir, mchar *szfilelist)
{
    // szfilelistにセミコロン区切りで指定されているファイル名をszdirから探
    // し出し、最初に見つかったファイルのフルパスをszbuffに格納する。ファ
    // イルが見つかったかどうかを返す。szbuffにはフルパスを格納するのに十
    // 分なサイズが必要。
    mchar szfilename[CCHPATHNAME];
    mchar *p = szfilelist;
    mchar *q;
    while (*p) {
        q = strchr(p, ';');
        if (!q) q = p + strlen(p);
        strcpylen(szfilename, p, q - p);
        if (*szfilename) {
            pathSetMode(szfilename, szdir, NULL, PATH_ABSOLUTEDRIVE);
            if (fileIsExist(szfilename)) {
                strcpy(szbuff, szfilename);
                return TRUE;
            }
        }
        p = q + 1;
    }
    return FALSE;
}

こんな感じで使います。参考になるといいのですが……。

    ...
    mchar szbuff[CCHPATHNAME];
    if (getDefaultHtmlFile(szbuff, "C:¥¥wwwdir", "index.html;index.shtml;default.html")) {
        information("%s が見つかりました。", szbuff);
    }
    ...

ynp2版xhtml.txcのuiInsertHtmlLink関数の5270行目のブロックのほうは、ループじゃなくて、szSubDefaultHtmlのコピーを作って';''|'に置換して括弧でくくって、(index.html|index.shtml)みたいな正規表現に仕立てあげてszfindbuffに入れれば、あとの処理をあんまり書き換えないで実装できるかも……。具体的なコードなしで申し訳ないのですが……。

あ、個人的にはynp2でじゅうぶん満足してますので、「実装しろよ」というプレッシャーではないです(笑)。