1. 序論
◎非規範的この~moduleは、 ~CSS~stylesheetの[ 抽象-構文と構文解析-法 ]を定義し,~CSS構文を利用する他のもの(~HTML `style^a 属性など)を定義する。 ◎ This module defines the abstract syntax and parsing of CSS stylesheets and other things which use CSS syntax (such as the HTML style attribute).
これは、[ ~Unicode`符号位置$たちが成す~stream (言い換えれば,~text) ]から,[ ~CSS~tokenたちが成す~stream ]へ変換するための各種~algo,および[ その結果の~streamから更に[ ~stylesheet, 規則, 宣言 ]などからなる,~CSS~objたちへ変換する ]ための各種~algoを定義する。 ◎ It defines algorithms for converting a stream of Unicode code points (in other words, text) into a stream of CSS tokens, and then further into CSS objects such as stylesheets, rules, and declarations.
1.1. ~module間の相互作用
この~moduleは、 ~CSS~stylesheetの[ 構文と構文解析-法 ]を定義する。 それは、 ~CSS 2.1 にて定義される[ 字句走査器と文法 ]に取って代わる。 ◎ This module defines the syntax and parsing of CSS stylesheets. It supersedes the lexical scanner and grammar defined in CSS 2.1.
【この訳に特有な表記規約】
◎表記記号加えて、 所与の %名前 に対し,ドットが接頭された記法 .%名前 も用いる。 それは、 この仕様の処理~modelにて生産される各[ ~token/~CSS構成子 ]に伴われる[ %名前 と命名された~field~DAGGER ]であることを指示する (文脈から明らかな所では、 このドットは省略され得る)。 例えば, “〜の.値” は、[ "`値^em" と命名された~field ]の値を意味する。 (~DAGGER この訳に現れる,この意味の “~field” という語は、 訳の都合により導入したものであり,原文には無い非公式な用語である。)
2. ~CSSの構文の記述
◎非規範的~CSS文書は、 一連の`~style規則$からなる — それら各~規則は、 次のいずれかを与える ⇒# `有修飾~規則$(文書~内の要素に~styleを適用する)/ `~at-規則$(~CSS文書~用に特別な処理~規則や値を定義する) ◎ A CSS document is a series of style rules—which are qualified rules that apply styles to elements in a document—and at-rules—which define special processing rules or values for the CSS document.
`有修飾~規則$は, .`導入部^dfn から開始して, 宣言たちが成す連列を包含している`波括弧~block$ ( `{^c, `}^c で括られた~block) が後続する。 .導入部の意味は、 その規則が出現する文脈に基づいて変わり得る — ~style規則~用には、 それは,`選択子$であり,[ 当の規則を成す宣言たちが適用されることになる要素たち ]を指定する。 各~宣言は、[ 名前, ~colon, 宣言~値 ]並びからなる。 宣言どうしは、 ~semicolonで分離される。 ◎ A qualified rule starts with a prelude then has a {}-wrapped block containing a sequence of declarations. The meaning of the prelude varies based on the context that the rule appears in—for style rules, it’s a selector which specifies what elements the declarations will apply to. Each declaration has a name, followed by a colon and the declaration value. Declarations are separated by semicolons.
典型的な規則は、 次に様な見かけになろう: ◎ A typical rule might look something like this:
p > a { color: blue; text-decoration: underline; }
上の規則における "`p > a^css" が選択子である。 ~source文書が~HTMLであるならば、 それは `p$e 要素の子である,あらゆる `a$e 要素を選択する。 ◎ In the above rule, "p > a" is the selector, which, if the source document is HTML, selects any a elements that are children of a p element.
"`color: blue^css" は、[ 選択子に合致する各~要素に対し, その `color$p ~propの値は `blue^v になるべきである ]ことを指定している宣言である。 類似に、 それらの `text-decoration$p ~propの値は, `underline$v になるべきであることになる。 ◎ "color: blue" is a declaration specifying that, for the elements that match the selector, their color property should have the value blue. Similarly, their text-decoration property should have the value underline.
~at-規則は、 種類ごとに異なるものだが,基本的な構造は共通する: ◎ At-rules are all different, but they have a basic structure in common.\
-
それらは、
`符号位置$ "
@
" から開始して, ~CSS~keywordとして名前が後続する。 ◎ They start with an "@" code point followed by their name as a CSS keyword.\ - 一部の`~at-規則$は,単純な`一文$であり、 その名前に[ その挙動を指定する~CSS値たち ]が後続して,~semicolonで終端する。 ◎ Some at-rules are simple statements, with their name followed by more CSS values to specify their behavior, and finally ended by a semicolon.\
- 他の`~at-規則$は、 ~blockである: それらにも,その名前に~CSS値たちが後続し得るが、 `有修飾~規則$と類似に,`波括弧~block$で終端する。 この~blockの内容は、 所与の`~at-規則$に特有であるが,[ `有修飾~規則$の様に,宣言たちが成す連列を包含する ]ことも[ 追加的に,[ ~block/~at-規則/その他の構造 ]たちを一緒に包含する ]こともある。 ◎ Others are blocks; they can have CSS values following their name, but they end with a {}-wrapped block, similar to a qualified rule. Even the contents of these blocks are specific to the given at-rule: sometimes they contain a sequence of declarations, like a qualified rule; other times, they may contain additional blocks, or at-rules, or other structures altogether.
ここに、 `~at-規則$が包含し得る様々な構文を解説する いくつかの例を示す: ◎ Here are several examples of at-rules that illustrate the varied syntax they may contain.
@import "my-styles.css";
`import$at `~at-規則$は,単純な`一文$であり、 名前の後に, ~importすべき~stylesheetを指示する 1 個の[ 文字列/ `url$f 関数 ]をとる。 ◎ The @import at-rule is a simple statement. After its name, it takes a single string or url() function to indicate the stylesheet that it should import.
@page :left { margin-left: 4cm; margin-right: 3cm; }
`page$at `~at-規則$は、[ 省略可能な~page選択子(この例では `left$ps 疑似類), ~pageの印刷~時に適用される~propたちが成す~block ]が成す並びである。 それは、 この仕方で[ それらの~propは、 どの “要素” にも適用されず,~page自身に適用される ]ことを除いて,通常の~style規則と とてもよく似る。 ◎ The @page at-rule consists of an optional page selector (the :left pseudoclass), followed by a block of properties that apply to the page when printed. In this way, it’s very similar to a normal style rule, except that its properties don’t apply to any "element", but rather the page itself.
@media print { body { font-size: 10pt } }
`media$at `~at-規則$は、[ `媒体~型$†, 省略可能な`媒体~query~list$ ]が成す並びから始まる 【† 現代の構文では、媒体~型も省略可能】。 その~blockは,[ `media$at 条件が充足されるときに限り適用される ]ような規則~全体を包含する。 ◎ The @media at-rule begins with a media type and a list of optional media queries. Its block contains entire rules, which are only applied when the @medias conditions are fulfilled.
[ `~prop$ / `~at-規則$ ]の名前は、 常に`~ident$であり: ◎ Property names and at-rule names are always ident sequences,\
- 次のいずれかから開始する必要がある ⇒# `~identを開始する符号位置$/ 2 個の~hyphen / [ 1 個の~hyphen, `~identを開始する符号位置$ ]が成す並び ◎ which have to start with an ident-start code point, two hyphens, or a hyphen followed by an ident-start code point,\
- ~~後続して 0 個以上の`~ident符号位置$を包含できる ◎ and then can contain zero or more ident code points.\
- 上述に加えて,どこにでも、 `~escape法$により,どの`符号位置$も含めれる — それが,~CSSの構文に利用されるものであっても。 ◎ You can include any code point at all, even ones that CSS uses in its syntax, by escaping it.
【 もっと簡潔に言い換えるなら、 次を満たす必要がある: [ `~identを開始している$ ]~AND[[ `~ident符号位置$/ `妥当な~escape$を成す符号位置~並び ]のみからなる ] 】
`選択子$の構文は、 `SELECTORS-4$r【!`SELECT$r】 にて定義される。 類似に,多岐に渡る~CSS値の構文は、 `CSS-VALUES-4$r `§ 値~定義の構文$にて定義される。 個々の`~at-規則$の特別な構文は、 それらを定義する各~仕様にて見出せる。 ◎ The syntax of selectors is defined in the Selectors spec. Similarly, the syntax of the wide variety of CSS values is defined in the Values & Units spec. The special syntaxes of individual at-rules can be found in the specs that define them.
2.1. ~escape法
◎非規範的`~ident$や, 引用符で括られた文字列には、 `~escape法@ により,任意の~Unicode`符号位置$を含ませれる。 ~CSS~escape列は、 ~backslash( `\^l )から開始して,次のいずれかが後続する: ◎ Any Unicode code point can be included in an ident sequence or quoted string by escaping it. CSS escape sequences start with a backslash (\), and continue with:
- [ `~hex$, `改行文字$ ]以外の~Unicode`符号位置$。 この~escape列は、 その`符号位置$に置換される。 ◎ Any Unicode code point that is not a hex digits or a newline. The escape sequence is replaced by that code point.
-
[ 1 〜 6 個の`~hex$, 省略可能な 1 個の`空白$ ]が成す並び。 この~escape列は、[ その~hex並びが表す数を値とする~Unicode`符号位置$ ]に置換される。 省略可能な空白は、[ 16 進~escape列に “本当の” ~hex列が後続する ]ことを許容するためにある。 ◎ Or one to six hex digits, followed by an optional whitespace. The escape sequence is replaced by the Unicode code point whose value is given by the hexadecimal digits. This optional whitespace allow hexadecimal escape sequences to be followed by "real" hex digits.
例えば,.値に `&B^l を伴う`~ident$は、[ `\26 B^css あるいは `\000026B^css ]として記すこともできる。 ◎ An ident sequence with the value "&B" could be written as \26 B or \000026B.
注記: ~escape列の直後に “本当の” ~spaceを続ける場合、 二重に記さなければならないことになる。 ◎ A "real" space after the escape sequence must be doubled.
2.2. ~errorの取扱い
◎非規範的~CSSにおいて~errorが生じたときには、 構文解析器は,通常通り構文解析に返る前に[ 最小限な内容のみを棄てて, “上品に” 回復する ]よう試みる。 これは、 ~errorが必ずしも誤用によるものとは限らないからである — 新たな構文は,旧い構文解析器からは~errorに見えるので、[ それを含んだ~stylesheetが,旧い~UAにおいて完全に非互換化される ]ことを心配せずに[ 言語に新たな構文を追加できる ]ことが有用になる。 ◎ When errors occur in CSS, the parser attempts to recover gracefully, throwing away only the minimum amount of content before returning to parsing as normal. This is because errors aren’t always mistakes—new syntax looks like an error to an old parser, and it’s useful to be able to add new syntax to the language without worrying about stylesheets that include it being completely broken in older UAs.
~error回復の精確な挙動は,構文解析器~それ自身の中で詳細が与えられているが、 短い記述でも,それなりに正確aに~~述べれる: ◎ The precise error-recovery behavior is detailed in the parser itself, but it’s simple enough that a short description is fairly accurate.
- ~stylesheetの “~top-level” においては、 `at-keyword$tok が,`~at-規則$を開始させる。 他のものは どれも,`有修飾~規則$を開始させ、 その規則の.導入部の中に含まれる。 これは,`無効な選択子$も生産し得るが、 そのことは,~CSS構文解析器が関知する所ではなく[ 最悪でも,何にも合致しない`選択子$になる ]ことを意味する。 ◎ At the "top level" of a stylesheet, an <at-keyword-token> starts an at-rule. Anything else starts a qualified rule, and is included in the rule’s prelude. This may produce an invalid selector, but that’s not the concern of the CSS parser—at worst, it means the selector will match nothing.
-
`~at-規則$が開始されたなら、 構文解析器の視点からは,何が来ようが無効にならない — 次のいずれかに遭遇するまでを成すすべてが,~at-規則の.導入部の一部になる: ◎ Once an at-rule starts, nothing is invalid from the parser’s standpoint; it’s all part of the at-rule’s prelude.\
- `semicolon$tok に遭遇したときは、 当の~at-規則は即時に終端される。 ◎ Encountering a <semicolon-token> ends the at-rule immediately, while\
- 一方で,開き波括弧 `open-curly$Tok に遭遇したときは、 その~at-規則の本体を開始させる — 本体に合致する~block( `()^c, `{}^c, `[]^c のいずれかに挟まれた内容)が、[[ 他のもの/別の~blockの内側 ]には合致しない閉じ波括弧 `close-curly$Tok ]が見出されるまで,前方検索される。 ◎ encountering an opening curly-brace <{-token> starts the at-rule’s body. The at-rule seeks forward, matching blocks (content surrounded by (), {}, or []) until it finds a closing curly-brace <}-token> that isn’t matched by anything else or inside of another block.\
次に、 当の~at-規則の内容が,~at-規則の自前の文法に則って解釈される。 ◎ The contents of the at-rule are then interpreted according to the at-rule’s own grammar.
- `有修飾~規則$の場合も,[ ~semicolonは,それを終端させない ]ことを除いて,類似に働く — この~semicolonは、 単に規則の.導入部の一部を成すものとみなされる。 最初の`波括弧~block$が見出されたなら、 その内容は,常に宣言~listとして解釈される。 ◎ Qualified rules work similarly, except that semicolons don’t end them; instead, they are just taken in as part of the rule’s prelude. When the first {} block is found, the contents are always interpreted as a list of declarations.
- 宣言~listを解釈する際に,未知な構文に出くわしたときは、 現在~構築中の宣言は,それが何であれ,構文解析器により棄てられ、 次の~semicolon(あるいは~blockの終端)が見出されるまで,前方検索される。 そこからまた、 宣言の構文解析が新規に試行される。 ◎ When interpreting a list of declarations, unknown syntax at any point causes the parser to throw away whatever declaration it’s currently building, and seek forward until it finds a semicolon (or the end of the block). It then starts fresh, trying to parse a declaration again.
-
どの[ 規則, 宣言, 関数, 文字列, 等々 ]においても, それが閉じられる前に~stylesheetが終端した場合、 あらゆるものが自動的に閉じられる。 これは、 それらを無効にはしない。 不完全にもなり得るが、 その場合,各自の文法に照らし合わせて検証yされる際に棄てられる。 ◎ If the stylesheet ends while any rule, declaration, function, string, etc. are still open, everything is automatically closed. This doesn’t make them invalid, though they may be incomplete and thus thrown away when they are verified against their grammar.
例えば,関数 `translateX$f の構文は: ◎ For example, the syntax of the translateX() function is:
translateX( `length-percentage【!translation-value】^t )
しかしながら,~stylesheetは、 この関数が閉じられないまま終端されてもよい — 次の様に: ◎ However, the stylesheet may end with the function unclosed, like:
.foo { transform: translateX【!translate】(50px
~CSS構文解析器は,これを[[[[ `関数$であって,その.名前は `translateX^l であるもの ]のみからなる`成分~値$たちが成す~list ]を.値にとる, 1 個の`宣言$ ]を包含している~style規則 ]として構文解析する。 これは、 終端ng~tokenが~token~streamの中に出現しなくても,上の文法には合致するものとされる。 構文解析器を抜けた時点で,終端ng~tokenの有無は決定し得なくなり、 ~blockと関数が在るという事実のみが残るので。 ◎ The CSS parser parses this as a style rule containing one declaration, whose value is a function named "translate". This matches the above grammar, even though the ending token didn’t appear in the token stream, because by the time the parser is finished, the presence of the ending token is no longer possible to determine; all you have is the fact that there’s a block and a function.
各~構成子(宣言, ~style規則, ~at-規則)が構文解析されたなら、 ~UAは,期待される文法に照らし合わせて検査する。 文法に合致しない場合,それは `無効@ になり、 ~UAは,それが元から無かったかのように `無視-@ することになる。 ◎ After each construct (declaration, style rule, at-rule) is parsed, the user agent checks it against its expected grammar. If it does not match the grammar, it’s invalid, and gets ignored by the UA, which treats it as if it wasn’t there at all.
3. ~CSSの~token化法と構文解析-法
~UAは、 【~MIME型】 `text/css^c の資源から~CSSOM~tree `CSSOM$r を生成するときは, この仕様に述べられる構文解析~規則を利用するモノトスル。 同時に,これらの規則は、 ~CSS構文解析器として参照rされるものを定義する。 ◎ User agents must use the parsing rules described in this specification to generate the [CSSOM] trees from text/css resources. Together, these rules define what is referred to as the CSS parser.
この仕様は、 ~CSS文書~用の構文解析~規則 — それが構文上は正しいか否か調べるための規則 — を定義する。 構文解析~algoの内側には、 `構文解析error@ と記される箇所がある。 その際の~errorの取扱いは、 きちんと定義される — ~UAは,そのような問題に遭遇したときには、[ 以下に述べる規則に従って動作する ]ことに加え[ それらの規則を適用するよう望まない~errorに遭遇したときは、 最初に遭遇した時点で,処理を中止する ]モノトスル。 ◎ This specification defines the parsing rules for CSS documents, whether they are syntactically correct or not. Certain points in the parsing algorithm are said to be parse errors. The error handling for parse errors is well-defined: user agents must either act as described below when encountering such problems, or must abort processing at the first error that they encounter for which they do not wish to apply the rules described below.
適合性~検査器は、 文書において 1 個以上の構文解析error【!error conditions】が生じたときには, それら~errorのうち 1 個以上を利用者に報告するモノトスル。 また、 それら~errorが複数個あるときは,それらのうち複数個を報告してもヨイ。 逆に,文書に~errorが存在しない場合、 ~errorを報告しないモノトスル。 適合性~検査器には,構文解析errorから回復することは要求されないが、 それを行う場合は,~UAと同じ仕方で回復するモノトスル。 ◎ Conformance checkers must report at least one parse error condition to the user if one or more parse error conditions exist in the document and must not report parse error conditions if none exist in the document. Conformance checkers may report more than one parse error condition if more than one parse error condition exists in the document. Conformance checkers are not required to recover from parse errors, but if they do, they must recover in the same way as user agents.
3.1. 構文解析~modelの概観
~CSS構文解析への入力は、[ ~Unicode`符号位置$たちが成す~stream ]である。 それは、[ ~token化~段階 ]を経て[ ~treeの構築~段階 ]に渡される。 その出力は[ `CSSStyleSheet$I ~obj ]である。 ◎ The input to the CSS parsing process consists of a stream of Unicode code points, which is passed through a tokenization stage followed by a tree construction stage. The output is a CSSStyleSheet object.
注記: ~scriptingを~supportしない実装は、 実際に~CSSOM `CSSStyleSheet^c ~objを作成する必要はないが、 そのような事例でも,~CSSOM~treeは[ この仕様を成す他の部分 ]用の~modelとして利用される。 ◎ Note: Implementations that do not support scripting do not have to actually create a CSSOM CSSStyleSheet object, but the CSSOM tree in such cases is still used as the model for the rest of the specification.
3.2. 入力~byte~stream
[ ~stylesheetの構文解析における~token化~段階 ]への入力を成す[ ~Unicode`符号位置$たちが成す~stream ]は、 ~UAにとっては,初期~時は (概して,~network越しに, または局所~file~systemからの) ~byte~streamとして見えるであろう。 その場合,~UAは、 特定0の文字~符号化法に則って,当の~streamを成す~byte列を`符号位置$列に復号するモノトスル。 ◎ When parsing a stylesheet, the stream of Unicode code points that comprises the input to the tokenization stage might be initially seen by the user agent as a stream of bytes (typically coming over the network or from the local file system). If so, the user agent must decode these bytes into code points according to a particular character encoding.
`~stylesheetの~byte列を復号する@ ときは、 所与の %~stylesheet に対し,その~byte~streamを次に従って`符号位置$~streamの中へ復号する: ◎ To decode a stylesheet’s stream of bytes into a stream of code points:
- %~fallback ~LET `~fallback符号化法を決定する$( %~stylesheet ) ◎ Determine the fallback encoding of stylesheet, and let fallback be the result.
- ~RET `~Unicodeに復号する$( %~stylesheet の~byte~stream, %~fallback ) ◎ Decode stylesheet’s stream of bytes with fallback encoding fallback, and return the result.
注記: `~Unicodeに復号する$ ~algoは、 ~BOM( `byte order mark^en / バイト順マーク )を優先する — ~fallbackを利用するのは、 ~BOMが見出されなかったときに限られる。 ◎ Note: The decode algorithm gives precedence to a byte order mark (BOM), and only uses the fallback when none is found.
`~fallback符号化法を決定する@ ときは、 所与の %~stylesheet に対し: ◎ To determine the fallback encoding of a stylesheet:
-
~IF[ ~HTTPまたは それに等価な~protocol ]は、 %~stylesheet 用の`符号化法~label$として %~label を供している (例: `Content-Type$h ~headerの `charset^c ~parameterを介して) ]:
- %符号化法 ~LET `~labelから符号化法を取得する$( %~label )
- ~IF[ %符号化法 ~NEQ `失敗^i ] ⇒ ~RET %符号化法
-
~IF[ %~stylesheet を成す~byte~stream ]の[ 先頭から【~stream終端を超えない】 1024 個までの~byteが成す~byte列 ]の頭部は、 次の~hex列に合致する ]: ◎ Otherwise, check stylesheet’s byte stream. If the first 1024 bytes of the stream begin with the hex sequence
40 63 68 61 72 73 65 74 20 22 %~label 22 3B
ここで %~label は、 各~byteが 16 進 範囲 { 0x00 〜 0x21, 0x23 〜 0x7F } に入る任意の~byte列とする。 ◎ where each XX byte is a value between 016 and 2116 inclusive or a value between 2316 and 7F16 inclusive, then\
注記: この~byte列は、 ~ASCIIとして復号したときには,次の連結になる ⇒# `@charset "^l, %~label が表現する文字列, `";^l ◎ ↓
-
%符号化法 ~LET `~labelから符号化法を取得する$( %~label を~ASCIIとして解釈して得られる文字列 ) ◎ get an encoding from a string formed out of the sequence of XX bytes, interpreted as ASCII. ◎ What does that byte sequence mean? ◎ The byte sequence above, when decoded as ASCII, is the string "@charset "…";", where the "…" is the sequence of bytes corresponding to the encoding’s label.
-
~IF[ %符号化法 ~NEQ `失敗^i ]:
- ~IF[ %符号化法 ~IN { `UTF-16BE$enc, `UTF-16LE$enc } ] ⇒ ~RET `UTF-8$enc
- ~RET %符号化法
宣言が~UTF-16のときに `UTF-8$enc を利用するのはなぜ? ◎ Why use utf-8 when the declaration says utf-16?
符号化法~宣言の~byte列は~ASCIIとしては “
@charset "…";
” になるが、 ~UTF-16は~ASCII互換でない。 好ましい行いでないが,文書~内では~~正しい~byte列が取得されるような~~暗号的な何か (例: `䁣桡牳整•utf-16be∻^c ) を与えたとき、 あるいは[ 文書が実際には~ASCII互換な符号化法でありつつ,符号化法~宣言は虚偽である場合 ]でも、 ~UTF-8を既定にしておくことが,あるべき挙動になる。 ◎ The bytes of the encoding declaration spell out “@charset "…";” in ASCII, but UTF-16 is not ASCII-compatible. Either you’ve typed in complete gibberish (like 䁣桡牳整•utf-16be∻) to get the right bytes in the document, which we don’t want to encourage, or your document is actually in an ASCII-compatible encoding and your encoding declaration is lying. ◎ Either way, defaulting to UTF-8 is a decent answer.これは、 ~HTMLの `meta charset^e の挙動を真似たものでもある。 ◎ As well, this mimics the behavior of HTML’s <meta charset> attribute.
注記: 符号化法~宣言の構文は、 名前 `charset$at の`~at-規則$の構文に`似ているように見える^emが、 そのような規則は実際には存在しない — その書き方の規則は、 そのような規則を認識する通常のあり方より,ずっと制約的である。 ~CSS内で[ ~space並び, ~comment, 一重~引用符 ]などを利用して[ 妥当な `charset$at 規則を生産させつつ, その符号化法~宣言は認識できなくする ]やり方は、 いくつもある。 この挙動は、 符号化法~宣言をアリな限り単純にして,正しく実装し易くするためにある。 ◎ Note: Note that the syntax of an encoding declaration looks like the syntax of an at-rule named @charset, but no such rule actually exists, and the rules for how you can write it are much more restrictive than they would normally be for recognizing such a rule. A number of things you can do in CSS that would produce a valid @charset rule (if one existed), such as using multiple spaces, comments, or single quotes, will cause the encoding declaration to not be recognized. This behavior keeps the encoding declaration as simple as possible, and thus maximizes the likelihood of it being implemented correctly.
-
- ~IF[ 参照元 文書にて`環境~符号化法$が供されている ] ⇒ ~RET それ ◎ Otherwise, if an environment encoding is provided by the referring document, return it.
- ~RET `UTF-8$enc ◎ Otherwise, return utf-8.
注記: ~web用の符号化法は~UTF-8が既定であり,[ ~web用途の新たな~file形式の多くは,~UTF-8符号化法と見做す, あるいは要求している ]が、 ~CSSは[ どの符号化法が~~主流になるか明瞭になる前 ]に創出されたので, ~stylesheetを自動的に~UTF-8と見做すわけにはいかない。 ◎ Though UTF-8 is the default encoding for the web, and many newer web-based file formats assume or require UTF-8 encoding, CSS was created before it was clear which encoding would win, and thus can’t automatically assume the stylesheet is UTF-8.
~stylesheet作者は、 ~stylesheetを~UTF-8で著作した上で,次のいずれかを確保する`ベキ^emである: ◎ Stylesheet authors should author their stylesheets in UTF-8, and ensure that either\
- ~HTTP~header(または等価な手法)により, ~stylesheetの符号化法は~UTF-8であるものと宣言する。 ◎ an HTTP header (or equivalent method) declares the encoding of the stylesheet to be UTF-8,\
- 参照元 文書の符号化法は~UTF-8であるものと宣言する。 (~HTMLにおいては、 これは,[ 文書の頭部( `head^e 内)に `meta charset=utf-8^e 要素を追加する ]ことにより行われる。) ◎ or that the referring document declares its encoding to be UTF-8. (In HTML, this is done by adding a <meta charset=utf-8> element to the head of the document.)
これらいずれも可用でない場合、 作者は,~stylesheetが次のいずれかで始まるようにするべきである ⇒# ~UTF-8~BOM / 正確に `@charset "utf-8";^c に一致する文字列 ◎ If neither of these options are available, authors should begin the stylesheet with a UTF-8 BOM or the exact characters • @charset "utf-8";
[ ~byte列から復号される~CSS~stylesheet ]を参照rする文書~言語は、 それら各~stylesheet用に, `環境~符号化法@ を定義してもヨイ。 それは、 他の符号化法~hintは[ 可用でない/利用できない ]ときの~fallbackとして利用される。 ◎ Document languages that refer to CSS stylesheets that are decoded from bytes may define an environment encoding for each such stylesheet, which is used as a fallback when other encoding hints are not available or can not be used.
`環境~符号化法$の概念は、 旧来の内容との互換性を得るために限り,存在する。 [ 新たな形式の文書/新たな~link法の仕組み ]は、[ ~stylesheetの符号化法が明示的に供されない下では、 ~UTF-8が既定になる ]よう,`環境~符号化法$を供するべきでない。 ◎ The concept of environment encoding only exists for compatibility with legacy content. New formats and new linking mechanisms should not provide an environment encoding, so the stylesheet defaults to UTF-8 instead in the absence of more explicit information.
注記: ◎ ↓
- `HTML$r は、 `link rel=stylesheet^e から参照rされる~stylesheet用の`環境~符号化法$を`定義する@~HTMLlinks#link-type-stylesheet$。 ◎ Note: [HTML] defines the environment encoding for <link rel=stylesheet>.
- `CSSOM$r は、 `<xml-stylesheet?>^c 用の`環境~符号化法$を`定義する@~CSSOM1#requirements-on-user-agents-implementing-the-xml-stylesheet-processing-instruction$。 ◎ Note: [CSSOM] defines the environment encoding for <xml-stylesheet?>.
- `CSS-CASCADE-3$r は、 `import$at 用の`環境~符号化法$を`定義する@~CASCADE#import-processing$。 ◎ Note: [CSS-CASCADE-3] defines the environment encoding for @import.
3.3. 入力~streamの前処理
`入力~stream@ は、 入力~byte~streamを復号するに伴い~pushされた,`一連の~filter済み符号位置@#css-filter-code-points$からなる。 ◎ The input stream consists of the filtered code points pushed into it as the input byte stream is decoded.
`符号位置~列を~filterする@ ときは、 所与の ( (~filter済みでない)`符号位置$列が成す~stream %入力 ) に対し, %入力 を成す各`符号位置$に応じて: ◎ To filter code points from a stream of (unfiltered) code points input:
- 次に該当するものは、 除去する ⇒ `0D^U (CR) のうち,直後に `0A^U (LF) が在るもの ◎ ↓
- 次に挙げるものは、 `0A^U (LF) に置換する ⇒# 前項に該当しない `0D^U (CR) / `0C^U (FF) ◎ Replace any U+000D CARRIAGE RETURN (CR) code points, U+000C FORM FEED (FF) code points, or pairs of U+000D CARRIAGE RETURN (CR) followed by U+000A LINE FEED (LF) in input by a single U+000A LINE FEED (LF) code point.
-
次に挙げるものは、 `FFFD^U に置換する ⇒# `00^U/ `~surrogate$ ◎ Replace any U+0000 NULL or surrogate code points in input with U+FFFD REPLACEMENT CHARACTER (�).
注記: ~CSS内容~内に`~surrogate$を生産する仕方は、 ~CSSOM演算を介して,それを含んだ `DOMString^c を直にアテガう他にない。 ◎ Note: The only way to produce a surrogate code point in CSS content is by directly assigning a DOMString with one in it via an OM operation.
4. ~token化
`符号位置~streamを~token化する@ ときは、 所与の ( `符号位置$たちが成す~stream %入力, ~tokenたちが成す~stream %出力【, 真偽値 %~unicode-rangeは許容されるか (省略時は ~F )】 ) に対し:
-
~WHILE 無条件
- %~token ~LET `~tokenを消費する$( %入力【, %~unicode-rangeは許容されるか 】 )
- ~IF[ %~token は `EOF$tok である ] ⇒ ~BREAK
- %出力 の中へ %~token を~pushする
注記: `~tokenを消費する$~algoは、 構文解析して`いる間に^em[ 必要に応じて “その場で”, `符号位置$たちが成す~streamを~token化する ]ためにも利用できるよう, 各~callに対し 1 個の~tokenを返す。 ◎ Note: Each call to the consume a token algorithm returns a single token, so it can also be used "on-demand" to tokenize a stream of code points during parsing, if so desired.
~token化の段における出力は、 次に挙げる 0 個~以上の~tokenたちが成す~streamである:
~token | ~tokenが有する~field | 代表的な~CSS構成子(括弧内はその例) 【この列は、訳者による補足であり,該当する構成子を網羅するものでもない。】 |
---|---|---|
`ident@tok | 値 | ~keywordなどの`~CSS識別子$( `auto^l ) |
`function@tok | 値 | `関数-記法$の名前(および直後にある丸括弧)を成す部分( `calc(^l ) |
`at-keyword@tok | 値 | ~at-規則( "@import " )
|
`hash@tok | 値, 型~flag | `~ID選択子$( `#ID^l )/ 16 進数による色( `#ABCDEF^l ) |
`string@tok | 値 | 文字列( `'もじのならび'^l, 引用符も含む) |
`bad-string@tok | 合法でない文字列 | |
`url@tok | 値 | ~URL( `url(example.png)^l ) |
`bad-url@tok | 合法でない~URL | |
`delim@tok | 値 | 1 個の文字からなる一般的な分離子(`結合子$, `~importantな宣言$の `!^l など) |
`number@tok | 数値, 型~flag, 符号~文字 | 単位を伴わない数値( `123.45^l ) |
`percentage@tok | 数値, 符号~文字 | 百分率( `33.3%^l ) |
`dimension@tok | 数値, 型~flag, 符号~文字, 単位 | 単位を伴う数値( `1.5em^l ) |
`unicode-range@tok | 始端, 終端 | `U+20-7E^l |
`whitespace@tok | 空白 | |
`CDO@tok | `<!--^l — ~HTML~comment開始~構文(互換性のためにあり,単純に無視される) | |
`CDC@tok | `-->^l — ~HTML~comment終了~構文(同上) | |
`colon@tok | `:^l — `宣言$の中の~propの名前と値を分離する~colon | |
`semicolon@tok | `;^l — `宣言$どうしを分離する~semicolon | |
`comma@tok | `,^l — 成分~値どうしを分離する~comma | |
`open-square@Tok | `[^l — `属性~選択子$を括る角括弧 | |
`close-square@Tok | `]^l — 同上 | |
`open-paren@Tok | `(^l — `条件付き~group規則$に与える条件を括る丸括弧 | |
`close-paren@Tok | `)^l — 同上 | |
`open-curly@Tok | `{^l — 宣言~listを括る波括弧 | |
`close-curly@Tok | `}^l — 同上 |
各種~fieldがとり得る値は: ◎ ↓
- [ `ident$tok / `function$tok / `at-keyword$tok / `hash$tok / `string$tok / `url$tok ]の .`値^dfn は、 0 個以上の`符号位置$からなる。 ◎ <ident-token>, <function-token>, <at-keyword-token>, <hash-token>, <string-token>, and <url-token> have a value composed of zero or more code points.\
- `hash$tok の .`型~flag^dfn は、 次のいずれかをとる ⇒# `無制約^i(既定), `id^i ◎ Additionally, hash tokens have a type flag set to either "id" or "unrestricted". The type flag defaults to "unrestricted" if not otherwise set.
- `delim$tok の .`値^dfn は、 1 個の`符号位置$をとる。 ◎ <delim-token> has a value composed of a single code point.
-
[ `number$tok / `percentage$tok / `dimension$tok ]の:
- .`数値^dfn は、 実数をとる。
- `.符号~文字^dfn は、 次のいずれかをとる ⇒# ε(既定), `正負符号$
- [ `number$tok / `dimension$tok ]の .`型~flag^dfn は、 次のいずれかをとる ⇒# `整数^i(既定), `実数^i ◎ <number-token> and <dimension-token> additionally have a type flag set to either "integer" or "number". The type flag defaults to "integer" if not otherwise set.\
- `dimension$tok の .`単位^dfn は、 1 個以上の`符号位置$からなる。 ◎ <dimension-token> additionally have a unit composed of one or more code points.
-
`unicode-range$tok の[ .`始端^dfn, .`終端^dfn ]は、 いずれも`符号位置$の`値$cpをとる。 ◎ <unicode-range-token> has a starting and ending code point.\
この~tokenは、 次を満たす`符号位置$たちが成す範囲を表現する ⇒ .始端 ~LTE その`値$cp ~LTE .終端 ◎ It represents an inclusive range of codepoints (including both the start and end).\
( .始端 ~GT .終端 の場合、 空な範囲を表現する。) ◎ If the ending code point is before the starting code point, it represents an empty range.
注記: `hash$tok の.型~flagは、 `選択子$の構文 `SELECTORS-4$r【!`SELECT$r】 にて利用される。 .型~flag に `id^i を伴う `hash$tok に限り,妥当な`~ID選択子$になる。 ◎ Note: The type flag of hash tokens is used in the Selectors syntax [SELECT]. Only hash tokens with the "id" type are valid ID selectors.
4.1. ~tokenの線路図式
◎非規範的この節では、 ~tokenizerの参考~viewを線路図式の形で呈示する。 線路図式は、 明示的な構文解析器よりも~~簡潔であり, 正規表現よりも読み易いことが多い。 ◎ This section presents an informative view of the tokenizer, in the form of railroad diagrams. Railroad diagrams are more compact than an explicit parser, but often easier to read than an regular expression.
これらの図式は、 `参考であって, 不完全である^em。 ~tokenの “正しい” 文法は述べるが、 ~errorの取扱いは まったく述べない。 それらはもっぱら,各種~tokenの構文を直感的に把握し易くするために供されている。 ◎ These diagrams are informative and incomplete; they describe the grammar of "correct" tokens, but do not describe error-handling at all. They are provided solely to make it easier to get an intuitive grasp of the syntax of each token.
`foo^tok の様な名前が付与された図式は、 ~tokenを表現する。 他のものは,他の図式から参照rされる生成規則である。 ◎ Diagrams with names such as <foo-token> represent tokens. The rest are productions referred to by other diagrams.
- `comment^sb(~comment)
- `comment^dgm
- `newline^sb(`前処理@#input-preprocessing$前の改行文字)
- `newline^dgm
- `whitespace^sb(`空白$)
- `whitespace^dgm
- `hex digit^sb( `~hex$ )
- `hex-digit^dgm
- `escape^sb(~escape列)
- `escape^dgm
- `whitespace$tok
- `whitespace-token^dgm
- `ws*^sb
- `whitespaces^dgm
- `ident$tok
- `ident-token^dgm
- `function$tok
- `function-token^dgm
- `at-keyword$tok
- `at-keyword-token^dgm
- `hash$tok
- `hash-token^dgm
- `string$tok
- `string-token^dgm
- `url$tok
- `url-token^dgm
- `number$tok
- `number-token^dgm
- `dimension$tok
- `dimension-token^dgm
- `percentage$tok
- `percentage-token^dgm
- `CDO$tok
- `CDO-token^dgm
- 【 原文の図式は `<!--^l から `<<!---->!--^l へ更新されたが、 何かの間違いに思われる。 】
- `CDC$tok
- `CDC-token^dgm
- `unicode-range$tok
- `unicode-range-token^dgm
4.2. 定義
この節では、 ~token化~相にて利用される,いくつかの用語を定義する。 ◎ This section defines several terms used during the tokenization phase.
- `C1^V, `C2^V, `C3^V ◎ next input code point
- 順に,`入力~stream$内の未だ消費されていない[ 1 個目, 2 個目, 3 個目 ]の`符号位置$を指す — ~streamの末尾を越える所を指す場合、 `~EOF$iと見なされる。 ◎ The first code point in the input stream that has not yet been consumed.
- 【 これらは、 `入力~符号位置を消費する$に伴い変化することになる。 】【 ~CSSの構文解析において先読みが必要になる符号位置たちは、 これら 3 個までに限られる。 】【 `C1$V は、 原文では `next input code point^en ( “次回の入力~符号位置” )と称されるが、 2 個目や 3 個目を指す記述も含めて一貫した形で簡明に述べるため,このように改める。 】
- `現在の入力~符号位置@ ◎ current input code point
- すでに消費された`符号位置$のうち,最後のもの。 【 `~EOF$i もとり得る。】 ◎ The last code point to have been consumed.
- `現在の入力~符号位置を消費し直す@ ◎ reconsume the current input code point
- `現在の入力~符号位置$を`入力~stream$の先頭に戻す 【未~消費-な~~状態に戻す】 。 すなわち,次回に`入力~符号位置を消費する$際には、 代わりに,`現在の入力~符号位置$から消費することになる。 ◎ Push the current input code point back onto the front of the input stream, so that the next time you are instructed to consume the next input code point, it will instead reconsume the current input code point.
- `~EOF符号位置@ 【この訳では、単に `~EOF$i と略記する。】 ◎ EOF code point
- `入力~stream$の終端を表現する, 【他のどの符号位置とも異なる】 概念的な符号位置。 `入力~stream$が空になり次第, `C1$V は常に `~EOF$i になる。 ◎ A conceptual code point representing the end of the input stream. Whenever the input stream is empty, the next input code point is always an EOF code point.
- 各種 符号位置の範囲
-
次に挙げる各種[ `符号位置$の範囲 ]が定義される — 記号 ∪ は、 和集合をとることを意味する: ◎ ↓
- `数字@ ◎ digit
- { `30^U 〜 `39^U } ◎ A code point between U+0030 DIGIT ZERO (0) and U+0039 DIGIT NINE (9) inclusive.
- `~hex@ ◎ hex digit
- `数字$ ∪ { `41^U 〜 `46^U } ∪ { `61^U 〜 `66^U } ◎ A digit, or a code point between U+0041 LATIN CAPITAL LETTER A (A) and U+0046 LATIN CAPITAL LETTER F (F) inclusive, or a code point between U+0061 LATIN SMALL LETTER A (a) and U+0066 LATIN SMALL LETTER F (f) inclusive.
- `正負符号@ 【これは、この訳による追加的な定義】
- { `2B^U, `2D^U }
- `大文字@ ◎ uppercase letter
- { `41^U 〜 `5A^U } ◎ A code point between U+0041 LATIN CAPITAL LETTER A (A) and U+005A LATIN CAPITAL LETTER Z (Z) inclusive.
- `小文字@ ◎ lowercase letter
- { `61^U 〜 `7A^U } ◎ A code point between U+0061 LATIN SMALL LETTER A (a) and U+007A LATIN SMALL LETTER Z (z) inclusive.
- `英字@ ◎ letter
- `大文字$ ∪ `小文字$ ◎ An uppercase letter or a lowercase letter.
- `非~ASCII~ident符号位置@ ◎ non-ASCII ident code point
-
{ `00B7^U } ∪ { `00C0^U 〜 `00D6^U } ∪ { `00D8^U 〜 `00F6^U } ∪ { `00F8^U 〜 `037D^U } ∪ { `037F^U 〜 `1FFF^U } ∪ { `200C^U, `200D^U, `203F^U, `2040^U } ∪ { `2070^U 〜 `218F^U } ∪ { `2C00^U 〜 `2FEF^U } ∪ { `3001^U 〜 `D7FF^U } ∪ { `F900^U 〜 `FDCF^U } ∪ { `FDF0^U 〜 `FFFD^U } ∪ { `10000^U 以上【〜 `10FFFF^U 】 } ◎ A code point whose value is any of: • U+00B7 • between U+00C0 and U+00D6 • between U+00D8 and U+00F6 • between U+00F8 and U+037D • between U+037F and U+1FFF • U+200C • U+200D • U+203F • U+2040 • between U+2070 and U+218F • between U+2C00 and U+2FEF • between U+3001 and U+D7FF • between U+F900 and U+FDCF • between U+FDF0 and U+FFFD • greater than or equal to U+10000 ◎ All of these ranges are inclusive.
-
これらの文字に特定的に限られるのは,なぜか? ◎ Why these character, specifically?
これは、 ~HTMLの`妥当な~custom要素~名$に許容される非~ASCII符号位置の~listに合致する。 これは、 いくつかの文字を除外する — [ 空白として現れるもの/ 何らかの~toolにおいて描画や構文解析の課題の原因になり得るもの/ 方向【書字~方向】上書き符号位置 ]など。 ◎ This matches the list of non-ASCII codepoints allowed to be used in HTML valid custom element names. It excludes a number of characters that appear as whitespace, or that can cause rendering or parsing issues in some tools, such as the direction override codepoints.
これは、 `UAX 31@https://unicode.org/reports/tr31/#Figure_Code_Point_Categories_for_Identifier_Parsing$ にて識別子~用に推奨される制約の集合 (~JSなどの言語が自身の識別子~構文を制約するために利用される) より弱いことに注意 — これは、 結合~文字から開始する識別子などを許容する。 ~HTML~custom要素~名との整合性 (したがって,~custom要素~用の選択子を~escapeを利用せずに書く能) は,価値があると見なされ、 ~HTMLにより制約される文字の集合は、 この “高価値” な制約をきちんと受持つ。 ◎ Note that this is a weaker set of restrictions than UAX 31 recommends for identifiers (used by languages such as JavaScript to restrict their identifier syntax), allowing things such as starting an identifier with a combining character. Consistency with HTML custom element names (and thus, the ability to write selectors for all custom elements without having to use escapes) was considered valuable, and the set of characters restricted by HTML covers the "high value" restrictions well.
これらの制約は、 混同され得る描画~すべてを避けるものではない — [ 左横書き, 右横書き ]用字系に属する文字が混在している場合、 結果は,依然として — 例えば、 ほとんどの~text~editorにおいては — 期待されない視覚的な並び替えになる。 ~source~textは、 例えば,非~ident文脈においても制約された【除外された】文字を包含し得る — それらのほとんどは、 文字列~内で完全に妥当である。 それらが妥当でない~CSSを作成する仕方で利用されたときでも、[ それによる構文解析~errorは,何か重要でないものに制限される ]かもしれない一方で,[ ~code考査~toolにおける~source~textの描画 ]に対する それらの効果は[ 有意/悪意的 ]になるかもしれない。 これらの類の “~source~text攻撃” についての詳細は、 `この Rust-lang blog post@https://blog.rust-lang.org/2021/11/01/cve-2021-42574.html$ `(archived)@https://web.archive.org/web/20220323175009/https://blog.rust-lang.org/2021/11/01/cve-2021-42574.html$ を見よ。 ◎ These restrictions do not avoid all possible confusing renderings; mixing characters from LTR and RTL scripts can still result in unexpected visual transposition in most text editors, for example. Source text can contain the restricted characters in non-ident contexts, as well: most of them are completely valid in strings, for example. Even when used in a way that creates invalid CSS, the parsing errors they cause might be limited to something unimportant, while their effect on rendering the source text in code review tools might be significant and/or malicious. For more details on these sorts of "source text attacks", see this Rust-lang blog post (archived).
- `~identを開始する符号位置@ ◎ ident-start code point
- `英字$ ∪ `非~ASCII~ident符号位置$ ∪ { `5F^U } ◎ A letter, a non-ASCII ident code point, or U+005F LOW LINE (_).
- `~ident符号位置@ ◎ ident code point
- `~identを開始する符号位置$ ∪ `数字$ ∪ { `2D^U } ◎ An ident-start code point, a digit, or U+002D HYPHEN-MINUS (-).
- `印字不能~符号位置@ ◎ non-printable code point
- { `00^U 〜 `08^U } ∪ { `0B^U } ∪ { `0E^U 〜 `1F^U } ∪ { `7F^U } ◎ A code point between U+0000 NULL and U+0008 BACKSPACE inclusive, or U+000B LINE TABULATION, or a code point between U+000E SHIFT OUT and U+001F INFORMATION SEPARATOR ONE inclusive, or U+007F DELETE.
- `改行文字@ ◎ newline
- { `0A^U } ◎ U+000A LINE FEED.\
- `0D^U, `0C^U は、 この定義には含まれない — それらは、 `前処理@#input-preprocessing$の段階で `0A^U に変換されるので。 ◎ Note that U+000D CARRIAGE RETURN and U+000C FORM FEED are not included in this definition, as they are converted to U+000A LINE FEED during preprocessing.
- `空白@ ◎ whitespace
- `改行文字$ ∪ { `09^U, `20^U } ◎ A newline, U+0009 CHARACTER TABULATION, or U+0020 SPACE.
- `許容される最大な符号位置@ ◎ maximum allowed code point
- `10FFFF^U — すなわち、 ~Unicodeにて定義される最~大な`符号位置$。 ◎ The greatest code point defined by Unicode: U+10FFFF.
- `~ident@ ◎ ident sequence
- `ident$tok と構文が同じな,`符号位置$たちが成す連列。 ◎ A sequence of code points that has the same syntax as an <ident-token>.
- 【 ~identは、 `identifier^en (識別子)の略語であり, ~CSSにおける識別子(`~CSS識別子$)の構文上の側面を特定的に指す技術-用語。 】【 この~identは、 原文では `ident sequence^en ( “( 1 個の)~ident(を成す,符号位置たちが成す)連列” ) と記されており,直訳するなら “~ident連列” あるいは “~ident列” の様になろうが、 それだと `sequence of idents^en ( “~identたちが成す連列” ) と紛らわしくなるので,この訳では ( `ident^en, `ident sequence^en どちらも) 単に “~ident” と表記することにする。 】
- 注記:
次に挙げるものは、
どれも`~ident$になる
⇒#
`at-keyword$tok の "
@
" より後の部分, `hash$tok のうち[ .型~flag ~EQ `id^i ]なるものの `#^l より後の部分, `function$tok の `(^l より前の部分, `dimension$tok の.単位 ◎ Note: The part of an <at-keyword-token> after the "@", the part of a <hash-token> (with the "id" type flag) after the "#", the part of a <function-token> before the "(", and the unit of a <dimension-token> are all ident sequences.
【 原文の記述を明確化するため、 この訳では,次に挙げる定義も導入する: 】
- %n 個の `入力~符号位置を消費する@
- ~streamの先頭から %n 個の符号位置を除去した上で、 除去された最後の符号位置を`現在の入力~符号位置$にあてがうことを意味する (言い換えれば、 現在の入力~符号位置を指している~pointerを,最後に消費された符号位置を指すよう移動する)。
- 最後の 1 個を除去する前に~streamを消費し尽くした場合、 `現在の入力~符号位置$は,`~EOF$iになる。
- ~streamから`入力~符号位置を繰返し消費する@ :…
-
次を繰返し走らすことを意味する:
- 1 個の`入力~符号位置を消費する$
- `現在の入力~符号位置$に応じて、[ 後続の~blockに記された,対応する段 ]を走らす
繰返nは、 値を返した時点( ~RET )で終了する。
4.3. ~tokenizer~algo
この節に定義する一連の~algoは、[ `符号位置$たちが成す~stream ]を[ ~tokenたちが成す~stream ]へ形式変換する。 ◎ The algorithms defined in this section transform a stream of code points into a stream of tokens.
4.3.1. ~tokenを消費する
この節では、 `符号位置$たちが成す~streamから `~tokenを消費する@ 方法を述べる。 それは、 所与の ( %入力, 真偽値 %~unicode-rangeは許容されるか( 省略時は ~F ) ) に対し, 1 個の~tokenを返す: ◎ This section describes how to consume a token from a stream of code points. It additionally takes an optional boolean unicode ranges allowed, defaulting to false. It will return a single token of any type.
- `~comment列を消費する$() ◎ Consume comments.
-
~streamから`入力~符号位置を繰返し消費する$: ◎ Consume the next input code point.
- `空白$
-
- ~WHILE[ `C1$V ~IN `空白$ ] ⇒ 1 個の`入力~符号位置を消費する$
- ~RET 新たな `whitespace$tok
- `22^U
-
- ~RET `文字列~tokenを消費する$()
- `23^U
-
-
~IF[ `C1$V ~IN `~ident符号位置$ ]~OR[ ( `C1$V, `C2$V ) は`妥当な~escape$を成す ]: ◎ If the next input code point is an ident code point or the next two input code points are a valid escape, then:
- %型 ~LET [ 次が満たされるならば `id^i / ~ELSE_ `無制約^i ] ⇒ ( `C1$V, `C2$V, `C3$V ) は`~identを開始している$ ◎ Create a <hash-token>. ◎ If the next 3 input code points would start an ident sequence, set the <hash-token>’s type flag to "id".
- %値 ~LET `~identを消費する$() ◎ Consume an ident sequence, and set the <hash-token>’s value to the returned string.
- ~RET 新たな `hash$tok — その ⇒# .値 ~SET %値, .型~flag ~SET %型 ◎ Return the <hash-token>.
- ~RET 新たな `delim$tok — その ⇒# .値 ~SET `現在の入力~符号位置$ ◎ Otherwise, return a <delim-token> with its value set to the current input code point.
-
- `27^U
-
- ~RET `文字列~tokenを消費する$()
- `28^U
-
- ~RET `open-paren$Tok
- `29^U
-
- ~RET `close-paren$Tok
- `2B^U
-
-
~IF[ 入力~streamは`実数を開始している$ ]:
- `現在の入力~符号位置を消費し直す$
- ~RET `数量-~tokenを消費する$()
- ~RET 新たな `delim$tok — その ⇒# .値 ~SET `現在の入力~符号位置$ ◎ Otherwise, return a <delim-token> with its value set to the current input code point.
-
- `2C^U
-
- ~RET 新たな `comma$tok
- `2D^U
-
-
~IF[ 入力~streamは`実数を開始している$ ]:
- `現在の入力~符号位置を消費し直す$
- ~RET `数量-~tokenを消費する$()
-
~IF[ `C1$V ~EQ `2D^U ]~AND[ `C2$V ~EQ `3E^U ]:
- 2 個の`入力~符号位置を消費する$
- ~RET 新たな `CDC$tok
-
~IF[ 入力~streamは`~identを開始している$ ]:
- `現在の入力~符号位置を消費し直す$
- ~RET `~identに類する~tokenを消費する$()
- ~RET 新たな `delim$tok — その ⇒# .値 ~SET `現在の入力~符号位置$ ◎ Otherwise, return a <delim-token> with its value set to the current input code point.
-
- `2E^U
-
-
~IF[ 入力~streamは`実数を開始している$ ]:
- `現在の入力~符号位置を消費し直す$
- ~RET `数量-~tokenを消費する$()
- ~RET 新たな `delim$tok — その ⇒# .値 ~SET `現在の入力~符号位置$ ◎ Otherwise, return a <delim-token> with its value set to the current input code point.
-
- `3A^U
-
- ~RET 新たな `colon$tok
- `3B^U
-
- ~RET 新たな `semicolon$tok
- `3C^U
-
-
~IF[ `C1$V ~EQ `21^U ]~AND[ `C2$V ~EQ `2D^U ]~AND[ `C3$V ~EQ `2D^U ]:
- 3 個の`入力~符号位置を消費する$
- ~RET 新たな `CDO$tok
- ~RET 新たな `delim$tok — その ⇒# .値 ~SET `現在の入力~符号位置$ ◎ Otherwise, return a <delim-token> with its value set to the current input code point.
-
- `40^U
-
-
~IF[ ( `C1$V, `C2$V, `C3$V ) は`~identを開始している$ ]: ◎ If the next 3 input code points would start an ident sequence,\
- %名前 ~LET `~identを消費する$() ◎ consume an ident sequence,\
- ~RET 新たな `at-keyword$tok — その ⇒# .値 ~SET %名前 ◎ create an <at-keyword-token> with its value set to the returned value, and return it.
- ~RET 新たな `delim$tok — その ⇒# .値 ~SET `現在の入力~符号位置$ ◎ Otherwise, return a <delim-token> with its value set to the current input code point.
-
- `5B^U
-
- ~RET `open-square$Tok
- `5C^U
-
-
~IF[ ( `現在の入力~符号位置$, `C1$V ) は`妥当な~escape$を成す ]:
- `現在の入力~符号位置を消費し直す$
- ~RET `~identに類する~tokenを消費する$()
- `構文解析error$ ◎ Otherwise, this is a parse error.\
- ~RET 新たな `delim$tok — その ⇒# .値 ~SET `現在の入力~符号位置$ ◎ Return a <delim-token> with its value set to the current input code point.
-
- `5D^U
-
- ~RET `close-square$Tok
- `7B^U
-
- ~RET `open-curly$Tok
- `7D^U
-
- ~RET `close-curly$Tok
- `数字$
-
- `現在の入力~符号位置を消費し直す$
- ~RET `数量-~tokenを消費する$()
- `55^U
- `75^U
-
-
~IF[ %~unicode-rangeは許容されるか ~EQ ~T ]~AND[ 入力~streamは`~unicode-rangeを開始している$ ]: ◎ If unicode ranges allowed is true and the input stream would start a unicode-range,\
- `現在の入力~符号位置を消費し直す$ ◎ reconsume the current input code point,\
- ~RET `~unicode-range~tokenを消費する$() ◎ consume a unicode-range token, and return it.
- `現在の入力~符号位置を消費し直す$ ◎ Otherwise, reconsume the current input code point,\
- ~RET `~identに類する~tokenを消費する$() ◎ consume an ident-like token, and return it.
-
- `~identを開始する符号位置$ ◎ ident-start code point
-
- `現在の入力~符号位置を消費し直す$
- ~RET `~identに類する~tokenを消費する$()
- `~EOF$i
-
- ~RET `EOF$tok
- 他全部
-
- ~RET 新たな `delim$tok — その ⇒# .値 ~SET `現在の入力~符号位置$
4.3.2. ~comment列を消費する
この節では、 `符号位置$たちが成す~streamから `~comment列を消費する@ 方法を述べる。 それは ε を返す: ◎ This section describes how to consume comments from a stream of code points. It returns nothing.
-
~WHILE[ `C1$V ~EQ `2F^U ]~AND[ `C2$V ~EQ `2A^U ]:
- 2 個の`入力~符号位置を消費する$
-
~WHILE[ `現在の入力~符号位置$ ~NEQ `~EOF$i ]:
- 1 個の`入力~符号位置を消費する$
- ~IF[ `現在の入力~符号位置$ ~EQ `2A^U ]~AND[ `C1$V ~EQ `2F^U ] ⇒# 1 個の`入力~符号位置を消費する$; ~BREAK
- ~IF[ `現在の入力~符号位置$ ~EQ `~EOF$i ] ⇒ `構文解析error$ ◎ If the preceding paragraph ended by consuming an EOF code point, this is a parse error.
- ~RET ε ◎ Return nothing.
4.3.3. 数量-~tokenを消費する
この節では、 `符号位置$たちが成す~streamから `数量-~tokenを消費する@ 方法を述べる。 それは[ `number$tok / `percentage$tok / `dimension$tok ]を返す: ◎ This section describes how to consume a numeric token from a stream of code points. It returns either a <number-token>, <percentage-token>, or <dimension-token>.
- ( %数値 , %型, %符号~文字 ) ~LET `実数を消費する$() ◎ Consume a number and let number be the result.
-
~IF[ ( `C1$V, `C2$V, `C3$V ) は`~identを開始している$ ]:
- %単位 ~LET `~identを消費する$()
- ~RET 新たな `dimension$tok — その ⇒# .数値 ~SET %数値, .型~flag ~SET %型, .符号~文字 ~SET %符号~文字, .単位 ~SET %単位
-
~IF[ `C1$V ~EQ `25^U ]:
- 1 個の`入力~符号位置を消費する$
- ~RET 新たな `percentage$tok — その ⇒# .数値 ~SET %数値, .符号~文字 ~SET %符号~文字
- ~RET 新たな `number$tok — その ⇒# .数値 ~SET %数値, .型~flag ~SET %型, .符号~文字 ~SET %符号~文字 ◎ Otherwise, create a <number-token> with the same value, type flag, and sign character as number, and return it.
4.3.4. ~identに類する~tokenを消費する
この節では、 `符号位置$たちが成す~streamから `~identに類する~tokenを消費する@ 方法を述べる。 それは[ `ident$tok / `function$tok / `url$tok / `bad-url$tok ]を返す: ◎ This section describes how to consume an ident-like token from a stream of code points. It returns an <ident-token>, <function-token>, <url-token>, or <bad-url-token>.
- %文字列 ~LET `~identを消費する$() ◎ Consume an ident sequence, and let string be the result.
-
~IF[ %文字列 ~EQ`大小無視$sub `url^l ]~AND[ `C1$V ~EQ `28^U ]: ◎ If string’s value is an ASCII case-insensitive match for "url", and the next input code point is U+0028 LEFT PARENTHESIS ((),\
- 1 個の`入力~符号位置を消費する$ ◎ consume it.\
- ~WHILE [ `C1$V ~IN `空白$ ]~AND[ `C2$V ~IN `空白$ ] ⇒ 1 個の`入力~符号位置を消費する$ ◎ While the next two input code points are whitespace, consume the next input code point.\
- %c ~LET [ `C1$V ~IN `空白$ならば `C2$V/ ~ELSE_ `C1$V ] ◎ ↓
-
~IF[ %c ~IN { `22^U, `27^U } ]:
- `現在の入力~符号位置を消費し直す$
- ~RET 新たな `function$tok — その ⇒# .値 ~SET %文字列
【 引数が引用符で括られた `url("…")^c のような文字列は、 `function$tok と引数たちが成す並びと見なされる。 】
◎ If the next one or two input code points are U+0022 QUOTATION MARK ("), U+0027 APOSTROPHE ('), or whitespace followed by U+0022 QUOTATION MARK (") or U+0027 APOSTROPHE ('), then create a <function-token> with its value set to string and return it.\ - ~RET `~URL~tokenを消費する$() ◎ Otherwise, consume a url token, and return it.
-
~IF[ `C1$V ~EQ `28^U ]:
- 1 個の`入力~符号位置を消費する$
- ~RET 新たな `function$tok — その ⇒# .値 ~SET %文字列
- ~RET 新たな `ident$tok — その ⇒# .値 ~SET %文字列 ◎ Otherwise, create an <ident-token> with its value set to string and return it.
4.3.5. 文字列~tokenを消費する
この節では、 `符号位置$たちが成す~streamから `文字列~tokenを消費する@ 方法を述べる。 それは[ `string$tok / `bad-string$tok ]を返す: ◎ This section describes how to consume a string token from a stream of code points. It returns either a <string-token> or <bad-string-token>.
この~algoは[ 文字列を終端させる`符号位置$を表す %終端ng符号位置 ]も伴って~callされることもある。 %終端ng符号位置 が指定されずに~callされた場合、 `現在の入力~符号位置$がそれに利用される。 【終端ng符号位置までは消費されつつ,結果の文字列には終端ng符号位置は含まれない。】 ◎ This algorithm may be called with an ending code point, which denotes the code point that ends the string. If an ending code point is not specified, the current input code point is used.
- %文字列 ~LET 空~文字列 ◎ Initially create a <string-token> with its value set to the empty string.
-
~streamから`入力~符号位置を繰返し消費する$: ◎ Repeatedly consume the next input code point from the stream:
- %終端ng符号位置
-
- ~RET 新たな `string$tok — その ⇒# .値 ~SET %文字列
- `~EOF$i
-
- `構文解析error$
- ~RET 新たな `string$tok — その ⇒# .値 ~SET %文字列
- `改行文字$
-
- `構文解析error$
- `現在の入力~符号位置を消費し直す$
- ~RET 新たな `bad-string$tok
- `5C^U
-
`C1$V に応じて:
- `~EOF$i
- 何もしない
- `改行文字$
- 1 個の`入力~符号位置を消費する$
- その他
-
- ~Assert: ( `現在の入力~符号位置$, `C1$V ) は`妥当な~escape$を成す
- %文字列 に次の結果を付加する ⇒ `~escapeされた符号位置を消費する$()
- 他全部
-
- %文字列 に`現在の入力~符号位置$を付加する
4.3.6. ~URL~tokenを消費する
この節では、 `符号位置$たちが成す~streamから `~URL~tokenを消費する@ 方法を述べる。 それは[ `url$tok / `bad-url$tok ]を返す: ◎ This section describes how to consume a url token from a stream of code points. It returns either a <url-token> or a <bad-url-token>.
注記: この~algoは、 直前に `url(^l が消費-済みであると見做す。 また、 `url(foo)^v の様な “引用符で括られてない” 値を消費するために~callされているものと見做す。 `url("foo")^v の様に引用符で括られた値は、 `function-token$t として構文解析される。 `~identに類する~tokenを消費する$~algoは、 この~~区別を自動的に取扱う — この~algoは、 他からは直に~callされるベキでない。 ◎ Note: This algorithm assumes that the initial "url(" has already been consumed. This algorithm also assumes that it’s being called to consume an "unquoted" value, like url(foo). A quoted value, like url("foo"), is parsed as a <function-token>. Consume an ident-like token automatically handles this distinction; this algorithm shouldn’t be called directly otherwise.
- %~URL ~LET 空~文字列 ◎ Initially create a <url-token> with its value set to the empty string.
- ~WHILE[ `C1$V ~IN `空白$ ] ⇒ 1 個の`入力~符号位置を消費する$ ◎ Consume as much whitespace as possible.
-
~streamから`入力~符号位置を繰返し消費する$: ◎ Repeatedly consume the next input code point from the stream:
- `29^U
-
- ~RET 新たな `url$tok — その ⇒# .値 ~SET %~URL
- `~EOF$i
-
- `構文解析error$
- ~RET 新たな `url$tok — その ⇒# .値 ~SET %~URL
- `空白$
-
- ~WHILE[ `C1$V ~IN `空白$ ] ⇒ 1 個の`入力~符号位置を消費する$ ◎ Consume as much whitespace as possible.\
-
`C1$V に応じて:
- `~EOF$i
-
- 1 個の`入力~符号位置を消費する$
- `構文解析error$
- ~RET 新たな `url$tok — その ⇒# .値 ~SET %~URL
- `29^U
-
- 1 個の`入力~符号位置を消費する$
- ~RET 新たな `url$tok — その ⇒# .値 ~SET %~URL
- その他
-
- `不良~URLの残余を消費する$()
- ~RET 新たな `bad-url$tok
- `22^U
- `27^U
- `28^U
- `印字不能~符号位置$
-
- `構文解析error$
- `不良~URLの残余を消費する$()
- ~RET 新たな `bad-url$tok
- `5C^U
-
-
~IF[ ( `現在の入力~符号位置$, `C1$V ) は`妥当な~escape$を成す ]: ◎ If the stream starts with a valid escape,\
- %~escape ~LET `~escapeされた符号位置を消費する$() ◎ consume an escaped code point and\
- %~URL に %~escape を付加する ◎ append the returned code point to the <url-token>’s value.
-
~ELSE:
- `構文解析error$
- `不良~URLの残余を消費する$()
- ~RET 新たな `bad-url$tok
-
- 他全部
-
- %~URL に`現在の入力~符号位置$を付加する
4.3.7. ~escapeされた符号位置を消費する
この節では、 `~escapeされた符号位置を消費する@ 方法を述べる。 これは、[ 直前に `5C^U が消費-済みである ]かつ[ `C1$V は`妥当な~escape$の一部を成す ]ことが検証y-済みであると見做す。 これは、 1 個の`符号位置$を返す: ◎ This section describes how to consume an escaped code point. It assumes that the U+005C REVERSE SOLIDUS (\) has already been consumed and that the next input code point has already been verified to be part of a valid escape. It will return a code point.
- 1 個の`入力~符号位置を消費する$ ◎ Consume the next input code point.
-
`現在の入力~符号位置$に応じて: ◎ ↓
- `~hex$
-
- %~hex列 ~LET 空~文字列 ◎ ↓
-
~WHILE[ %~hex列 の長さ ~LT 6 ]:
- %~hex列 に`現在の入力~符号位置$を付加する
- ~IF[ `C1$V ~IN `~hex$ ] ⇒ 1 個の`入力~符号位置を消費する$
- ~ELSE ⇒ ~BREAK
- ~IF[ `C1$V ~IN `空白$ ] ⇒ 1 個の`入力~符号位置を消費する$ ◎ If the next input code point is whitespace, consume it as well.\
- %数値 ~SET %~hex列 を16 進数として解釈した結果 ◎ Interpret the hex digits as a hexadecimal number.\
- ~IF[ %数値 ~EQ 0 ]~OR[ %数値 ~IN `~surrogate$ ]~OR[ %数値 ~GT `許容される最大な符号位置$ ] ⇒ ~RET `FFFD^U ◎ If this number is zero, or is for a surrogate, or is greater than the maximum allowed code point, return U+FFFD REPLACEMENT CHARACTER (�).\
- ~RET %数値 を値とする `符号位置$ ◎ Otherwise, return the code point with that value.
- `~EOF$i
-
- `構文解析error$
- ~RET `FFFD^U
- 他全部
- ~RET `現在の入力~符号位置$ ◎ Return the current input code point.
4.3.8. 2 個の符号位置が成す並びが妥当な~escapeを成すかどうか検査する
この節では、 2 個の`符号位置$ ( %c0, %c1 ) が成す並びが `妥当な~escape@ を成すかどうか検査する方法を述べる。 【!or can be called with the input stream itself…】 ◎ This section describes how to check if two code points are a valid escape. The algorithm described here can be called explicitly with two code points, or can be called with the input stream itself. In the latter case, the two code points in question are the current input code point and the next input code point, in that order.
注記: この~algoは`符号位置$を消費しない。 ◎ Note: This algorithm will not consume any additional code point.
- ~RET ~IS[ %c0 ~EQ `5C^U ]~AND[ %c1 は`改行文字$でない ] ◎ If the first code point is not U+005C REVERSE SOLIDUS (\), return false. ◎ Otherwise, if the second code point is a newline, return false. ◎ Otherwise, return true.
4.3.9. 3 個の符号位置が成す並びが~identを開始しているかどうか検査する
この節では、 3 個の`符号位置$ ( %c0, %c1, %c2 ) が成す並びが `~identを開始している@ かどうか検査する方法を述べる。 この~algoの入力には、 入力~streamそのものが渡されることもある — その場合、 ( `現在の入力~符号位置$, `C1$V, `C2$V ) に対し適用するとする。 ◎ This section describes how to check if three code points would start an ident sequence. The algorithm described here can be called explicitly with three code points, or can be called with the input stream itself. In the latter case, the three code points in question are the current input code point and the next two input code points, in that order.
注記: この~algoは`符号位置$を消費しない。 ◎ Note: This algorithm will not consume any additional code points.
-
~RET ~IS[ ( %c0, %c1, %c2 ) は次の表tを成す いずれかの行に示される条件を満たす ]:
%c0 %c1 %c2 `2D^U `~identを開始する符号位置$ (任意) `2D^U `2D^U (任意) `2D^U `妥当な~escape$を成す `~identを開始する符号位置$ (任意) (任意) `妥当な~escape$を成す (任意) Look at the first code point:
- U+002D HYPHEN-MINUS
- If the second code point is an ident-start code point or a U+002D HYPHEN-MINUS, or the second and third code points are a valid escape, return true. Otherwise, return false.
- ident-start code point
- Return true.
- U+005C REVERSE SOLIDUS (\)
- If the first and second code points are a valid escape, return true. Otherwise, return false.
- anything else
- Return false.
4.3.10. 3 個の符号位置が成す並びが実数を開始しているかどうか検査する
この節では、 3 個の`符号位置$ ( %c0, %c1, %c2 ) が成す並びが `実数を開始している@ かどうか検査する方法を述べる。 この~algoの入力には、 入力~streamそのものが渡されることもある — その場合、 ( `現在の入力~符号位置$, `C1$V, `C2$V ) に対し適用するとする。 ◎ This section describes how to check if three code points would start a number. The algorithm described here can be called explicitly with three code points, or can be called with the input stream itself. In the latter case, the three code points in question are the current input code point and the next two input code points, in that order.
注記: この~algoは`符号位置$を消費しない。 ◎ Note: This algorithm will not consume any additional code points.
-
~RET ~IS[ ( %c0, %c1, %c2 ) は次の表tを成す いずれかの行に示される条件を満たす ]:
%c0 %c1 %c2 `正負符号$ `数字$ (任意) `正負符号$ `2E^U `数字$ `2E^U `数字$ (任意) `数字$ (任意) (任意) Look at the first code point:
- U+002B PLUS SIGN (+)
- U+002D HYPHEN-MINUS (-)
-
If the second code point is a digit, return true.
Otherwise, if the second code point is a U+002E FULL STOP (.) and the third code point is a digit, return true.
Otherwise, return false.
- U+002E FULL STOP (.)
- If the second code point is a digit, return true. Otherwise, return false.
- digit
- Return true.
- anything else
- Return false.
4.3.11. 3 個の符号位置が成す並びが~unicode-rangeを開始しているかどうか検査する
この節では、 3 個の`符号位置$が成す並び ( %c0, %c1, %c2 ) が `~unicode-rangeを開始している@ かどうか検査する方法を述べる。 この~algoの入力には、 入力~streamそのものが渡されることもある — その場合、 ( `現在の入力~符号位置$, `C1$V, `C2$V ) に対し適用するとする。 ◎ This section describes how to check if three code points would start a unicode-range. The algorithm described here can be called explicitly with three code points, or can be called with the input stream itself. In the latter case, the three code points in question are the current input code point and the next two input code points, in that order.
注記: この~algoは`符号位置$を消費しない。 ◎ Note: This algorithm will not consume any additional code points.
-
~RET ~IS ~AND↓:
- %c0 ~IN { `55^U, `75^U }
- %c1 ~EQ `2B^U
- %c2 ~IN { `3F^U, `~hex$ }
4.3.12. ~identを消費する
この節では、 `符号位置$たちが成す~streamから `~identを消費する@ 方法を述べる。 それは、 ~stream内の `C1$V から始まる最長な名前を成す文字列を返す。 ◎ This section describes how to consume an ident sequence from a stream of code points. It returns a string containing the largest name that can be formed from adjacent code points in the stream, starting from the first.
注記: この~algoは、 最初の少数の`符号位置$の検証y — それは、 返される`符号位置$が `ident$tok の一部を成すことを確保するために必要yある — を行わない。 意図的にそのように利用するときは、[ ~streamは`~identを開始している$こと ]を事前に確保すること。 ◎ Note: This algorithm does not do the verification of the first few code points that are necessary to ensure the returned code points would constitute an <ident-token>. If that is the intended use, ensure that the stream starts with an ident sequence before calling this algorithm.
- %結果 ~LET 空~文字列 ◎ Let result initially be an empty string.
-
~streamから`入力~符号位置を繰返し消費する$: ◎ Repeatedly consume the next input code point from the stream:
- `~ident符号位置$ ◎ ident code point
-
- %結果 に`現在の入力~符号位置$を付加する
- ( `現在の入力~符号位置$, `C1$V ) は`妥当な~escape$を成す ◎ the stream starts with a valid escape
-
- %結果 に次の結果を付加する ⇒ `~escapeされた符号位置を消費する$()
- 他全部
-
- `現在の入力~符号位置を消費し直す$
- ~RET %結果
4.3.13. 実数を消費する
この節では、 `符号位置$たちが成す~streamから `実数を消費する@ 方法を述べる。 それは、 ( 数値, %型~flag ~IN { `整数^i, `実数^i }, %符号~文字 ~IN { `正負符号$, ε} ) が成す組を返す。 ◎ This section describes how to consume a number from a stream of code points. It returns a numeric value, a string type which is either "integer" or "number", and an optional sign character which is either "+", "-", or missing.
注記: この~algoは、[ ~streamから実数が得せること ]を確保するために必要yな[ 最初の少数の`符号位置$の検証y ]を行わない。 ~callする際には,[ ~streamは`実数を開始している$こと ]を事前に確保すること。 ◎ Note: This algorithm does not do the verification of the first few code points that are necessary to ensure a number can be obtained from the stream. Ensure that the stream starts with a number before calling this algorithm.
- %型 ~LET `整数^i ◎ Let type be the string "integer".\
- %実数~部 ~LET 空~文字列 ◎ Let number part and exponent part be the empty string.
- %指数~部 ~LET 空~文字列 ◎ ↑
- %符号~文字 ~LET `C1$V ◎ ↓
- ~IF[ %符号~文字 ~NIN `正負符号$ ] ⇒ %符号~文字 ~SET ε ◎ ↓
- ~ELSE ⇒# 1 個の`入力~符号位置を消費する$; %符号~文字 を %実数~部 に付加する ◎ If the next input code point is U+002B PLUS SIGN (+) or U+002D HYPHEN-MINUS (-), consume it. Append it to number part and set sign character to it.
- ~WHILE[ `C1$V ~IN `数字$ ] ⇒# 1 個の`入力~符号位置を消費する$; %実数~部 に`現在の入力~符号位置$を付加する ◎ While the next input code point is a digit, consume it and append it to number part.
-
~IF[ `C1$V ~EQ `2E^U ]~AND[ `C2$V ~IN `数字$ ]:
- 1 個の`入力~符号位置を消費する$
- %実数~部 に`現在の入力~符号位置$を付加する
- ~WHILE[ `C1$V ~IN `数字$ ] ⇒# 1 個の`入力~符号位置を消費する$; %実数~部 に`現在の入力~符号位置$を付加する
- %型 ~SET `実数^i
- %c ~LET [ `C2$V ~IN `正負符号$ならば `C3$V / ~ELSE_ `C2$V ] ◎ ↓
-
~IF[ `C1$V ~IN { `45^U, `65^U } ]~AND[ %c ~IN `数字$ ]: ◎ If the next 2 or 3 input code points are U+0045 LATIN CAPITAL LETTER E (E) or U+0065 LATIN SMALL LETTER E (e), optionally followed by U+002D HYPHEN-MINUS (-) or U+002B PLUS SIGN (+), followed by a digit, then:
- 1 個の`入力~符号位置を消費する$ ◎ Consume the next input code point.
- ~IF[ `C1$V ~IN `正負符号$ ] ⇒# 1 個の`入力~符号位置を消費する$; %指数~部 に`現在の入力~符号位置$を付加する ◎ If the next input code point is "+" or "-", consume it and append it to exponent part.
- ~WHILE[ `C1$V ~IN `数字$ ] ⇒# 1 個の`入力~符号位置を消費する$; %指数~部 に`現在の入力~符号位置$を付加する ◎ While the next input code point is a digit, consume it and append it to exponent part.
- %型 ~SET `実数^i ◎ Set type to "number".
- %値 ~LET %実数~部 を 10 進数として解釈した結果 ◎ Let value be the result of interpreting number part as a base-10 number.
- ~IF[ %指数~部 ~NEQ 空~文字列 ] ⇒ %値 ~SET %値 ~MUL ( 10 の ( %指数~部 を 10 進数として解釈した結果 ) 乗 ) ◎ If exponent part is non-empty, interpret it as a base-10 integer, then raise 10 to the power of the result, multiply it by value, and set value to that result.
- ~RET ( %値, %型, %符号~文字 ) ◎ Return value, type, and sign character.
4.3.14. ~unicode-range~tokenを消費する
この節では、 `符号位置$たちが成す~streamから `~unicode-range~tokenを消費する@ 方法を述べる。 それは `unicode-range$tok を返す: ◎ This section describes how to consume a unicode-range token from a stream of code points. It returns a <unicode-range-token>.
注記: この~algoは、[ 返される`符号位置$が `unicode-range$tok の一部を成すこと ]を確保するために必要yな[ 最初の少数の`符号位置$の検証y ]を行わない。 [ ~streamは`~unicode-rangeを開始している$こと ]を事前に確保すること。 ◎ Note: This algorithm does not do the verification of the first few code points that are necessary to ensure the returned code points would constitute an <unicode-range-token>. Ensure that the stream would start a unicode-range before calling this algorithm.
注記: ~tokenizerは、 通常の状況下では, この~tokenを生産しない。 この~algoは、 `~unicode-range記述子の値を消費する$間に限り,~callされる — それ自体も `unicode-range$d 記述子を構文解析するための特別な事例に限り,~callされる。 ~CSS言語~全体における この単独の呼出nは, 早期~CSSにおける構文の不良な設計に因る。 ◎ Note: This token is not produced by the tokenizer under normal circumstances. This algorithm is only called during consume the value of a unicode-range descriptor, which itself is only called as a special case for parsing the unicode-range descriptor; this single invocation in the entire language is due to a bad syntax design in early CSS.
- 1 個の`入力~符号位置を消費する$ ◎ Consume the next two input code points and discard them.
- %第一~区分 ~LET 空~文字列 ◎ ↓
- ~WHILE[ %第一~区分 の長さ ~LT 6 ]~AND[ `C1$V ~IN `~hex$ ] ⇒# 1 個の`入力~符号位置を消費する$; %第一~区分 に`現在の入力~符号位置$を付加する ◎ Consume as many hex digits as possible, but no more than 6.\
- ~WHILE[ %第一~区分 の長さ ~LT 6 ]~AND[ `C1$V ~EQ `3F^U ] ⇒# 1 個の`入力~符号位置を消費する$; %第一~区分 に`現在の入力~符号位置$を付加する ◎ If less than 6 hex digits were consumed, consume as many U+003F QUESTION MARK (?) code points as possible, but no more than enough to make the total of hex digits and U+003F QUESTION MARK (?) code points equal to 6. ◎ Let first segment be the consumed code points.
- %範囲~始端 ~LET [ %第一~区分 を成す各 `3F^U を `30^U に置換した結果 ]を 16 進数として解釈した結果 ◎ ↓
- %範囲~終端 ~LET [ %第一~区分 を成す各 `3F^U を `46^U に置換した結果 ]を 16 進数として解釈した結果 ◎ If first segment contains any question mark code points, then: • Replace the question marks in first segment with U+0030 DIGIT ZERO (0) code points, and interpret the result as a hexadecimal number. Let this be start of range. • Replace the question marks in first segment with U+0046 LATIN CAPITAL LETTER F (F) code points, and interpret the result as a hexadecimal number. Let this be end of range. • ↓ Return a new <unicode-range-token> starting at start of range and ending at end of range. ◎ ↓
-
~IF[ %範囲~始端 ~EQ %範囲~終端 (すなわち, %第一~区分 は `3F^U を包含しない) ]~AND[ `C1$V ~EQ `2D^U ]~AND[ `C2$V ~IN `~hex$ ]: ◎ Otherwise, interpret first segment as a hexadecimal number, and let the result be start of range. ◎ If the next 2 input code points are U+002D HYPHEN-MINUS (-) followed by a hex digit, then:
- 1 個の`入力~符号位置を消費する$ ◎ Consume the next input code point.
- %第二~区分 ~LET 空~文字列 ◎ ↓
- ~WHILE[ %第二~区分 の長さ ~LT 6 ]~AND[ `C1$V ~IN `~hex$ ] ⇒# 1 個の`入力~符号位置を消費する$; %第二~区分 に`現在の入力~符号位置$を付加する ◎ Consume as many hex digits as possible, but no more than 6.\
- %範囲~終端 ~SET %第二~区分 を 16 進数として解釈した結果 ◎ Interpret the consumed code points as a hexadecimal number. Let this be end of range. ◎ ↓ Return a new <unicode-range-token> starting at start of range and ending at end of range.
- ~RET 新たな `unicode-range$tok — その ⇒# .始端 ~SET %範囲~始端, .終端 ~SET %範囲~始端 ◎ Otherwise, return a new <unicode-range-token> both starting and ending at start of range.
4.3.15. 不良~URLの残余を消費する
この節では、 `不良~URLの残余を消費する@ 方法を述べる。 それは、 ~tokenizerが,`符号位置$たちが成す~streamにおいて[ `url$tok ではなく,`bad-url$tok の中途にある ]ことが~~判明した際の “後始末” を行う。 それは ε を返し、 もっぱら,[ 通常の~token化処理を再開できるような回復~地点に達するまで,入力~streamを十分に消費する ]ために利用される。 ◎ This section describes how to consume the remnants of a bad url from a stream of code points, "cleaning up" after the tokenizer realizes that it’s in the middle of a <bad-url-token> rather than a <url-token>. It returns nothing; its sole use is to consume enough of the input stream to reach a recovery point where normal tokenizing can resume.
-
~streamから`入力~符号位置を繰返し消費する$: ◎ Repeatedly consume the next input code point from the stream:
- `29^U
- `~EOF$i
-
- ~RET ε
- ( `現在の入力~符号位置$, `C1$V ) は`妥当な~escape$を成す ◎ the input stream starts with a valid escape
-
- `~escapeされた符号位置を消費する$()
- 注記: これは、 `bad-url$tok を終端させずに,[ ~escapeされた閉じ丸括弧( `\)^l ) ]を取り込めるようにする。 それ以外については “他全部” の段と一致する。 ◎ This allows an escaped right parenthesis ("\)") to be encountered without ending the <bad-url-token>. This is otherwise identical to the "anything else" clause.
- 他全部
-
- 何もしない
5. 構文解析-法
~CSS構文解析器は、 `~token~stream$ (`§ ~tokenizer~algo@#tokenizer-algorithms$により生産された結果) を 1 個以上の~CSS構成子たち (どの構文解析~algoが呼出されたかに依存する) へ変換する。 ◎ The CSS parser converts a token stream (produced by the tokenization process, defined earlier in this spec) into one or more of several CSS constructs (depending on which parsing algorithm is invoked).
5.1. 構文解析器の線路図式
◎非規範的この節は、 構文解析器の参考~viewを,線路図式の形で呈示する。 ◎ This section presents an informative view of the parser, in the form of railroad diagrams.
これらの図式は、 `参考であり, 不完全である^em。 ~stylesheetの “正しい” 文法は述べるが、 ~errorの取扱いは まったく述べない。 それらはもっぱら,構文を直感的に把握し易くするために供されている。 ◎ These diagrams are informative and incomplete; they describe the grammar of "correct" stylesheets, but do not describe error-handling at all. They are provided solely to make it easier to get an intuitive grasp of the syntax.
- `Stylesheet^sb(~stylesheet)
- `stylesheet^dgm
- `At-rule^sb(`~at-規則$)
- `at-rule^dgm
- `Qualified rule^sb(`有修飾~規則$)
- `qualified-rule^dgm
- `{} block^sb
- `declaration-list^dgm
- 【 `波括弧~block$と同じ名前だが,定義が異なっていて紛らわしい。 】
- `Declaration^sb(`宣言$)
- `declaration^dgm
- `!important^sb
- `important^dgm
- `Component value^sb(`成分~値$)
- `component-value^dgm
- `Simple block^sb(`単純~block$)
- `simple-block^dgm
- `Function block^sb(`関数$)
- `function-block^dgm
5.2. ~CSS構文解析の結果
構文解析の結果は、 次に挙げるいずれか — あるいは、 それらが成す`~list$ — になる: ◎ The result of parsing can be any of the following (or lists of these):
- `~stylesheet@ ◎ stylesheet
-
次に挙げる~fieldを伴う:
- .`規則~群^dfn — `規則$たちが成す`~list$
- `規則@ ◎ rule
- `~at-規則$ / `有修飾~規則$ 【/ `入子な宣言~列が成す規則$】 ◎ A rule is either an at-rule or a qualified rule.
- `~at-規則$ ◎ at-rule
-
次に挙げる~fieldを伴う:
- .`名前^dfn — `文字列$
- .`導入部^dfn — `成分~値$たちが成す`~list$
- .`宣言~群^dfn — ε / `宣言$たちが成す`~list$
- .`子~規則~群^dfn — ε / 子`規則$たちが成す`~list$
これらのうち,[ .宣言~群 / .子~規則~群 ]は、 `~block~at-規則$(`波括弧~block$で終端するもの)に限り非 ε になり, ~semicolonで終端する`一文~at-規則$においては ε になる。
◎ An at-rule has a name which is a string, a prelude consisting of a list of component values. Block at-rules (ending in a {}-block) will additionally have a list of declarations and a list of child rules. (Statement at-rules, ending in a semicolon, will not.) - `有修飾~規則@ ◎ qualified rule
-
次に挙げる~fieldを伴う:
- .`導入部^dfn — `成分~値$たちが成す`~list$
- .`宣言~群^dfn — `宣言$たちが成す`~list$
- .`子~規則~群^dfn — 子`規則$たちが成す`~list$
- 注記: ほとんどの有修飾~規則は、 ~style規則になり,その[ .導入部は`選択子$, .宣言~群は`~prop$たち ]を与える。 ◎ Note: Most qualified rules will be style rules, where the prelude is a selector [selectors-4] and its declarations are properties.
- `宣言@ ◎ declaration
-
次に挙げる~fieldを伴う:
- .`名前^dfn — `文字列$
- .`値^dfn — `成分~値$たちが成す`~list$
- .`~importantか^dfn — 真偽値, 初期~時は ~F 【`~importantな宣言$になるかどうかを指示する。】
- .`元の~text^dfn — ε / 文字列 (文字列は、少数の宣言に限り捕捉される。)
-
宣言たちは、 次に挙げるいずれかに分類される: ◎ Declarations are further categorized as property declarations or descriptor declarations, with\
- `~prop宣言@ ⇒ `有修飾~規則$内で出現することが最も多く,~CSS`~prop$を設定する。 ◎ the former setting CSS properties and appearing most often in qualified rules\
- `記述子~宣言@ ⇒ `~at-規則$内に限り出現し,~CSS`記述子$を設定する。 ◎ and the latter setting CSS descriptors, which appear only in at-rules.\
(この分類は、 この仕様の構文~levelにおいては生じない — この分類は、 宣言が出現する所における産物であり, 当の規則を定義する仕様により定義される。) ◎ (This categorization does not occur at the Syntax level; instead, it is a product of where the declaration appears, and is defined by the respective specifications defining the given rule.)
- `成分~値@ ◎ component value
- `保全d~token$ / `関数$ / `単純~block$ ◎ A component value is one of the preserved tokens, a function, or a simple block.
- `保全d~token@ ◎ preserved tokens
- 次に挙げるもの以外の,~tokenizerにより生産される任意の~token ⇒# `function$tok, `open-curly$Tok, `open-paren$Tok, `open-square$Tok ◎ Any token produced by the tokenizer except for <function-token>s, <{-token>s, <(-token>s, and <[-token>s.
- 注記: 上に挙げられた非`保全d~token$は、 常に,より高~levelな[ `関数$/`単純~block$ ]~objの中で消費されるので、 構文解析器の出力には,決して出現しない。 ◎ Note: The non-preserved tokens listed above are always consumed into higher-level objects, either functions or simple blocks, and so never appear in any parser output themselves.
- 注記: 【出力に出現する】 ~tokenのうち[ `close-curly$Tok, `close-paren$Tok, `close-square$Tok, `bad-string$tok, `bad-url$tok ]は,常に`構文解析error$を表すが、 それらは,[ 宣言や~blockを単にまるごと落とすより細やかな、 ~errorの取扱い ]を定義することを他の仕様 — `MEDIAQ$r など — に許容するため、 この仕様により,~token~streamの中に保全される。 ◎ Note: The tokens <}-token>s, <)-token>s, <]-token>, <bad-string-token>, and <bad-url-token> are always parse errors, but they are preserved in the token stream by this specification to allow other specs, such as Media Queries, to define more fine-grained error-handling than just dropping an entire declaration or block.
- `関数@ ◎ function
-
次に挙げる~fieldを伴う:
- .`名前^dfn
- .`値^dfn — `成分~値$たちが成す`~list$
- `単純~block@ ◎ simple block ◎ {}-block ◎ []-block ◎ ()-block
-
次に挙げる~fieldを伴う:
- .`開き括弧^dfn — 次に挙げるいずれか ⇒# `open-square$Tok / `open-paren$Tok / `open-curly$Tok
- .`値^dfn — `成分~値$たちが成す`~list$
-
`単純~block$は、 その.開き括弧に応じて:
- `open-square$Tok ならば `角括弧~block@ ( `[]-block^en )と称される。
- `open-paren$Tok ならば `丸括弧~block@ ( `()-block^en )と称される。
- `open-curly$Tok ならば `波括弧~block@ ( `{}-block^en )と称される。
5.3. ~token~stream
`~token~stream@ は、[ ~token/`成分~値$ ]たち~DAGGERが成す~streamを表現している`構造体$であり, 次に挙げる`~item$sctからなる: ◎ A token stream is a struct representing a stream of tokens and/or component values. It has the following items:
【 ~DAGGER ~tokenと成分~値が混在し得るかどうかは、 はっきりしない。 】
- `~token群@tS ◎ tokens
- [ ~token/`成分~値$ ]たちが成す`~list$。 ◎ A list of tokens and/or component values.
- 注記: 単純にするため、 この仕様は,[ 入力~streamは、 構文解析が始まる前に全部的に~token化済み ]と見做す。 しかしながら、 構文解析~algoは, 1 個の~tokenしか “先読み” に利用しないので、 実施においては,~token化と構文解析は “連動的” に行える。 ◎ Note: This specification assumes, for simplicity, that the input stream has been fully tokenized before parsing begins. However, the parsing algorithms only use one token of "lookahead", so in practice tokenization and parsing can be done in lockstep.
- `~index@tS ◎ index
- `~token群$tSの中を指す~index — 初期~時は 0 とする。 構文解析の進捗を表現する。 ◎ An index into the tokens, representing the progress of parsing. It starts at 0 initially.
- 注記: `~markを復旧する$tS【!`~markする$tS】ときは別として、 `~index$tSは決して後戻りしない。 したがって、 `~token群$tSを成す~tokenのうち,すでに処理したものは、 それに伴い,早急に破棄できる。 ◎ Note: Aside from marking, the index never goes backwards. Thus the already-processed prefix of tokens can be eagerly discarded as it’s processed.
- `~mark済み~index群@tS ◎ marked indexes
- ~indexたちが成す`~stack$ — 初期~時は空とする。 これは、 構文解析器が返るかもしれない地点たちを表現する。 ◎ A stack of index values, representing points that the parser might return to. It starts empty initially.
~CSSには、[ 宣言の値~用に構文解析して~tokenを生産する前の精確な~text ]を参照することを要求する箇所が少数ある。 したがって、 `~token~stream$は[ 宣言を成す.元の~textを その場で再生産する能 ]を有していなければナラナイ — それは、 ここでの~algo上の構造には明示的に述べられないが。 これがいつ要求されるかについての詳細は、 `宣言を消費する$を見よ。 ◎ CSS has a small number of places that require referencing the precise text that was parsed for a declaration’s value (not just what tokens were produced from that text). This is not explicitly described in the algorithmic structure here, but the token stream must, thus, have the ability to reproduce the original text of declarations on demand. See consume a declaration for details on when this is required.
`~token~stream$ %入力 に対しては、 次に挙げる演算が遂行され得る: ◎ Several operations can be performed on a token stream:
-
%入力 の `次回の~token@tS は、 次の結果を返す:
- %~index ~LET %入力 の`~index$tS
- %~token群 ~LET %入力 の`~token群$tS
- ~IF[ %~index ~GTE %~token群 の`~size$ ] ⇒ ~RET `EOF$tok
- ~RET %~token群[ %~index ]
- %入力 は `空@tS であるとは、 次を満たすことをいう ⇒ %入力 の`次回の~token$tS ~EQ `EOF$tok ◎ empty • A token stream is empty if the next token is an <eof-token>.
-
%入力 から `~tokenを消費する@tS ときは:
- %~token ~LET %入力 の`次回の~token$tS
- %入力 の`~index$tS ~INCBY 1
- ~RET %~token
- %入力 から `~tokenを破棄する@tS ときは ⇒ ~IF[ %入力 は`空$tSでない ] ⇒ %入力 の`~index$tS ~INCBY 1 ◎ discard a token • If the token stream is not empty, increment index.
- %入力 を `~markする@tS ときは ⇒ %入力 の`~mark済み~index群$tSに %入力 の`~index$tS を`付加する$ ◎ mark • Append index to marked indexes.
- %入力 の `~markを復旧する@tS ときは ⇒ %入力 の`~index$tS ~SET %入力 の`~mark済み~index群$tSから`~popする$ ◎ restore a mark • Pop from marked indexes, and set index to the popped value.
- %入力 の `~markを破棄する@tS ときは ⇒ %入力 の`~mark済み~index群$tSから`~popする$ (~popされた値は棄てる) ◎ discard a mark • Pop from marked indexes, and do nothing with the popped value.
- %入力 の `空白を破棄する@tS ときは ⇒ ~WHILE[ %入力 の`次回の~token$tSは `whitespace$tok である ] ⇒ %入力 から`~tokenを破棄する$tS ◎ discard whitespace • While the next token is a <whitespace-token>, discard a token.
-
%入力 を `処理する@tS 所では、 次を繰返す ⇒ %入力 の`次回の~token$tSに応じて、[ 後続の~block内に記された,当の~tokenの型に対応する動作 ]を遂行する
繰返nは、 当の動作が値を返した時点( ~RET )で終了する。
◎ process • To process, given a following list of token types and associated actions, perform the action associated with the next token. Repeat until one of the actions returns something, then return that.
`EOF@tok は、[ 実際に~tokenizerにより生産されることはない,概念的な~token ]であり,[ 当の`~token~stream$が枯渇したことを指示する ]ために利用される。 ◎ An <eof-token> is a conceptual token, not actually produced by the tokenizer, used to indicate that the token stream has been exhausted.
5.4. 構文解析器の入口
この節に定義する各種~algoは、 低~levelな~CSS~tokenから高~levelな~CSS~objを生産する。 ◎ The algorithms defined in this section produce high-level CSS objects from lists of CSS tokens.
これらの~algoは,~token~streamを入力として演算するが、 便利~用に,何種かの他の値~型でも — `~token~streamに正規化する$ことを介して,それが受容する値~型でも — 呼出せる。 ◎ The algorithms here operate on a token stream as input, but for convenience can also be invoked with a number of other value types.
`~token~streamに正規化する@ ときは、 所与の ( %入力 ) に対し, %入力 の型に応じて: ◎ To normalize into a token stream a given input:
- `~token~stream$ ⇒ ~RET %入力 ◎ If input is already a token stream, return it.
- [ ~token/`成分~値$ ]たちが成す~list ⇒ ~RET 新たな`~token~stream$ — その ⇒ `~token群$tS ~SET %入力 ◎ If input is a list of CSS tokens and/or component values, create a new token stream with input as its tokens, and return it.
-
`文字列$:
- %入力 ~SET `符号位置~列を~filterする$( %入力 )
- %~token群 ~LET 新たな`~list$
- `符号位置~streamを~token化する$( %入力, %~token群 )
- ~RET 新たな`~token~stream$ — その ⇒ `~token群$tS ~SET %~token群
- その他 ⇒ ~Assert: この事例は生じ得ない — %入力 として渡されるのは、 上に挙げた型に限られるベキである。 ◎ Assert: Only the preceding types should be passed as input.
注記: 他の仕様は、 自前の目的で,追加的な入口を定義できる。 ◎ Note: Other specs can define additional entry points for their own purposes.
以下の注記は、 おそらく,関連な仕様の規範的な~textに — この仕様の用語を通して — 翻訳されるべきである: ◎ The following notes should probably be translated into normative text in the relevant specs, hooking this spec’s terms:
- `~stylesheetを構文解析する$ ⇒ ~stylesheetを構文解析するための, 構文解析器の通常の入口になることが意図される。 ◎ "Parse a stylesheet" is intended to be the normal parser entry point, for parsing stylesheets.
- `~stylesheetの内容を構文解析する$ ⇒ `CSSStyleSheet^I の `replace()@~CSSOM1#dom-cssstylesheet-replace$c ~methodやそれに類似なものによる利用-用に意図され、 ~textを既存の~stylesheetを成す内容へ構文解析する。 ◎ "Parse a stylesheet’s contents" is intended for use by the CSSStyleSheet replace() method, and similar, which parse text into the contents of an existing stylesheet.
- `規則を構文解析する$ ⇒ `CSSStyleSheet^I の `insertRule()@~CSSOM1#dom-cssstylesheet-insertrule$c ~methodやそれに類似なもの による利用-用に意図され、 ~textを単独の規則に構文解析する。 ◎ "Parse a rule" is intended for use by the CSSStyleSheet insertRule() method, and similar, which parse text into a single rule. CSSStyleSheet#insertRule method, and similar functions which might exist, which parse text into a single rule.
- `宣言を構文解析する$ ⇒ `条件付き~group規則$( `supports$at )における利用が意図される。 `CSS3-CONDITIONAL$r ◎ "Parse a declaration" is used in @supports conditions. [CSS3-CONDITIONAL]
- `~blockの内容を構文解析する$ ⇒ 次に意図される ⇒ ~CSSにおける任意の~block (`~style属性@~CSSSTYLEATTR#style-attribute$の様なものも含む) を成す内容を構文解析するため/ `CSSStyleDeclaration^I の `cssText@~CSSOM1#dom-cssstyledeclaration-csstext$c 属性などの~API用 ◎ "Parse a block’s contents" is intended for parsing the contents of any block in CSS (including things like the style attribute), and APIs such as the CSSStyleDeclaration cssText attribute.
- `成分~値を構文解析する$ ⇒ 1 個の値を消費するために必要になる — `attr$f 用の構文解析~規則の様な。 ◎ "Parse a component value" is for things that need to consume a single value, like the parsing rules for attr().
- `成分~値~listを構文解析する$ ⇒ 呈示~用の属性の内容~text【例:`非~CSS呈示~用~hint$】を 1 個の宣言~値として構文解析したり,[ 【!*`~Selectors~API@~TR/selectors-api/$】 `querySelector()$c などの選択子~APIに渡す自立的な`選択子$ / ~HTMLの `media$a 属性に与える`媒体~query~list$ ]を構文解析するためにある。 ◎ "Parse a list of component values" is for the contents of presentational attributes, which parse text into a single declaration’s value, or for parsing a stand-alone selector [SELECT] or list of Media Queries [MEDIAQ], as in Selectors API or the media HTML attribute.
5.4.1. ある~CSS文法に則って何かを構文解析する
文字列や~token~listを構文解析して,何らかの~CSS文法に合致するかどうか見た上で、 合致したならば,その文法に則って各成分に切り分けたい( `destructure^en )と欲されることは多い。 この節では、 この種の演算~用に汎用な~hookを供する。 それは、 “ %foo を~CSS `color$t 文法に則って構文解析する” 等々のように呼出されるべきである。 ◎ It is often desirable to parse a string or token list to see if it matches some CSS grammar, and if it does, to destructure it according to the grammar. This section provides a generic hook for this kind of operation. It should be invoked like "parse foo as a CSS <color>", or similar.
この~algoは、 所与の[ 供された文法に対応する構造が指定されていない入力 ]が,その文法に[ 合致しないならば `失敗^i / 合致するならば その文法に則って入力を構文解析した結果 ]を返す。 結果とヤリトリできるのは、 表現の多義性が問題にならない所, かつ仕様の注釈文に限られなければナラナイ。 仕様~言語の外側へ公開することが意味される場合、 その仕様は,結果を[ きちんと指定された表現 ]に明示的に翻訳しなければナラナイ — 例えば、 ( “~CSS `string$t として直列化する” の様に) 何らかの~CSS直列化~algoを呼出して。 ◎ This algorithm returns either failure, if the input does not match the provided grammar, or the result of parsing the input according to the grammar, which is an unspecified structure corresponding to the provided grammar specification. The return value must only be interacted with by specification prose, where the representation ambiguity is not problematic. If it is meant to be exposed outside of spec language, the spec using the result must explicitly translate it into a well-specified representation, such as, for example, by invoking a CSS serialization algorithm (like "serialize as a CSS <string> value").
注記: 他の仕様から~callすることが求まれる構文解析~algoは、 `通例的に^em,[ この~algo, および`~commaで分離された~listを~CSS文法に則って構文解析する$ ]に限られる。 残りの構文解析~algoは、 ほとんど[ `CSSOM$r, それに関係する “明示的に~CSS構造を構築する” 事例 ]用に意味される — それらの~algoを利用する必要があると~~考えている策定者は、 まず~CSS~WGに指導を諮られたし。 ◎ Note: This algorithm, and parse a comma-separated list according to a CSS grammar, are usually the only parsing algorithms other specs will want to call. The remaining parsing algorithms are meant mostly for [CSSOM] and related "explicitly constructing CSS structures" cases. Consult the CSSWG for guidance first if you think you need to use one of the other algorithms.
何かを `~CSS文法に則って構文解析する@ (略して,単に “構文解析する” )ときは、 所与の ( %入力, ~CSS文法 %生成規則 ) に対し: ◎ To parse something according to a CSS grammar (aka simply parse) given an input and a CSS grammar production:
- %入力 ~SET `~token~streamに正規化する$( %入力 ) ◎ Normalize input, and set input to the result.
- %結果 ~LET `成分~値~listを構文解析する$( %入力 ) ◎ Parse a list of component values from input, and let result be the return value.
- ~RET %結果 が %生成規則 の文法に[ 合致するならば,合致した結果 / 合致しないならば `失敗^i ] ◎ Attempt to match result against grammar. If this is successful, return the matched result; otherwise, return failure.
5.4.2. ~commaで分離された~listを ある~CSS文法に則って構文解析する
~commaを伴う値でも,`~CSS文法に則って構文解析する$ことは もちろんできるが、 値を成す`すべての部分^emが成功裡に構文解析されない限り, `失敗^i を返すことになる。 ◎ While one can definitely parse a value according to a grammar with commas in it, if any part of the value fails to parse, the entire thing doesn’t parse, and returns failure.
それが欲されることもあるが (~CSS~propのうち`~list値をとる$ものなど)、 値を成す各~commaで分離された下位部分を別々に構文解析して,[ 各~結果に対し、 成功したか失敗したかに応じて,別な仕方で処する ]方が良いこともある (失敗した場合、 概して,無視されよう — `img$e の `sizes$a 属性を`構文解析する@~HEimages#parse-a-sizes-attribute$ときなど)。 ◎ Sometimes that’s what’s desired (such as in list-valued CSS properties); other times, it’s better to let each comma-separated sub-part of the value parse separately, dealing with the parts that parse successfully one way, and the parts that fail to parse another way (typically ignoring them, such as in <img sizes>).
次の~algoは、 これを成遂げるための容易な~hookを供する。 それは、 “~top-level” の~commaで分割された値たちが成す~listを返す — ~listを成す各~値は、[ `失敗^i (構文解析-に失敗した)/ 構文解析した結果(`構文解析-$する~algoにて述べたとおり,構造が未指定な) ]になる。 ◎ This algorithm provides an easy hook to accomplish exactly that. It returns a list of values split by "top-level" commas, where each values is either failure (if it failed to parse) or the result of parsing (an unspecified structure, as described in the parse algorithm).
`~commaで分離された~listを~CSS文法に則って構文解析する@ (略して,単に “~listを構文解析する” )ときは、 所与の ( %入力, ~CSS文法 %生成規則 ) に対し: ◎ To parse a comma-separated list according to a CSS grammar (aka parse a list) given an input and a CSS grammar production:
- %入力 ~SET `~token~streamに正規化する$( %入力 ) ◎ Normalize input, and set input to the result.
- ~IF[ %入力 の`~token群$tSを成す どの~itemも `whitespace$tok である ] ⇒ ~RET 新たな`~list$ ◎ If input contains only <whitespace-token>s, return an empty list.
- %~list ~LET `~commaで分離された成分~値~listを構文解析する$( %入力 ) ◎ Parse a comma-separated list of component values from input, and let list be the return value.
- %~list を成す ~EACH( %~item ) に対し ⇒ %~item を次の結果に置換する ⇒ `~CSS文法に則って構文解析する$( %~item, %生成規則 ) ◎ For each item of list, replace item with the result of parsing item with grammar.
- ~RET %~list ◎ Return list.
5.4.3. ~stylesheetを構文解析する
`~stylesheetを構文解析する@ ときは、 所与の ( %入力, `~URL$ %所在 (省略時は ~NULL )) に対し: ◎ To parse a stylesheet from an input given an optional url location:
- ~IF[ %入力 は ある~stylesheet用の~byte~streamである ] ⇒ %入力 ~SET `~stylesheetの~byte列を復号する$( %入力 ) ◎ If input is a byte stream for a stylesheet, decode bytes from input, and set input to the result.
- %入力 ~SET `~token~streamに正規化する$( %入力 ) ◎ Normalize input, and set input to the result.
- %~stylesheet ~LET 新たな`~CSS~stylesheet$ — その ⇒# `所在$ss ~SET %所在 ◎ Create a new stylesheet, with its location set to location (or null, if location was not passed).
- %~stylesheet の.規則~群 ~SET `~stylesheetの内容を消費する$( %入力 ) ◎ Consume a stylesheet’s contents from input, and set the stylesheet’s rules to the result.
- ~RET %~stylesheet ◎ Return the stylesheet.
5.4.4. ~stylesheetの内容を構文解析する
`~stylesheetの内容を構文解析する@ ときは、 所与の ( %入力 ) に対し: ◎ To parse a stylesheet’s contents from input:
- %入力 ~SET `~token~streamに正規化する$( %入力 ) ◎ Normalize input, and set input to the result.
- ~RET `~stylesheetの内容を消費する$( %入力 ) ◎ Consume a stylesheet’s contents from input, and return the result.
5.4.5. ~blockの内容を構文解析する
`~blockの内容を構文解析する@ ときは、 所与の ( %入力 ) に対し: ◎ To parse a block’s contents from input:
- %入力 ~SET `~token~streamに正規化する$( %入力 ) ◎ Normalize input, and set input to the result.
- ~RET `~blockの内容を消費する$( %入力 ) ◎ Consume a block’s contents from input, and return the result.
5.4.6. 規則を構文解析する
`規則を構文解析する@ ときは、 所与の ( %入力 ) に対し: ◎ To parse a rule from input:
- %入力 ~SET `~token~streamに正規化する$( %入力 ) ◎ Normalize input, and set input to the result.
- %入力 から`空白を破棄する$tS ◎ Discard whitespace from input.
- ~IF[ %入力 は`空$tSである【!`次回の~token$tS は `EOF$tok 】 ] ⇒ ~RET `構文~error^i ◎ If the next token from input is an <EOF-token>, return a syntax error.
- %規則 ~LET %入力 の`次回の~token$tS に応じて ⇒# `at-keyword$tok であるならば `~at-規則を消費する$( %入力 ) / ~ELSE_ `有修飾~規則を消費する$( %入力 ) ◎ Otherwise, if the next token from input is an <at-keyword-token>, consume an at-rule from input, and let rule be the return value. ◎ Otherwise, consume a qualified rule from input and let rule be the return value.\
- ~IF[ %規則 ~IN { ε, `妥当な規則でない$i } ] ⇒ ~RET `構文~error^i ◎ If nothing or an invalid rule error was returned, return a syntax error.
- %入力 から`空白を破棄する$tS ◎ Discard whitespace from input.
- ~IF[ %入力 は`空$tSである【!`次回の~token$tS は `EOF$tok 】 ] ⇒ ~RET %規則 ◎ If the next token from input is an <EOF-token>, return rule.\
- ~RET `構文~error^i ◎ Otherwise, return a syntax error.
5.4.7. 宣言を構文解析する
注記: `~blockの内容を消費する$【!宣言~listを構文解析する$】ときと違って、 これは,宣言のみを構文解析する — ~at-規則は構文解析しない。 ◎ Note: Unlike "Parse a list of declarations", this parses only a declaration and not an at-rule.
`宣言を構文解析する@ ときは、 所与の ( %入力 ) に対し: ◎ To parse a declaration from input:
- %入力 ~SET `~token~streamに正規化する$( %入力 ) ◎ Normalize input, and set input to the result.
- %入力 から`空白を破棄する$tS ◎ Discard whitespace from input.
- %宣言 ~LET `宣言を消費する$( %入力 ) ◎ Consume a declaration from input.\
- ~IF[ %宣言 ~NEQ ε ] ⇒ ~RET %宣言 ◎ If anything was returned, return it.\
- ~RET `構文~error^i ◎ Otherwise, return a syntax error.
5.4.8. 成分~値を構文解析する
`成分~値を構文解析する@ ときは、 所与の ( %入力 ) に対し: ◎ To parse a component value from input:
- %入力 ~SET `~token~streamに正規化する$( %入力 ) ◎ Normalize input, and set input to the result.
- %入力 から`空白を破棄する$tS ◎ Discard whitespace from input.
- ~IF[ %入力 は`空$tSである ] ⇒ ~RET `構文~error^i ◎ If input is empty, return a syntax error.
- %値 ~LET `成分~値を消費する$( %入力 ) ◎ Consume a component value from input and let value be the return value.
- %入力 から`空白を破棄する$tS ◎ Discard whitespace from input.
- ~IF[ %入力 は`空$tSである ] ⇒ ~RET %値 ◎ If input is empty, return value.\
- ~RET `構文~error^i ◎ Otherwise, return a syntax error.
5.4.9. 成分~値~listを構文解析する
`成分~値~listを構文解析する@ ときは、 所与の ( %入力 ) に対し: ◎ To parse a list of component values from input:
- %入力 ~SET `~token~streamに正規化する$( %入力 ) ◎ Normalize input, and set input to the result.
- ~RET `成分~値~listを消費する$( %入力 ) ◎ Consume a list of component values from input, and return the result.
5.4.10. ~commaで分離された成分~値~listを構文解析する
`~commaで分離された成分~値~listを構文解析する@ ときは、 所与の ( %入力 ) に対し: ◎ To parse a comma-separated list of component values from input:
- %入力 ~SET `~token~streamに正規化する$( %入力 ) ◎ Normalize input, and set input to the result.
- %~group群 ~LET 新たな`~list$ ◎ Let groups be an empty list.
-
~WHILE[ %入力 は`空$tSでない ]: ◎ While input is not empty:
- %~group群 に次の結果を`付加する$ ⇒ `成分~値~listを消費する$( %入力, `comma$tok ) ◎ Consume a list of component values from input, with <comma-token> as the stop token, and append the result to groups.
- %入力 から`~tokenを破棄する$tS ◎ Discard a token from input.
- ~RET %~group群 ◎ Return groups.
5.5. 構文解析器~algo
構文解析器は、 以下に挙げる~algoからなる。 それらは、 上に挙げた構文解析器の入口から~callされる — 他の仕様は、 一般に,それらを直に~callするベキでない。 ◎ The following algorithms comprise the parser. They are called by the parser entry points above, and generally should not be called directly by other specifications.
~CSS構文解析は、 文字大小区別であることに注意。 加えて,所与の文脈における構成子の妥当性は、 少なくとも一部の状況下においては, 構文解析して`いる間に^em検査しなければナラナイことに注意†。 この仕様は、 妥当性の検査-法を可能化するために足る文脈を`どう渡す^emベキかは,意図的に指定しない。 ◎ Note that CSS parsing is case-sensitive, and checking the validity of constructs in a given context must be done during parsing in at least some circumstances. This specification intentionally does not specify how sufficient context should be passed around to enable validity-checking.
【† 以下においては、 “現在の文脈において妥当である” という句で指示される。 】
5.5.1. ~stylesheetの内容を消費する
`~stylesheetの内容を消費する@ ときは、 所与の ( `~token~stream$ %入力 ) に対し: ◎ To consume a stylesheet’s contents from a token stream input:
- %規則~群 ~LET 新たな`~list$ ◎ Let rules be an initially empty list of rules.
-
%入力 を`処理する$tS: ◎ Process input:
- `whitespace$tok ⇒ %入力 から`~tokenを破棄する$tS ◎ <whitespace-token> • Discard a token from input.
- `EOF$tok ⇒ ~RET %規則~群 ◎ <EOF-token> • Return rules.
-
`CDO$tok / `CDC$tok ⇒ %入力 から`~tokenを破棄する$tS ◎ <CDO-token> <CDC-token> • Discard a token from input.
これは何のためにある? ◎ What’s this for?
~CSSが最初に導入された頃、 `style$e 要素は, 旧来の~browserにおいては未知な要素として扱われた。 それらの~browserにおいて,要素の内容が~page内に表示されるのを避けるため、 ~stylesheetを~HTML~comment内に包装することが共通な実施になり、 より新たな~browserは,単純に~HTML~comment構文を無視するようになった。 この要件は、 数十年経た今日まで引き継がれている。 ◎ Back when CSS was first being introduced, the style element was treated as an unknown element by older browsers. To avoid having its contents displayed in the page for these legacy browsers, it became common practice to wrap the stylesheet in an HTML comment, and newer browsers would simply ignore the HTML comment syntax. This requirement carries over to today, decades later.
同じ実施は、 `script$e 要素に対しても行われた — 同じ理由から、 ~JS内における~HTML~comment構文は, ( `//^c に類似な)行l~commentとして扱われるようになった。 ◎ The same practice was done for script elements, where HTML comment syntax is treated as a line comment in JS (similar to //) for the same reason.
-
`at-keyword$tok: ◎ <at-keyword-token>
- `~at-規則を消費する$( %入力 ) ◎ Consume an at-rule from input.
- ~IF[ %規則 ~NEQ ε ] ⇒ %規則~群 に %規則 を`付加する$ ◎ If anything is returned, append it to rules.
-
その他: ◎ anything else
- %規則 ~LET `有修飾~規則を消費する$( %入力 ) ◎ Consume a qualified rule from input.\
- ~IF[ %規則 は`規則$である ] ⇒ %規則~群 に %規則 を`付加する$ ◎ If a rule is returned, append it to rules.
5.5.2. ~at-規則を消費する
`~at-規則を消費する@ ときは、 所与の ( `~token~stream$ %入力, 真偽値 %入子か (省略時は ~F ) ) に対し: ◎ To consume an at-rule from a token stream input, given an optional bool nested (default false):
- ~Assert: `次回の~token$tSは `at-keyword$tok である。 ◎ Assert: The next token is an <at-keyword-token>.
- %~token ~LET %入力 から`~tokenを消費する$tS ◎ Consume a token from input,\
- %規則 ~LET 新たな`~at-規則$ — その ⇒# .名前 ~SET %~token の.値, .導入部 ~SET 新たな`~list$, .宣言~群 ~SET ε, .子~規則~群 ~SET ε ◎ and let rule be a new at-rule with its name set to the returned token’s value, its prelude initially set to an empty list, and no declarations or child rules.
-
%入力 を`処理する$tS: ◎ Process input:
-
`semicolon$tok / `EOF$tok: ◎ <semicolon-token> ◎ <EOF-token>
- %入力 から`~tokenを破棄する$tS ◎ Discard a token from input.\
- ~IF[ %規則 は現在の文脈において妥当である ] ⇒ ~RET %規則 ◎ If rule is valid in the current context, return it;\
- ~RET ε ◎ otherwise return nothing.
-
`close-curly$Tok: ◎ <}-token>
-
~IF[ %入子か ~EQ ~T ]: ◎ If nested is true:
- ~IF[ %規則 は現在の文脈において妥当である ] ⇒ ~RET %規則 ◎ If rule is valid in the current context, return it.
- ~RET ε ◎ Otherwise, return nothing.
- %規則 の.導入部に次の結果を`付加する$ ⇒ %入力 から`~tokenを消費する$tS ◎ Otherwise, consume a token and append the result to rule’s prelude.
-
-
`open-curly$Tok: ◎ <{-token>
-
%規則 の.子~規則~群 ~SET `~blockを消費する$( %入力 ) ◎ Consume a block from input, and assign the result to rule’s child rules.
注記: 結果が`宣言$たちが成す`~list$を包含する場合、 それらが~CSSOMにおいて どう実体化されるかは,当の規則に依存する。 すべてを`入子な宣言~列が成す規則$の中へ包装する場合も, すべてを宣言として扱う場合も, 最初の~itemと他の~itemの扱いを違える場合もある。 ◎ Note: If the result contains lists of declarations, how they’re materialized in the CSSOM depends on the rule. Some turn them all into nested declarations rules, others will treat them all as declarations, and others will treat the first item differently from the rest.
【 %規則 の.宣言~群 をどう初期化するか,~algoの中では明示的に指定されていない — この注記に従って,適切に初期化することが意図される? 】
- ~IF[ %規則 は現在の文脈において妥当である ] ⇒ ~RET %規則 ◎ If rule is valid in the current context, return it.\
- ~RET ε ◎ Otherwise, return nothing.
-
- その他 ⇒ %規則 の.導入部に次の結果を`付加する$ ⇒ `成分~値を消費する$( %入力 ) ◎ anything else • Consume a component value from input and append the returned value to rule’s prelude.
-
5.5.3. 有修飾~規則を消費する
`有修飾~規則を消費する@ ときは、 所与の ( `~token~stream$ %入力, ~token %停止-~token (省略時は ε ), 真偽値 %入子か (省略時は ~F ) ) に対し: ◎ To consume a qualified rule, from a token stream input, given an optional token stop token and an optional bool nested (default false):
- %導入部 ~LET 新たな`~list$ ◎ ↓↓ Let rule be a new qualified rule with its prelude, declarations, and child rules all initially set to empty lists.
-
%入力 を`処理する$tS: ◎ Process input:
-
`EOF$tok / %停止-~token( ~NEQ ε ) ◎ <EOF-token> stop token (if passed)
- `構文解析error$ ◎ This is a parse error.\
- ~RET ε ◎ Return nothing.\
-
`close-curly$Tok: ◎ <}-token>
- `構文解析error$ ◎ This is a parse error.\
- ~IF[ %入子か ~EQ ~T ] ⇒ ~RET ε ◎ If nested is true, return nothing.\
- %導入部 に次の結果を`付加する$ ⇒ %入力 から`~tokenを消費する$tS ◎ Otherwise, consume a token and append the result to rule’s prelude.
-
`open-curly$Tok: ◎ <{-token>
-
~IF[ %導入部 の中に `whitespace$tok でないものが 2 個~以上あって,それらのうち最初の 2 個は順に次を満たす ]… ◎ If the first two non-<whitespace-token> values of rule’s prelude are\
- `ident$tok であって,その.値は `--^l から開始している ◎ an <ident-token> whose value starts with "--"\
- `colon$tok である ◎ followed by a <colon-token>,\
…ならば: ◎ then:\
- ~IF[ %入子か ~EQ ~T ] ⇒ `不良な宣言の残余を消費する$( %入力, ~T ) ◎ If nested is true, consume the remnants of a bad declaration from input, with nested set to true, and return nothing.
- ~ELSE ⇒ `~blockを消費する$( %入力 ) ◎ If nested is false, consume a block from input, and return nothing.
- ~RET ε ◎ ↑
この検査は何のためにある? ◎ What’s this check for?
`一般に^em、[ `宣言$に許容される構文, `有修飾~規則$に許容される構文 ]が重合することはない。 現時点で定義-済みな~CSS~propには,その値~内に`波括弧~block$を許容するものは無いので、 `foo:bar {};^css は確定的に規則であり, `foo: bar;^css は確定的に~propである。 将来の~CSS~propが その値~内に`波括弧~block$を許容する場合でも、 それに許容される構文は — `foo: {...};^css のように — `波括弧~block$が値~全体を成すよう制約される。 それは、 妥当な規則にならないことが保証される — `:^css に~identや関数が後続して,それを疑似類として~markすることは、 ないので。 ◎ Declarations and qualified rules don’t generally overlap in their allowed syntax. No currently-defined CSS property allows {}-blocks in its value, so foo:bar {}; is definitely a rule, and foo: bar; is definitely a property. Even if a future CSS property allows {}-blocks in its value, the allowed syntax is restricted to the {}-block being the whole value, such as foo: {...};, which is guaranteed to not be a valid rule, since the : doesn’t have an ident or function following it to mark it as a pseudo-class.
このことは、 同じ文脈~内に宣言と規則を混合することを許容する。 まずは、 何かを宣言として構文解析するよう試行してから、 その結果が妥当な宣言でない場合には,代わりに規則として構文解析し直す。 偶発的に無効になる宣言は, 代わりに規則として構文解析されることになるが、 ~~不都合はない。 構文解析器は、 宣言を終端している~semicolonの所で停止して, それを無効な規則と見なすことになる (あるいは,~propが`波括弧~block$を包含している事例でも、 当の~semicolonの`直前^emで停止して, それを無効な規則と見なしてから、 何かを構文解析する次回の試みにおいて, 当の~semicolonを無効なものとして棄てることになる)。 なので、 消費される~tokenの総数は,いずれにせよ同じになる。 ◎ This allows us to mix declarations and rules in the same context: we first try to parse something as a declaration, and if that doesn’t result in a valid declaration, we reparse it as a rule instead. An accidentally-invalid declaration will parse as a rule instead, but that’s fine: the parser will stop at the declaration’s ending semicolon and consider it an invalid rule. (Or in the case of a property containing a {}-block, will stop just *before* the semicolon, still considering it an invalid rule, and then the next attempt to parse something will throw out the lone semicolon as invalid.) So the total amount of tokens consumed is the same regardless.
しかしながら,`~custom~prop$の構文に対しては、 ~CSS~WGは,注意深く審査しない。 作者は、 値に`波括弧~block$を含んでいる~custom~propを`書ける^em — ~blockを他と組合せて書くことも。 そのような~custom~propが妥当でない場合 (例えば, `var$f 関数が妥当に記されなかったことに因り)、 それが規則として構文解析し直されるとき, `波括弧~block$の所で早々に停止することになる。 ~custom~propの値を成す残りの~tokenたちは、 新規な構成子として構文解析され,期待されない[ 宣言/規則 ]を作成させることにもなり得る。 ◎ Custom properties, however, don’t have the CSSWG carefully vetting their syntax. Authors can write a custom property that takes a {}-block in its value, even combined with other things; if that custom property is then invalid (due to an invalidly-written var() function, for example), when it’s reparsed as a rule it will stop early, at the {}-block. The remaining tokens of the custom property’s value will then get parsed as a fresh construct, potentially causing unexpected declarations or rules to be created.
この(ごく~nicheではあるが)際どい事例を避けるため、 `~custom~prop$の構文は,`有修飾~規則$の構文から除かれる。 ~propと規則を混合することを許容する文脈において, `~custom~prop$の様な見かけの規則が どういうわけか構文解析された場合、 どこかで間違っている — 代わりに、 ~custom~prop全体(それを終端している~semicolonまでを成すすべて)を消費する必要がある。 ◎ To avoid this (admittedly very niche) corner-case, we subtract the syntax of a custom property from that of a qualified rule; if you’re in a context that allows properties and rules to be mixed, and you somehow end up parsing a rule that looks like a custom property, you’ve messed up, and need to instead consume an entire custom property (all the way to the ending semicolon).
(~propを許容しない文脈においては、 ~custom~propの様な見かけになる規則は,ただ棄てられるだけである。 これは、 `--foo:hover { color: blue; }^css が, どこでも一貫して無効になることを確保する — それを終端させる存在しない~semicolonを探すために,~stylesheetを~~際限なく消費することはない。) ◎ (If we’re in a context that doesn’t allow properties, we just throw away the rule if it looks like a custom property. This ensures that --foo:hover { color: blue; } is consistently invalid everywhere, without potentially consuming a ton of a stylesheet looking for the non-existent ending semicolon.)
- %規則 ~LET 新たな`有修飾~規則$ — その ⇒# .導入部 ~SET %導入部, .宣言~群 ~SET 新たな`~list$, .子~規則~群 ~SET 新たな`~list$ ◎ ↑↑
- %子~規則~群 ~LET `~blockを消費する$( %入力 ) ◎ Otherwise, consume a block from input, and let child rules be the result.\
-
~IF[ %子~規則~群 は空でない 【この条件は,この訳による補完】 ]:
-
~IF[ %子~規則~群[ 0 ] は`宣言$たちが成す`~list$である ]:
- %規則 の.宣言~群 ~SET %子~規則~群[ 0 ]
- %子~規則~群 から %子~規則~群[ 0 ] を`除去する$
-
%子~規則~群 を成す ~EACH( %子~規則 ) に対し:
- ~IF[ %子~規則 は`宣言$たちが成す`~list$である ] ⇒ %子~規則 ~SET %子~規則 を包装する新たな`入子な宣言~列が成す規則$
- %規則 の.子~規則~群 に %子~規則 を`付加する$
-
- ~IF[ %規則 は現在の文脈において妥当である ] ⇒ ~RET %規則 ◎ If rule is valid in the current context, return it;\
- ~RET `妥当な規則でない@i ◎ otherwise return an invalid rule error.
-
- その他 ⇒ %導入部 に次の結果を`付加する$ ⇒ `成分~値を消費する$( %入力 ) ◎ anything else • Consume a component value from input and append the result to rule’s prelude.
-
5.5.4. ~blockを消費する
`~blockを消費する@ ときは、 所与の ( `~token~stream$ %入力 ) に対し: ◎ To consume a block, from a token stream input:
- ~Assert: `次回の~token$tSは `open-curly$Tok である ◎ Assert: The next token is a <{-token>.
- %入力 から`~tokenを破棄する$tS ◎ Discard a token from input.\
- %規則~群 ~LET `~blockの内容を消費する$( %入力 ) ◎ Consume a block’s contents from input and let rules be the result.\
- %入力 から`~tokenを破棄する$tS ◎ Discard a token from input.
- ~RET %規則~群 ◎ Return rules.
5.5.5. ~blockの内容を消費する
`~blockの内容を消費する@ ときは、 所与の ( `~token~stream$ %入力 ) に対し: ◎ To consume a block’s contents from a token stream input:
注記: この~algoは、[ `宣言$たちが成す~list/`規則$ ]たちが成す新たな`~list$( %規則~群 )を返す。 各[ `宣言$たちが成す`~list$ ]は、 ~CSSOMにおいては,親の文脈に依存して `CSSStyleDeclaration$I として実体化されることも, `CSSNestedDeclarations$I として実体化されることもある。 ◎ Note: This algorithm returns a list, consisting of rules and lists of declarations. Depending on the parent context, a list of declarations might be materialized in the CSSOM as either a CSSStyleDeclaration, or as a CSSNestedDeclarations rule.
- %規則~群 ~LET 新たな`~list$ ◎ Let rules be an empty list, containing either rules or lists of declarations.
- %宣言~群 ~LET 新たな`~list$ (`宣言$たち) ◎ Let decls be an empty list of declarations.
-
%入力 を`処理する$tS: ◎ Process input:
- `whitespace$tok / `semicolon$tok ⇒ %入力 から`~tokenを破棄する$tS ◎ <whitespace-token> <semicolon-token> • Discard a token from input.
- `EOF$tok / `close-curly$Tok ⇒ ~RET %規則~群 ◎ <EOF-token> <}-token> • Return rules.
-
`at-keyword$tok: ◎ <at-keyword-token>
-
~IF[ %宣言~群 は空でない ]:
- %規則~群 に %宣言~群 を`付加する$
- %宣言~群 ~SET 新たな`~list$
- %規則 ~LET `~at-規則を消費する$( %入力, ~T ) ◎ Consume an at-rule from input, with nested set to true.\
- ~IF[ %規則 は`規則$である ] ⇒ %規則~群 に %規則 を`付加する$ ◎ If a rule was returned, append it to rules.
-
-
その他: ◎ anything else
- %入力 を`~markする$tS ◎ Mark input.
- %宣言 ~LET `宣言を消費する$( %入力, ~T ) ◎ Consume a declaration from input, with nested set to true.\
-
~IF[ %宣言 ~NEQ ε【!`宣言$である】 ] ◎ If a declaration was returned,\
- %宣言~群 に %宣言 を`付加する$ ◎ append it to decls,\
- %入力 から`~markを破棄する$tS ◎ and discard a mark from input.
-
~ELSE: ◎ Otherwise,\
- %入力 から`~markを復旧する$tS ◎ restore a mark from input,\
- %規則 ~LET `有修飾~規則を消費する$( %入力, `semicolon$tok, ~T ) ◎ then consume a qualified rule from input, with nested set to true, and <semicolon-token> as the stop token.
-
~IF[ %規則 ~NEQ ε ]:
- ~Assert: %規則 は`規則$であるか `妥当な規則でない$i
-
~IF[ %宣言~群 は空でない ]:
- %規則~群 に %宣言~群 を`付加する$
- %宣言~群 ~SET 新たな`~list$
- ~IF[ %規則 は`規則$である ] ⇒ %規則~群 に`規則$を`付加する$
実装~向けの注記 ◎ Implementation note
この仕様は、 他の多くの~CSS仕様と同じく, 効率より理解し易さを優先するよう書かれた。 いくつかの~algo — 特に,上述した “宣言として構文解析してから,規則 として構文解析する” 挙動 — は、 述べられたとおり,素朴に実装された場合に効率が悪くなり得る。 ◎ This spec, as with many CSS specs, has been written to prioritize understandability over efficiency. A number of algorithms, notably the above "parse as a declaration, then parse as a rule" behavior can be fairly inefficient if implemented naively as described.
しかしながら,この挙動は、 アリな限り “早々な退出” を許容するよう,注意深く書かれた。 特に,これらの退出は、 概ね次に挙げる順序で生じ得る: ◎ However, the behavior has been carefully written to allow "early exits" as much as possible. In particular, and roughly in order of when the exit can occur:
-
1 個目の非~空白~token【非 `whitespace$tok 】が[ 認識される~prop名(または~custom~prop名)用の `ident$tok ]ではない場合、 宣言として構文解析することを即時に停止して, 代わりに規則として構文解析し直せる。 類似に, `2 個目の^em 非~空白~tokenは `colon$tok でない場合、 宣言として構文解析することを即時に停止できる。 ◎ If the first non-whitespace token isn’t an <ident-token> for a recognized property name (or a custom property name), you can immediately stop parsing as a declaration and reparse as a rule instead. If the next non-whitespace token isn’t a <colon-token>, you can similarly immediately stop parsing as a declaration.
(すなわち, `font+ ...^css は、 ~propでも `not-a-prop-name: ...^css でもないことが保証される。) ◎ (That is, font+ ... is guaranteed to not be a property, nor is not-a-prop-name: ....)
-
1 個目, 2 個目の非~空白~tokenが,順に[ ~custom~prop名, ~colon ]である場合、 それは,確定的に~custom~propである — それは,妥当な規則を生産し得ないので、 当の~custom~propとして妥当でない場合でも, 規則として構文解析し直すよう試行する必要は無い。 ◎ If the first two non-whitespace tokens are a custom property name and a colon, it’s definitely a custom property and won’t ever produce a valid rule, so even if the custom property ends up invalid there’s no need to try and reparse as a rule.
(すなわち, `--foo:hover {...}^css は、 規則ではなく~custom~propであることが保証される。) ◎ (That is, --foo:hover {...} is guaranteed to be a custom property, not a rule.)
-
1 個目, 2 個目, 3 個目の非~空白~tokenが,順に[ 妥当な~prop名, ~colon, `open-curly$Tok 以外 ]であり,当の宣言の値を構文解析している間に `open-curly$Tok に遭遇した場合、 宣言として構文解析することを即時に停止して, 代わりに規則として構文解析し直せる。 ◎ If the first three non-whitespace tokens are a valid property name, a colon, and anything other than a <{-token>, and then while parsing the declaration’s value you encounter a <{-token>, you can immediately stop parsing as a declaration and reparse as a rule instead.
(すなわち, `font:bar {...^css は、 無効な~propになることが保証される。) ◎ (That is, font:bar {... is guaranteed to be an invalid property.)
-
[ 認識される~prop名, ~colon, `波括弧~block$ ]が成す並びに出くわしたが, その~blockに後続している非~空白~tokenのうち[ 1 個目は~semicolonでない ]かつ[ 1 個目, 2 個目は順に[ `!important^css, ~semicolon ]ではない ]場合、 宣言として構文解析することを即時に停止して, 代わりに規則として構文解析し直せる。 ◎ If you see a recognized property name, a colon, and a {}-block, but the first non-whitespace tokens following that block isn’t either immediately the final semicolon, or the !important followed by the semicolon, you can immediately stop parsing as a declaration and reparse as a rule instead.
(すなわち, `font: {} bar ...^css は、 無効な~propになることが保証され, ~semicolonに出くわすまで構文解析し続ける必要は無い。) ◎ (That is, font: {} bar ... is guaranteed to be an invalid property; you don’t need to keep parsing until you hit a semicolon.)
類似に,構文解析~要件が[ 構文解析する際に,当の宣言の文法を検査することに依拠する ]よう指定されたとしても、 汎用な~CSS`構文^emの上層に非~CSS言語を実装するよう試行している`汎用^emな処理器は,当の宣言が[ ~ident, ~colon ]から開始していて,[ `波括弧~block$と他の何かを同時に包含しない ]ことを検証yするだけで済ませられる。 それらは, `foo:hover ... {}^css の様な事例においては、 1 個目の~tokenで早々に退出し得ないので, 文法~知識を有する実装よりも少しだけ構文解析に時間を費やすことになるが。 ◎ Similarly, even tho the parsing requirements are specified to rely on checking the grammar of the declarations as you parse, a generic processor trying to implement a non-CSS language on top of the generic CSS syntax can still get away with just verifying that declarations start with an ident, a colon, and then either contain solely a {}-block or no {}-block at all. They’ll just spent a little more time on parsing than an implementation with grammar knowledge in cases like foo:hover ... {}, since they can’t early-exit on the first token.
5.5.6. 宣言を消費する
`宣言を消費する@ ときは、 所与の ( `~token~stream$ %入力, 真偽値 %入子か (省略時は ~F ) ) に対し: ◎ To consume a declaration from a token stream input, given an optional bool nested (default false):
- %宣言 ~LET 新たな`宣言$ — その ⇒# .名前 ~SET 空~文字列, .値 ~SET 新たな`~list$ .元の~text ~SET ε .~importantか ~SET ~F ◎ Let decl be a new declaration, with an initially empty name and a value set to an empty list.
-
~IF[ `次回の~token$tSは `ident$tok である ]: ◎ If the next token is an <ident-token>,\
- %~token ~LET %入力 から`~tokenを消費する$tS ◎ consume a token from input and\
- %宣言 の.名前 ~SET %~token の.値 ◎ set decl’s name to the token’s value.
-
~ELSE: ◎ Otherwise,\
- `不良な宣言の残余を消費する$( %入力, %入子か ) ◎ consume the remnants of a bad declaration from input, with nested,\
- ~RET ε ◎ and return nothing.
- %入力 から`空白を破棄する$tS ◎ Discard whitespace from input.
- ~IF[ `次回の~token$tSは `colon$tok である ] ⇒ %入力 から`~tokenを破棄する$tS ◎ If the next token is a <colon-token>, discard a token from input.
-
~ELSE: ◎ Otherwise,\
- `不良な宣言の残余を消費する$( %入力, %入子か ) ◎ consume the remnants of a bad declaration from input, with nested,\
- ~RET ε ◎ and return nothing.
- %入力 から`空白を破棄する$tS ◎ Discard whitespace from input.
- %宣言 の.値 ~SET `成分~値~listを消費する$( %入力, `semicolon$tok, %入子か ) ◎ Consume a list of component values from input, with nested, and with <semicolon-token> as the stop token, and set decl’s value to the result.
- %元の~text ~LET 前~段にて消費された, %入力 を成す文字列 ◎ ↓
-
~IF[ %宣言 の.値の中に `whitespace$tok でないものが 2 個~以上あって,それらのうち最後の 2 個は順に次を満たす ]… ◎ If the last two non-<whitespace-token>s in decl’s value are\
- [ `delim$tok である ]~AND[ その.値 ~EQ `21^U ] ◎ a <delim-token> with the value "!"\
- [ `ident$tok である ]~AND[ その.値 ~EQ`大小無視$sub `important^l ] ◎ followed by an <ident-token> with a value that is an ASCII case-insensitive match for "important",\
…ならば: ◎ \
- その 2 個の~tokenを %宣言 の.値から`除去する$ ◎ remove them from decl’s value\
- %宣言 の.~importantか ~SET ~T ◎ and set decl’s important flag.
- ~WHILE[ %宣言 の.値を成す最後の~itemは `whitespace$tok である ] ⇒ %宣言 の.値から最後の~itemを`除去する$ ◎ While the last item in decl’s value is a <whitespace-token>, remove that token.
- ~IF[ %宣言 の.名前は`~custom~prop名~文字列$である ] ⇒ %宣言 の.元の~text ~SET %元の~text 【!corresponding to the tokens of decl’s value】 ◎ If decl’s name is a custom property name string, then set decl’s original text to the segment of the original source text string corresponding to the tokens of decl’s value.
-
~ELIF[ %宣言 の.値は、 ~top-levelの`波括弧~block$に`加えて^em 非 `whitespace$tok を包含する ] ⇒ ~RET ε ◎ Otherwise, if decl’s value contains a top-level simple block with an associated token of <{-token>, and also contains any other non-<whitespace-token> value, return nothing.\
(すなわち、 ~top-levelの`波括弧~block$は,非~custom~propの値~全体を成す場合に限り許容される。) ◎ (That is, a top-level {}-block is only allowed as the entire value of a non-custom property.)
- ~ELIF[ %宣言 の.名前は `~ASCII大小無視$で `unicode-range^l に合致する ] ⇒ %宣言 の.値 ~SET `~unicode-range記述子の値を消費する$( %元の~text ) ◎ Otherwise, if decl’s name is an ASCII case-insensitive match for "unicode-range", consume the value of a unicode-range descriptor from the segment of the original source text string corresponding to the tokens returned by the consume a list of component values call, and replace decl’s value with the result.
- ~IF[ %宣言 は現在の文脈において妥当である ] ⇒ ~RET %宣言 ◎ If decl is valid in the current context, return it;\
- ~RET ε ◎ otherwise return nothing.
`不良な宣言の残余を消費する@ ときは、 所与の ( `~token~stream$ %入力, 真偽値 %入子か ) に対し: ◎ To consume the remnants of a bad declaration from a token stream input, given a bool nested:
-
%入力 を`処理する$tS: ◎ process input:
-
`EOF$tok / `semicolon$tok: ◎ <eof-token> <semicolon-token>
- %入力 から`~tokenを破棄する$tS ◎ Discard a token from input,\
- ~RET ε ◎ and return nothing.
-
`close-curly$Tok: ◎ <}-token>
- ~IF[ %入子か ~EQ ~T ] ⇒ ~RET ε ◎ If nested is true, return nothing.\
- %入力 から`~tokenを破棄する$tS ◎ Otherwise, discard a token.
- その他 ⇒ `成分~値を消費する$( %入力 ) ◎ anything else • Consume a component value from input, and do nothing.
-
5.5.7. 成分~値~listを消費する
`成分~値~listを消費する@ ときは、 所与の ( `~token~stream$ %入力, ~token %停止-~token (省略時は ε ), 真偽値 %入子か (省略時は ~F ) ) に対し: ◎ To consume a list of component values from a token stream input, given an optional token stop token and an optional boolean nested (default false):
- %値~群 ~LET 新たな`~list$ (`成分~値$たち) ◎ Let values be an empty list of component values.
-
%入力 を`処理する$tS: ◎ Process input:
- `EOF$tok / %停止-~token( ~NEQ ε ) ⇒ ~RET %値~群 ◎ <eof-token> stop token (if passed) • Return values.
-
`close-curly$Tok: ◎ <}-token>
-
~IF[ %入子か ~EQ ~T ] ⇒ ~RET %値~群 ◎ If nested is true, return values.
- `構文解析error$ ◎ Otherwise, this is a parse error.\
- %値~群 に次の結果を`付加する$ ⇒ %入力 から`~tokenを消費する$tS ◎ Consume a token from input and append the result to values.
-
- その他 ⇒ %値~群 に次の結果を`付加する$ ⇒ `成分~値を消費する$( %入力 ) ◎ anything else • Consume a component value from input, and append the result to values.
5.5.8. 成分~値を消費する
`成分~値を消費する@ ときは、 所与の ( `~token~stream$ %入力 ) に対し: ◎ To consume a component value from a token stream input:
-
%入力 を`処理する$tS: ◎ Process input:
- `open-curly$Tok / `open-square$Tok / `open-paren$Tok ⇒ ~RET `単純~blockを消費する$( %入力 ) ◎ <{-token> <[-token> <(-token> • Consume a simple block from input and return the result.
- `function$tok ⇒ ~RET `関数を消費する$( %入力 ) ◎ <function-token> • Consume a function from input and return the result.
- その他 ⇒ ~RET %入力 から`~tokenを消費する$tS ◎ anything else • Consume a token from input and return the result.
5.5.9. 単純~blockを消費する
`単純~blockを消費する@ ときは、 所与の ( `~token~stream$ %入力 ) に対し: ◎ To consume a simple block from a token stream input:
- %始端~token ~LET %入力 の`次回の~token$tS ◎ ↓
- ~Assert: %始端~token は次に挙げるいずれかである ⇒# `open-curly$Tok, `open-square$Tok, `open-paren$Tok ◎ Assert: the next token of input is <{-token>, <[-token>, or <(-token>.
- %終端ng~token ~LET %始端~token に応じて ⇒# `open-curly$Tok ならば `close-curly$Tok / `open-square$Tok ならば `close-square$Tok / `open-paren$Tok ならば `close-paren$Tok ◎ Let ending token be the mirror variant of the next token. (E.g. if it was called with <[-token>, the ending token is <]-token>.)
- %~block ~LET 新たな`単純~block$ — その ⇒# .開き括弧 ~SET %始端~token, .値 ~SET 新たな`~list$ ◎ Let block be a new simple block with its associated token set to the next token and with its value initially set to an empty list.
- %入力 から`~tokenを破棄する$tS ◎ Discard a token from input.
-
%入力 を`処理する$tS: ◎ Process input:
-
`EOF$tok / %終端ng~token: ◎ <eof-token> ending token
- %入力 から`~tokenを破棄する$tS ◎ Discard a token from input.\
- ~RET %~block ◎ Return block.
- その他 ⇒ %~block の.値に次の結果を`付加する$ ⇒ `成分~値を消費する$( %入力 ) ◎ anything else • Consume a component value from input and append the result to block’s value.
-
5.5.10. 関数を消費する
`関数を消費する@ ときは、 所与の ( `~token~stream$ %入力 ) に対し: ◎ To consume a function from a token stream input:
- ~Assert: `次回の~token$tS は `function$tok である ◎ Assert: The next token is a <function-token>.
- %~token ~LET %入力 から`~tokenを消費する$tS ◎ Consume a token from input,\
- %関数 ~LET 新たな`関数$ — その ⇒# .名前 ~SET %~token の.値, .値 ~SET 新たな`~list$ ◎ and let function be a new function with its name equal the returned token’s value, and a value set to an empty list.
-
%入力 を`処理する$tS: ◎ Process input:
-
`EOF$tok / `close-paren$Tok: ◎ <eof-token> <)-token>
- %入力 から`~tokenを破棄する$tS ◎ Discard a token from input.\
- ~RET %関数 ◎ Return function.
- その他 ⇒ %関数 の.値に次の結果を`付加する$ ⇒ `成分~値を消費する$( %入力 ) ◎ anything else • Consume a component value from input and append the result to function’s value.
-
5.5.11. `unicode-range$d 値を消費する
`~unicode-range記述子の値を消費する@ ときは、 所与の ( 文字列 %入力~文字列 ) に対し: ◎ To consume the value of a unicode-range descriptor from a string input string:
- %~token群 ~LET 新たな`~token~stream$ ◎ ↓
- `符号位置~streamを~token化する$( %入力~文字列, %~token群, ~T ) ◎ Let tokens be the result of tokenizing input string with unicode ranges allowed set to true. Let input be a new token stream from tokens.
- ~RET `成分~値~listを消費する$( %~token群 ) ◎ Consume a list of component values from input, and return the result.
注記: この~algoは、 早期~CSSにおける[ 決して再生産されるべきでない設計の過ち ]に因り存在する。 ◎ Note: The existence of this algorithm is due to a design mistake in early CSS. It should never be reproduced.
6. ~AnB 小構文
~CSSにおける一部の~~構成子 — `nth-child()$ps 疑似類など — は、 その対象になる~list内の~indexを指示する必要がある。 ~AnB 小構文は、 このために有用になる — それは、 ~list内の[ 単独の要素/一定周期に~~位置する要素~すべて ]を容易に指示することを作者に許容する。 ◎ Several things in CSS, such as the :nth-child() pseudoclass, need to indicate indexes in a list. The An+B microsyntax is useful for this, allowing an author to easily indicate single elements or all elements at regularly-spaced intervals in a list.
`~AnB@ 記法を成す整数[ %A は `周期@ / %B は `~offset@ ]を定義する。 それは、 負でない あらゆる整数 %n に対する[ ~list内の ( %A × %n + %B ) 個目の要素 ]を表現する ( 0 ではなく 1 から数える)。 ◎ The An+B notation defines an integer step (A) and offset (B), and represents the An+Bth elements in a list, for every positive integer or zero value of n, with the first element in the list having index 1 (not 0).
%A, %B どちらも正な場合、 これは実質的に,~listを先頭から順に %A 個ずつの要素~groupに分割0した上で (余った部分は、 最後の~groupを成す), 各~groupから %B 個目の要素を選択する。 ◎ For values of A and B greater than 0, this effectively divides the list into groups of A elements (the last group taking the remainder), and selecting the Bth element of each group.
~AnB 記法は、 ~keyword[ `even^v / `odd^v ]も受容し,[ `2n^v / `2n+1^v ]と同じ意味になる。 ◎ The An+B notation also accepts the even and odd keywords, which have the same meaning as 2n and 2n+1, respectively.
◎ Examples:
2n+0 /* ~list内の偶数個目の要素すべてを表現する ◎ represents all of the even elements in the list */ even /* 同じ ◎ same */ 4n+1 /* ~list内の[ 1, 5, 9, 13, …]個目の要素すべてを表現する ◎ represents the 1st, 5th, 9th, 13th, etc. elements in the list */
%A, %B どちらも負になり得るが,いずれにせよ[ %n ~GT 0 に対する正な ( %A × %n + %B ) ]のみが利用される。 ◎ The values of A and B can be negative, but only the positive results of An+B, for n ≥ 0, are used.
◎ Example:
-1n+6 /* ~list内の最初から 6 個までの要素を表現する ◎ represents the first 6 elements of the list */ -4n+10 /* ~list内の[ 2, 6, 10 ]個目の要素を表現する ◎ represents the 2nd, 6th, and 10th elements of the list */
%A, %B どちらも 0 の場合、 当の疑似類は,~list内のどの要素も表現しない。 ◎ If both A and B are 0, the pseudo-class represents no element in the list.
6.1. 非正式な構文~記述
◎非規範的%A ~EQ 0 の場合、 ~An 部分を省略してもヨイ ( %B 部分がすでに省略されていない限り)。 ~An 部分が無い場合、 負でない %B の前の `+^c 符号も省略してヨイ【! (when allowed) ?】 — この事例では、 構文は %B だけに単純~化される。 ◎ When A is 0, the An part may be omitted (unless the B part is already omitted). When An is not included and B is non-negative, the + sign before B (when allowed) may also be omitted. In this case the syntax simplifies to just B.
◎ Examples:
0n+5 /* ~list内の 5 個目の要素を表現する ◎ represents the 5th element in the list */ 5 /* 同じ ◎ same */
%A ~IN { 1, −1 } の場合、 当の規則から `1^c を省略してもヨイ。 ◎ When A is 1 or -1, the 1 may be omitted from the rule.
◎ Examples:
したがって次の記法は,どれも等価になる: ◎ The following notations are therefore equivalent:
1n+0 /* ~list内のすべての要素を表現する ◎ represents all elements in the list */ n+0 /* 同じ ◎ same */ n /* 同じ ◎ same */
%B ~EQ 0 の場合、 毎 %A 個目の要素が選ばれる。 そのような場合、 正負符号と %B 部分を省略してもヨイ ( ~An 部分がすでに省略されていない限り)。 ◎ If B is 0, then every Ath element is picked. In such a case, the +B (or -B) part may be omitted unless the A part is already omitted.
◎ Examples:
2n+0 /* ~list内の毎~偶数個目の要素を表現する ◎ represents every even element in the list */ 2n /* 同じ ◎ same */
B が負な場合、 正符号は負符号に置換する。 ◎ When B is negative, its minus sign replaces the + sign.
妥当な例: ◎ Valid example:
3n-6
妥当でない例: ◎ Invalid example:
3n + -6
~An, %B どちらも在る場合、 それらを分離する正負符号の前後には,空白も許可される。 ◎ Whitespace is permitted on either side of the + or - that separates the An and B parts when both are present.
空白を伴う妥当な例: ◎ Valid Examples with white space:
3n + 1 +3n - 2 -n+ 6 +6
空白を伴う無効な例: ◎ Invalid Examples with white space:
3 n + 2n + 2
6.2. ~anb 型
~AnB 記法は、 元々は,~CSSの他のものと少し異なる~tokenizerを利用して定義された — その結果、 ~CSS~tokenの用語を通して表出するときには,いくぶん不規則な定義になる。 この節では、[ ~AnB 記法を~CSS~tokenの用語を通して認識する方法 (したがって,~CSS文法の目的に~~適した ~anb 型を定義する) ]および[ %A, %B の値を得するために,当の~CSS~token列を解釈する方法 ]を述べる。 ◎ The An+B notation was originally defined using a slightly different tokenizer than the rest of CSS, resulting in a somewhat odd definition when expressed in terms of CSS tokens. This section describes how to recognize the An+B notation in terms of CSS tokens (thus defining the <an+b> type for CSS grammar purposes), and how to interpret the CSS tokens to obtain values for A and B.
~anb 型は、 ( `CSS-VALUES-4$r `§ 値~定義の構文$を利用して) 次で定義される: ◎ The <an+b> type is defined (using the Value Definition Syntax in the Values & Units spec) as:
`~anb@ = odd | even | `integer$t | `n-dimension$t | '+'?~nB n | -n | `ndashdigit-dimension$t | '+'?~nB `ndashdigit-ident$t | `dashndashdigit-ident$t | `n-dimension$t `signed-integer$t | '+'?~nB n `signed-integer$t | -n `signed-integer$t | `ndash-dimension$t `signless-integer$t | '+'?~nB n- `signless-integer$t | -n- `signless-integer$t | `n-dimension$t ['+' | '-'] `signless-integer$t | '+'?~nB n ['+' | '-'] `signless-integer$t | -n ['+' | '-'] `signless-integer$t
上に現れ, 下の表tの 1 列目に記される各種~生成規則は、[ 同じ行の 2 列目の~token ]であって, その各~fieldが[ 同じ行の 3 列目に記された条件 ]を満たすものである: ◎ where:
生成規則 | ~token | ~fieldが満たす条件 |
---|---|---|
`n-dimension@t | `dimension$tok | [ .型~flag ~EQ `整数^i ]~AND[ .単位 ~EQ`大小無視$sub `n^l ] |
`ndash-dimension@t | `dimension$tok | [ .型~flag ~EQ `整数^i ]~AND[ .単位 ~EQ`大小無視$sub `n-^l ] |
`ndashdigit-dimension@t | `dimension$tok | [ .型~flag ~EQ `整数^i ]~AND[ .単位 ~EQ`大小無視$sub "`n-^c`数字~列$" ] |
`ndashdigit-ident@t | `ident$tok | .値 ~EQ`大小無視$sub "`n-^c`数字~列$" |
`dashndashdigit-ident@t | `ident$tok | .値 ~EQ`大小無視$sub "`-n-^c`数字~列$" |
`integer@t | `number$tok | .型~flag ~EQ `整数^i |
`signed-integer@t | `number$tok | [ .型~flag ~EQ `整数^i ]~AND[ .符号~文字 ~NEQ ε ] |
`signless-integer@t | `number$tok | [ .型~flag ~EQ `整数^i ]~AND[ .符号~文字 ~EQ ε ] |
この表tの中の `数字~列@ は、 `数字$のみからなる,長さ 1 以上の任意の~~連なりを表す。
上で ~DAGGER 印が付与された所のように、 正符号 (`+^c) ~tokenの直後に[ `n^l から開始している `ident^tok ~token ]が来る所では,それらの合間に空白が在ってはナラナイ — さもなければ、 それらの~tokenは上の文法に合致しないとする。 他の[ ~tokenたちの合間に在る空白 ]は妥当である(無視される)。 ◎ †: When a plus sign (+) precedes an ident starting with "n", as in the cases marked above, there must be no whitespace between the two tokens, or else the tokens do not match the above grammar. Whitespace is valid (and ignored) between any other two tokens.
各~選択肢の生成規則(~top-levelの "|" で分割された各~項)は、 次に従って解釈される: ◎ The clauses of the production are interpreted as follows:
生成規則 | %A の値 | %B の値 |
---|---|---|
`odd^v | 2 | 1 |
`even^v | 2 | 0 |
`integer$t | 0 | `integer$t の.数値 |
`n-dimension$t | `n-dimension$t の.数値 | 0 |
'`+^c'? `n^c | 1 | 0 |
`-n^c | −1 | 0 |
`ndashdigit-dimension$t | `ndashdigit-dimension$t の.数値 | [ `ndashdigit-dimension$t の.単位から,最初の`符号位置$を除去した残りの部分 ]を 10 進数として解釈した結果 — 負になる |
'`+^c'? `ndashdigit-ident$t | 1 | [ `ndashdigit-ident$t の.値から,最初の`符号位置$を除去した残りの部分 ]を 10 進数として解釈した結果 — 負になる |
`dashndashdigit-ident$t | −1 | [ `dashndashdigit-ident$t の.値から最初の 2 個の`符号位置$を除去した残りの部分 ]を 10 進数として解釈した結果 — 負になる |
`n-dimension$t `signed-integer$t | `n-dimension$t の.数値 | `signed-integer$t の.数値 |
'`+^c'? `n^c `signed-integer$t | 1 | (同上) |
`-n^c `signed-integer$t | −1 | (同上) |
`ndash-dimension$t `signless-integer$t | `n-dimension$t の.数値 | −1 ×[ `signless-integer$t の.数値 ] |
'`+^c'? `n-^c `signless-integer$t | 1 | (同上) |
`-n-^c `signless-integer$t | −1 | (同上) |
`n-dimension$t ['`+^c' | '`-^c'] `signless-integer$t | `n-dimension$t の.数値 | %sign × [ `signless-integer$t の.数値 ] — ここで %sign は、 ['`+^c' | '`-^c'] が[ '`+^c' ならば 1 / '`-^c' ならば −1 ] |
'`+^c'? `n^c ['`+^c' | '`-^c'] `signless-integer$t | 1 | (同上) |
`-n^c ['`+^c' | '`-^c'] `signless-integer$t | −1 | (同上) |
- odd
- A is 2, B is 1.
- even
- A is 2, B is 0.
- <integer>
- A is 0, B is the integer’s value.
- <n-dimension>
- '+'? n
- -n
- A is the dimension’s value, 1, or -1, respectively. B is 0.
- <ndashdigit-dimension>
- '+'? <ndashdigit-ident>
- A is the dimension’s value or 1, respectively. B is the dimension’s unit or ident’s value, respectively, with the first code point removed and the remainder interpreted as a base-10 number. B is negative.
- <dashndashdigit-ident>
- A is -1. B is the ident’s value, with the first two code points removed and the remainder interpreted as a base-10 number. B is negative.
- <n-dimension> <signed-integer>
- '+'? n <signed-integer>
- -n <signed-integer>
- A is the dimension’s value, 1, or -1, respectively. B is the integer’s value.
- <ndash-dimension> <signless-integer>
- '+'? n- <signless-integer>
- -n- <signless-integer>
- A is the dimension’s value, 1, or -1, respectively. B is the negation of the integer’s value.
- <n-dimension> ['+' | '-'] <signless-integer>
- '+'? n ['+' | '-'] <signless-integer>
- -n ['+' | '-'] <signless-integer>
- A is the dimension’s value, 1, or -1, respectively. B is the integer’s value. If a '-' was provided between the two, B is instead the negation of the integer’s value.
7. 規則や他の値~用の文法の定義-法
~propその他の~CSS構文-構成子~用の文法を指定する方法は、 `CSS-VALUES-4$r `§ 値~定義の構文$が定義する。 ◎ CSS Values 4 § 2 Value Definition Syntax defines how to specify a grammar for properties and other CSS syntactic constructions.
7.1. ~block内容の定義-法: `block-contents^t, `declaration-list^t, `qualified-rule-list^t, `declaration-rule-list^t, `rule-list^t 生成規則
~CSS構文解析器は、 ~blockを成す内容を問わない — それらはすべて,同じ`~algo@#consume-a-blocks-contents$で構文解析され、 もっぱら,構成子として何が妥当になるかにより区別される。 ◎ The CSS parser is agnostic as to the contents of blocks—they’re all parsed with the same algorithm, and differentiate themselves solely by what constructs are valid.
規則の文法を書くときは、 `block-contents@t が,この[ 構成子を問わない構文解析 ]を表現する。 それは、[ ~block全体を占める値 ]としてに限って利用しなければナラナイ。 それは、[ 当の~blockが包含し得るものに対し,暗黙的に設置される制約 ]は無いことを表現する。 ◎ When writing a rule grammar, <block-contents> represents this agnostic parsing. It must only be used as the sole value in a block, and represents that no restrictions are implicitly placed on what the block can contain.
付随している注釈文は、 次を定義しなければナラナイ: ◎ Accompanying prose must\
- 当の文脈において何が妥当で何が無効になるか。 ◎ define what is valid and invalid in this context.\
- 妥当な`宣言$が`~prop宣言$である場合、 それは,`~cascade$とヤリトリするか否か — ヤリトリする場合、 その`詳細度@~CASCADE#cascade-specificity$,それは `!important^css をどう利用するか。 ◎ If any declarations are valid, and are property declarations, it must define whether they interact with the cascade; if they do, it must define their specificity and how they use !important.
しかしながら,多くの事例では、 ~blockは,所与の型を成す どの構成子も妥当に包含できるわけではない。 これらの事例を より明示的に表現するためとして、 次に挙げる生成規則を利用してもヨイ: ◎ In many cases, however, a block can’t validly contain any constructs of a given type. To represent these cases more explicitly, the following productions may be used
- `declaration-list@t ⇒ `宣言$は許容され,[ `~at-規則$, `有修飾~規則$ ]は自動的に無効になる。 ◎ <declaration-list>: only declarations are allowed; at-rules and qualified rules are automatically invalid.
- `qualified-rule-list@t ⇒ `有修飾~規則$は許容され,[ `宣言$, `~at-規則$ ]は自動的に無効になる。 ◎ <qualified-rule-list>: only qualified rules are allowed; declarations and at-rules are automatically invalid.
- `at-rule-list@t ⇒ `~at-規則$は許容され,[ `宣言$, `有修飾~規則$ ]は自動的に無効になる。 ◎ <at-rule-list>: only at-rules are allowed; declarations and qualified rules are automatically invalid.
- `declaration-rule-list@t ⇒ [ `宣言$, `~at-規則$ ]は許容され, `有修飾~規則$は自動的に無効になる。 ◎ <declaration-rule-list>: declarations and at-rules are allowed; qualified rules are automatically invalid.
- `rule-list@t ⇒ [ `有修飾~規則$, `~at-規則$ ]は許容され, `宣言$は自動的に無効になる。 ◎ <rule-list>: qualified rules and at-rules are allowed; declarations are automatically invalid.
これらはいずれも、 構文解析の用語においては,正確に `block-contents$t に等価である — 付随している注釈文は、 自動的に無効になるもの以外に限り,妥当性を定義する必要がある。 ◎ All of these are exactly equivalent to <block-contents> in terms of parsing, but the accompanying prose only has to define validity for the categories that aren’t automatically invalid.
様々な生成規則の例: ◎ Some examples of the various productions:
- ~top-levelの `media$at は, 自身の~block用に `rule-list$t を利用する。 一方で,入子にされた `media$at `CSS-NESTING-1$r は `block-contents$t を利用する。 ◎ A top-level @media uses <rule-list> for its block, while a nested one [CSS-NESTING-1] uses <block-contents>.
- `~style規則$は `block-contents$t を利用する。 ◎ Style rules use <block-contents>.
- `font-face$at は `declaration-list$t を利用する。 ◎ @font-face uses <declaration-list>.
- `page$at は `declaration-rule-list$t を利用する。 ◎ @page uses <declaration-rule-list>.
- `keyframes$at は `qualified-rule-list$t を利用する。 ◎ @keyframes uses <qualified-rule-list>
例えば, `font-face$at 用の文法は、 次のように書ける: ◎ For example, the grammar for @font-face can be written as:
`font-face$at = @font-face { `declaration-list$t }
付随している注釈文は、 ~block内で許容される妥当な`記述子$を定義する。 ◎ and then accompanying prose defines the valid descriptors allowed in the block.
例えば, `keyframes$at 用の文法は、 次のように書ける: ◎ The grammar for @keyframes can be written as:
`keyframes$at = @keyframes { `qualified-rule-list$t } `keyframe-rule^t = `keyframe-selector$t { `declaration-list$t }
付随している注釈文は、 次を定義する ⇒ `keyframes$at 内に許容されるものは `keyframe-rule^t に限られる。 各 `keyframe-rule^t は、 ~CSS~propのうち[ ~animate可能なものすべて, `animation-timing-function$p ]を受容するが,それらは~cascadeとはヤリトリしない。 ◎ and then accompanying prose defines that only <keyframe-rule>s are allowed in @keyframes, and that <keyframe-rule>s accept all animatable CSS properties, plus the animation-timing-function property, but they do not interact with the cascade.
7.2. 任意の内容を定義するもの: `declaration-value^t, `any-value^t 生成規則
文法によっては、 任意の適理な入力を受容して,その~errorを手動で取扱う方が有用になる場合もある (単純に,文法への不一致により当の構成子を即 無効にすることなく)。 ◎ In some grammars, it is useful to accept any reasonable input in the grammar, and do more specific error-handling on the contents manually (rather than simply invalidating the construct, as grammar mismatches tend to do).
例えば,`~custom~prop$は、[ 他の~CSS~propがとる値の成分も包含し得る ]ような, あるいは[ 既存の~CSSに まったく含まれないものに利用される ]ような,任意の適理な値を許容する。 他の例として、 `MEDIAQ$r の `general-enclosed$t 生成規則は、 その仕様の将来の構文が許容し得るものを定義して, “未知な” 値を特別な~logicで処する。 ◎ For example, custom properties allow any reasonable value, as they can contain arbitrary pieces of other CSS properties, or be used for things that aren’t part of existing CSS at all. For another example, the <general-enclosed> production in Media Queries defines the bounds of what future syntax MQs will allow, and uses special logic to deal with "unknown" values.
これを援助するため、 2 つの追加的な生成規則が定義される: ◎ To aid in this, two additional productions are defined:
- `declaration-value@t
-
この生成規則は、 `任意の^em[ 1 個以上の~tokenたちが成す連列 ]に — その連列が次に挙げるものを包含していないならば — 合致する: ◎ The <declaration-value> production matches any sequence of one or more tokens, so long as the sequence does not contain\
- `bad-string$tok
- `bad-url$tok
- 対になっていない[ `close-paren$Tok / `close-square$Tok / `close-curly$Tok ]
- ~top-levelの `semicolon$tok
- `!^l を.値にとる `delim$tok
- これは、 その並び全体として[ 妥当な宣言がとり得る値 ]を表現する。 ◎ It represents the entirety of what a valid declaration can have as its value.
- `any-value@t
- この生成規則は、[ ~top-levelの `semicolon$tok / `!^l を.値にとる `delim$tok ]も許容されることを除いて, `declaration-value$t と一致する。 ◎ The <any-value> production is identical to <declaration-value>, but also allows top-level <semicolon-token> tokens and <delim-token> tokens with a value of "!".\
- これは、 それ全体として[ 何らかの文脈の下で,妥当な~CSSになり得るもの ]を表現する。 ◎ It represents the entirety of what valid CSS can be in any context.
8. ~CSS~stylesheet
`~CSS~stylesheetを構文解析する@ ときは、 所与の ( ~stylesheet %入力 ) に対し:
- %結果 ~LET `~stylesheetを構文解析する$( %入力 )
- %結果 を成す ~EACH( ~top-levelの`有修飾~規則$ %規則 ) に対し ⇒ %規則 を,以下に定義するように`~style規則$として解釈する
[ `無効$な~style規則 / 認識できない~at-規則 / その文法あるいは文脈に則って 無効な~at-規則 ]は、 `構文解析error$であり,破棄される。 ◎ If any style rule is invalid, or any at-rule is not recognized or is invalid according to its grammar or context, it’s a parse error. Discard that rule.
8.1. ~style規則
`~style規則@ は、 `有修飾~規則$のうち,`選択子~list$に[ ~prop宣言~群が成す~list, および — 場合によっては — 入子にされた規則~群が成す~list ]を結付けるものである。 `~style規則$は、 `CSS2$r においては`規則~集合$とも呼ばれる。 ~style規則の内側にある宣言が`~cascade$にどう関与するかは、 `CSS-CASCADE-3$r が定義する。 ◎ A style rule is a qualified rule that associates a selector list with a list of property declarations and possibly a list of nested rules. They are also called rule sets in [CSS2]. CSS Cascading and Inheritance [CSS-CASCADE-3] defines how the declarations inside of style rules participate in the cascade.
有修飾~規則の.導入部は、 `selector-list$t として`構文解析-$される。 それが `失敗^i を返したならば、 その~style規則~全体が`無効$になる。 ◎ The prelude of the qualified rule is parsed as a <selector-list>. If this returns failure, the entire style rule is invalid.
有修飾~規則の~blockの内容は、 `declaration-list$t として構文解析される。 この~block内の有修飾~規則も`~style規則$である。 別の仕様やこの仕様の将来~levelにて定義されない限り、 この~list内の~at-規則は`無効$であり,無視するモノトスル。 ◎ The content of the qualified rule’s block is parsed as a <declaration-list>. Qualified rules in this block are also style rules. Unless defined otherwise by another specification or a future level of this specification, at-rules in that list are invalid and must be ignored.
注記: `CSS-NESTING-1$r は、 `~style規則$の内側では[ `条件付き~group規則$, 他の一部の`~at-規則$たち ]が許容されるものと定義する。 ◎ Note: [CSS-NESTING-1] defines that conditional group rules and some other at-rules are allowed inside of style rules.
~CSS~prop用の宣言のうち,その値が[ 未知なもの/当の~propに定義される構文に合致しないもの ]は、 `無効$であり,無視するモノトスル。 ~style規則の内容の妥当性は、 当の規則~自身の妥当性には~~影響しない。 他から定義されない限り,~prop名は`~ASCII大小無視$である。 ◎ Declarations for an unknown CSS property or whose value does not match the syntax defined by the property are invalid and must be ignored. The validity of the style rule’s contents have no effect on the validity of the style rule itself. Unless otherwise specified, property names are ASCII case-insensitive.
注記: `~custom~prop$ `CSS-VARIABLES$r の名前の文字大小は区別される。 ◎ Note: The names of Custom Properties [CSS-VARIABLES] are case-sensitive.
~CSS~stylesheetの~top-levelの`有修飾~規則$は、 `~style規則$である。 他の文脈における有修飾~規則が`~style規則$になるかどうかは、 その文脈の定義に従う。 ◎ Qualified rules at the top-level of a CSS stylesheet are style rules. Qualified rules in other contexts may or may not be style rules, as defined by the context.
例えば、[ `media$at 規則 `CSS3-CONDITIONAL$r の内側にある有修飾~規則 ]は`~style規則$であるが,[ `keyframes$at 規則 `CSS3-ANIMATIONS$r の内側にある有修飾~規則 ]はそうでない。 ◎ For example, qualified rules inside @media rules [CSS3-CONDITIONAL] are style rules, but qualified rules inside @keyframes rules [CSS3-ANIMATIONS] are not.
8.2. ~at-規則
`~at-規則@ ( `at-rule^en )は、 `at-keyword$tok 【!at-keyword】から始まる規則であり、 したがって,同じ文脈~内の`~style規則$と判別できる。 ◎ An at-rule is a rule that begins with an at-keyword, and can thus be distinguished from style rules in the same context.
`~at-規則$は、 次のために利用される: ◎ At-rules are used to:
- ~style規則や他の~at-規則 — `条件付き~group規則$内にあるものなど — を~group化したり構造~化する。 ◎ group and structure style rules and other at-rules such as in conditional group rules
- 特定0の要素には結付けられない~style情報を宣言する — `~counter~style$を定義するなど。 ◎ declare style information that is not associated with a particular element, such as defining counter styles
- 構文上の構成子を管理する — `import$at や `namespace$at における対応付けなど ◎ manage syntactic constructs such as imports and namespaces keyword mappings
- `~style規則$が~serveしない,他の諸々の目的を~serveする。 ◎ and serve other miscellaneous purposes not served by a style rule
`~at-規則$は、 自身に特有な規則と目的に依存して多くの形をとり得るが,次の 2 種に大別される: ◎ At-rules take many forms, depending on the specific rule and its purpose, but broadly speaking there are two kinds:\
- `一文~at-規則@ ( `statement at-rule^en, “~blockを伴わない” ~at-規則) ⇒ これは、 `~block~at-規則$より単純な,~semicolonで終端する構成子である。 ◎ statement at-rules which are simpler constructs that end in a semicolon,\
- `~block~at-規則@ ( `block at-rule^en, “~blockを伴う” ~at-規則 ) ⇒ これは、 `波括弧~block$で終端する構成子であり,入子な[ `有修飾~規則$/`~at-規則$/`宣言$ ]を包含できる。 ◎ and block at-rules which end in a {}-block that can contain nested qualified rules, at-rules, or declarations.
`~block~at-規則$は、 概して,[ `~at-規則$/`有修飾~規則$/`記述子~宣言$ ]たちが成す~collection【混在し得る】を包含する — それらには、 当の`~at-規則$に特有なものも, そうでない汎用なものもあり, 当の~at-規則により定義される制限の~subjectになる。 ◎ Block at-rules will typically contain a collection of (generic or at-rule–specific) at-rules, qualified rules, and/or descriptor declarations subject to limitations defined by the at-rule.\
`記述子@ は,`~prop$に類似する(かつ同じ構文で宣言される)が、 ~tree内の[ 要素/~box ]ではなく,特定0の型の`~at-規則$に結付けられる。 ◎ Descriptors are similar to properties (and are declared with the same syntax) but are associated with a particular type of at-rule rather than with elements and boxes in the tree.
8.3. `charset^at 規則
~stylesheet用に`~fallback符号化法を決定する$~algoは、 ~fileの一番先頭から,特定の~byte列 — 構文上は[ 名前 "`charset^at" の`~at-規則$ ]の形をとる,少数の~byte列 — を検索する。 ◎ The algorithm used to determine the fallback encoding for a stylesheet looks for a specific byte sequence as the very first few bytes in the file, which has the syntactic form of an at-rule named "@charset".
しかしながら、 名前 `charset@at の`~at-規則$は,実際には無い。 `charset$at 規則のどの出現に対しても、 ~stylesheetを実際に構文解析するときは,認識できない規則として扱った上で、 ~stylesheetの文法を検査するときは,無効なものとして落とすモノトスル。 ◎ However, there is no actual at-rule named @charset. When a stylesheet is actually parsed, any occurrences of an @charset rule must be treated as an unrecognized rule, and thus dropped as invalid when the stylesheet is grammar-checked.
注記: CSS 2.1 においては、 `charset$at は妥当な規則であった。 旧来の仕様には、 依然として,[ `charset$at 規則を参照rして, ~stylesheet内における その有無について明示的に~~述べているもの ]もある。 ◎ Note: In CSS 2.1, @charset was a valid rule. Some legacy specs may still refer to a @charset rule, and explicitly talk about its presence in the stylesheet.
9. 直列化
この仕様にて述べられる~tokenizerは、 ~commentに対応する~tokenは,生産しないし,何らかの仕方で保全することもない。 実装は、[ 各~commentの内容,~token~stream内での その所在 ]を保全してもヨイ 【以下では、 “`保全d~comment^dfn” と称される】 。 そうする場合、 その保全された情報は,構文解析~段に~~影響させないモノトスル。 ◎ The tokenizer described in this specification does not produce tokens for comments, or otherwise preserve them in any way. Implementations may preserve the contents of comments and their location in the token stream. If they do, this preserved information must have no effect on the parsing step.
この仕様は、 ~CSSを直列化する一般的な方法は 定義しない。 その仕事は、 `CSSOM$r, および 個々の特能の仕様に委ねられる。 特に,~commentや空白の直列化は定義されない。 ◎ This specification does not define how to serialize CSS in general, leaving that task to the [CSSOM] and individual feature specifications. In particular, the serialization of comments and whitespace is not defined.
直列化に課される唯一の要件は、 構文解析と “往復-” できなければナラナイことである。 すなわち,~stylesheetの構文解析においては、[ 連続する `whitespace$tok が 1 個の~tokenに縮約されてもヨイ~DAGGER ]ことを除き,[ その結果 ]と[ それを更に直列化して, もう一度~構文解析した結果 ]は,同じ~data構造を生産しなければナラナイ。 ◎ The only requirement for serialization is that it must "round-trip" with parsing, that is, parsing the stylesheet must produce the same data structures as parsing, serializing, and parsing again, except for consecutive <whitespace-token>s, which may be collapsed into a single token.
注記~DAGGER: 上の例外は、 ~CSS文法が,任意の量の空白を 常に 1 個の~spaceと同一視することに因る。 ◎ Note: This exception can exist because CSS grammars always interpret any amount of whitespace as identical to a single space.
この要件を満たすためには: ◎ To satisfy this requirement:
- [ `5C^U を.値にとる `delim$tok ]は、[ `5C^U, `改行文字$ ]が成す並びとして直列化されなければナラナイ。 (~tokenizerが その種の~tokenを発するときは、 必ず[ 改行文字から開始する `whitespace$tok ]を後続させる。) ◎ A <delim-token> containing U+005C REVERSE SOLIDUS (\) must be serialized as U+005C REVERSE SOLIDUS followed by a newline. (The tokenizer only ever emits such a token followed by a <whitespace-token> that starts with a newline.)
- `hash$tok であって[ .型~flag ~EQ `無制約^i ]なるものに要する~escapeが,同じ~tokenであって[ .型~flag ~EQ `id^i ]なるものより多くなることはない。 ◎ A <hash-token> with the "unrestricted" type flag may not need as much escaping as the same token with the "id" type flag.
- `dimension$tok の.単位は、 科学的記数法と区別するために,~escapeを要し得る。 ◎ The unit of a <dimension-token> may need escaping to disambiguate with scientific notation.
-
下の表tの中で,チェック( ✗ )が入っている欄と同じ[ 列, 行 ]の見出しに示されている 2 個の~tokenを,この順に連続して直列化するときは、 それらの合間に~commentを挟むモノトスル。 ◎ For any consecutive pair of tokens, if the first token shows up in the row headings of the following table, and the second token shows up in the column headings, and there’s a ✗ in the cell denoted by the intersection of the chosen row and column, the pair of tokens must be serialized with a comment between them.
~tokenizerが~commentの内容を保全する場合、 2 個の~tokenの合間に在る各~commentに対しては,保全d~commentを利用するベキである。 保全しない場合、[ 空な~comment( `/**/^c ) ]を挿入するモノトスル。 (保全d~commentは、 ~tokenの合間に~commentが要求されない所でも,挿入し直してヨイ。) ◎ If the tokenizer preserves comments, and there were comments originally between the token pair, the preserved comment(s) should be used; otherwise, an empty comment (/**/) must be inserted. (Preserved comments may be reinserted even if the following tables don’t require a comment between two tokens.)
見出しに挙げる~tokenのうち, 1 個の文字からなるものは、 それを.値に伴う `delim$tok を表現する。 ◎ Single characters in the row and column headings represent a <delim-token> with that value, except for "(", which represents a (-token. `ident$tok `function$tok `url$tok `bad-url$tok `-^c `number$tok `percentage$tok `dimension$tok `CDC$tok `(^c `*^c `%^c `ident$tok `✗✗✗✗✗✗✗✗✗✗__^cK `at-keyword$tok `✗✗✗✗✗✗✗✗✗___^cK `hash$tok `✗✗✗✗✗✗✗✗✗___^cK `dimension$tok `✗✗✗✗✗✗✗✗✗___^cK `#^c `✗✗✗✗✗✗✗✗✗___^cK `-^c `✗✗✗✗✗✗✗✗✗___^cK `number$tok `✗✗✗✗_✗✗✗✗__✗^cK `@^c `✗✗✗✗✗___✗___^cK `.^c `_____✗✗✗____^cK `+^c `_____✗✗✗____^cK `/^c `__________✗_^cK
9.1. ~anb の直列化-法
`~anb 値を直列化-@ するときは、 その ( `周期$ %A, `~offset$ %B ) に対し,次を走らす: ◎ To serialize an <an+b> value, with integer values A and B:
- ~IF[ %A ~EQ 0 ] ⇒ ~RET %B を直列化した結果
- %結果 ~LET %A に応じて ⇒# 1 ならば 空~文字列 / −1 ならば `-^l / ~ELSE_ %A を直列化した結果
- %結果 に `n^l を付加する
- ~IF[ %B ~EQ 0 ] ⇒ ~RET %結果
- ~IF[ %B ~GT 0 ] ⇒ %結果 に `+^l を付加する
- %結果 に %B を直列化した結果を付加する
- ~RET %結果
~privacyの考慮点
この仕様が導入する新たな~privacyの懸念は無い。 ◎ This specification introduces no new privacy concerns.
~privacyの考慮点
この仕様による~CSS構文解析は、 今や すべての入力に対し一義的に定義されるので,~securityを改善する。 ◎ This specification improves security, in that CSS parsing is now unambiguously defined for all inputs.
~whitelistや~filterなどの旧い構文解析器には、 この仕様と異なるように構文解析する限り~secureでない部分があることになる。 以前の構文解析の仕様には,[ 多義的で, ~browserにより解釈が異なるような多数の際どい事例 ]が残されているので、 それらの~filterは~secureでない可能性がある。 この仕様は,その状況を悪化させることはない。 ◎ Insofar as old parsers, such as whitelists/filters, parse differently from this specification, they are somewhat insecure, but the previous parsing specification left a lot of ambiguous corner cases which browsers interpreted differently, so those filters were potentially insecure already, and this specification does not worsen the situation.
変更点
◎非規範的【 変更~箇所の引用は省略する。 】
2021年 12月 24日 勧告候補~草案からの変更点
~~主要な変更点は: ◎ The following substantive changes were made:
- `非~ASCII符号位置@~TR/css-syntax-3/#non-ascii-code-point$ 【(旧)今や,`非~ASCII~ident符号位置$】 の定義を一部の面倒事になり得る符号位置を省略するよう制約した。 ( `7129$issue ) ◎ The definition of non-ASCII code point was restricted to omit some potentially troublesome codepoints. (7129)
- [ 関数, ~at-規則 ]用の生成規則を定義した。 ( `5728$issue ) ◎ Defined the <foo()> and <@foo> productions. (5728)
- 入子な~style規則を許容した。 ( `7961$issue )。 ◎ Allow nested style rules. (7961).
- 入子ngを許容するための一部として、 `§ 構文解析-法@#parsing$の全体を有意に書き直した。 特に、[ `~stylesheetの内容を構文解析する$/`~blockの内容を構文解析する$ ]への支持を受けて,[ “規則たちが成す~listを構文解析する” / “宣言たちが成す~listを構文解析する” ]を除去した。 追加的な規範的な変更は、 ~semicolonは,一部の文脈では少し異なる~error回復を誘発するようになったことである — `media$at ~blockの様なものを構文解析した結果が, 入子にされていてもいなくても一致するよう。 ( `8834$issue )。 ◎ As part of allowing Nesting, significantly rewrote the entire parsing section. Notably, removed "parse a list of rules" and "parse a list of declarations" in favor of "parse a stylesheet’s contents" and "parse a block’s contents". Only additional normative change is that semicolons trigger slightly different error-recovery now in some contexts, so that parsing of things like @media blocks is identical whether they’re nested or not. (8834).
- `urange^t 生成規則【 `unicode-range$tok 】を既存の~tokenに基づいて定義する試みを除去した。 代わりに,~sourceから特別に構文解析し直すことに依拠するようにした — 特定的には、 `unicode-range$d 記述子を構文解析する 【`~unicode-range~tokenを消費する$】とき。 ( `8835$issue ) ◎ Removed the attempt at a <urange> production in terms of existing tokens, instead relying on a special re-parse from source specifically when you’re parsing the unicode-range descriptor. (8835)
- 上により,~tokenの “表現” (構文解析する前の,元の文字列)を保全する必要もなくなったので、 `§ ~AnB 小構文@anb-microsyntax$ にも残っていた “表現” への参照を除去した — 代わりに,それ用に必要yな少しばかりの情報(実数は明示的な符号を伴っていたか否か)を記録するだけにした。 ◎ Since the above removed the main need to preserve a token’s "representation" (the original string it was parsed from), removed the rest of the references to "representation" in the An+B section and instead just recorded the few bits of information necessary for that (whether or not the number had an explicit sign).
- 一部の利用( `~custom~prop$, `unicode-range^d 記述子)が[ 宣言の値~全体を成す元の文字列への~access ]を要求することを明示的に注記して, それが構文解析器内のどこで生じるかを~markした。 ◎ Explicitly noted that some uses (custom properties, the unicode-range descriptor) require access to the original string of a declaration’s entire value, and marked where that occurs in the parser.
- `~blockの内容を消費する$ときには、 今や,当の内容を成す[ 規則たちに相対的な,宣言たちの順序 ]も保守される — 以前は、 どこに出現するかに関わらず, すべての宣言を一緒に~group化していた。 その情報で実際に何を行うものと決定するかは、 【当の内容を有する】個々の規則に委ねられる。 ◎ When consuming a block’s contents, rather than grouping all declarations together, regardless of where they appear relative to other rules, declarations now maintain their relative position wrt surrounding rules. It’s up to individual rules to determine what they actually do with that information.
2019年 8月 16日 勧告候補からの変更点
~~主要な変更点は: ◎ The following substantive changes were made:
- `§ ~commaで分離された~listを ある~CSS文法に則って構文解析する@#parse-comma-list$ ~algoを新たに追加した。 ◎ Added a new § 5.4.2 Parse a comma-separated list according to a CSS grammar algorithm.
-
[ ~style~blockの内容を構文解析する~algo, それに対応する `style-block^t 生成規則 ]†を新たに追加した。 `~style規則$は、 これらを利用するものと定義した。
【† これらは、今や[ `~blockの内容を構文解析する$, `block-contents$t ]として定義し直された。 】
◎ Added a new "Parse a style block’s content" algorithm and a corresponding <style-block> production, and defined that style rules use it. - `~stylesheetを構文解析する$ ~algoを Fetch 仕様に関係する `shenanigans^en に揃えた。 ( `commit@https://github.com/w3c/csswg-drafts/commit/64becb59fe678760608a6f2a8d6bfb3a334500c9#diff-9d409f899ee6e2cc8cd87356d0e2a0ff739c5aa9663d83f49c951c379a38f1f6$ を見よ。) ◎ Aligned parse a stylesheet with the Fetch-related shenanigans. (See commit.) ◎ To parse a stylesheet from an input given an optional url location : • ... • Create a new stylesheet , with its location set to location (or null, if location was not passed). • ...
編集上の変更点は: ◎ The following editorial changes were made:
- [ `~at-規則$, `一文~at-規則$, `~block~at-規則$, `記述子$ ]用の定義を供するため, `§ ~at-規則@#at-rules$ を追加した ( `課題 #5633@~CSSissue/5633$ )。 ◎ Added § 8.2 At-rules to provide definitions for at-rules, statement at-rules, block at-rules, and descriptors. (5633)
- `宣言$用の定義~textを改善した。 [ `~prop宣言$, `記述子~宣言$ ]用の定義を追加した。 ◎ Improved the definition text for declaration, and added definitions for property declarations and descriptor declarations.
- 何箇所かで利用していた用語 “名前” に代えて、 一貫して`~ident$を参照rするよう切替えた。 ◎ Switched to consistently refer to ident sequence, rather than sometimes using the term “name”.
- ~token化前の処理nのいくつかを明示的に命名して,それらを構文解析の入口から明示的に参照rするようにした (総括的な言明 “これらの~algoの開始-時には X を行うとする” に依拠するのでなく)。 ◎ Explicitly named several of the pre-tokenizing processes, and explicitly referred to them in the parsing entry points (rather than relying on a blanket "do X at the start of these algorithms" statement).
- “`~tokenの合間に~commentを挟む@#_put-a-comment-between-tokens$” 表tに~entryを追加して、[ ~identは、 今や `--^c から開始し得る事実 ]を適正に取扱うようにした。 ( `pull #6874@https://github.com/w3c/csswg-drafts/pull/6874$ ) ◎ Added more entries to the "put a comment between them" table, to properly handle the fact that idents can now start with --. (6874)
2014年 2月 20日 勧告候補からの変更点
~~主要な変更点は: ◎ The following substantive changes were made:
- `urange^t 生成規則を創出する支持を受けて, `unicode-range$tok は除去した【が,戻された(以下も同様)】。 ◎ Removed <unicode-range-token>, in favor of creating a <urange> production.
- 文字列を包含する `url^f 関数は、 今や,通常通り `function$tok として構文解析される。 “生の” ~URLを包含する `url^f 関数は、 依然として `url$tok として特別に構文解析される。 ◎ url() functions that contain a string are now parsed as normal <function-token>s. url() functions that contain "raw" URLs are still specially parsed as <url-token>s.
- 文字列を消費するよう試みる前に引用符を消費していなかった, “~URL~tokenを消費する” ~algoの~bugを修正した。 ◎ Fixed a bug in the "Consume a URL token" algorithm, where it didn’t consume the quote character starting a string before attempting to consume the string.
- [[ 現在の/次回の ]入力~token, それが消費される時機 ]に関する,いくつかの構文解析器~algoの~bugを修正した。 ◎ Fixed a bug in several of the parser algorithms related to the current/next token and things getting consumed early/late.
- ~token化と構文解析~algoにおける いくつかの~bugを修正した。 ◎ Fix several bugs in the tokenization and parsing algorithms.
- ~identに類する~tokenの定義を[ `--^c から開始する~ident ]も許容するように変更した 【`参照@#would-start-an-identifier$】 。 その~~一環として、[ `~tokenを消費する$ときの `2D^U 段を成す段たち ]を配列し直して, `CDC$tok が — `--^c `ident-token$t にはならずに — そう認識されるようにした。 ◎ Change the definition of ident-like tokens to allow "--" to start an ident. As part of this, rearrange the ordering of the clauses in the "-" step of consume a token so that <CDC-token>s are recognized as such instead of becoming a -- <ident-token>.
- `~anb$ の`周期$ ~IN { 1, −1 } のときは、 その数字は直列化しないようにした。 ◎ Don’t serialize the digit in an <an+b> when A is 1 or -1.
- すべての~tokenは `表現^dfn を持つように定義した 【が、廃された( “.元の~text” に置換された)】 。 ◎ Define all tokens to have a representation.
- 2 個の符号位置が`妥当な~escape$を成すかどうか検査するときの,小さな~bugを修正した — [ `5C^U, `EOF$tok ]が成す並びは、 今や,妥当な~escapeではないものと正しく報告される。 ~stylesheet内の最後の `\^c は、 今や,自身を `delim$tok として発するだけになる。 ◎ Fixed minor bug in check if two code points are a valid escape—a \ followed by an EOF is now correctly reported as not a valid escape. A final \ in a stylesheet now just emits itself as a <delim-token>.
- `charset^at は、 もはや妥当な~CSS規則ではない (単に, `charset^at という名前の規則の`様に見える^em 符号化法~宣言があるに過ぎない)。 ◎ @charset is no longer a valid CSS rule (there’s just an encoding declaration that looks like a rule named @charset)
- 構文解析の間に,宣言の.値の[ 先頭/末尾 ]にある空白~並びは削るようにした。 ◎ Trimmed whitespace from the beginning/ending of a declaration’s value during parsing.
- ~WGによる解決にしたがって、 `Selectors^cite に特有な~tokenは除去した。 ◎ Removed the Selectors-specific tokens, per WG resolution.
- ~WGによる解決にしたがって、 入力~stream内の`~surrogate$は~filterするようにした。 この仕様~全体は、 今や,`~scalar値$のみに演算する。 ◎ Filtered surrogates from the input stream, per WG resolution. Now the entire specification operates only on scalar values.
編集上の変更点は: ◎ The following editorial changes were made:
- “文字列を消費する” ~algoは、 明示的な終端~符号位置を指定せずに~callできるようにされた。 その場合、 現在の~tokenが代わりに利用される。 これにより, 3 箇所の~call元に変更が加えられた。 ◎ The "Consume a string token" algorithm was changed to allow calling it without specifying an explicit ending token, so that it uses the current token instead. The three call-sites of the algorithm were changed to use that form.
- 編集上の,~algoにおける小さな~~再構成。 ◎ Minor editorial restructuring of algorithms.
- 構文解析-~API用の入口として、 次を追加した ⇒# `~CSS文法に則って構文解析する$, `~commaで分離された成分~値~listを構文解析する$ ◎ Added the parse and parse a comma-separated list of component values API entry points.
- 次に挙げる生成規則を追加した ⇒# `declaration-value$t, `any-value$t ◎ Added the <declaration-value> and <any-value> productions.
- 次に挙げる定義は、 `INFRA$r による定義に一致するので,除去した ⇒# “符号位置”, “~surrogate符号位置” ◎ Removed "code point" and "surrogate code point" in favor of the identical definitions in the Infra Standard.
- どの【符号位置】範囲も `inclusive^en であることを明確化した。 ◎ Clarified on every range that they are inclusive.
- `%^l `delim$tok ~tokenの次に出現する `number$tok を取扱うため、 `~comment挿入~表t@#serialization-tables$に列を追加した。 ◎ Added a column to the comment-insertion table to handle a number token appearing next to a "%" delim token.
`各~commentに対する処置集@https://github.com/w3c/csswg-drafts/milestone/5?closed=1$ もある。 ◎ A Disposition of Comments is available.
2013年 11月 5日 最終~作業草案からの変更点
- `§ 直列化@#serialization$は、 “往復-” の要件のみが規範的になるように書き直され、 それを得るための方法の詳細は注記に移動された。 これらの詳細~における,いくつかの際どい事例は解消された。 ◎ The Serialization section has been rewritten to make only the "round-trip" requirement normative, and move the details of how to achieve it into a note. Some corner cases in these details have been fixed.
- 参照文献(規範)に `ENCODING$r が追加された。 それは規範的な~textからは参照されていたが、 単に文献~listから漏れていた。 ◎ [ENCODING] has been added to the list of normative references. It was already referenced in normative text before, just not listed as such.
-
~stylesheetの`~fallback符号化法を決定する$~algoにおける `charset^at ~byte列の上限は、 1024 ~byteにされた。 これは,~HTMLにおける `meta charset^e の処し方に倣うものであり、 列の長さを常に一定に抑えるようにする。 これは、 符号化法~labelの前後の空白についてのみ,以前と相違がある: ◎ In the algorithm to determine the fallback encoding of a stylesheet, limit the @charset byte sequence to 1024 bytes. This aligns with what HTML does for <meta charset> and makes sure the size of the sequence is bounded. This only makes a difference with leading or trailing whitespace in the encoding label:
@charset " …多量の空白… utf-8";
2013年 9月 19日 作業草案からの変更点
- `環境~符号化法$の概念が追加された。 挙動は変更されていないが、 定義の一部は,関連な仕様へ移動されるべきである。 ◎ The concept of environment encoding was added. The behavior does not change, but some of the definitions should be moved to the relevant specs.
`CSS 2.1^cite, `Selectors Level 3^cite からの変更点
注記: この仕様の要点は、 実態に合致させることである — CSS 2.1 からの変更点は、 おおよそ常に, CSS 2.1 が[ 実際の~browserの挙動に合致していない何かを指定しているか, または 何かを未指定なままにしている ]ことに因る。 何らかの詳細が~browserの挙動に合致しない場合、 それは,ほぼ意図的でないことなので,編集者まで知らせるよう願う。 ◎ Note: The point of this spec is to match reality; changes from CSS2.1 are nearly always because CSS 2.1 specified something that doesn’t match actual browser behavior, or left something unspecified. If some detail doesn’t match browsers, please let me know as it’s almost certainly unintentional.
~byte~streamからの復号-法における変更点: ◎ Changes in decoding from a byte stream:
- ~ASCII互換~byte~patternの中では、 `charset$at 規則のみが検出される。 ◎ Only detect @charset rules in ASCII-compatible byte patterns.
- ~ASCII互換でない符号化法を指定する `charset$at 規則は、 規則それ自身を適正に復号できなくするので,無視される。 ◎ Ignore @charset rules that specify an ASCII-incompatible encoding, as that would cause the rule itself to not decode properly.
- 文字~符号化法は、 IANA ~registryではなく, `ENCODING$r を参照rするようにされた。 ◎ Refer to [ENCODING] rather than the IANA registry for character encodings.
~token化における変更点: ◎ Tokenization changes:
- ~CSS~source内の `00^U `符号位置$はすべて, `FFFD^U に置換される ◎ Any U+0000 NULL code point in the CSS source is replaced with U+FFFD REPLACEMENT CHARACTER.
- `\0^css などの 0 に評価されるどの 16 進~escape列も, `00^U でなく `FFFD^U を生産する。 ◎ Any hexadecimal escape sequence such as \0 that evaluates to zero produce U+FFFD REPLACEMENT CHARACTER rather than U+0000 NULL.
- `非~ASCII~ident符号位置$の定義は、 ~HTMLの`妥当な~custom要素~名$に整合するよう変更された。 ◎ The definition of non-ASCII ident code point was changed to be consistent with HTML’s valid custom element names.
- ~token化は、 もはや[ `COMMENT^c / `BAD_COMMENT^c ]~tokenを発することはない。 `BAD_COMMENT^c は今や,(~errorではない)通常の~tokenと同じものと見なされる。 分離される必要がある~token — 例えば 連続する 2 個の `ident$tok など — の合間に,必要yなだけ~commentを挿入することは、 `§ 直列化@#serialization$が責を負う。 ◎ Tokenization does not emit COMMENT or BAD_COMMENT tokens anymore. BAD_COMMENT is now considered the same as a normal token (not an error). Serialization is responsible for inserting comments as necessary between tokens that need to be separated, e.g. two consecutive <ident-token>s.
-
`unicode-range$tok を除去した。 価値が低い割に,ときには有害になるので (例えば、 `u+a { font-weight: bold; }^css は,`無効な選択子$にされていた…)。 ◎ The <unicode-range-token> was removed, as it was low value and occasionally actively harmful. (u+a { font-weight: bold; } was an invalid selector, for example...)
代わりに,~token~patternに基づく `urange^t 生成規則が追加された。 それは、 CSS 2.1 で許容されていたものより,形上では緩い(任意個数の数字や `?^c )が、 実施におけるその利用には影響iない筈である。 ◎ Instead, a <urange> production was added, based on token patterns. It is technically looser than what 2.1 allowed (any number of digits and ? characters), but not in any way that should impact its use in practice.
- ~tokenizerにおいては`~EOF~errorの取扱い規則$が適用され、 `~EOF$iに際しては — `BAD_STRING^c や `BAD_URI^c ではなく — 通常の `string$tok や `url$tok が発される。 ◎ Apply the EOF error handling rule in the tokenizer and emit normal <string-token> and <url-token> rather than BAD_STRING or BAD_URI on EOF.
- `BAD_URI^c ~token(今や `bad-url$tok )は “自己完結的” である。 言い換えれば、[ ~tokenizerにおいて, `url$tok ではなく `bad-url$tok の中であることが~~判明した時点 ]で, 単に閉じられる箇所を見つけるために,他のすべてを無視して前方検索する。 この挙動は、[ それを `function$tok の様に扱って, 開いた~blockに類するものに注意を払う ]より単純である。 この挙動は WebKit だけが呈するが、 それによる互換性~bugは生じていないように見受けられる。 ◎ The BAD_URI token (now <bad-url-token>) is "self-contained". In other words, once the tokenizer realizes it’s in a <bad-url-token> rather than a <url-token>, it just seeks forward to look for the closing ), ignoring everything else. This behavior is simpler than treating it like a <function-token> and paying attention to opened blocks and such. Only WebKit exhibits this behavior, but it doesn’t appear that we’ve gotten any compat bugs from it.
- `comma$tok が追加された。 ◎ The <comma-token> has been added.
- [ `number$tok, `percentage$tok, `dimension$tok ]は、 前置された`正負符号$を値の一部に含むように変更された (他の仕様で言及される度に,手動で取扱う必要がある,別々な `delim$tok としてではなく)。 これによる唯一の帰結は、 符号とその実数の合間には,もはや~commentを挿入し得なくなったことである。 ◎ <number-token>, <percentage-token>, and <dimension-token> have been changed to include the preceding +/- sign as part of their value (rather than as a separate <delim-token> that needs to be manually handled every time the token is mentioned in other specs). The only consequence of this is that comments can no longer be inserted between the sign and the number.
- ~WGによる解決に従って、 ~SVGに合わせるため,[ 実数/百分率/次元 ]における科学的記数法も~supportされる。 ◎ Scientific notation is supported for numbers/percentages/dimensions to match SVG, per WG resolution.
- [ `~surrogate$用の 16 進~escape ]は今や、 その~surrogateではなく,代替文字 【 `FFFD^U 】 を発する。 これにより、 実装は,~UTF-16を内部的に安全に利用できるようになる。 ◎ Hexadecimal escape for surrogate now emit a replacement character rather than the surrogate. This allows implementations to safely use UTF-16 internally.
構文解析における変更点: ◎ Parsing changes:
- ~WGによる解決に従って,今や、 どの`宣言~list$も `page$at のような~at-規則を受容する。 これにより,その種の~at-規則が未だ定義されていなかったとしても,~errorの取扱いには相違が生じる: `~at-規則$は、[ 妥当かどうか, `semicolon$tok の有無 ]を問わず,波括弧~blockで終端し、 次の宣言を始めさせる。 ◎ Any list of declarations now also accepts at-rules, like @page, per WG resolution. This makes a difference in error handling even if no such at-rules are defined yet: an at-rule, valid or not, ends at a {} block without a <semicolon-token> and lets the next declaration begin.
-
文法~内の様々な箇所に現れる,諸々の “特別な” ~token (対になっていない `close-curly$Tok など) の取扱いは、 少なくとも 1 つ以上の~browserに見られる,ある種の適理な挙動により指定された。 その種の~tokenが伴われた~stylesheetは、 以前までは,単に ~stylesheet文法に まったく合致しないものとされており、 その取扱いは,まったく定義されていなかった。 特定的には、 今や: ◎ The handling of some miscellaneous "special" tokens (like an unmatched <}-token>) showing up in various places in the grammar has been specified with some reasonable behavior shown by at least one browser. Previously, stylesheets with those tokens in those places just didn’t match the stylesheet grammar at all, so their handling was totally undefined. Specifically:
- [ `角括弧~block$ / `丸括弧~block$ / `関数$ ]は、[ `波括弧~block$, `at-keyword$tok, `semicolon$tok, ]のいずれをも包含し得る ◎ [] blocks, () blocks and functions can now contain {} blocks, <at-keyword-token>s or <semicolon-token>s
- 有修飾~規則の.導入部は、 ~semicolonを包含し得る ◎ Qualified rule preludes can now contain semicolons
- [ 有修飾~規則 / ~at-規則の.導入部 ]は、 `at-keyword$tok 包含し得る。 ◎ Qualified rule and at-rule preludes can now contain <at-keyword-token>s
~AnB における, `Selectors Level 3^cite `SELECT$r からの変更点: ◎ An+B changes from Selectors Level 3 [SELECT]:
-
~AnB 小構文は、 今や — 別々な~tokenizerではなく,~CSS~tokenの用語を通して — 正式に定義された。 その結果、 小さな相違が生じている: ◎ The An+B microsyntax has now been formally defined in terms of CSS tokens, rather than with a separate tokenizer. This has resulted in minor differences:
- 一部の場合には、 負符号や数字を (それらが `dimension$tok の.単位や `ident$tok の一部として出現するときには) ~escapeできる。 ◎ In some cases, minus signs or digits can be escaped (when they appear as part of the unit of a <dimension-token> or <ident-token>).
謝辞
次の方々からの~feedbackと貢献に: ◎ Thanks for feedback and contributions from\
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, and Zack Weinberg.