[Date Prev][Date Next][Thread Prev][][Date Index][Thread Index]

Re: bold



>> On Fri, 25 Jul 2003 16:55:56 +0900 (JST)
>> 「白井」== shirai@rdmg.mgcs.mei.co.jp (Hideyuki SHIRAI (白井秀行)) said as follows:

白井> % w3m -halfdump ./index.html 
白井> <base
白井> href="http://ko.meadowy.net/~shirai/diary/20030723.html#p08">夢
白井> の内容は『<b>あぁぁぁ、こんなバグがまだあったのかぁぁぁぁぁぁ
白井> </b>』。...

白井> なパターンだと、"<base h.." を bold の開始だと思って文章の先頭か
白井> ら bold にしてしまいます。

おやあ,shimbun の先頭部分が太字になることが多いなあと気にはなってたん
ですけど,まさか emacs-w3m のバグでしたか.

白井> (1) 気にしない
白井> (2) 正規表現を厳密に書く(けど、遅くなりそう)

厳密には,こうでしょうか?

    (re-search-forward "<[ \t\r\f\n]*b\\([ \t\r\f\n][^>]*\\)?>" nil t)

白井> (3) 実は、<bxxx> の "xxx" の部分に whitespace 以外の文字が来るこ
白井>     とはないので、"<[\t\n ]*b[\t\n ]*>" で大丈夫。
白井> (4) <base href...> は事前に消しておく。

いや,それより.

この変更は,[emacs-w3m:03933] 添付のパッチが由来のようですが,指摘を受
けた

    <b
      class="hoge">太字 class つき</b
    >

を halfdump させてみると,

    <b>太字 class つき</b
    >

という結果になったので,変更を撤回して,

    開始タグ: (search-forward "<b>" nil t)
    終了タグ: (re-search-forward "</b[ \t\r\f\n]*>" nil t)

でいいんじゃないかと.

白井> どれかしら? (3)を期待。

というわけで,

  (5) もっと簡略化できる.

を期待.w3m のバージョンや種類に依りそうな気もするので,追試をお願いし
ます.

関連して,HTML4 の定義書を斜め読みしたくらいでは分からなかったのですが,
< とタグ名の間に空白は挿入できるのでしょうか? つまり,

    <
    b>太字<
    /b>

というような書き方は許されるのかなあ? ということが気になっています.

;; これが許されるなら,上記の終了タグはもう少し条件を緩和してやらない
;; といけなくなりそう.

この件でちょっと気になって調べてみたのですが,re-search-forward() は信
じられているほど,遅いものではないかもしれないという気がしてきました.

(progn
  (defun w3m-check-bold-close-tag-1 ()
    (re-search-forward "</b[ \t\r\f\n]*>" nil t))
  (defun w3m-check-bold-close-tag-2 ()
    (let ((pos (point)))
      (catch 'found
        (while (search-forward "</b" nil t)
          (when (looking-at "[ \t\r\f\n]*>")
            (throw 'found (goto-char (match-end 0)))))
        (goto-char pos)
        nil)))
  (byte-compile 'w3m-check-bold-close-tag-1)
  (byte-compile 'w3m-check-bold-close-tag-2)
  (require 'elp)
  (elp-reset-all)
  (elp-instrument-list '(w3m-check-bold-close-tag-1
                         w3m-check-bold-close-tag-2
                         re-search-forward
                         search-forward))
  (with-temp-buffer
    (dotimes (x 10)
      (insert "\
<b>テスト</b>
<b>テスト</b
>"))
    (dotimes (x 10)
      (goto-char (point-min))
      (while (w3m-check-bold-close-tag-1))
      (goto-char (point-min))
      (while (w3m-check-bold-close-tag-2))))
  (elp-results))

という実験をしてみると,意外にも re-search-forward() と 
search-forward() の実行時間に大差はないという結果が出ました.

ということは,re-search-forward() そのものが遅いと言うわけではなく,遅
くなるような正規表現が良くない,ということになるのかなと思います.

-- 
土屋 雅稔 ( TSUCHIYA Masatoshi )