SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

不完全なHTMLを動的にタッチアップ

Greasemonkeyを活用した互換性の確保とTouchUpWebプロジェクト

タッチアップしてみよう: HTML仕様解釈の違いを吸収する

 では実際に非互換性から生じた表示の崩れをタッチアップして正しく表示させる事例を見てみましょう。問題の特定から、ユーザースクリプトのプログラミング例まで、順番に見ていきます。

問題の例

 このサンプルページは、テーブル用タグの属性に関する解釈の違いから問題が生じている例です。このページの作者の意図は、各段落が折り返して表示され、右端の縦線よりも左側にすべてのコンテンツを表示するというものでした。しかしFirefoxではそのようなレンダリング結果になっていません。

図7 問題が生じている例
図7 問題が生じている例

 <td>タグの属性として、width属性がピクセル単位で指定されており、かつnowrap属性も指定されている場合に問題が発生します。IEでは、nowrapよりもwidthが優先され、指定の幅を越えるような長い文章は折り返されて表示されます。一方Firefoxでは、nowrapが優先されます。その結果、作成者の意図に反して横に長くはみだして表示されてしまうのです。

問題箇所の特定 ~ DOMインスペクタの活用

 問題の箇所はHTMLのソースを追いかけて特定することもできますが、DOMインスペクタ拡張機能を活用すれば、より効率的に作業を進められます(図8)。

図8 DOMインスペクタの活用
図8 DOMインスペクタの活用

 DOMインスペクタを起動し、左上にあるボタンを押してから、ブラウザ上に表示されている問題の箇所をクリックします。すると、クリックした箇所に対応するDOMノードがDOMインスペクタ内部で表示されます。この操作によって、HTMLソース中の問題箇所を素早く特定することができます。

編集部注
 DOMインスペクタは、Firefoxインストール時の「セットアップの種類」で[標準]を選択した場合には、インストールされません。この場合は、もう一度インストーラーを実行した上で、セットアップの種類に[カスタム]を選択し、目的のツールを追加してください。

属性の変更によるデバッグ

 さて問題箇所が特定できたら、その修正を考えます。DOMインスペクタで問題の箇所を特定できれば、その属性値の情報や関連するCSSの情報を調べることができます。DOMインスペクタの右側に、詳しい情報が表示されるので、それが問題解決のヒントになるのです。

 この問題の例では、<td>タグの属性としてwidthとnowrapの両方が指定されていることが分かります。

 ここで、問題となっている属性値の上で右クリックしてみましょう。Editメニューを選ぶと、その属性の値を修正することができます。また右クリックからDeleteメニューを選択することで、その属性自体を削除することも可能です。

 DOMインスペクタを用いてnowrap属性を削除することで、折り返されて表示されることを確認することができるでしょう。

ユーザースクリプトの作成

 DOMインスペクタを上手に活用して、問題の特定と原因が分かりました。そこで、この問題を解決するためのユーザースクリプトを作成してみます。次のスクリプトは、Greasemonkeyを利用してこの問題をタッチアップするためのスクリプトです。

表示が崩れる問題を解決するためのユーザースクリプト例
// ==UserScript==
// @name         Conflicting "nowrap" Remover
// @description  correct the nowrap and width conflict problem in table tags
// @namespace    http://www.touchupweb.org/~iiojun/
// @include      http://www.touchupweb.org/ja/sample/
// ==/UserScript==

var tdtags = document.getElementsByTagName("td");
for (i = 0; i < tdtags.length; i++)
  {
    if (!tdtags[i].hasAttribute("nowrap")) continue;
    if (!tdtags[i].hasAttribute("width")) continue;
    var wid = tdtags[i].getAttribute("width");

    // it is ok if width is non-null and specified with %
    if (wid && wid.match(/.*\%$/)) continue;

   tdtags[i].removeAttribute("nowrap");
  }

 このスクリプトでは、まずgetElementsByTagName()メソッドによって<td>タグを抽出しています。そして続くforループで、それらのタグについて問題がないかどうかをチェックし、問題がある場合はその修正を試みています。

 forループの内部では、nowrap属性とwidth属性が定義されているかどうかをチェックします。もしこれらに関する矛盾がなければ、問題ありません。width属性が指定されていても、ピクセル単位ではなく%で指定されていれば問題ないことが分かっています。widthがピクセル単位で指定されており、さらにnowrapが指定されている場合は、removeAttribute()を用いてnowrap属性を削除することで、widthnowrapの矛盾を回避し、表示レイアウトの崩れをタッチアップすることができるのです。

