D3 Pipesとは、内外のシンジケーション情報を自在に扱うためのモジュールです。
名前からも機能からも、某!Pipesを予想させるでしょう。
ただ実は私、某!Pipesを使ったことは一度もありません。(アカウントすらない)
あくまでITMediaの紹介記事を読んだだけであり、概念くらいしか知りません。
その紹介記事からインスパイアされて作っただけなので、もしかしたら、まったく違うものである可能性はあります。
さて、xhldを開発していて、何より苦労したのは、環境依存があまりにも多いことです。xhldでは、個別に対応して、その都度パッチを当てていたのですが、結果的にレンダラクラスばかりが肥大する、という結果になりました。
問題となった環境依存とは以下のようなものです。
-取得処理
--allow_url_fopen設定 (onならfopenが使えるがoffならsocketを使うしかない)
--curlの有無/パス (snoopy利用時のhttpsアクセス)
--Proxyをどう超えるか
-解析処理
--XMLの文字エンコーディング (mbstring/iconv)
--RSS1/RSS2/ATOMのフォーマットの違い
--どの要素にどのデータが載っているか(サイトによって千差万別)
--規則に違反しているXMLの処理
-絞り込み処理
--国際化を考えるとpreg_matchしか使えないが、マルチバイト圏ではmbregexでないと使い物にならない
-保存処理
--内部エンコーディング (mbstring/iconv)
-集約処理
--発行日のないエントリをどう扱うか
-表示処理
--どの要素を表示するか
--どの要素をエスケープするか/しないか
…とまあ、実際キリがなく、嫌になるほどです。
ところが、RSSの処理をパイプに見立てて、上述した各動作を、ジョイントとして機能的に分解してみると、驚くほどすっきりとしたコードになったのです。外部XMLを取得・表示する1本のパイプは以下のようなジョイント構成になります。
Joint -> Joint -> Joint -> Joint
元のXML utf8XML utf8配列 内部配列