Markup

XML, HTML 出力支援モジュール Markup

Author : trashtoy

Table of Contents

出力に特化したモジュールです

パッケージ Markup は, XML や HTML などのマークアップ言語の出力を支援するライブラリです. DOM に近い API を備えていますが, コンセプトは DOM とは全く異なります.

得意なこと

  • 手書きの HTML コードのような, 読みやすいフォーマットによるコード生成
  • SGML 形式と XML 形式の切替 (空要素を "<br>" と "<br />" のどちらで出力するか等)
  • インデントの種類 (半角スペース, TAB) や改行コードのカスタマイズ

不得手なこと

  • ノードツリーの操作 (あるノードを別のノードの下に移動させたり, 特定のノードを削除させたりなど) はサポートしていません. (append しか出来ません)
  • DOCTYPE 宣言, CDATA セクション, PI (処理命令) などのデータ型は存在しません. もしもこれらのデータを Node として扱いたい場合は Code オブジェクトにする必要があります.

サンプルコード

このモジュールの使い方を以下のサンプルコードでお見せします.

  1. $article new Peach_Markup_ContainerElement("article");
  2. $article->setAttributes(array("id" => 42"author" => "Thomas"));
  3.  
  4. $summary new Peach_Markup_ContainerElement("summary");
  5. $summary->append("Lorem ipsum dolor sit amet, consectetur adipisicing elit.");
  6. $article->append($summary);
  7.  
  8. $category new Peach_Markup_ContainerElement("category");
  9. $item1 new Peach_Markup_EmptyElement("item");
  10. $item1->setAttribute("id"3);
  11. $category->append($item1);
  12. $item2 new Peach_Markup_EmptyElement("item");
  13. $item2->setAttribute("id"7);
  14. $category->append($item2);
  15. $article->append($category);
  16.  
  17. $builder new Peach_Markup_DefaultBuilder();
  18. echo $builder->build($article);

このコードは以下の XML を出力します.

  1. <article id="42" author="Thomas">
  2.     <summary>Lorem ipsum dolor sit ametconsectetur adipisicing elit.</summary>
  3.     <category>
  4.         <item id="3" />
  5.         <item id="7" />
  6.     </category>
  7. </article>

HTML を出力する場合は Peach_Markup_Html を使ってさらに簡潔に書くことが出来ます. (上の書き方でももちろん出来ます)

  1. Peach_Markup_Html::alias()// 関数 tag() を定義する
  2. echo tag("html"array("lang" => "ja"))
  3.     ->append(tag("head")
  4.         ->append(tag("meta")->attr(array("http-equiv" => "Content-Type""content" => "text/html; charset=UTF-8")))
  5.         ->append(tag("title")->append("TEST PAGE"))
  6.     )
  7.     ->append(tag("body")
  8.         ->append(tag("form"array("method" => "post""action" => "sample.php"))
  9.             ->append("Name")
  10.             ->append(tag("input")->attr(array("type" => "text""name" => "param1""value" => "")))
  11.             ->append(tag("br"))
  12.             ->append(tag("input")
  13.                 ->attr(array("type" => "checkbox""name" => "flag1""value" => "1"))
  14.                 ->attr("checked")
  15.             )
  16.             ->append("Enable something")
  17.             ->append(tag("br"))
  18.             ->append(tag("input")->attr(array("type" => "submit""name" => "submit""value" => "Send")))
  19.         )
  20.     )->write();

このコードは以下の HTML を出力します.

  1. <html lang="ja">
  2.     <head>
  3.         <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  4.         <title>TEST PAGE</title>
  5.     </head>
  6.     <body>
  7.         <form method="post" action="sample.php">
  8.             Name
  9.             <input type="text" name="param1" value="">
  10.             <br>
  11.             <input type="checkbox" name="flag1" value="1" checked>
  12.             Enable something
  13.             <br>
  14.             <input type="submit" name="submit" value="Send">
  15.         </form>
  16.     </body>
  17. </html>

モジュールの基本構造

このモジュールの基本となる型は NodeBuilder です. この 2 つの型の相互作用によりマークアップ言語の出力が行われます.

Node

Node はマークアップ言語を構成するパーツを表すインタフェースです. 例えば要素 (タグ)・テキスト・コメントなどが該当します.

Node の実装クラスとして, 代表的なものを以下に挙げます.

  • ContainerElement: 開始タグと終了タグを伴う要素です.
  • EmptyElement: 空要素です. HTML における img や br などに相当します.
  • Text: 開始タグと終了タグに囲まれたテキスト部分を表します.
  • Comment: <-- と --> で囲まれたコメントを表します.

詳しくは Node (各種パーツ) を参照してください.

Builder

Builder は XML (HTML) 文書を出力する際の整形ルールを表すクラスです. 例えば以下の情報を制御することが出来ます.

  • インデントの種類 (タブ文字 or スペース)
  • 改行コード (CR, LF, CRLF)
  • 空要素タグの出力方法

詳しくは Builder (出力制御) を参照してください.