CSS構文モジュール レベル3

W3C 勧告候補ドラフト,

この文書の詳細情報
このバージョン:
https://www.w3.org/TR/2021/CRD-css-syntax-3-20211224/
最新公開バージョン:
https://www.w3.org/TR/css-syntax-3/
編集者草案:
https://drafts.csswg.org/css-syntax/
以前のバージョン:
履歴:
https://www.w3.org/standards/history/css-syntax-3
実装レポート:
https://wpt.fyi/css/css-syntax/
テストスイート:
http://test.csswg.org/suites/css-syntax-3_dev/nightly-unstable/
フィードバック:
CSSWG イシューレポジトリ
編集者:
Tab Atkins Jr. (Google)
Simon Sapin (Mozilla)
この仕様への編集提案:
GitHub エディター

概要

このモジュールは、一般的な観点からCSSスタイルシートの基本的な構造と構文を説明します。CSSの構文とパース処理、つまりバイトストリームを意味のあるスタイルシートに変換する方法について詳細に定義します。

CSSは、構造化された文書(HTMLやXMLなど)が画面や紙などでどのように表示されるかを記述するための言語です。

この文書のステータス

このセクションでは、公開時点での本文書のステータスについて説明します。現在のW3C公開文書一覧や、本技術レポートの最新改訂版は、W3C技術レポートインデックス https://www.w3.org/TR/で確認できます。

この文書はCSS作業グループによって、勧告候補ドラフトとして勧告トラックを用いて公開されました。 勧告候補として公開されたことは、W3Cおよびその会員による支持を意味するものではありません。 勧告候補ドラフトには、作業グループが次回の勧告候補スナップショットに含める予定の、前回の勧告候補からの変更が統合されています。

この文書はドラフトであり、随時更新・置換・廃止される可能性があります。 本文書を進行中の作業以外のものとして引用することは不適切です。

ご意見は、GitHubでイシューを提出(推奨)、タイトルに仕様コード「css-syntax」を含めて「[css-syntax] …コメントの概要…」のようにしてください。 すべてのイシューおよびコメントはアーカイブされています。 または、(アーカイブ済み)公開メーリングリストwww-style@w3.orgでもご意見を送信できます。

本書は2021年11月2日付W3Cプロセス文書によって管理されています。

本書は、W3C特許ポリシーの下で運営されているグループによって作成されました。 W3Cは、グループの成果物に関連して行われた特許開示の公開リストを維持しています。 そのページには特許開示の方法についても記載されています。 個人がその個人の知識に基づき、必須クレームを含むと考える特許を知っている場合は、W3C特許ポリシー第6節に従い情報を開示しなければなりません。

1. はじめに

この節は規範的ではありません。

このモジュールは、CSSスタイルシートおよびCSS構文を利用するその他のもの (例えばHTMLのstyle属性)の抽象構文と構文解析を定義します。

Unicodeのコードポイント(つまりテキスト)のストリームを、 CSSトークンのストリームへ変換するアルゴリズム、 さらにCSSオブジェクト(スタイルシート、規則、宣言など)へと変換するアルゴリズムを定義します。

1.1. モジュール間の関係

このモジュールはCSSスタイルシートの構文とパース処理を定義します。 CSS 2.1で定義されていた字句解析と文法を置き換えます。

2. CSSの構文の説明

この節は規範的ではありません。

CSS文書は一連のスタイル規則文書内の要素にスタイルを適用する修飾規則と、at-ルールCSS文書に対して特別な処理規則や値を定義するもの—から構成されます。

修飾規則は、まず前置部があり、 その後に波括弧で囲まれた宣言のシーケンスが続きます。 前置部の意味は、その規則が現れる文脈によって異なります。 スタイル規則の場合は、 宣言が適用される要素を指定するセレクターです。 各宣言は名前、 コロン、宣言値の順に記述します。 宣言はセミコロンで区切られます。

典型的な規則は次のようになります:

p > a {
  color: blue;
  text-decoration: underline;
}

上記の規則では、「p > a」がセレクターであり、 ソース文書がHTMLの場合、 a 要素が p 要素の子要素である場合に選択されます。

color: blue」は、セレクターに一致する要素に対して color プロパティの値をblueに指定しています。 同様に、text-decorationプロパティの値をunderlineに指定しています。

at-ルールはそれぞれ異なる構造を持ちますが、基本的な構造は共通しています。 まず「@」コードポイントで始まり、その後CSSキーワードとして名前が続きます。 一部のat-ルールは単純な文で、 名前の後にCSS値が続き、その動作を指定し、 最後にセミコロンで終わります。 他のものはブロックとなり、 名前の後にCSS値が続くこともありますが、 最後は波括弧で囲まれたブロックで終わります。 これは修飾規則と似ています。 これらのブロックの内容も、各at-ルールごとに固有です。 場合によっては宣言のシーケンスが含まれることもあれば、 追加のブロックやat-ルール、その他の構造が含まれることもあります。

様々な構文を持つat-ルールの例をいくつか示します。

@import "my-styles.css";

@import at-ルールは単純な文です。 名前の後に、インポートすべきスタイルシートを示す文字列またはurl()関数が続きます。

@page :left {
  margin-left: 4cm;
  margin-right: 3cm;
}

@page at-ルールは、オプションのページセレクター(:left疑似クラス)の後に、 印刷時にページに適用するプロパティのブロックが続きます。 この点で、通常のスタイル規則と非常に似ていますが、 プロパティは「要素」ではなくページ自体に適用されます。

@media print {
  body { font-size: 10pt }
}

@media at-ルールは、メディアタイプとオプションのメディアクエリのリストで始まります。 ブロック内には規則全体が含まれており、 @mediaの条件が満たされたときのみ適用されます。

プロパティ名やat-ルール名は常に identシーケンスであり、 ident-startコードポイント、2つのハイフン、 またはハイフン+ident-startコードポイントで始まり、 その後、0個以上のidentコードポイントが続きます。 CSS構文で用いられるものも含め、 任意のコードポイントエスケープすることで含めることができます。

セレクターの構文はSelectors仕様で定義されています。 同様に、さまざまなCSS値の構文はValues & Units仕様で定義されています。 個別のat-ルールの特殊な構文は、それぞれの仕様で確認できます。

2.1. エスケープ処理

この節は規範的ではありません。

任意のUnicodeコードポイントは、identシーケンスや引用符付き文字列にエスケープして含めることができます。 CSSのエスケープシーケンスはバックスラッシュ(\)で始まり、以下が続きます:

2.2. エラー処理

この節は規範的ではありません。

CSSでエラーが発生した場合、 パーサはできるだけ少ない内容だけを破棄し、 通常どおりパースを続行できるようにします。 これは、エラーが必ずしもミスとは限らず—新しい構文は古いパーサにはエラーに見えるため、 言語に新しい構文を追加しても古いUAでスタイルシートが完全に壊れることを心配せずにすむようにするためです。

厳密なエラー回復動作はパーサ自体で詳述されていますが、 簡単な説明でも十分に正確です。

各構成要素(宣言、スタイル規則、at-ルール)がパースされた後、 ユーザーエージェントは期待される文法と照合します。 一致しない場合は無効となり、 UAによって無視され、 まったく存在しなかったものとして扱われます。

3. CSSのトークン化とパース

ユーザーエージェントは、本仕様で記載されたパース規則を用いて text/cssリソースから[CSSOM]ツリーを生成しなければなりません。 これらの規則を合わせて、CSSパーサと呼ばれます。

本仕様は、CSS文書のパース規則を定義します。 文書が構文的に正しい場合も、そうでない場合も対象です。 パースアルゴリズムの特定のポイントはパースエラーとされます。 パースエラーの処理方法は明確に定義されています。 このような問題が発生した場合、ユーザーエージェントは以下に記載された方法で動作するか、 そうしたくない場合は、最初に遭遇したエラーで処理を中止しなければなりません。

適合性チェッカーは、文書内に1つ以上のパースエラー条件が存在する場合、 少なくとも1つ以上のパースエラー条件をユーザーに報告しなければなりません。 また、パースエラー条件が存在しない場合は報告してはなりません。 複数のパースエラー条件が存在する場合は、複数報告しても構いません。 適合性チェッカーはパースエラーから復帰する必要はありませんが、 復帰する場合はユーザーエージェントと同じ方法で復帰しなければなりません。

3.1. パースモデルの概要

CSSパース処理への入力は、Unicodeコードポイントのストリームであり、 トークン化段階を経てツリー構築段階に渡されます。 出力はCSSStyleSheetオブジェクトです。

注: スクリプトをサポートしない実装は、 実際にCSSOM CSSStyleSheetオブジェクトを生成する必要はありませんが、 その場合でもCSSOMツリーは以降の仕様のモデルとして利用されます。

3.2. 入力バイトストリーム

スタイルシートをパースする場合、 トークン化段階への入力となるUnicodeコードポイントのストリームは、 ユーザーエージェントによって最初はバイトストリームとして認識されることがあります (通常はネットワーク経由やローカルファイルシステムから)。 その場合、ユーザーエージェントはこれらのバイトを 特定の文字エンコーディングに従ってコードポイントへ復号しなければなりません。

stylesheetのバイトストリームをコードポイントのストリームへ復号するには:
  1. フォールバックエンコーディングを決定し、 fallbackに結果を格納する。

  2. 復号fallbackエンコーディングで行い、 結果を返す。

注: decodeアルゴリズムは バイトオーダーマーク(BOM)を優先し、 見つからなかった場合のみフォールバックを利用します。

stylesheetフォールバックエンコーディングを決定するには:
  1. HTTPや同等のプロトコルがstylesheetencoding label(例: Content-Typeヘッダーのcharsetパラメータ)を提供している場合、エンコーディングを取得する。 失敗しなければ、その値を返す。
  2. それ以外の場合、stylesheetのバイトストリームを確認する。 ストリームの最初の1024バイトが次の16進シーケンスで始まる場合
    40 63 68 61 72 73 65 74 20 22 XX* 22 3B

    XXバイトは016〜2116または2316〜7F16の範囲の値で、 この場合はASCIIとして解釈されるXXバイト列から エンコーディングを取得する。

    このバイトシーケンスの意味は?

    このバイトシーケンスはASCIIでデコードすると "@charset "…";"という文字列となり、 「…」はエンコーディングラベルのバイト列です。

    返り値がutf-16beまたはutf-16leの場合はutf-8を返し、 それ以外で失敗しなければその値を返す。

    宣言がutf-16でもutf-8を使う理由は?

    エンコーディング宣言のバイトはASCIIで“@charset "…";”を記述しますが、 UTF-16はASCII互換ではありません。 ドキュメント内で意図的にバイト値を合わせた場合(例: 䁣桡牳整•utf-16be∻)は推奨されませんし、 実際はASCII互換エンコーディングで宣言が誤っている場合もあります。

    いずれの場合でも、UTF-8をデフォルトにするのが妥当です。

    また、これはHTMLの<meta charset>属性の動作と一致します。

    注: エンコーディング宣言の構文は at-ルール@charsetの構文に見えますが、 実際にはそのようなルールは存在しません。 その書き方の制約は通常のCSSのat-ルールより厳格です。 CSSで有効な@charsetルールを記述できるもの(スペース、コメント、シングルクォート等)でも、 エンコーディング宣言として認識されません。 この挙動は宣言構文をできるだけ単純化し、 実装の正確性を高めるためです。

  3. それ以外の場合、参照元文書が環境エンコーディングを提供している場合はそれを返す。
  4. それ以外の場合はutf-8を返す。

UTF-8はWebのデフォルトエンコーディングですが、 多くの新しいWebベースのファイルフォーマットはUTF-8を想定または要求しますが、 CSSはどのエンコーディングが主流になるか明確になる前に作られたため、 自動的にUTF-8とは仮定できません。

スタイルシートの著者はUTF-8で記述し、 HTTPヘッダーや参照文書でUTF-8を宣言するべきです。 (HTMLの場合は<meta charset=utf-8>をhead要素に追加します。)

これらの方法が利用できない場合は、 スタイルシートの先頭にUTF-8 BOMまたは次の文字列を記述してください:

@charset "utf-8";

バイトからデコードされるCSSスタイルシートを参照する文書言語は、 そのスタイルシートごとに環境エンコーディングを定義でき、 他のエンコーディングヒントが使えない場合にフォールバックとして利用されます。

環境エンコーディングという概念は、レガシーコンテンツとの互換性のためだけに存在します。 新しいフォーマットや新しいリンク手段は、環境エンコーディングを提供すべきではありません。 そのため、より明示的な情報がなければスタイルシートはUTF-8がデフォルトになります。

注: [HTML] <link rel=stylesheet> の環境エンコーディングを定義しています。

注: [CSSOM] <xml-stylesheet?> の環境エンコーディングを定義しています。

注: [CSS-CASCADE-3]@import の環境エンコーディングを定義しています。

3.3. 入力ストリームの前処理

入力ストリームは、 バイトストリームのデコード時にプッシュされたフィルタ済みコードポイントで構成されます。

(CSS)から(未フィルタ)コードポイントのストリームinputから コードポイントをフィルタするには:

4. トークン化

トークン化するには、コードポイントのストリームinputから トークンを消費し、 <EOF-token>に到達するまで繰り返し、 それぞれのトークンをストリームにプッシュする。

注: トークン消費アルゴリズムは1トークンずつ返すため、 必要に応じてパース中にコードポイントのストリームを 「オンデマンド」でトークン化することもできます。

トークン化の出力は、以下のいずれかのトークンのストリームです: <ident-token>, <function-token>, <at-keyword-token>, <hash-token>, <string-token>, <bad-string-token>, <url-token>, <bad-url-token>, <delim-token>, <number-token>, <percentage-token>, <dimension-token>, <whitespace-token>, <CDO-token>, <CDC-token>, <colon-token>, <semicolon-token>, <comma-token>, <[-token>, <]-token>, <(-token>, <)-token>, <{-token>, <}-token>

注: hashトークンのtypeフラグはSelectors構文[SELECT]で使用されます。 "id"型のhashトークンのみIDセレクターとして有効です。

4.1. トークン レールロード図

この節は規範的ではありません。

この節では、トークナイザーの説明をレールロード図の形で示します。 レールロード図は明示的なパーサよりもコンパクトであり、 正規表現よりも読みやすいことが多いです。

これらの図は参考情報であり、完全ではありません。 「正しい」トークンの文法を説明しますが、エラー処理については全く説明していません。 各トークンの構文を直感的に理解しやすくするためだけに提供しています。

<foo-token>のような名前の図はトークンを表します。 それ以外は他の図から参照される生成規則です。

comment
/* anything but * followed by / */
newline
\n \r\n \r \f
whitespace
space \t newline
hex digit
0-9 a-f or A-F
escape
\ not newline or hex digit hex digit 1-6 times whitespace
<whitespace-token>
whitespace
ws*
<whitespace-token>
<ident-token>
-- - a-z A-Z _ or non-ASCII escape a-z A-Z 0-9 _ - or non-ASCII escape
<function-token>
<ident-token> (
<at-keyword-token>
@ <ident-token>
<hash-token>
# a-z A-Z 0-9 _ - or non-ASCII escape
<string-token>
" not " \ or newline escape \ newline " ' not ' \ or newline escape \ newline '
<url-token>
<ident-token "url"> ( ws* not " ' ( ) \ ws or non-printable escape ws* )
<number-token>
+ - digit . digit digit . digit e E + - digit
<dimension-token>
<number-token> <ident-token>
<percentage-token>
<number-token> %
<CDO-token>
<!--
<CDC-token>
-->

4.2. 定義

このセクションでは、トークン化フェーズで使用されるいくつかの用語を定義します。

next input code point
まだ消費されていないコードポイントのうち、入力ストリームの先頭のもの。
current input code point
直前に消費されたコードポイント
reconsume the current input code point
current input code point入力ストリームの先頭に戻す。 次回next input code pointを消費する指示が出た際に、現在のコードポイントを再消費することになる。
EOF code point
入力ストリームの末尾を表す概念上のコードポイント入力ストリームが空のときは、next input code pointは常にEOFコードポイントとなる。
digit
U+0030 DIGIT ZERO (0) から U+0039 DIGIT NINE (9) までのコードポイント
hex digit
digit、またはU+0041 LATIN CAPITAL LETTER A (A) から U+0046 LATIN CAPITAL LETTER F (F) までのコードポイント、またはU+0061 LATIN SMALL LETTER A (a) からU+0066 LATIN SMALL LETTER F (f) までのコードポイント
uppercase letter
U+0041 LATIN CAPITAL LETTER A (A) から U+005A LATIN CAPITAL LETTER Z (Z) までのコードポイント
lowercase letter
U+0061 LATIN SMALL LETTER A (a) から U+007A LATIN SMALL LETTER Z (z) までのコードポイント
letter
uppercase letterまたはlowercase letter
non-ASCII code point
値がU+0080 <control>以上のコードポイント
ident-start code point
letternon-ASCII code point、 またはU+005F LOW LINE (_)。
ident code point
ident-start code pointdigit、 またはU+002D HYPHEN-MINUS (-)。
non-printable code point
U+0000 NULL から U+0008 BACKSPACE までのコードポイント、 またはU+000B LINE TABULATION、 またはU+000E SHIFT OUT から U+001F INFORMATION SEPARATOR ONE までのコードポイント、 またはU+007F DELETE。
newline
U+000A LINE FEED。 U+000D CARRIAGE RETURNおよびU+000C FORM FEEDはこの定義に含まれません。前処理の際にU+000A LINE FEEDへ変換されるためです。
whitespace
newline、U+0009 CHARACTER TABULATION、またはU+0020 SPACE。
maximum allowed code point
Unicodeで定義されている最大のコードポイント:U+10FFFF。
ident sequence
コードポイントの並びで、<ident-token>と同じ構文を持つもの。

注: <at-keyword-token>の「@」以降の部分、 <hash-token>(typeフラグが"id"の場合)の「#」以降の部分、 <function-token>の「(」より前の部分、 <dimension-token>の単位はすべてident sequenceです。

representation
トークンのrepresentationは、 入力ストリームから consume a tokenアルゴリズムによって消費された部分列。 これは、入力テキストの細かな違いに依存するいくつかのアルゴリズムで保持され、 トークンの単純な「再シリアライズ」では失われる可能性のある情報を守るためのもの。

representationは内部アルゴリズムのみで消費され、直接公開されることはないため、 正確なテキストを保持する必要はなく、 例えばトークンにソーステキストのオフセットを関連付けるなどの方法でも十分です。

注: 特にrepresentationは、 .009が.009として書かれていたか9e-3か、 文字がリテラルで書かれていたかCSSエスケープかなどの違いも保持します。 前者は<urange>生成規則のパースに必要であり、 後者はトークン化抽象化の偶発的なリークですが、実装の定義を容易にするため許容されています。

トークンが本仕様のトークン化アルゴリズム以外から直接生成された場合は、 そのrepresentationは空文字列となります。

4.3. トークナイザー アルゴリズム

このセクションで定義されるアルゴリズムは、コードポイントのストリームをトークンのストリームへ変換します。

4.3.1. トークンの消費

このセクションでは、consume a tokenコードポイントのストリームから消費する方法を説明します。 任意の型のトークンを1つ返します。

コメントを消費します。

next input code pointを消費します。

whitespace
可能な限り多くのwhitespaceを消費し、 <whitespace-token>を返します。
U+0022 QUOTATION MARK (")
文字列トークンを消費して返します。
U+0023 NUMBER SIGN (#)
next input code pointident code pointか、次の2コードポイント有効なエスケープなら:
  1. <hash-token>を作成。
  2. 次の3コードポイントident sequenceを開始するなら、 <hash-token>のtypeフラグを"id"に設定。
  3. ident sequenceを消費し、 <hash-token>の値に返された文字列を設定。
  4. <hash-token>を返す。

それ以外の場合は、 <delim-token>を返し、その値にcurrent input code pointを設定。

U+0027 APOSTROPHE (')
文字列トークンを消費して返します。
U+0028 LEFT PARENTHESIS (()
<(-token>を返します。
U+0029 RIGHT PARENTHESIS ())
<)-token>を返します。
U+002B PLUS SIGN (+)
入力ストリームが数値で始まるなら、current input code pointを再消費し、 数値トークンを消費して返す。

それ以外の場合は、 <delim-token>を返し、その値にcurrent input code pointを設定。

U+002C COMMA (,)
<comma-token>を返します。
U+002D HYPHEN-MINUS (-)
入力ストリームが数値で始まるなら、current input code pointを再消費し、 数値トークンを消費して返す。

それ以外の場合、 次の2コードポイントが U+002D HYPHEN-MINUS U+003E GREATER-THAN SIGN (->)なら、これらを消費し <CDC-token>を返します。

それ以外の場合、 入力ストリームがident sequenceで始まるなら、 current input code pointを再消費し、 ident-likeトークンを消費して返す。

それ以外の場合、 <delim-token>を返し、その値にcurrent input code pointを設定。

U+002E FULL STOP (.)
入力ストリームが数値で始まるなら、current input code pointを再消費し、 数値トークンを消費して返す。

それ以外の場合、 <delim-token>を返し、その値にcurrent input code pointを設定。

U+003A COLON (:)
<colon-token>を返します。
U+003B SEMICOLON (;)
<semicolon-token>を返します。
U+003C LESS-THAN SIGN (<)
次の3コードポイントが U+0021 EXCLAMATION MARK U+002D HYPHEN-MINUS U+002D HYPHEN-MINUS (!--)なら、これらを消費し <CDO-token>を返します。

それ以外の場合、 <delim-token>を返し、その値にcurrent input code pointを設定。

U+0040 COMMERCIAL AT (@)
次の3コードポイントident sequenceを開始するなら、 ident sequenceを消費し、 <at-keyword-token>を作成し、その値に返された値を設定して返す。

それ以外の場合、 <delim-token>を返し、その値にcurrent input code pointを設定。

U+005B LEFT SQUARE BRACKET ([)
<[-token>を返します。
U+005C REVERSE SOLIDUS (\)
入力ストリームが有効なエスケープで始まるなら、 current input code pointを再消費し、 ident-likeトークンを消費して返す。

それ以外の場合、これはパースエラーです。 <delim-token>を返し、その値にcurrent input code pointを設定。

U+005D RIGHT SQUARE BRACKET (])
<]-token>を返します。
U+007B LEFT CURLY BRACKET ({)
<{-token>を返します。
U+007D RIGHT CURLY BRACKET (})
<}-token>を返します。
digit
current input code pointを再消費し、 数値トークンを消費して返す。
ident-start code point
current input code pointを再消費し、 ident-likeトークンを消費して返す。
EOF
<EOF-token>を返します。
その他
<delim-token>を返し、その値にcurrent input code pointを設定。

4.3.2. コメントの消費

このセクションでは、consume commentsコードポイントのストリームから消費する方法を説明します。 何も返しません。

次の2コードポイントが U+002F SOLIDUS (/)の後にU+002A ASTERISK (*)の場合、 それらと、最初に出現するU+002A ASTERISK (*)の後にU+002F SOLIDUS (/)が続くまで(またはEOFコードポイントまで)をすべて消費します。 このステップの先頭に戻ります。

前段落がEOFコードポイントの消費で終了した場合、 これはパースエラーです。

何も返しません。

4.3.3. 数値トークンの消費

このセクションでは、consume a numeric tokenコードポイントのストリームから消費する方法を説明します。 <number-token><percentage-token>、または<dimension-token>を返します。

数値を消費し、その結果をnumberとします。

次の3コードポイントident sequenceを開始する場合:

  1. numberと同じ値とtypeフラグで、単位は空文字列の<dimension-token>を作成します。
  2. ident sequenceを消費します。 <dimension-token>の単位に返された値を設定します。
  3. <dimension-token>を返します。

それ以外の場合、次のコードポイントがU+0025 PERCENTAGE SIGN (%)の場合、 それを消費します。 numberと同じ値で<percentage-token>を作成して返します。

それ以外の場合、 numberと同じ値・typeフラグで<number-token>を作成して返します。

4.3.4. 識別子風トークンの消費

このセクションでは、consume an ident-like tokenコードポイントのストリームから消費する方法を説明します。 <ident-token><function-token><url-token>、または<bad-url-token>を返します。

ident sequenceを消費し、その結果をstringとします。

stringの値がASCII大文字小文字無視で"url"と一致し、 次のコードポイントがU+0028 LEFT PARENTHESIS (()の場合、 それを消費します。 次の2コードポイントwhitespaceである間、 次のコードポイントを消費します。 次の1または2コードポイントがU+0022 QUOTATION MARK (")、 U+0027 APOSTROPHE (')、 またはwhitespace+U+0022 QUOTATION MARK (")/U+0027 APOSTROPHE (')の場合、 stringを値とする<function-token>を作成して返します。 それ以外の場合、urlトークンを消費して返します。

それ以外の場合、次のコードポイントがU+0028 LEFT PARENTHESIS (()の場合、 それを消費します。 stringを値とする<function-token>を作成して返します。

それ以外の場合、 stringを値とする<ident-token>を作成して返します。

4.3.5. 文字列トークンの消費

このセクションでは、consume a string tokenコードポイントのストリームから消費する方法を説明します。 <string-token>または<bad-string-token>を返します。

このアルゴリズムはending code pointを引数で受け取る場合があり、 それは文字列を終了するコードポイントです。 ending code pointが指定されない場合は、 current input code pointが使われます。

最初に値を空文字列とした<string-token>を作成します。

ストリームから次のコードポイントを繰り返し消費します:

ending code point
<string-token>を返します。
EOF
これはパースエラーです。 <string-token>を返します。
newline
これはパースエラーです。current input code pointを再消費し、 <bad-string-token>を作成して返します。
U+005C REVERSE SOLIDUS (\)
次のコードポイントがEOFの場合は何もしません。

それ以外の場合、 次のコードポイントが改行の場合はそれを消費します。

それ以外の場合、(ストリームが有効なエスケープで開始) エスケープされたコードポイントを消費し、返されたコードポイント<string-token>の値に追加します。

その他
current input code point<string-token>の値に追加します。

4.3.6. URLトークンの消費

このセクションでは、consume a url tokenコードポイントのストリームから消費する方法を説明します。 <url-token>または<bad-url-token>を返します。

注: このアルゴリズムは、最初の「url(」がすでに消費されていることを前提としています。 また、url(foo)のような「引用符なし値」を消費する際に呼ばれることも前提です。 url("foo")のような引用符付き値は<function-token>としてパースされます。consume an ident-like tokenがこの区別を自動で行うため、 それ以外の場合にこのアルゴリズムを直接呼び出すべきではありません。

  1. 最初に値を空文字列とする<url-token>を作成します。
  2. 可能な限り多くのwhitespaceを消費します。
  3. ストリームから次のコードポイントを繰り返し消費します:
    U+0029 RIGHT PARENTHESIS ())
    <url-token>を返します。
    EOF
    これはパースエラーです。 <url-token>を返します。
    whitespace
    可能な限り多くのwhitespaceを消費します。 次のコードポイントがU+0029 RIGHT PARENTHESIS ())またはEOFの場合、 それを消費して<url-token>を返します(EOFの場合はパースエラーです); それ以外の場合、不正なURLの残骸を消費し、 <bad-url-token>を作成して返します。
    U+0022 QUOTATION MARK (")
    U+0027 APOSTROPHE (')
    U+0028 LEFT PARENTHESIS (()
    non-printable code point
    これはパースエラーです。不正なURLの残骸を消費し、 <bad-url-token>を作成して返します。
    U+005C REVERSE SOLIDUS (\)
    ストリームが有効なエスケープで始まるなら、 エスケープされたコードポイントを消費し、返されたコードポイント<url-token>の値に追加します。

    それ以外の場合、これはパースエラーです。不正なURLの残骸を消費し、 <bad-url-token>を作成して返します。

    その他
    current input code point<url-token>の値に追加します。

4.3.7. エスケープされたコードポイントの消費

このセクションでは、consume an escaped code pointの方法を説明します。 U+005C REVERSE SOLIDUS (\)はすでに消費済みであり、 次のコードポイントが有効なエスケープであることも検証済みであることを前提とします。 コードポイントを返します。

次のコードポイントを消費します。

hex digit
可能な限り多くのhex digit(最大5個)を消費する。 合計で1~6桁のhex digitが消費されることになります。 次のコードポイントwhitespaceなら、それも消費します。 hex digitを16進数として解釈します。 この値が0の場合、surrogateの場合、最大許可コードポイントより大きい場合は、 U+FFFD 置換文字(�)を返します。 それ以外の場合は、その値のコードポイントを返します。
EOF
これはパースエラーです。 U+FFFD 置換文字(�)を返します。
その他
current input code pointを返します。

4.3.8. 2コードポイントが有効なエスケープか判定

このセクションでは、2コードポイントが有効なエスケープか判定の方法を説明します。 このアルゴリズムは、2つのコードポイントを明示的に渡すか、 入力ストリームそのものに対して呼ぶことができます。 後者の場合、対象となる2つのコードポイントcurrent input code pointnext input code pointの順です。

注: このアルゴリズムは追加のコードポイントは消費しません。

最初のコードポイントがU+005C REVERSE SOLIDUS (\)でない場合はfalseを返します。

それ以外の場合、2つ目のコードポイントnewlineならfalseを返します。

それ以外の場合はtrueを返します。

4.3.9. 3コードポイントがident sequenceを開始するか判定

このセクションでは、3コードポイントがident sequenceを開始するか判定の方法を説明します。 このアルゴリズムは3つのコードポイントを明示的に渡すか、 入力ストリームそのものに対して呼ぶことができます。 後者の場合、対象となる3つのコードポイントcurrent input code point次の2コードポイントの順です。

注: このアルゴリズムは追加のコードポイントは消費しません。

最初のコードポイントを見ます:

U+002D HYPHEN-MINUS
2つ目のコードポイントident-start code pointまたはU+002D HYPHEN-MINUSの場合、 または2つ目と3つ目のコードポイント有効なエスケープの場合、trueを返します。 それ以外はfalseを返します。
ident-start code point
trueを返します。
U+005C REVERSE SOLIDUS (\)
最初と2つ目のコードポイント有効なエスケープの場合、trueを返します。 それ以外はfalseを返します。
その他
falseを返します。

4.3.10. 3コードポイントが数値を開始するか判定

このセクションでは、3コードポイントが数値を開始するか判定の方法を説明します。 このアルゴリズムは、3つのコードポイントを明示的に渡すか、 入力ストリームそのものに対して呼ぶことができます。 後者の場合、対象となる3つのコードポイントcurrent input code point次の2コードポイントの順です。

注: このアルゴリズムは追加のコードポイントは消費しません。

最初のコードポイントを見ます:

U+002B PLUS SIGN (+)
U+002D HYPHEN-MINUS (-)
2つ目のコードポイントdigitの場合はtrueを返します。

それ以外の場合、 2つ目のコードポイントがU+002E FULL STOP (.)で、 3つ目のコードポイントdigitの場合はtrueを返します。

それ以外の場合はfalseを返します。

U+002E FULL STOP (.)
2つ目のコードポイントdigitの場合はtrueを返します。 それ以外はfalseを返します。
digit
trueを返します。
その他
falseを返します。

4.3.11. ident sequenceの消費

このセクションでは、consume an ident sequenceコードポイントのストリームから消費する方法を説明します。 これは、ストリーム内の最初から隣接するコードポイントで形成可能な最大の名前を含む文字列を返します。

注: このアルゴリズムは、返されるコードポイント<ident-token>となることを保証するために必要な最初の数個のコードポイントの検証は行いません。 その用途であれば、このアルゴリズム呼び出し前にストリームがident sequenceで始まることを確認してください。

resultを最初は空文字列とします。

ストリームからnext input code pointを繰り返し消費します:

ident code point
コードポイントresultに追加します。
ストリームが有効なエスケープで始まる
エスケープされたコードポイントを消費し、 返されたコードポイントresultに追加します。
その他
current input code pointを再消費し、 resultを返します。

4.3.12. 数値の消費

このセクションでは、consume a numberコードポイントのストリームから消費する方法を説明します。 数値valueと、"integer"または"number"のいずれかであるtypeを返します。

注: このアルゴリズムは、ストリームから数値を得られることを保証するために必要な最初の数個のコードポイントの検証は行いません。 呼び出し前にストリームが数値で始まることを確認してください。

以下のステップを順に実行します:

  1. 最初にtypeを"integer"とし、 reprを空文字列とします。
  2. next input code pointがU+002B PLUS SIGN (+)またはU+002D HYPHEN-MINUS (-)なら、 それを消費してreprに追加します。
  3. next input code pointdigitである間、 それを消費してreprに追加します。
  4. 次の2コードポイントが U+002E FULL STOP (.)の後にdigitの場合:
    1. それらを消費します。
    2. reprに追加します。
    3. typeを"number"に設定します。
    4. next input code pointdigitである間、それを消費してreprに追加します。
  5. 次の2〜3コードポイントが U+0045 LATIN CAPITAL LETTER E (E)またはU+0065 LATIN SMALL LETTER E (e)、 (オプションで)U+002D HYPHEN-MINUS (-)またはU+002B PLUS SIGN (+)、 その後digitの場合:
    1. それらを消費します。
    2. reprに追加します。
    3. typeを"number"に設定します。
    4. next input code pointdigitである間、それを消費してreprに追加します。
  6. reprを数値に変換し、 valueに設定します。
  7. valuetypeを返します。

4.3.13. 文字列を数値に変換

このセクションでは、convert a string to a numberの方法を説明します。 数値を返します。

注: このアルゴリズムは、文字列が数値のみを含むことの検証はしません。 呼び出し前に、文字列が有効なCSS数値のみを含むことを確認してください。

文字列を左から順に7つの要素に分割します:

  1. 符号: U+002B PLUS SIGN (+)またはU+002D HYPHEN-MINUS (-)のいずれか1文字、または空文字列。 符号がU+002D HYPHEN-MINUS (-)の場合はsを-1、それ以外はsを1とする。
  2. 整数部分: 0個以上のdigit。 1つ以上digitがあれば、その数値を10進整数として解釈しiとする。なければiは0。
  3. 小数点: U+002E FULL STOP (.)の1文字、または空文字列。
  4. 小数部分: 0個以上のdigit。 1つ以上digitがあれば、その数値を10進整数として解釈しfとし、桁数をdとする。なければfdは0。
  5. 指数指示子: U+0045 LATIN CAPITAL LETTER E (E)またはU+0065 LATIN SMALL LETTER E (e)の1文字、または空文字列。
  6. 指数符号: U+002B PLUS SIGN (+)またはU+002D HYPHEN-MINUS (-)の1文字、または空文字列。 符号がU+002D HYPHEN-MINUS (-)の場合はtを-1、それ以外はtを1とする。
  7. 指数: 0個以上のdigit。 1つ以上digitがあれば、その数値を10進整数として解釈しeとする。なければeは0。

数値 s·(i + f·10-d)·10te を返します。

4.3.14. 不正なURLの残骸を消費

このセクションでは、不正なURLの残骸を消費コードポイントのストリームから行う方法を説明します。 これは、トークナイザーが<bad-url-token>の途中であることに気づいた場合に「後始末」を行うものです。 何も返しません。 目的は、入力ストリームを十分に消費して回復ポイントに到達し、通常のトークン化を再開できるようにすることです。

ストリームからnext input code pointを繰り返し消費します:

U+0029 RIGHT PARENTHESIS ())
EOF
return。
ストリームが有効なエスケープで始まる
エスケープされたコードポイントを消費これにより、エスケープされた右括弧("\)")が現れても<bad-url-token>が終了しないようになります。 それ以外は「その他」と同じです。
その他
何もしません。

5. パース

パース段階への入力は、トークン化段階からのトークンのストリームまたはリストです。 出力はパーサーの呼び出し方法(このセクション後半の入口点で定義)によって異なります。 パーサーの出力はat-ルール、修飾規則、宣言のいずれかまたは複数となります。

パーサーの出力はCSSの基本的な構文に従って構築され、個別項目の妥当性は考慮しません。 実装は各パーサーアルゴリズムから返された項目の妥当性をチェックし、妥当性がない場合は何も返さないものとして扱ってもよいし、 仕様通りに完全なツリーを構築してから、後処理で妥当性のない項目を除去しても構いません。

ツリーに現れる可能性がある項目は以下です:

at-ルール
at-ルールは名前、 コンポーネント値のリストからなる前置部、 オプションで{}ブロックからなるブロックを持ちます。

注: 本仕様はat-ルールのブロック内容に制限を設けません。 個々のat-ルールが、ブロックを受け入れるかどうか、受け入れる場合のパース方法(できれば本仕様で定義されたパーサーアルゴリズムや入口点を使う)を定義する必要があります。

修飾規則
修飾規則は コンポーネント値のリストからなる前置部と、 {}ブロックからなるブロックを持ちます。

注: ほとんどの修飾規則はスタイル規則となり、 前置部がセレクター[SELECT]、 ブロックが宣言リストとなります。

宣言
概念的には、宣言はプロパティまたは記述子名と値を関連付ける特定のインスタンスです。 構文的には、宣言は名前、コンポーネント値のリストからなる値、最初は未設定のimportantフラグを持ちます。

宣言はさらに、プロパティ宣言または記述子宣言に分類されます。 前者はCSSプロパティを設定し、主に修飾規則内で現れます。 後者はCSS記述子を設定し、at-ルール内にのみ現れます。 (この分類はSyntaxレベルでは行われません。宣言の出現場所によって仕様ごとに定義されます。)

コンポーネント値
コンポーネント値は保存トークン関数、 または単純ブロックのいずれかです。
保存トークン
トークナイザーが生成したすべてのトークン(ただし<function-token><{-token><(-token><[-token>は除く)。

注: 上記の非保存トークンは常により高次のオブジェクト(関数または単純ブロック)に消費されるため、 パーサ出力自体には現れません。

注: <}-token><)-token><]-token><bad-string-token><bad-url-token>は常にパースエラーですが、 本仕様ではMedia Queriesなど他の仕様が宣言やブロック全体を破棄せず、より細かなエラー処理を定義できるように、 トークンストリームに保持されます。

関数
関数は名前と、コンポーネント値のリストからなる値を持ちます。
単純ブロック
{}-ブロック
[]-ブロック
()-ブロック
単純ブロックは、関連付けられたトークン(<[-token><(-token><{-token>のいずれか)と、 コンポーネント値のリストからなる値を持ちます。

{}-ブロック[]-ブロック()-ブロックは その該当する関連トークンを持つ単純ブロックを指します。

5.1. パーサ レールロード図

このセクションは規範的ではありません。

このセクションでは、パーサの説明をレールロード図の形で示します。

これらの図は参考情報であり、完全ではありません。 「正しい」スタイルシートの文法を説明しますが、エラー処理については全く説明していません。 構文を直感的に理解しやすくするためだけに提供しています。

Stylesheet
<whitespace-token> <CDC-token> <CDO-token> Qualified rule At-rule
Rule list
<whitespace-token> Qualified rule At-rule
At-rule
<at-keyword-token> Component value {} block ;
Qualified rule
Component value {} block
Declaration list
ws* Declaration ; Declaration list At-rule Declaration list
Declaration
<ident-token> ws* : Component value !important
!important
! ws* <ident-token "important"> ws*
Component value
Preserved token {} block () block [] block Function block
{} block
{ Component value }
() block
( Component value )
[] block
[ Component value ]
Function block
<function-token> Component value )

5.2. 定義

current input token
トークナイザーによって生成されたトークンリストから、現在操作対象となっているトークンまたはコンポーネント値
next input token
トークナイザーによって生成されたトークンリストにおいて、current input tokenの次に位置するトークンまたはコンポーネント値current input tokenの次にトークンがない場合、next input token<EOF-token>となる。
<EOF-token>
トークンリストの終端を表す概念上のトークン。 トークンリストが空の場合、next input tokenは常に<EOF-token>となる。
consume the next input token
current input tokenを現在のnext input tokenに更新し、next input tokenも適切に調整する。
reconsume the current input token
次回アルゴリズムがconsume the next input tokenを指示した際は、何もしない(current input tokenを変更せず維持する)。

5.3. パーサーの入口点

このセクションで定義されるアルゴリズムは、CSSトークンのリストから高レベルのCSSオブジェクトを生成します。

ここでのアルゴリズムは入力としてトークンストリームを扱いますが、利便性のため他の値型でも呼び出せます。

normalize into a token streamを与えられたinputに対して行うには:

  1. inputがCSSトークンのリストなら、そのままinputを返す。

  2. inputがCSSコンポーネント値のリストなら、そのままinputを返す。

    注: トークンリストとコンポーネント値リストの違いは、関数やブロックのように「何かを含む」オブジェクトが、コンポーネント値リストでは単一のエンティティとなるが、トークンリストでは複数のエンティティとなる点のみです。 この仕様内のアルゴリズムには差異はありません。

  3. input文字列なら、filter code pointsinputを処理し、tokenizeして、最終結果を返す。

  4. 前記タイプ以外はinputとして渡されないことを保証する。

注: 他の仕様は独自の入口点を目的に合わせて定義可能です。

以下の注記は、関連仕様で規範的な文章として翻訳されるべきです。この仕様の用語にフックする形で:

5.3.1. CSS文法に従って何かをパースする

文字列やトークンリストがCSS文法に一致するか試し、一致した場合はその文法に従って構造化したい、といったケースがしばしばあります。 このセクションはそのような操作のための汎用フックです。 "parse foo as a CSS <color>"のように呼び出します。

このアルゴリズムは、一致しなかった場合はfailureを返し、一致した場合は文法に従ってパースした結果(文法仕様に対応する未定義の構造)を返します。 返り値は仕様の本文からのみ操作する必要があり、表現の曖昧さは問題になりません。 もし仕様外に公開したい場合は、利用側の仕様が明確な表現に変換する必要があります(例えばCSSシリアライズアルゴリズムを呼ぶなど("serialize as a CSS <string> value"のように)。

注: このアルゴリズムとCSS文法に従ってカンマ区切りリストをパースは、通常他の仕様が呼び出す唯一のパースアルゴリズムです。 他のパースアルゴリズムは主に[CSSOM]や「CSS構造を明示的に構築する」ケース向けです。 他のアルゴリズムを使う必要がある場合は、まずCSSWGに相談してください。

CSS文法に従って何かをパースする (単にparseとも呼ぶ) inputとCSSのgrammar生成規則を受け取るとき:
  1. normalizeinputを処理し、結果をinputとする。
  2. コンポーネント値リストをパースinputからパースし、返り値をresultとする。
  3. resultgrammarに一致するか試みる。 成功すれば一致した結果を返し、失敗ならfailureを返す。

5.3.2. CSS文法に従ってカンマ区切りリストをパース

値をCSS文法に従ってパースする場合、文法中にカンマがあっても値のどこかがパース失敗すると全体がパース失敗となり、failureを返します。

それが望ましい場合もあります(リスト値のCSSプロパティなど)し、逆に、カンマ区切りの各部分ごとに別々にパースでき、成功した部分だけ扱いたい場合(失敗部分は無視するなど、例えば<img sizes>など)もあります。

このアルゴリズムは、まさにそのためのフックです。 「トップレベル」のカンマで分割した値リストを返し、各値はパース失敗ならfailure、成功ならパース結果(parseアルゴリズム同様未定義の構造)となります。

CSS文法に従ってカンマ区切りリストをパースするparse a listとも呼ぶ) inputとCSSのgrammar生成規則を受け取るとき:
  1. normalizeinputを処理し、結果をinputとする。
  2. input<whitespace-token>のみの場合、空のリストを返す。
  3. コンポーネント値のカンマ区切りリストをパースinputからパースし、返り値をlistとする。
  4. listの各itemについて、parseitemgrammarを処理した結果で置き換える。
  5. listを返す。

5.3.3. スタイルシートをパースする

スタイルシートをパースする inputと省略可能なurllocationを受け取る場合:
  1. inputがスタイルシートのバイトストリームなら、decode bytesinputを処理し、結果をinputとする。
  2. normalizeinputを処理し、結果をinputとする。
  3. 新しいスタイルシートを作成し、そのlocationlocation(未指定時はnull)に設定する。
  4. consume a list of rulesinputをパースし、top-level flagをセットして、スタイルシートの値に結果を設定する。
  5. スタイルシートを返す。

5.3.4. 規則リストをパースする

規則リストをパースする inputを受け取る場合:
  1. normalizeinputを処理し、結果をinputとする。
  2. consume a list of rulesinputをパースし、top-level flagは未セット。
  3. 返されたリストを返す。

5.3.5. 規則をパースする

規則をパースする inputを受け取る場合:
  1. normalizeinputを処理し、結果をinputとする。
  2. inputからnext input token<whitespace-token>の間は、consume the next input tokenで消費する。
  3. inputからnext input token<EOF-token>なら構文エラーを返す。

    それ以外でnext input token<at-keyword-token>なら、consume an at-ruleinputからパースし、返り値をruleとする。

    それ以外はconsume a qualified ruleinputからパースし、返り値をruleとする。 何も返されなければ構文エラーを返す。

  4. inputからnext input token<whitespace-token>の間は、consume the next input tokenで消費する。
  5. inputからnext input token<EOF-token>ならruleを返す。そうでなければ構文エラーを返す。

5.3.6. 宣言をパースする

注: "宣言リストをパースする"とは異なり、こちらは宣言のみ(at-ルールはパースしない)です。

宣言をパースする inputを受け取る場合:
  1. normalizeinputを処理し、結果をinputとする。
  2. inputからnext input token<whitespace-token>の間は、consume the next input tokenで消費する。
  3. inputからnext input token<ident-token>でない場合、構文エラーを返す。
  4. consume a declarationinputからパースする。 何か返されたらそれを返し、返されなければ構文エラーを返す。

5.3.7. スタイルブロックの内容をパースする

注: このアルゴリズムはスタイル規則の内容をパースします。 ネストされたスタイル規則やその他のat-ルールを許可する必要があります。 スタイル規則のネストが不要な場合(例:@page@keyframesの子規則など)は、 宣言リストをパースするを使ってください。

スタイルブロックの内容をパースするには input を対象として:
  1. Normalize inputを実行し、結果をinputに設定する。
  2. スタイルブロックの内容を消費inputから消費し、結果を返す。

5.3.8. 宣言リストをパースする

注: 名前とは異なり、このアルゴリズムは宣言とat-ルールが混合したリストをパースします。 CSS 2.1が@pageで行うようにです。 想定外のat-ルール(その文脈では全ての場合もあり得ます)は無効とされ、利用者によって無視されます。

注: このアルゴリズムはネストされたスタイル規則には対応しません。 その必要がある場合はスタイルブロックの内容をパースするを使ってください。

宣言リストをパースするには input を対象として:
  1. Normalize inputを実行し、結果をinputに設定する。
  2. 宣言リストを消費inputから消費し、結果を返す。

5.3.9. コンポーネント値をパースする

コンポーネント値をパースするには input を対象として:
  1. Normalize inputを実行し、結果をinputに設定する。
  2. inputからnext input token<whitespace-token>の間は、consume the next input tokenで消費する。
  3. inputからnext input token<EOF-token>なら構文エラーを返す。
  4. コンポーネント値を消費inputから消費し、返り値をvalueとする。
  5. inputからnext input token<whitespace-token>の間は、consume the next input tokenで消費する。
  6. inputからnext input token<EOF-token>ならvalueを返す。そうでなければ構文エラーを返す。

5.3.10. コンポーネント値リストをパースする

コンポーネント値リストをパースするには input を対象として:
  1. Normalize inputを実行し、結果をinputに設定する。
  2. コンポーネント値を消費inputから繰り返し消費し、 <EOF-token>が返されたら終了し、 返された値(最後の<EOF-token>以外)をリストに追加して返す。

5.3.11. コンポーネント値のカンマ区切りリストをパースする

コンポーネント値のカンマ区切りリストをパースするには input を対象として:
  1. Normalize inputを実行し、結果をinputに設定する。
  2. list of cvlsを最初は空のコンポーネント値リストのリストとする。
  3. コンポーネント値を消費inputから繰り返し消費し、 <EOF-token>または<comma-token>が返されたら終了し、 返された値(最後の<EOF-token>または<comma-token>以外)をリストに追加する。 そのリストをlist of cvlsに追加する。

    返されたトークンが<comma-token>なら、この手順を繰り返す。

  4. list of cvlsを返す。

5.4. パーサーアルゴリズム

以下のアルゴリズムがパーサーを構成します。 これらは上記のパーサー入口点から呼び出されます。

これらのアルゴリズムはトークンリストまたはコンポーネント値リストのいずれかで呼び出される場合があります。 (違いは、コンポーネント値リストでは一部トークンが関数単純ブロックに置き換えられていることです。) トークン化段階で入力ストリームが空の時EOFコードポイントを返したように、 この段階のリストでも次のトークンリクエスト時に空なら<EOF-token>を返さなければなりません。

特定のリストでアルゴリズムを呼び出した場合はそのリストのみ消費し(リストが尽きたら<EOF-token>を返し続けます)、そうでなければ呼び出し元と同じリストで暗黙的に呼び出されます。

5.4.1. 規則リストを消費

規則リストを消費には top-level flagを受け取る:

最初は空の規則リストを作成する。

next input tokenを繰り返し消費する:

<whitespace-token>
何もしない。
<EOF-token>
規則リストを返す。
<CDO-token>
<CDC-token>
top-level flagがセットされていれば何もしない。

そうでなければ、current input tokenを再消費し、修飾規則を消費する。 返り値があれば規則リストに追加。

<at-keyword-token>
current input tokenを再消費し、at-ルールを消費し、返り値を規則リストに追加。
その他
current input tokenを再消費し、修飾規則を消費する。 返り値があれば規則リストに追加。

5.4.2. at-ルールを消費

at-ルールを消費するには:

next input tokenを消費する。 新しいat-ルールを作成し、 名前をcurrent input tokenの値に設定し、 前置部は空のリスト、 値は最初は何も設定しない。

next input tokenを繰り返し消費する:

<semicolon-token>
at-ルールを返す。
<EOF-token>
これはパースエラー。at-ルールを返す。
<{-token>
単純ブロックを消費し、at-ルールのブロックに設定する。 at-ルールを返す。
単純ブロック(関連トークンが<{-token>の場合)
ブロックをat-ルールのブロックに設定し、at-ルールを返す。
その他
current input tokenを再消費し、コンポーネント値を消費する。 返り値をat-ルールの前置部に追加。

5.4.3. 修飾規則を消費

修飾規則を消費するには:

新しい修飾規則を作成し、 前置部は空のリスト、 値は最初は何も設定しない。

next input tokenを繰り返し消費する:

<EOF-token>
これはパースエラー。何も返さない。
<{-token>
単純ブロックを消費し、修飾規則のブロックに設定する。 修飾規則を返す。
単純ブロック(関連トークンが<{-token>の場合)
ブロックを修飾規則のブロックに設定し、修飾規則を返す。
その他
current input tokenを再消費し、コンポーネント値を消費する。 返り値を修飾規則の前置部に追加。

5.4.4. スタイルブロックの内容を消費

スタイルブロックの内容を消費するには:

最初は空の宣言リストdeclsと空の規則リストrulesを作成する。

next input tokenを繰り返し消費する:

<whitespace-token>
<semicolon-token>
何もしない。
<EOF-token>
declsをrulesで拡張し、declsを返す。
<at-keyword-token>
current input tokenを再消費し、at-ルールを消費し、結果をrulesに追加。
<ident-token>
一時リストを作成し、current input tokenで初期化する。 next input token<semicolon-token>または<EOF-token>以外の間、 コンポーネント値を消費し、一時リストに追加する。宣言を消費で一時リストから消費する。 何か返されたらdeclsに追加。
<delim-token>(値が"&" (U+0026 AMPERSAND)の場合)
current input tokenを再消費し、修飾規則を消費する。 何か返されたらrulesに追加。
その他
これはパースエラーcurrent input tokenを再消費し、 next input token<semicolon-token>または<EOF-token>以外の間、 コンポーネント値を消費して値を破棄。

5.4.5. 宣言リストを消費

宣言リストを消費するには:

最初は空の宣言リストを作成する。

next input tokenを繰り返し消費する:

<whitespace-token>
<semicolon-token>
何もしない。
<EOF-token>
宣言リストを返す。
<at-keyword-token>
current input tokenを再消費し、at-ルールを消費し、結果を宣言リストに追加。
<ident-token>
一時リストを作成し、current input tokenで初期化する。 next input token<semicolon-token>または<EOF-token>以外の間、 コンポーネント値を消費し、一時リストに追加する。宣言を消費で一時リストから消費する。 何か返されたら宣言リストに追加。
その他
これはパースエラーcurrent input tokenを再消費し、 next input token<semicolon-token>または<EOF-token>以外の間、 コンポーネント値を消費して値を破棄。

5.4.6. 宣言を消費

注: このアルゴリズムはnext input token<ident-token>であることを事前にチェック済みであると仮定します。

宣言を消費するには:

next input tokenを消費する。 新しい宣言を作成し、 名前をcurrent input tokenの値に設定し、 値は最初は空のリストとする。

  1. next input token<whitespace-token>の間は、consume the next input tokenで消費する。
  2. next input token<colon-token>以外なら、 これはパースエラー。何も返さない。

    それ以外の場合はnext input tokenを消費する。

  3. next input token<whitespace-token>の間は、consume the next input tokenで消費する。
  4. next input token<EOF-token>以外の間、 コンポーネント値を消費し、宣言の値に追加する。
  5. 宣言の値の最後の2つの<whitespace-token>以外のトークンが <delim-token>(値が"!")と <ident-token>(値がASCII大文字小文字無視で"important"と一致)の場合は、 それらを宣言の値から削除し、宣言のimportantフラグをtrueにする。
  6. 宣言の値の最後のトークンが<whitespace-token>の間は、 そのトークンを削除する。
  7. 宣言を返す。

5.4.7. コンポーネント値を消費する

コンポーネント値を消費するには:

次の入力トークンを消費する

現在の入力トークン<{-token><[-token>、または <(-token>の場合、単純ブロックを消費するし、それを返す。

それ以外の場合、現在の入力トークン<function-token>の場合、関数を消費するし、それを返す。

それ以外の場合、現在の入力トークンを返す。

5.4.8. 単純ブロックを消費する

注: このアルゴリズムは、現在の入力トークンがすでに <{-token><[-token>、または <(-token>であることを確認済みと仮定する。

単純ブロックを消費するには:

終了トークンは、現在の入力トークンのミラー変種である。 (例: <[-token>で呼び出された場合、終了トークン<]-token>となる。)

単純ブロックを生成し、その関連トークンを現在の入力トークンに設定し、値を最初は空のリストに設定する。

次の入力トークンを繰り返し消費し、以下のように処理する:

終了トークン
ブロックを返す。
<EOF-token>
これは構文解析エラーである。ブロックを返す。
その他
現在の入力トークンを再消費するコンポーネント値を消費するし、その値をブロックの値に追加する。

注: CSSには、宣言を含むことができるブロックと、修飾規則を含むことができるブロックの間で不幸な構文的曖昧さがあるため、ルールを扱う "消費" アルゴリズムは最初により汎用的なこのアルゴリズムを使用し、より具体的な宣言リストを消費するルールリストを消費するアルゴリズムは、文法が適用されるときに呼び出される。 より具体的なアルゴリズムは、<declaration-list>または<rule-list>/<stylesheet>を含むかどうかによって適用される。

5.4.9. 関数を消費する

注: このアルゴリズムは、現在の入力トークンがすでに <function-token>であることを確認済みと仮定する。

関数を消費するには:

関数を生成し、その名前を現在の入力トークンの値とし、値を最初は空のリストに設定する。

次の入力トークンを繰り返し消費し、以下のように処理する:

<)-token>
関数を返す。
<EOF-token>
これは構文解析エラーである。関数を返す。
その他
現在の入力トークンを再消費するコンポーネント値を消費するし、返された値を関数の値に追加する。

6. An+Bマイクロ構文

CSSにおいて、 :nth-child()擬似クラスなど、 リスト内のインデックスを示す必要がある場面がいくつかある。 An+Bマイクロ構文はこれに役立ち、 著者がリスト内の単一要素や一定間隔ごとのすべての要素を簡単に指定できる。

An+B記法は整数ステップ(A)とオフセット(B)を定義し、 nが0以上のすべての正の整数値について、 リスト内のAn+B番目の要素を表す。 リストの最初の要素はインデックス1(0ではない)を持つ。

ABの値が0より大きい場合、 リストをA個ずつのグループに分割し (最後のグループが余りを取る)、 各グループのB番目の要素を選択する。

An+B記法は、evenおよびoddキーワードも受け入れ、 これらはそれぞれ2n2n+1と同じ意味となる。

例:

2n+0   /* リスト内の偶数要素すべてを表す */

even   /* 同じ */

4n+1   /* リスト内の1番目、5番目、9番目、13番目などを表す */

ABの値は負も可能だが、 n ≥ 0の場合のAn+Bの正の結果のみが使用される。

例:

-1n+6   /* リストの最初の6要素を表す */

-4n+10  /* リストの2番目、6番目、10番目の要素を表す */

両方のABが0の場合、 疑似クラスはリストのいずれの要素も表さない。

6.1. 非公式構文説明

このセクションは規範的ではありません。

Aが0のとき、An部分は省略できる (B部分がすでに省略されていない限り)。 Anが含まれず、Bが非負の場合、 +記号は(許可される場合)Bの前から省略可能。 この場合、構文は単にBのみとなる。

例:

0n+5   /* リストの5番目の要素を表す */

5      /* 同じ */

Aが1または-1のとき、 規則の1は省略できる。

例:

次の表記はすべて同等である:

1n+0   /* リスト内のすべての要素を表す */

n+0    /* 同じ */

n      /* 同じ */

Bが0の場合、すべてのA番目の要素が選択される。 この場合、+B(または-B)部分は A部分がすでに省略されていない限り省略可能。

例:

2n+0   /* リスト内のすべての偶数要素を表す */

2n     /* 同じ */

Bが負の場合、そのマイナス記号は+記号を置き換える。

有効な例:

3n-6

無効な例:

3n + -6

両方のAnBが存在する場合、+または-の両側に空白を入れてもよい。

空白を含む有効な例:

3n + 1

+3n - 2

-n+ 6

+6

空白を含む無効な例:

3 n

+ 2n

+ 2

6.2. <an+b>

An+B記法はもともとCSSとは少し異なるトークナイザーで定義されており、 CSSトークンで表現するとやや奇妙な定義となっていた。 このセクションでは、CSSトークンの観点からAn+B記法を認識する方法 (CSS文法用の<an+b>型の定義)と、 CSSトークンをどのように解釈してABの値を取得するかを説明する。

<an+b>型は、 (値定義構文(Values & Units仕様)を使用) 以下のように定義される:

<an+b> =
  odd | even |
  <integer> |

  <n-dimension> |
  '+'? n |
  -n |

  <ndashdigit-dimension> |
  '+'? <ndashdigit-ident> |
  <dashndashdigit-ident> |

  <n-dimension> <signed-integer> |
  '+'? n <signed-integer> |
  -n <signed-integer> |

  <ndash-dimension> <signless-integer> |
  '+'? n- <signless-integer> |
  -n- <signless-integer> |

  <n-dimension> ['+' | '-'] <signless-integer>
  '+'? n ['+' | '-'] <signless-integer> |
  -n ['+' | '-'] <signless-integer>

ここで:

: 識別子が"n"で始まる場合、前にプラス記号(+)がある場合は、2つのトークンの間に空白があってはならない。 そうでなければ、トークンは上記の文法に一致しない。 他の2つのトークンの間では空白は有効(無視される)。

生成規則の各節は以下のように解釈される:

odd
Aは2、Bは1。
even
Aは2、Bは0。
<integer>
Aは0、Bは整数の値。
<n-dimension>
'+'? n
-n
Aは次元の値、1、または-1。Bは0。
<ndashdigit-dimension>
'+'? <ndashdigit-ident>
Aは次元の値または1。Bは次元の単位または識別子の値(先頭のコードポイントを削除し、残りを10進数として解釈)。Bは負。
<dashndashdigit-ident>
Aは-1。Bは識別子の値(先頭2つのコードポイントを削除し、残りを10進数として解釈)。Bは負。
<n-dimension> <signed-integer>
'+'? n <signed-integer>
-n <signed-integer>
Aは次元の値、1、または-1。Bは整数の値。
<ndash-dimension> <signless-integer>
'+'? n- <signless-integer>
-n- <signless-integer>
Aは次元の値、1、または-1。Bは整数値の負。
<n-dimension> ['+' | '-'] <signless-integer>
'+'? n ['+' | '-'] <signless-integer>
-n ['+' | '-'] <signless-integer>
Aは次元の値、1、または-1。Bは整数の値。 '-'が間にある場合、Bは整数値の負となる。

7. Unicode-Rangeマイクロ構文

いくつかの構造体、例えばunicode-range記述子(@font-face規則用)などは、1つ以上のユニコードコードポイントを記述する方法が必要です。 <urange> 生成規則は1つ以上のユニコードコードポイントの範囲を表します。

非公式には、<urange>生成規則には3つの形式があります:

U+0001
単一のコードポイントからなる範囲を定義します(この場合「1」)。
U+0001-00ff
最初の値から2番目の値まで(両端を含む)のコードポイント範囲を定義します(この場合「1」から「ff」(10進255)まで)。
U+00??
「?」文字がすべての16進数字を表し、範囲を定義します(この場合U+0000-00ffと同じ)。

どの形式でも、各16進数値に最大6桁まで使用できます(「?」を16進数字として扱った場合)。

7.1. <urange>

<urange>記法は元々CSSのプリミティブトークンとして定義されていましたが、使用頻度は非常に低く、 妥当な<ident-token>(識別子)と紛らわしい衝突を起こすことがあります。 このセクションでは、既存のCSSトークンで<urange>記法を認識する方法と、 それをユニコードコードポイントの範囲として解釈する方法を説明します。

紛らわしい衝突とは?

例えば、CSSでu + a { color: green; }と書いた場合、 意図としてはu要素の直後のa要素に緑色を適用したいものです。 通常、セレクタのコンビネータの前後に空白は不要なので、次のように圧縮しても同じ意味になるはずです:

u+a{color:green;}

他のコンビネータならこの2つのCSSは同等ですが、ユニコード範囲専用トークンが以前存在したため、 圧縮したセレクタ部分は2つの識別子とコンビネータではなく、ユニコード範囲として解釈されます。 そのためセレクタ文法に一致せず、規則は無効として破棄されます。

(この例はFirefoxで報告された実際のバグから取られています。)

注: ここで記述されている構文は意図的に非常に低レベルで、実装者向けです。 著者は代わりに前セクションの非公式構文説明を読むべきです。そこに<urange>を使うための必要情報がすべてあり、実際に読みやすいです。

<urange>型は (Values & Units仕様の値定義構文を用いて) 以下のように定義されます:

<urange> =
  u '+' <ident-token> '?'* |
  u <dimension-token> '?'* |
  u <number-token> '?'* |
  u <number-token> <dimension-token> |
  u <number-token> <number-token> |
  u '+' '?'+

この生成規則では、いずれのトークンの間にも空白は入れられません。

<urange>生成規則は、連続するユニコードコードポイントの範囲(start valueend valueの非負整数)を表します。 上記の生成規則を範囲として解釈するには、次の手順を順に実行します:

  1. 最初のuトークンを飛ばし、生成規則内のすべてのトークンの表現を連結します。これをtextとします。

  2. textの最初の文字がU+002B PLUS SIGNなら消費します。そうでなければ、この<urange>は無効であり、このアルゴリズムは終了します。

  3. textからできるだけ多くの16進数字を消費し、その後できるだけ多くのU+003F QUESTION MARK (?)コードポイントを消費します。 0個または6個を超えるコードポイントが消費された場合、この<urange>は無効であり、このアルゴリズムは終了します。

    もしQUESTION MARK (?)コードポイントが消費された場合:

    1. textに未消費のコードポイントが残っていたら、この<urange>は無効であり、アルゴリズムは終了します。

    2. 消費したコードポイントを16進数として解釈し、QUESTION MARK (?)はU+0030 DIGIT ZERO (0)コードポイントに置き換えます。これがstart valueです。

    3. 消費したコードポイントを再び16進数として解釈し、QUESTION MARK (?)はU+0046 LATIN CAPITAL LETTER F (F)コードポイントに置き換えます。これがend valueです。

    4. このアルゴリズムを終了します。

    それ以外の場合、消費したコードポイントを16進数として解釈します。これがstart valueです。

  4. textに未消費のコードポイントが残っていなければ、end valuestart valueと同じでアルゴリズムを終了します。

  5. textの次のコードポイントがU+002D HYPHEN-MINUS (-)なら消費します。そうでなければ、この<urange>は無効であり、アルゴリズムは終了します。

  6. textからできるだけ多くの16進数字を消費します。

    0個または6個を超える16進数字が消費された場合、 またtextに未消費のコードポイントが残っていた場合、この<urange>は無効であり、アルゴリズムは終了します。

  7. 消費したコードポイントを16進数として解釈します。これがend valueです。

<urange>が表すコードポイントを決定するには:

  1. end value最大許可コードポイントを超えていれば、 <urange>は無効かつ構文エラーです。

  2. start valueend valueより大きければ、 <urange>は無効かつ構文エラーです。

  3. それ以外の場合、<urange>start valueからend valueまで(両端含む)の連続したコードポイントの範囲を表します。

注: <urange>の構文は意図的にかなり広めに設計されています。 パターンは非公式構文が生成可能なすべてのトークン列を網羅します。 ただし、構成トークン間に空白を許さないため、実際の利用では安全性が高いです。 <urange>の後ろに<number><dimension>(著者が<urange>を''u <number>''句で指定する場合など)を続けても、 著者がコメントで区切らない限り曖昧さは生じません。 そのため、著者が紛らわしいものを書くことは可能ですが、実際にそのような書き方をすること自体稀であり、混乱を招くものです。

8. 規則やその他の値の文法定義

Values仕様はプロパティの文法定義方法を規定しています。 このセクションは規則について同様の規定を行います。

プロパティ文法と同様に、 <foo>という記法は「foo」文法項目を指し、他の場所で定義されているものとします。 <foo>をその定義で置き換えても、文法的意味は同じです。

いくつかのトークン種別はリテラルで、クォート無しで記述されます:

トークンは、その値が文法で定義された値と一致すればマッチします。 特に指定がない限り、すべての一致はASCII大文字・小文字を区別しない方法です。

注: エスケープを使えば、 <ident-token>の値の末尾を(や先頭を@にすることもできますが、 そのようなトークンは<function-token><at-keyword-token>とは見なされず、対応する文法定義にも一致しません。

<delim-token>は値をシングルクォートで囲みます。 例:<delim-token>が「+」コードポイントを含む場合、'+'と記述します。 同様に、<[-token><]-token>もシングルクォートで囲む必要があります。なぜなら文法構文自体で句のグループ化に使用されるからです。 <whitespace-token>は文法上は示されません。 <whitespace-token>は、 プローズ定義で明示的に指定しない限り、任意の2つのトークンの前後・間に許可されます。 (例えば、規則の前置部がセレクタの場合、空白は重要です。)

関数やブロックを定義する場合、 終了トークンは文法で指定する必要がありますが、 トークンストリームに存在しなくても一致します。

例えば、translateX()関数の構文は次の通りです:
translateX( <translation-value> )

しかし、スタイルシートが関数の閉じ括弧無しで終了する場合:

.foo { transform: translate(50px

CSSパーサはこれを「translate」名の関数を値とする1つの宣言を含むスタイル規則として解釈します。 終了トークンがトークンストリームに現れなくても文法と一致します。 なぜならパーサが終了する時点では、終了トークンの有無は判定できず、ブロックや関数がある事実しか分からないためです。

8.1. ブロック内容の定義: <declaration-list>, <rule-list>, <stylesheet>生成規則

CSSパーサは、@規則末尾のブロックなど、ブロックの内容には中立的です。 トークンでブロックの汎用文法を定義するのは容易ではありませんが、専用かつ明確な解析アルゴリズムが定義されています。

<style-block>生成規則はスタイル規則のブロック内容を表します。 文法上ブロック内の唯一の値としてのみ使え、 ブロック内容はスタイルブロック内容を消費するアルゴリズムで解析する必要があります。

<declaration-list>生成規則は宣言リストを表します。 文法上ブロック内の唯一の値としてのみ使え、 内容は宣言リストを消費するアルゴリズムで解析します。

同様に、<rule-list>生成規則は規則リストを表し、 文法上ブロック内の唯一の値としてのみ使えます。 内容は規則リストを消費するアルゴリズムで解析します。

最後に、<stylesheet>生成規則は規則リストを表します。 <rule-list>と同じですが、 これを使うブロックはデフォルトで他の文脈に限定されないすべての規則を受け入れます。

この4つの生成規則は非常に似ているので、受け入れるものと各例をまとめた表を示します:
宣言許可 入れ子スタイル規則許可 任意の修飾規則許可 @規則許可
<style-block> スタイル規則@nest入れ子条件付きグループ規則
<declaration-list> @font@counter-style@page@keyframes子規則
<rule-list> @keyframes@font-feature-values
<stylesheet> スタイルシート、非入れ子条件付きグループ規則

特定の文脈が@規則のみを受け入れる場合(例:@font-features-values)、 どの生成規則を使うかは実際には重要ではありませんが、名称が分かりやすい<rule-list>が好まれます。

例えば、@font-face規則は前置部が空で、宣言リストを含むよう定義されています。 文法は次のように表現されます:
@font-face { <declaration-list> }

これが規則文法の完全かつ十分な定義です。

別の例として、@keyframes規則はより複雑で、前置部を名前として解釈し、ブロック内にキー フレーム規則を含みます。文法は次の通りです:

@keyframes <keyframes-name> { <rule-list> }

<style-block><declaration-list>を使う規則については、 規則の仕様で、ブロック内で有効なプロパティ・記述子・@規則を定義する必要があります。 これは「@foo規則は本仕様・本セクションで定義されたプロパティ/記述子を受け入れる」と記述するだけでもよく、 拡張仕様では「@foo規則はさらに以下のプロパティ/記述子を受け入れる」と記述しても良いです。 ブロック内で定義されていない宣言や@規則は規則値から除去されます。

<style-block><declaration-list>内では、記述子での!importantは自動的に無効です。 規則がプロパティを受け入れる場合は、仕様でそのプロパティがカスケードに関与するか、どの特異性を持つかを定義する必要があります。 カスケードと関与しない場合、!important付きプロパティは自動的に無効ですが、 そうでなければ!importantは有効で、 important宣言としてカスケードに扱われます。 詳細は[CSS-CASCADE-3]参照。

例えば、前述の@font-face文法では、 許可される宣言がFonts仕様で定義された記述子であることも追加で定義する必要があります。

<rule-list>を使う規則については、 仕様でブロック内で有効な規則種別を定義する必要があり、 <declaration-list>と同様に、未認識規則は値から除去されます。

例えば、前述の@keyframes文法では、許可される規則が<keyframe-rule>のみであることも追加で定義する必要があります。
<keyframe-rule> = <keyframe-selector> { <declaration-list> }

キー フレーム規則では、宣言としてすべてのアニメーション可能なCSSプロパティと、animation-timing-functionプロパティが許可され、 ただしカスケードとは関与しません。

<stylesheet>を使う規則については、 すべての規則がデフォルトで許可されますが、 仕様でそのブロック内で無効な規則種別を定義することもできます。

例えば、@media規則はスタイルシートに配置できるものは何でも受け入れますが、 さらに@media規則自体は受け入れません。 文法は次の通りです:
@media <media-query-list> { <stylesheet> }

さらに、<stylesheet>内に@media規則が含まれていたら外側規則の値から除去されるという制限も定義されています。

8.2. 任意の内容の定義: <declaration-value> および <any-value> 生成規則

一部の文法では、 あらゆる妥当な入力を文法で受け入れて、 内容に対するより具体的なエラー処理を手動で行うことが有用です (文法不一致で単に構造を無効化するのではなく)。

例えば、カスタムプロパティは、任意の妥当な値を許可します。 これは他のCSSプロパティの断片を任意に含めることができるためであり、 既存CSSの一部でないものにも使用できます。 また、Media Queriesの<general-enclosed>生成規則では、 将来の構文でMQが許可する範囲を定義し、 「未知」の値を扱うための特別なロジックを使用しています。

これを補助するため、2つの追加生成規則が定義されています:

<declaration-value>生成規則は、任意の1個以上のトークンの並びにマッチします。 ただし、その並びに<bad-string-token><bad-url-token>、 対応しない<)-token><]-token><}-token>、 またはトップレベルの<semicolon-token>トークンや値が"!"である<delim-token>トークンが含まれていない場合に限ります。 これは有効な宣言が値として持つことができる全てを表します。

<any-value> 生成規則は<declaration-value>と同じですが、 トップレベルの<semicolon-token>トークンおよび値が"!"である<delim-token>トークンも許可されます。 これはあらゆる文脈で有効なCSSが持ち得る全てを表します。

9. CSSスタイルシート

CSSスタイルシートを構文解析するには、 まずスタイルシートを構文解析する。 得られた全てのトップレベル修飾規則を、以下で定義するスタイル規則として解釈する。

いずれかのスタイル規則が無効、 または任意の@規則が認識されない、あるいは文法や文脈に従って無効である場合、 それは構文解析エラーである。 その規則を破棄する。

9.1. スタイル規則

スタイル規則は、 修飾規則であり、 セレクタリストとプロパティ宣言リスト、 そして場合によっては入れ子規則リストを関連付けます。 rule set[CSS2])とも呼ばれます。 CSSカスケードと継承は[CSS-CASCADE-3]で、 スタイル規則内の宣言がカスケードにどう関与するかを定義しています。

修飾規則の前置部はCSS文法に従って構文解析され、 <selector-list>となります。 これが失敗した場合、スタイル規則全体が無効となります。

修飾規則のブロック内容はスタイルブロック内容を構文解析する。 他の仕様や将来の仕様で明示的に定義されていない限り、そのリスト内の@規則は無効であり、無視される。

注: [CSS-NESTING-1]では、@nestおよび 条件付きグループ規則スタイル規則内で許可されることが定義されています。

未知のCSSプロパティの宣言、 または値がそのプロパティで定義された構文と一致しない宣言は無効であり、無視されなければなりません。 スタイル規則内容の妥当性は規則自体の妥当性に影響しません。 特に指定がない限り、プロパティ名はASCII大文字・小文字を区別しないです。

注: カスタムプロパティ名[CSS-VARIABLES]は大文字・小文字を区別します。

修飾規則はCSSスタイルシートのトップレベルではスタイル規則です。 他の文脈の修飾規則は、文脈によってスタイル規則である場合もそうでない場合もあります。

例えば、 @media規則[CSS3-CONDITIONAL]内の修飾規則はスタイル規則ですが、 @keyframes規則[CSS3-ANIMATIONS]内の修飾規則はスタイル規則ではありません。

9.2. @規則

@規則はatキーワードで始まる規則であり、 同じ文脈のスタイル規則と区別できます。

@規則は以下の目的で使われます:

@規則はその規則や目的によって様々な形を取りますが、 大きく分けて2種類あります:より単純な構造でセミコロンで終わるステートメント@規則と、 {}-ブロックの末尾に終わり、入れ子の修飾規則@規則宣言を含められるブロック@規則です。

ブロック@規則は通常、 (汎用または@規則固有の)@規則修飾規則、および@規則で定義された制限に従う記述子宣言の集合を含みます。 記述子プロパティと似ています(宣言構文は同じ)が、 ツリー内の要素やボックスではなく、特定の@規則種別に関連付けられます。

9.3. @charset規則

スタイルシートのフォールバックエンコーディングを決定するアルゴリズムは、 ファイルの最初の数バイトとして特定のバイト列を探し、 これは構文的には"@charset"という名前の@規則の形を取ります。

しかし、実際には@charsetという名前の@規則は存在しません。 スタイルシートを解析するとき、@charset規則が出現した場合は認識されない規則として扱われ、 文法チェック時に無効として除去されます。

注: CSS 2.1では@charsetは有効な規則でした。 一部のレガシー仕様では依然として@charset規則に言及しており、 スタイルシート内での存在について明示的に記述しています。

10. シリアライズ

この仕様で説明されているトークナイザーは、コメント用のトークンを生成せず、 コメントを何らかの方法で保存することもありません。 実装はコメント内容とトークンストリーム内の位置を保存しても構いません。 その場合、この保存情報は構文解析ステップには影響を与えてはなりません。

この仕様はCSSの一般的なシリアライズ方法を定義せず、 その作業は[CSSOM]や個別機能仕様に委ねられています。 特に、コメントや空白のシリアライズは定義されていません。

シリアライズの唯一の要件は、構文解析との「ラウンドトリップ」を満たすことです。 つまり、スタイルシートを構文解析した結果と、 構文解析→シリアライズ→再度構文解析した結果が同じデータ構造になることです。 ただし、連続する<whitespace-token>については、 1つのトークンにまとめられる場合があります。

注: この例外が許可されるのは、 CSS文法が任意量の空白を1つのスペースと同じように解釈するためです。

この要件を満たすために:
ident function url bad url - number percentage dimension CDC ( * %
ident
at-keyword
hash
dimension
#
-
number
@
.
+
/

10.1. <an+b>のシリアライズ

<an+b>値をシリアライズするには、 整数値ABを使って次の手順を行う:
  1. Aがゼロの場合、 Bをシリアライズして返す。

  2. それ以外の場合、resultを最初は空の文字列とする。

  3. A1の場合

    resultに「n」を追加する。

    A-1の場合

    resultに「-n」を追加する。

    Aが非ゼロの場合

    Aをシリアライズしてresultに追加し、 その後「n」をresultに追加する。

  4. Bが0より大きい場合

    resultに「+」を追加し、 Bをシリアライズしてresultに追加する。

    Bが0より小さい場合

    Bをシリアライズしてresultに追加する。

  5. resultを返す。

11. プライバシーとセキュリティに関する考慮事項

この仕様は新たなプライバシー懸念を導入しません。

この仕様はセキュリティを向上させます。CSSの構文解析がすべての入力に対して明確に定義されたためです。

古いパーサ(ホワイトリストやフィルタ等)がこの仕様と異なる解析を行う場合、 それらはやや安全性に欠けますが、従来の構文解析仕様には多くの曖昧な隅のケースがあり、 ブラウザによって解釈が異なっていたため、 そうしたフィルタはすでに潜在的に安全性に問題があり、 この仕様が状況を悪化させるものではありません。

12. 変更点

このセクションは規範的ではありません。

12.1. 2019年8月16日候補勧告からの変更点

以下の実質的変更を行いました:

以下の編集上の変更を行いました:

12.2. 2014年2月20日候補勧告からの変更点

以下の実質的変更を行いました:

以下の編集上の変更を行いました:

コメント一覧(Disposition of Comments)が利用可能です。

12.3. 2013年11月5日最終コール作業草案からの変更点

12.4. 2013年9月19日作業草案からの変更点

12.5. CSS 2.1およびSelectors Level 3からの変更点

注: 本仕様の目的は現実に合わせることです。 CSS2.1からの変更点はほぼ例外なく、CSS2.1が実ブラウザの動作と合わなかったことや未定義部分があったことに起因します。 もし何か挙動がブラウザと一致しない場合は、ほぼ確実に意図しないものなのでお知らせください。

バイトストリームからのデコード変更点:

トークナイズ変更点:

構文解析の変更点:

An+BのSelectors Level 3 [SELECT]からの変更点:

謝辞

フィードバック・貢献に感謝: Anne van Kesteren, David Baron, Elika J. Etemad (fantasai), Henri Sivonen, Johannes Koch, 呂康豪 (Kang-Hao Lu), Marc O’Morain, Raffaello Giulietti, Simon Pieter, Tyler Karaszewski, Zack Weinberg.

適合性

文書慣習

適合性要件は記述的な断定とRFC 2119の用語の組み合わせで表現しています。規範的部分での “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, “OPTIONAL” のキーワードはRFC 2119で説明される通りに解釈されます。 可読性のため、本仕様ではこれらの語がすべて大文字ではありません。

この仕様のテキストは、明示的に非規範的・例・注と示されたセクションを除き、すべて規範的です。[RFC2119]

本仕様の例は「for example」またはclass="example"属性付きで導入されます。例えば:

これは参考例(informative example)です。

参考注(informative notes)は「Note」で始まり、class="note"属性付きで表示されます。例えば:

Note, これは参考注です。

勧告(advisement)は規範的セクションで、特別な注意喚起のスタイルが適用され、他の規範文から区別されます。例: UAはアクセシブルな代替手段を提供しなければならない

適合性クラス

本仕様への適合性は、3つの適合性クラスで定義されます:

スタイルシート
CSS スタイルシート
レンダラー
UA。スタイルシートの意味を解釈し、 それを使う文書をレンダリングするもの。
オーサリングツール
UA。スタイルシートを書き出すもの。

スタイルシートは本モジュールで定義された文法を使う文のすべてが、 一般CSS文法および各機能ごとの個別文法に従って有効であれば、本仕様に適合します。

レンダラーは、スタイルシートを対応する仕様で定義された通りに解釈するだけでなく、 本仕様で定義されたすべての機能に対応し、それらを正しく構文解析し文書を適切にレンダリングすることで本仕様に適合します。 ただし、UAがデバイスの制限のため文書を正しくレンダリングできない場合でも、UAが非適合とはなりません(例:UAがモノクロモニターで色をレンダリングする必要はない)。

オーサリングツールは、一般CSS文法および本モジュール各機能の個別文法に従って文法的に正しいスタイルシートを書き出し、 本モジュールで説明されるスタイルシートのすべての適合要件も満たす場合、本仕様に適合します。

部分実装

著者が将来互換性のあるパース規則を利用してフォールバック値を指定できるよう、 CSSレンダラーは、サポートできない@規則・プロパティ・値・キーワード・その他構文はすべて無効とし(適切に無視)なければなりません。 特に、UAはマルチ値プロパティ宣言で未サポート値だけを無視し、サポート値だけを適用してはならず、 いずれかの値が無効なら宣言全体を無視する必要があります(CSSでは未サポート値を無効とするため)。

不安定・独自機能の実装

将来の安定CSS機能との衝突を避けるため、CSSWGは将来互換性のベストプラクティスに従い、 不安定機能や独自拡張の実装を推奨します。

非実験的実装

仕様が候補勧告段階に達すると、非実験的実装が可能となります。実装者は仕様通りに正しく実装できたCRレベルの機能について、 プレフィックス無しで公開するよう推奨されます。

CSSの相互運用性を確保・維持するため、CSSワーキンググループは非実験的CSSレンダラーに対し、 実装報告書(必要ならテストケースも)をW3Cに提出するよう求めています。 テストケースはCSS WGによるレビュー・修正の対象です。

テストケース・実装報告書提出方法はCSS WGのWebサイト https://www.w3.org/Style/CSS/Test/ で確認できます。 質問は public-css-testsuite@w3.org メーリングリストへ。

CR脱出基準

この仕様を勧告案(Proposed Recommendation)に進めるには、 各機能について少なくとも2つの独立した相互運用可能な実装が必要です。各機能は異なる製品群が実装してもよく、1つの製品がすべての機能を実装する必要はありません。 この基準のため、以下の用語を定義します:

独立
各実装は異なる組織が開発し、他の実装からコードを共有・再利用・派生してはならない。 仕様実装に関係しないコードはこの要件の対象外。
相互運用可能
公式CSSテストスイートの該当テストケースを通過すること、またはWebブラウザ以外の場合は同等のテストを通過すること。 すべての関連テストに同等テストを用意し、互換性主張するUAが同等テストを通過できる必要がある。これら同等テストは公開し、査読可能にする。
実装
ユーザーエージェント(UA)で、
  1. 仕様を実装している。
  2. 一般公開されている。製品版、ベータ版、プレビュー、nightly build等を含む。 未出荷製品版は、少なくとも1か月間その機能を実装して安定性を示す必要がある。
  3. 実験的でない(テストスイート通過専用ではなく、今後も通常利用が想定されている)。

仕様は少なくとも6か月間候補勧告で維持されます。

索引

本仕様で定義される用語

参照によって定義される用語

参考文献

規範的参考文献

[CSS-CASCADE-3]
Elika Etemad; Tab Atkins Jr.. CSS Cascading and Inheritance Level 3. 2021年2月11日. REC. URL: https://www.w3.org/TR/css-cascade-3/
[CSS-CASCADE-5]
Elika Etemad; Miriam Suzanne; Tab Atkins Jr.. CSS Cascading and Inheritance Level 5. 2021年12月3日. WD. URL: https://www.w3.org/TR/css-cascade-5/
[CSS-CASCADE-6]
Elika Etemad; Miriam Suzanne; Tab Atkins Jr.. CSS Cascading and Inheritance Level 6. 2021年12月21日. WD. URL: https://www.w3.org/TR/css-cascade-6/
[CSS-COUNTER-STYLES-3]
Tab Atkins Jr.. CSS Counter Styles Level 3. 2021年7月27日. CR. URL: https://www.w3.org/TR/css-counter-styles-3/
[CSS-PAGE-3]
Elika Etemad; Simon Sapin. CSS Paged Media Module Level 3. 2018年10月18日. WD. URL: https://www.w3.org/TR/css-page-3/
[CSS-VALUES-4]
Tab Atkins Jr.; Elika Etemad. CSS Values and Units Module Level 4. 2021年12月16日. WD. URL: https://www.w3.org/TR/css-values-4/
[CSS3-CONDITIONAL]
David Baron; Elika Etemad; Chris Lilley. CSS Conditional Rules Module Level 3. 2020年12月8日. CR. URL: https://www.w3.org/TR/css-conditional-3/
[CSSOM]
Daniel Glazman; Emilio Cobos Álvarez. CSS Object Model (CSSOM). 2021年8月26日. WD. URL: https://www.w3.org/TR/cssom-1/
[ENCODING]
Anne van Kesteren. Encoding Standard. Living Standard. URL: https://encoding.spec.whatwg.org/
[HTML]
Ian Hickson. HTML. Living Standard. URL: http://whatwg.org/html
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra Standard. Living Standard. URL: https://infra.spec.whatwg.org/
[RFC2119]
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels. 1997年3月. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
[SELECTORS-4]
Elika Etemad; Tab Atkins Jr.. Selectors Level 4. 2018年11月21日. WD. URL: https://www.w3.org/TR/selectors-4/
[URL]
Anne van Kesteren. URL Standard. Living Standard. URL: https://url.spec.whatwg.org/

参考情報

[CSS-COLOR-4]
Tab Atkins Jr.; Chris Lilley; Lea Verou. CSS Color Module Level 4. 2021年12月15日. WD. URL: https://www.w3.org/TR/css-color-4/
[CSS-FONTS-4]
John Daggett; Myles Maxfield; Chris Lilley. CSS Fonts Module Level 4. 2021年12月21日. WD. URL: https://www.w3.org/TR/css-fonts-4/
[CSS-FONTS-5]
Myles Maxfield; Chris Lilley. CSS Fonts Module Level 5. 2021年12月21日. WD. URL: https://www.w3.org/TR/css-fonts-5/
[CSS-NAMESPACES-3]
Elika Etemad. CSS Namespaces Module Level 3. 2014年3月20日. REC. URL: https://www.w3.org/TR/css-namespaces-3/
[CSS-NESTING-1]
Tab Atkins Jr.; Adam Argyle. CSS Nesting Module. 2021年8月31日. WD. URL: https://www.w3.org/TR/css-nesting-1/
[CSS-TEXT-DECOR-3]
Elika Etemad; Koji Ishii. CSS Text Decoration Module Level 3. 2019年8月13日. CR. URL: https://www.w3.org/TR/css-text-decor-3/
[CSS-TRANSFORMS-1]
Simon Fraser; et al. CSS Transforms Module Level 1. 2019年2月14日. CR. URL: https://www.w3.org/TR/css-transforms-1/
[CSS-VALUES-3]
Tab Atkins Jr.; Elika Etemad. CSS Values and Units Module Level 3. 2019年6月6日. CR. URL: https://www.w3.org/TR/css-values-3/
[CSS-VARIABLES]
Tab Atkins Jr.. CSS Custom Properties for Cascading Variables Module Level 1. 2021年11月11日. CR. URL: https://www.w3.org/TR/css-variables-1/
[CSS2]
Bert Bos; et al. Cascading Style Sheets Level 2 Revision 1 (CSS 2.1) Specification. 2011年6月7日. REC. URL: https://www.w3.org/TR/CSS21/
[CSS3-ANIMATIONS]
Dean Jackson; et al. CSS Animations Level 1. 2018年10月11日. WD. URL: https://www.w3.org/TR/css-animations-1/
[MEDIAQ]
Florian Rivoal; Tab Atkins Jr.. Media Queries Level 4. 2020年7月21日. CR. URL: https://www.w3.org/TR/mediaqueries-4/
[MEDIAQUERIES-5]
Dean Jackson; et al. Media Queries Level 5. 2021年12月18日. WD. URL: https://www.w3.org/TR/mediaqueries-5/
[SELECT]
Tantek Çelik; et al. Selectors Level 3. 2018年11月6日. REC. URL: https://www.w3.org/TR/selectors-3/