基本構文

注) この文書はDiazo: Basic Syntaxをgoogle 翻訳にかけた後,フォーマットなどを少し修正したものです。少し訳を修正した部分もありますが,google 翻訳そのままの部分がほとんどです。

Diazoのテーマは、静的なHTMLページ(「テーマ」と呼ばれる)と、 rules.xmlと呼ばれるルールファイルで構成されています。 rulesファイルは<rules />というタグを使ったXML文書が含んでいます。

<rules
    xmlns="http://namespaces.plone.org/diazo"
    xmlns:css="http://namespaces.plone.org/diazo/css"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

       ...

</rules>

ここでは、3つの名前空間を定義しています。デフォルトの名前空間はルールとXPathセレクターに使用されます。 css名前空間はCSS3セレクタに使用されます。これらはXPathセレクタと機能的に同等です。 実際、CSSセレクタは、コンパイラの前処理ステップで同等のXPathセレクタに置き換えられます。 したがって、パフォーマンスに影響はありません。 細かい制御のためにインラインXSLTディレクティブを追加する場合は、 xsl名前空間が使用されます。 私たちはこのガイドの後半でこれに着きます。 Diazoは、 nth-child疑似セレクタなどの複雑なCSS3セレクタとXPathセレクタをサポートしています。 XPathやCSS3を初めてお使いの方は、参考になることをお勧めします。

ルールの記述

ルール記述のための命令一覧です。

<theme />

<theme />は、rulesファイルの<rules />要素内で使用する。 テーマファイルの指定に使用する場合には以下のように記述する。

  <theme href = "theme.html" />

相対パスはrules.xmlファイルに対する相対位置で解決される。

次の属性を使用できます。

<notheme />

<notheme /> : 特定の条件ですべてのテーマをオフにするのに使用します。 例えば

    <theme href = "theme.html" />
    <notheme css:if-content = "body.rawpage" />

複数の<notheme />要素を使用できます。 いずれかの条件が真である場合、テーマは省略されます。 

以下の属性のどれか1つ以上が必要です。

複数の属性が使用されている場合、すべて条件が真のときのみにこの命令文は有効。

<replace />

テーマ内の要素をコンテンツ内の要素で置き換えるために使用します。 例:

<replace theme="/html/head/title" content="/html/head/title"/>

CSSセレクタを使用して同様のことをすると次のようになります。

<replace css:theme="title" css:content="title"/>

どちらの場合も,テーマの<title />要素は(動的)コンテンツの<title />要素に置き換えられます。

以下の属性を使用できます。

<replace>のより高度な使い方については、テーマの変更コンテンツの変更の章を参照してください。

<before /><after />

<before />と<after />は、 <replace />とほぼ同じですが,テーマの中の指定箇所の前や後にコンテンツを挿入します。 例:

<before css:theme="#content" css:content="#info-box" />

これは、テーマにおけるidがcontentである要素の直前に,コンテンツ(ここではidがinfo-boxのもの)を配置します。 代わりに,info-boxを下に置きたい場合は、次のようにします。

<after css:theme="#content" css:content="#info-box" />

既存の,どの子要素よりも前の,#contentの内側にコンテンツ(ここではinfo-box)を挿入するには、次のようにします。

<before css:theme-children="#content" css:content="#info-box" />

<before />と<after />の必須属性とオプション属性は<replace />と同様です。 ただし,attributesはサポートされてません。

<drop />

テーマまたはコンテンツから要素を削除するために使用されます。 これは、 テーマ属性またはコンテンツ属性(またはそのcss:-children 属性のうち等価なもの)を受け入れる唯一の要素ですが、両方は受け入れません。

<drop css:content="#portal-content .about-box" />
<replace css:theme-children="#content" css:content="#portal-content" />

これは、まず,コンテンツ要素内のidがportal-contentである要素のうち,クラス名がabout-boxであるコンテンツを全て削除します。その後, コンテンツファイル内の,id がportal-contentであるすべての要素を、テーマファイル内のid がcontentである要素にコピーします。

同様に,

<drop theme="/html/head/base" />

とすると,テーマファイルのヘッダから<base />タグを削除します。

次の属性を使用できます。

<strip />

テーマやコンテンツからタグを取り除いて、子をそのまま残します。 これは、 theme-childrenまたはcontent-childrenを持つ<drop />の逆と考えることができます。例えば:


<strip css:theme="#content" />

これにより、idの内容を持つ要素が削除され、すべての子要素がそのまま残ります。 同様に:

<strip css:content="#main-area .wrapper" />
<replace css:theme="#content-area" css:content="#main-area" />

これにより、テーマの要素がidのcontent-areaで置き換えられ、idのメイン 領域を持つコンテンツ内の要素に置き換えられますが、 #main-areaにあるCSSクラスのラッパーを含むネストされたタグは除外されます。 <strip /><drop />と同じ属性と文法を使用します。

<merge />

コンテンツ内の属性の値を、テーマ内の同じ名前の属性とマージするために使用されます。 これは主にCSSクラスのマージに便利です:


<merge attributes="class" css:theme="body" css:content="body" />

テーマに次のbodyタグがある場合:

<body class = "alpha beta">

内容は次のとおりです。

<body class="delta gamma">

結果は次のようになります。

<body class="alpha beta delta gamma">

次の属性を使用できます。

<copy />

コンテンツ内のノードからテーマ内のノードに属性をコピーするために使用されます。 <replace />とは異なり、属性がターゲットテーマノードに存在しない場合でも<copy />は動作します。 それが存在する場合、それは置き換えられます。 例えば:

<copy attributes="class" css:theme="body" css:content="body"/>

次の属性を使用できます。

ルールの実行順序

ほとんどの場合、Diazoコンパイラの内部動作についてはあまり気にしないでください。 ただし、規則が適用される順序を理解することが役立つことがあります。

  1. テーマを使っている<before />ルール(theme-childrenではなく)は常に最初に実行されます。
  2. 次に、 <drop />ルールが実行されます。
  3. 同じテーマノードに<drop />ルールが適用されていないか、またはmethod = "raw"が使用されていれば、 テーマを使用する<replace />ルールは次に実行されます。
  4. 次に<strip />ルールが実行されます。 コンテンツまたはテーマノードが削除される場合でも、 <strip />ルールは他のルールの起動を妨げないことに注意してください。
  5. 属性を操作するルール。
  6. テーマを使用する<replace />ルールが以前に同じテーマノードに適用されていない限り、 theme-childrenを使用して<before />および<replace />および<after />ルールが次に実行されます。
  7. テーマを使った<after />ルール( theme-childrenではなく)が最後に実行されます。

テーマやコンテンツが一致しない場合の動作

ルールがテーマに一致しない場合(コンテンツと一致するかどうかにかかわらず)、暗黙のうちに無視されます。 <replace />ルールがテーマに一致するがコンテンツに一致しない場合、一致した要素はテーマにドロップされます。

  <replace css:theme = "#header" content = "#header-element" />

ここで、id ヘッダー要素を持つ要素がコンテンツに見つからない場合 、そのテーマのid ヘッダーを持つプレースホルダーが削除されます。 同様に、一致するコンテンツがない場合、 <copy />ルールと一致するテーマノードのコンテンツは削除されます。 これを考えるもう1つの方法は、コンテンツノードが一致しない場合、Diazoはコピーまたは置換するときに空のノードセットを使用するということです。 見つからないコンテンツノードの場合にプレースホルダを置いておきたい場合は、これを条件付きルールにすることができます。

  <replace css:theme="#header" content="#header-element" if-content = "" />

条件付きルールの詳細については、次のセクションを参照してください。