TouchUpWebプロジェクト

 このように、Greasemonkeyを利用することでIEに特化したWebコンテンツをFirefoxなどからも利用できるように修正できることが分かりました。ただし、GreasemonkeyのユーザースクリプトはURLを指定して適用するため、問題のあるコンテンツに遭遇したときにそれを修正するスクリプトが存在するかどうかは、自ら探さなければなりません。

 これを自動化する試みが、TouchUpWebプロジェクトです。TouchUpWebプロジェクトでは、これらの問題を修正するスクリプトをデータベースで管理しています。そしてTouchUpWeb拡張機能を利用することで、データベースへの問い合わせからスクリプトのダウンロード、Greasemonkeyを利用したスクリプトの適用による問題の解決までを、自動的に実行することができるようになります。

TouchUpWeb拡張機能

 TouchUpWebを使うには、TouchUpWeb拡張機能をインストールする必要があります。TouchUpWeb拡張機能は、TouchUpWebプロジェクトに用意されているダウンロードページから、Greasemonkey拡張機能のインストールと同様の手順でインストールすることができます。なお、TouchUpWeb拡張機能はGreasemonkeyを利用しているので、事前にGreasemonkey拡張機能をインストールしておく必要があります(TouchUpWebプロジェクトでは、日本語化したGreasemonkey拡張機能とTouchUpWeb拡張機能を同時にインストールできるようにした統合パッケージも用意しています)。

 表示が崩れていたり、JavaScriptがうまく動かないページを見つけたら、ウィンドウ左下に表示されているTouchUpWeb拡張機能アイコンをクリックしてみましょう(図9)。このアイコンをクリックすることで、TouchUpWeb拡張機能が起動されます。TouchUpWeb拡張機能が起動されると、TouchUpWebサーバに、そのページをタッチアップするスクリプトが登録されているかどうかを問い合わせます。

図9 TouchUpWeb拡張機能アイコン
図9 TouchUpWeb拡張機能アイコン

 そのページをタッチアップできるスクリプトがTouchUpWebサーバに登録されている場合、当該スクリプトがダウンロードされます。適用するかどうかを尋ねられるので、問題がなければ適用してみましょう。そのスクリプトを適用して正しく表示されるようになれば成功です。なお、ダウンロードしたスクリプトはGreasemonkeyがスクリプトを格納する領域に保存されるため、2回目からは手動でTouchUpWeb拡張機能を起動する必要はありません。

TouchUpスクリプトの登録

 TouchUpWebプロジェクトでは、非互換問題のあるページをタッチアップするTouchUpスクリプトを募集しています。IEに依存するようなコンテンツを修正するスクリプトを書いたら、ぜひTouchUpWebプロジェクトが用意しているBugzillaに登録してください。TouchUpWebプロジェクトのコミッタがそのスクリプトを確認して、問題がなければTouchUpWebサーバのデータベースに登録します。

まとめ

 本稿では、Webコンテンツの非互換問題について解説し、その問題を解決する一つの手段としてGreasemonkeyの利用とそのユーザースクリプトの書き方を説明しました。また、そのユーザースクリプトを管理して自動的に適用する機構を実現するTouchUpWebプロジェクトを紹介しました。

 なお、TouchUpWebプロジェクトは独立行政法人情報処理推進機構(IPA)の2005年度下期オープンソースソフトウェア活用基盤整備事業の支援を受けて開発されました。現在、プロジェクトはSourceforge.netでもホストされています。TouchUpスクリプトの登録だけでなく、プロジェクトへの参加も歓迎します。興味のある方はぜひ私やプロジェクト関係者もしくはプロジェクトのメーリングリストまでご連絡ください。

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
特集記事連載記事一覧

もっと読む

この記事の著者

飯尾 淳(イイオ ジュン)

1970年生まれ。株式会社三菱総合研究所 情報通信技術研究本部 情報技術研究グループ 主任研究員。専門は、画像処理とユーザインタフェース……のはずが、なぜか最近はOSS普及振興の手伝いで多忙な毎日を過ごしている。著書に「Linuxによる画像処理プログラミング」、「リブレソフトウェアの利用と開発~I...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/534 2006/08/31 00:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー