DoCoMo向けにCSS指定をインラインに埋め込むPHPライブラリ「toInlineCSSDoCoMo」作りました
こんにちは。Windowsの最大の発明はゴミ箱の標準装備だと思っている亀本です。
追記:Mac信者の某氏にゴミ箱はWindowsの発明じゃないと突っ込まれてしまいました。すみません<(。_。)>
昨日はグリーさんのオープンソース勉強会に参加してきました。
今回の講師はDeNAの川崎さんで、わりとモバイル屋さんな自分としてはぜひともチェックしておきたいなと思って参加してきました。
勉強会・懇親会ともなかなか面白い話が聞けたり、変な人がいっぱいしたりしてとても面白かったです。
モバイルをやっているといつも面倒なのは、テンプレートの扱いです。
そのあたりのまとめは以前このブログでうちの高橋さんが超まとめてくれた記事があるので、そちらをご参照ください。
とくにDoCoMoのCSS(i-CSS)は開発者泣かせですね。インラインのみに対応とか、開発しにくくて涙ちょちょぎれそうです。
さてさてそんなDoCoMoのCSSですが、PerlにはHTML::DoCoMoCSSというCPANライブラリがあります。
styleタグで指定した外部CSSファイルを読み込んで、インラインのstyle要素に入れ込んでくれるというすぐれものです。
(MobaSiFもそうですが、Perlの周辺はモバイル関連のライブラリが非常に充実していますね。
なんだかあちこち探してみると、いろいろと便利そうなライブラリが転がっています。)
せっかくそんな素晴らしいライブラリがあるんですが、僕はPerl?イエモンですね、把握しました。みたいな生粋のPHPerなので、PHPしか使えません。
PerlなんてわかんないよPHPじゃないと使えないよ(´・ω・`)ショボーンって思ったので、これをPHPで作ってみました。
ファイル:toInlineCSSDoCoMo.tar.gz
(追記2008/07/09 18:19:getInstance()にstatic指定が抜けていたので修正しました)
追記:バージョンアップした物をHTML_CSS_Mobileという名称に変更して、CodeReposにimportしました。
http://coderepos.org/share/browser/lang/php/HTML_CSS_Mobile
同梱物は
toInlineCSSDoCoMo.phpは、基本的にはid:tokuhiromさんの作った上記のHTML::DoCoMoCSSをPHP用にリライトしたもので、それに若干の機能追加をしています。
selectorToXPath.phpもPerlのHTML::Selector::XPathというid:miyagawaさんのライブラリの移植です。
ただ、selectorToXPathの方は自分自身がXPathもCSSもさほど詳しくなかったので、理解できるレベルでしか移植していません。なので単体での配布はちょっと見送りましたが、大体の場合はうまく動くと思います。
なお、動作環境としてはPHP 5.1以上になります。
以下に簡単に利用方法を説明しておきます。
このライブラリ自体がPEAR::HTML_CSSに依存しているので、まずそちらをインストールします。
サンプルスクリプトは以下のようになります。
なお、CSSはhttp経由で取ってくるわけじゃないので、ちゃんとcss_basedirをパス指定してあげてください。
実際にどんな感じになるかは、sampleディレクトリの中を見てもらえればわかりやすいかと思いますが、
sample.html
sample.css:
結果:
という感じになります。
現段階で実装してあること:
・linkタグで指定した外部CSSの読み込み、インライン化
・ファイル内のstyleタグCSSの読み込み、インライン化
・インライン化したlinkタグやstyleタグの削除
・a:hover,a:link,a:visited,a:focusのstyleタグへの埋め込み
・複数class指定への対応
まだ対応していないこと:
・@importなどの対応
・a:以外の疑似クラスにもうちょっときちんと対応
こんな感じのライブラリです。
これでDoCoMoのCSSをインライン以外でも書けるようになるので、テンプレート作成がだいぶ楽になるんじゃないかなー、と思います。
もしお役に立てば幸いです。
なお、このライブラリを完成させるにあたり、id:maru_ccさん、うちの会社の(笑)熊谷さんにはデバッグ、アイデア出し等でひじょーにお世話になりました。
この場をお借りしてお礼申し上げます。
※おまけですが、selectorToXPathの使い方はこんな感じです。
追記:Mac信者の某氏にゴミ箱はWindowsの発明じゃないと突っ込まれてしまいました。すみません<(。_。)>
昨日はグリーさんのオープンソース勉強会に参加してきました。
今回の講師はDeNAの川崎さんで、わりとモバイル屋さんな自分としてはぜひともチェックしておきたいなと思って参加してきました。
勉強会・懇親会ともなかなか面白い話が聞けたり、変な人がいっぱいしたりしてとても面白かったです。
モバイルをやっているといつも面倒なのは、テンプレートの扱いです。
そのあたりのまとめは以前このブログでうちの高橋さんが超まとめてくれた記事があるので、そちらをご参照ください。
とくにDoCoMoのCSS(i-CSS)は開発者泣かせですね。インラインのみに対応とか、開発しにくくて涙ちょちょぎれそうです。
さてさてそんなDoCoMoのCSSですが、PerlにはHTML::DoCoMoCSSというCPANライブラリがあります。
styleタグで指定した外部CSSファイルを読み込んで、インラインのstyle要素に入れ込んでくれるというすぐれものです。
(MobaSiFもそうですが、Perlの周辺はモバイル関連のライブラリが非常に充実していますね。
なんだかあちこち探してみると、いろいろと便利そうなライブラリが転がっています。)
せっかくそんな素晴らしいライブラリがあるんですが、僕はPerl?イエモンですね、把握しました。みたいな生粋のPHPerなので、PHPしか使えません。
PerlなんてわかんないよPHPじゃないと使えないよ(´・ω・`)ショボーンって思ったので、これをPHPで作ってみました。
(追記2008/07/09 18:19:getInstance()にstatic指定が抜けていたので修正しました)
追記:バージョンアップした物をHTML_CSS_Mobileという名称に変更して、CodeReposにimportしました。
http://coderepos.org/share/browser/lang/php/HTML_CSS_Mobile
同梱物は
- toInlineCSSDoCoMo/
- +
lib/ - ++
toInlineCSSDoCoMo.php - ++
selectorToXPath.php - +
sample/ - ++
sample.php - ++
sample.html - ++
sample.css
toInlineCSSDoCoMo.phpは、基本的にはid:tokuhiromさんの作った上記のHTML::DoCoMoCSSをPHP用にリライトしたもので、それに若干の機能追加をしています。
selectorToXPath.phpもPerlのHTML::Selector::XPathというid:miyagawaさんのライブラリの移植です。
ただ、selectorToXPathの方は自分自身がXPathもCSSもさほど詳しくなかったので、理解できるレベルでしか移植していません。なので単体での配布はちょっと見送りましたが、大体の場合はうまく動くと思います。
なお、動作環境としてはPHP 5.1以上になります。
以下に簡単に利用方法を説明しておきます。
このライブラリ自体がPEAR::HTML_CSSに依存しているので、まずそちらをインストールします。
- %
sudo pear install HTML_CSS
- %
wget http://blog.asial.co.jp/data/toInlineCSSDoCoMo.tar.gz - %
tar xvzf toInlineCSSDoCoMo.tar.gz
サンプルスクリプトは以下のようになります。
- require_once
'lib/toInlineCSSDoCoMo.php'; - $document
= file_get_contents('path/to/file.html'); - try
{ echo toInlineCSSDoCoMo::getInstance()->setBaseDir('path/to/css_basedir/')->apply($document); - }
catch (Exception $e) { var_dump($e); - }
なお、CSSはhttp経由で取ってくるわけじゃないので、ちゃんとcss_basedirをパス指定してあげてください。
実際にどんな感じになるかは、sampleディレクトリの中を見てもらえればわかりやすいかと思いますが、
sample.html
- <!DOCTYPE
html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml-transitional.dtd"> - <html
lang="ja"> - <head>
<link rel="stylesheet" href="sample.css" /> <style type="text/css"> - div.hoge
{ color:#00FF00; - }
- div.hoge
a { color:#FFFF00; - }
</style> - </head>
- <body>
- <h1>test</h1>
- <div>hogehoge</div>
- <div
class="hoge">test<a href="" style="font-size:8px">test</a></div> - </body>
- </html>
sample.css:
- body
{ margin: 0px; - }
- h1
{ font-size: 11px; - }
- div
{ font-size: 10px; - }
- a:hover
{ color: #0000FF; - }
結果:
- <!DOCTYPE
html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml-transitional.dtd"> - <html
lang="ja"> - <head><style
type="text/css"><![CDATA[ - a:hover{color:#0000FF;}
- ]]></style></head>
- <body
style="margin:0px;"> - <h1
style="font-size:11px;">test</h1> - <div
style="font-size:10px;">hogehoge</div> - <div
class="hoge" style="font-size:10px;color:#00FF00;">test<a href="" style="font-size:8px;color:#FFFF00;">test</a> - </div>
- </body>
- </html>
という感じになります。
現段階で実装してあること:
・linkタグで指定した外部CSSの読み込み、インライン化
・ファイル内のstyleタグCSSの読み込み、インライン化
・インライン化したlinkタグやstyleタグの削除
・a:hover,a:link,a:visited,a:focusのstyleタグへの埋め込み
・複数class指定への対応
まだ対応していないこと:
・@importなどの対応
・a:以外の疑似クラスにもうちょっときちんと対応
こんな感じのライブラリです。
これでDoCoMoのCSSをインライン以外でも書けるようになるので、テンプレート作成がだいぶ楽になるんじゃないかなー、と思います。
もしお役に立てば幸いです。
なお、このライブラリを完成させるにあたり、id:maru_ccさん、うちの会社の(笑)熊谷さんにはデバッグ、アイデア出し等でひじょーにお世話になりました。
この場をお借りしてお礼申し上げます。
※おまけですが、selectorToXPathの使い方はこんな感じです。
- require_once
'lib/selectorToXPath.php'; - $selector
= 'li.hogehoge'; - $xpath
= selectorToXPath::toXPath($selector); - var_dump($xpath);
コメント
コメントフォーム
トラックバック
-
- [php][mobile][Ethna]PHPライブラリ「toInlineCSSDoCoMo」をEthnaに組み込んでみた from maru.cc@はてな
- アシアルBlogにて、すばらしいライブラリが公開されました。 「DoCoMo向...
2008年07月09日 21:58
-
- ドコモでも CSS を外部参照で使えるEthna_Plugin from ごえlog
- 元ネタはCatalyst::Plugin::CSS::DocomoとHTML::DoCoMoCSSです。<link rel="stylesheet" hre...
2008年07月10日 17:39
-
- DoCoMo用に外部CSSをインライン化してくれるライブラリ from ぐさぎ どっと こむ - blog
- アシアルブログのこちらの記事で、タイトルの機能を持つ素晴らしいラ...
2008年07月10日 19:30
-
- モバイルサイトでCSSを使うための設定 from ノミ脳Webディレクター
- 久々に新規でモバイルサイトを作ることになったので、デザインの幅を...
2008年12月18日 08:36
最近の記事
- 【AS3】「ActionScript3の、こんなときどうするの??」 [2010年02月09日 : 橋本章史]
- Twitter-APIを使ってみました [2010年02月05日 : 中川善樹]
- PHPの名前空間と主要フレームワークの対応について [2010年02月04日 : 小川雄大]
- HDDのフォーマットには時間がかかるんです [2010年02月01日 : 岡本雄樹]
- GoogleChrome に Firebug extension をいれてみた + よさげなextensionまとめ [2010年01月26日 : 松田惇]
- 社員旅行で作成した陶磁器が完成しました! [2010年01月21日 : 阿部恵]
- PHPでコマンドライン・アプリケーションを簡単に作成する [2010年01月20日 : 小川雄大]
- kvmでwindows7を入れてみました [2010年01月20日 : 門脇優児]
- ratproxyとSelenium IDEを組み合わせたWebアプリケーションテスト [2010年01月15日 : 川原美和]
- lsyncdでファイルを同期してみよう [2010年01月13日 : 熊谷裕志]



大変恐縮なのですが、私の方で不可解な問題がでてしまいました。何かおわかりでしたらご教示いただけると幸いです。
ローカルの環境XAMPPでは、問題ないのですが、レンタルサーバー上で処理をすると、すべての日本語(マルチバイト文字)が特殊文字(&#12310;)に、変換されてしまいます。
サーバー設定(php.ini)によるものの可能性が高いのですが、それがどの項目なのかがわかりません。
また、XPATHスクリプトなのか、toInlineCSSDoCoMoなのか、PEAR::HTML_CSSなのか。
おわかりの範囲でけっこうですので、どうぞよろしくお願いします。
それはtoInlineCSSDoCoMoの中で使っているDOMDocument(もっというとlibXML)が引き起こす問題です。
ファイルの文字コードはUTF-8だけど、metaできちんとcharsetを指定していない、といった感じの状況になっていませんか?
あと、申し訳ないことにこちらは最新版ではなくて、CodeReposの方へ名称を変えて最新版を入れてあります。。すいません。
http://coderepos.org/share/browser/lang/php/HTML_CSS_Mobile
記事の方も修正しておきました。
お返事いただいてありがとうございます。
なるほど、そういった点があるんですね。勉強になります。
文字コードなどは指定しているのですが、携帯サイトについてはまだ勉強し始めたところなので、間違ってるのかもしれないですね。いろいろ検証してみたいと思います。(今のところPC用のものを流用中)
最新版のほうも試させていただきたいと思います。
重ねまして、このような有用なライブラリを公開・利用許可していただきありがとうございます。
私ももっと知識をつけて、還元していきたいと思います。
libXML Version 2.6.19
だとアウトみたいですね。queryメソッドがダメらしいです。
お騒がせしました~
ご連絡ありがとうございますー。
たしかに、libXMLのバージョンはありがち(^^;
しかし、それによって起きる問題もわかったので、とても助かりました。
ありがとうございます。
CodeReposの方は、ちょっとずつだまってwバージョンアップしたりしてるのでw
ある程度変更が加わったら、またブログ等でご報告しますね。
ライブラリを通して出力し、ソースを見るたび「おぉ」と思っています。
当方、サーバー、PHPソース、PHPライブラリ、入力・出力、全てUTF-8で稼働させています。
そのとき、(110行目付近)
$dom->loadHTML($document);
で、文字化けが発生していました。
その前で、
$document = mb_convert_encoding($document, 'HTML-ENTITIES', $doc_encoding);
としてやることで、文字化け回避ができました。
なにか設定ミス、勘違い等で起こっていた文字化けでしたら、出しゃばって申し訳ございません。
お知らせにまで、コメントさせていただきました。
本当に、このライブラリには助けられてばかりです。
ありがとうございます。
使っていただいてありがとうございます><
> そのとき、(110行目付近)
> $dom->loadHTML($document);
> で、文字化けが発生していました。
行数から察するに、たぶん古いバージョンかも(^^;
不案内で済みません。
上記エントリを書き変えてありますが、ライブラリの名前を変えてCodeReposに入れてあります。
そちらでは、一応文字化け問題は修正されている。。はずですw
もしまた問題があったら、ぜひご連絡ください><