HTML5/common-microsyntaxes

From HTML5 Chinese Interest Group Wiki
Jump to: navigation, search

通用微語法

HTML 在很多地方使用不同的資料型態,如日期或數值。此章節描述用這些格式的內容符合規範的條件與解析他們的方法。

注:我們強烈迫切實作者仔細檢驗任何用來解析下述語法的第三方程式庫。舉例來說,日期程式庫實作的錯誤處理行為很可能有與本規範要求的不同,這是因為描述跟本規範用的日期語法相似的規範未定義錯誤處理行為,也因此各種實作在處理錯誤上有很大的不同。

常用解析器慣用語

在本規範裡,空白字符指的是 U+0020 SPACE、U+0009 CHARACTER TABULATION (tab)、U+000A LINE FEED (LF)、U+000C FORM FEED (FF) 與 U+000D CARRIAGE RETURN (CR)。

White_Space 字符是指 Unicode PropList.txt 資料檔裡有 Unicode "White_Space" 屬性的那些字符。[UNICODE]

注:不應該與把這個跟 Unicode.txt 資料檔裡 "Bidi_Class" 屬性的 "White_Space" 值(簡寫為 "WS")搞混。

ASCII 字母數字字符是指範圍 U+0030 DIGIT ZERO (0) 至 U+0039 DIGIT NINE (9)、U+0041 LATIN CAPITAL LETTER A 至 U+005A LATIN CAPITAL LETTER Z、U+0061 LATIN SMALL LETTER A to U+007A LATIN SMALL LETTER Z 的字符。

部份下述的微解析器按照以下的模式:有一個輸入變數放正在解析的字串,另一個位置變數指向輸入裡要解析的下一個字符。

對於按照這個模式的解析器,要求使用者代理蒐集一串字符意會著使用者代理必須執行以下演算法,其中字符集是要蒐集的字符集合。

  1. 輸入位置為呼叫此演算法的相同名稱的變數。
  2. 結果為空字串。
  3. 位置沒超過輸入的結尾且位於位置的字符在字符集裡,將該字符附上結果的結尾並將位置向前移到輸入裡的下一個字符。
  4. 回傳結果

跳過空白步驟代表使用者代理必須蒐集一串空白字符跳過 White_Space 字符步驟代表使用者代理必須蒐集一串White_Space 字符。在這兩種情況下,不使用蒐集到的字符。[UNICODE]

當使用者代理要剝離換行符時,使用者代理必須移除該字串中任何的 U+000A LINE FEED (LF) 與 U+000D CARRIAGE RETURN (CR)。

當使用者代理要剝離頭尾空白字符時,使用者代理必須移除該字串起頭與結尾的空白字符

一個字串的代碼點長度是該字串有的 Unicode 代碼點的個數。

布尔型属性

关键字和枚举类型属性

数字

非负整数
带符号整数
实数
百分比和长度
整数列表
尺寸列表

日期和時間

在下面的演算法中,年份月份月裡的天數的算法:若月份是 1, 3, 5, 7, 8, 10, 12,天數為 31。若月份是 4, 6, 9, 11,天數為 30。若月份是 2 且年份是一個可被 400 整除的數,又或年份是一個可被 4 整除卻不被 100 整除的數,則天數為 29。不然,天數為 28。這個算法有算到公曆中的閏年。[GREGORIAN]

本小節定義的日期與時間的語法中的數字必須是在範圍 U+0030 DIGIT ZERO(0)到 U+0039 DIGIT NINE(9)裡的字符,以十進位表示各個數。

注:雖然這裡意圖將支援的格式定義為對應的 ISO8601 格式的子集,但是本規範定義的解析規則遠比 ISO8601 詳盡,因此我們鼓勵實作者在實作下述解析規則之前仔細檢驗使用的日期解析程式庫是否符合本規範 — ISO8601 的程式庫不一定以與本規範完全相同的方式解析日期和時間。[ISO8601]
月份

一個月份是指某一個沒有時區資訊且沒有年、月以外的日期資訊的特定 延伸公曆(proleptic Gregorian)日期。[GREGORIAN]

若一個字串按照順序由以下部份組成,則該字串是一個表示年份月份月的合法月份字串

  1. 表示年份數字,四位以上,年份 > 0
  2. U+002D HYPHEN-MINUS 字符(-)
  3. 表示月份的兩位數字,1 ≤ 月份 ≤ 12

下面是解析月份字串的規則,回傳一個年份與月份或是不回傳。若演算法裡的任何地方提到「演算法失效」,則代表在那個地方使用者代理會退出演算法且不回傳。

  1. 輸入為要解析的字串。
  2. 位置為指向輸入的指針,一開始指向字串的起點。
  3. 解析月份部份以得年份月份,若沒有回傳值則演算法失效。
  4. 位置尚未超過輸入的結尾,則演算法失效。

給定輸入字串與位置,下面是解析月份部份的規則,回傳一個年份與月份或是不回傳。若演算法裡的任何地方提到「演算法失效」,則代表在那個地方使用者代理會退出演算法且不回傳。

  1. 蒐集一串在範圍 U+0030 DIGIT ZERO(0)到 U+0039 DIGIT NINE(9)裡的字符。若蒐集到的字符數量不足四,則演算法失效。否則,將串列當作十進位整數解讀。設年份為該整數。
  2. 年份不是一個大於零的數,則演算法失效。
  3. 位置已超過輸入的結尾或在位置上的字符不是一個 U+002D HYPHEN-MINUS 字符,則演算法失效。否則,將位置往前移一個字符。
  4. 蒐集一串在範圍 U+0030 DIGIT ZERO(0)到 U+0039 DIGIT NINE(9)裡的字符。若蒐集到的字符數量不正好是兩個,則演算法失效。否則,將串列當作十進位整數解讀。設月份為該整數。
  5. 月份不在 1 ≤ 月份 ≤ 12 的範圍,則演算法失效。
  6. 回傳年份月份
日期

一個日期是指某一個沒有時區資訊,由年、月、日組成的特定 延伸公曆(proleptic Gregorian)日期。[GREGORIAN]

若一個字串按照順序由以下部份組成,則該字串是一個表示年份月份日子日的合法日期字串

  1. 表示年份月份月的合法月份字串
  2. U+002D HYPHEN-MINUS 字符(-)
  3. 表示日子的兩位數字,1 ≤ 日子最大天數,其中最大天數年份月份月裡的天數

下面是解析日期字串的規則,回傳一個日期或是不回傳。若演算法裡的任何地方提到「演算法失效」,則代表在那個地方使用者代理會退出演算法且不回傳。

  1. 輸入為要解析的字串。
  2. 位置為指向輸入的指針,一開始指向字串的起點。
  3. 解析日期部份以得年份月份日子,若沒有回傳值則演算法失效。
  4. 位置尚未超過輸入的結尾,則演算法失效。
  5. 日期年份月份日子日組成的日期。
  6. 回傳日期

給定輸入字串與位置,下面是解析日期部份的規則,回傳一個年份、月份與日子或是不回傳。若演算法裡的任何地方提到「演算法失效」,則代表在那個地方使用者代理會退出演算法且不回傳。

  1. 解析月份部份以得年份月份,若沒有回傳值則演算法失效。
  2. 最大天數年份月份月裡的天數
  3. 位置已超過輸入的結尾或在位置上的字符不是一個 U+002D HYPHEN-MINUS 字符,則演算法失效。否則,將位置往前移一個字符。
  4. 蒐集一串在範圍 U+0030 DIGIT ZERO(0)到 U+0039 DIGIT NINE(9)裡的字符。若蒐集到的字符數量不正好是兩個,則演算法失效。否則,將串列當作十進位整數解讀。設日子為該整數。
  5. 日子不在 1 ≤ 日子最大天數 的範圍,則演算法失效。
  6. 回傳年份月份日子
時間

一個時間是指某一個沒有時區資訊,由時、分、秒與秒的小數組成的特定時間。

若一個字串按照順序由以下部份組成,則該字串是一個表示幾時幾分幾秒秒的合法時間字串

  1. 表示幾時的兩位數字,0 ≤ 幾時 ≤ 23
  2. U+003A COLON 字符(:)
  3. 表示幾分的兩位數字,0 ≤ 幾分 ≤ 59
  4. U+003A COLON 字符(:)
  5. 選擇性的(若幾秒不是零則是必需的)
    1. U+003A COLON 字符(:)
    2. 表示幾秒整數部份的兩位數字 s,0 ≤ s ≤ 59
    3. 選擇性的(若幾秒不是整數則是必需的)
      1. U+002E FULL STOP 字符(.)
      2. 表示幾秒小數部份的一位以上數字
注:秒數部份不能是 60 或 61 — 不能表示閏秒。

下面是解析時間字串的規則,回傳一個時間或是不回傳。若演算法裡的任何地方提到「演算法失效」,則代表在那個地方使用者代理會退出演算法且不回傳。

  1. 輸入為要解析的字串。
  2. 位置為指向輸入的指針,一開始指向字串的起點。
  3. 解析時間部份以得幾時幾分幾秒,若沒有回傳值則演算法失效。
  4. 位置尚未超過輸入的結尾,則演算法失效。
  5. 時間幾時幾分幾秒秒組成的時間。
  6. 回傳時間

給定輸入字串與位置,下面是解析時間部份的規則,回傳一個時、分與秒或是不回傳。若演算法裡的任何地方提到「演算法失效」,則代表在那個地方使用者代理會退出演算法且不回傳。

  1. 蒐集一串在範圍 U+0030 DIGIT ZERO(0)到 U+0039 DIGIT NINE(9)裡的字符。若蒐集到的字符數量不正好是兩個,則演算法失效。否則,將串列當作十進位整數解讀。設幾時為該整數。
  2. 幾時不在 0 ≤ 幾時 ≤ 23 的範圍,則演算法失效。
  3. 位置已超過輸入的結尾或在位置上的字符不是一個 U+003A COLON 字符,則演算法失效。否則,將位置往前移一個字符。
  4. 蒐集一串在範圍 U+0030 DIGIT ZERO(0)到 U+0039 DIGIT NINE(9)裡的字符。若蒐集到的字符數量不正好是兩個,則演算法失效。否則,將串列當作十進位整數解讀。設幾分為該整數。
  5. 幾分不在 0 ≤ 幾分 ≤ 59 的範圍,則演算法失效。
  6. 幾秒為 "0" 字串
  7. 位置尚未超過輸入的結尾且在位置上的字符為 U+003A COLON,則執行這些子步驟:
    1. 位置指向輸入的下一個字符。
    2. 位置已超過輸入的結尾,或是位置指向輸入的最後一個字符,又或從位置開始的下「兩」的輸入裡的字符不都在範圍 U+0030 DIGIT ZERO(0)到 U+0039 DIGIT NINE(9)裡,則演算法失效。
    3. 蒐集一串在範圍 U+0030 DIGIT ZERO(0)到 U+0039 DIGIT NINE(9)裡或正好是 U+002E FULL STOP 的字符。若蒐集到的串列裡有超過一個 U+002E FULL STOP 字符,或串列裡的最後一個字符是 U+002E FULL STOP 字符,則演算法失效。否則,設幾秒為蒐集到的字串而不是先前的值。
  8. 幾秒當作十進位的數(有可能有小數部份)解讀。設幾秒為該數而不是字串版本。
  9. 幾秒不在 0 ≤ 幾秒 < 60 的範圍,則演算法失效。
  10. 回傳幾時幾分幾秒
本地日期與時間

一個本地日期與時間是一個不帶有時區,由年、月、日組成的特定 延伸公曆(proleptic Gregorian)日期與由時、分、秒與秒的小數組成的時間。[GREGORIAN]

若一個字串按照順序由以下部份組成,則該字串是一個表示日期與時間的合法的本地日期與時間字串

  1. 表示日期的合法日期字串
  2. U+0054 LATIN CAPITAL LETTER T 字符(T)。
  3. 表示時間的合法時間字串

下面是解析本地日期與時間字串的規則,回傳一個日期與時間或是不回傳。若演算法裡的任何地方提到「演算法失效」,則代表在那個地方使用者代理會退出演算法且不回傳。

  1. 輸入為要解析的字串。
  2. 位置為指向輸入的指針,一開始指向字串的起點。
  3. 解析日期部份以得年份月份日子,若沒有回傳值則演算法失效。
  4. 位置已超過輸入的結尾或在位置上的字符不是一個U+0054 LATIN CAPITAL LETTER T 字符(T),則演算法失效。否則,將位置往前移一個字符。
  5. 解析時間部份以得幾時幾分幾秒,若沒有回傳值則演算法失效。
  6. 位置尚未超過輸入的結尾,則演算法失效。
  7. 日期年份月份日子日組成的日期。
  8. 時間幾時幾分幾秒秒組成的時間。
  9. 回傳日期時間
全球日期與時間

一個全球日期與時間是一個由年、月、日組成的特定 延伸公曆(proleptic Gregorian)日期與由時、分、秒與秒的小數組成的時間,帶有由帶有正負號的時與分組成的時區偏移。[GREGORIAN]

若一個字串按照順序由以下部份組成,則該字串是一個表示日期、時間與時區偏移的合法的全球日期與時間字串

  1. 表示日期的合法日期字串
  2. U+0054 LATIN CAPITAL LETTER T 字符(T)。
  3. 表示時間的合法時間字串
  4. 以下其一:
    • U+005A LATIN CAPITAL LETTER Z 字符(Z),僅可在時區是 UTC 時使用
    • 或:
      1. 表示時區偏移正負號的 U+002B PLUS SIGN 字符(+)或 U+002D HYPHEN-MINUS 字符(-)(僅可在時區非零時使用)
      2. 表示時區偏移整點部份小時的兩位數字,0 ≤ 小時 ≤ 23
      3. U+003A COLON 字符(:)
      4. 表示時區偏移分鐘部份分鐘的兩位數字,0 ≤ 分鐘 ≤ 59
注:本格式容許從 -23:59 到 +23:59 的時區偏移。然而,實際使用的時區範圍是從 -12:00 到 +14:00,且時間偏移的分鐘部份只會是 00、30 或 45。

二十世紀中業 UTC 成立之前的時間必須以 UT1(當代經度 0° 的太陽時間)而不是 UTC(以 SI 秒近似 UT1 的時間)表示、解讀。時區概念成立以前的時間必須以帶有近似當代本地時間與倫敦格林威治觀測到的時間的差異作為時區的 UT1 時間表示 、解讀。

以下是寫成合法的全球日期與時間字串的幾個例子:

"0037-12-13T00:00Z"

在尼祿(羅馬皇帝)生日那天使用倫敦時間地區的半夜。請參考以下關於這天是哪一天的延伸討論。

"1979-10-14T12:00:00.001-04:00"

在使用美國東岸日光節約時間的時區的1979年10月14日中午過後一毫秒。

"8592-01-01T02:09+02:09"

8592年1月1日 UTC 的半夜,在超過 UTC 兩個小時又九分鐘的時區,儘管現在不是一個真實的時區,本規翻容許它。

這些日期中可以注意到的事情:

  • 少於四位數的年份要用零補齊。"37-12-13" 不是一個合法日期。
  • 要完全準確的識別引入公曆前的日期(就像 UTC 成立前的時間可以完全準確識別一樣),日期必須先從當時的日曆(例如,儒略曆)轉換成公曆。尼祿的生日在儒略曆是37年12月15日,也是延伸公曆(proleptic Gregorian)裡的37年12月13日。
  • 時間與時區偏移部份是必需的。
  • 這個版本的 HTML 不能表示公曆元年以前的日期。
  • 發生在遠古時候的事件的時間僅是近似值,因為直到最近幾十年之前時間的測量尚未協調。
  • 時區偏差與日光節約時間相關。

日期時間全球日期與時間的最好表示字串為表示日期時間合法的全球日期與時間字串,其中合法時間字串部份以最短形式書寫,且字串的最後一個字符就算時區是 UTC 也不是 U+005A LATIN CAPITAL LETTER Z 字符(Z),且當時區是 UTC 時以 U+002B PLUS SIGN 字符(+)作為時區偏移的正負號。

下面是解析全球日期與時間字串的規則,回傳一個 UTC 時間 日並帶有用來作為往返紀錄或是顯示用的時區偏移資訊,或是不回傳。若演算法裡的任何地方提到「演算法失效」,則代表在那個地方使用者代理會退出演算法且不回傳。

  1. 輸入為要解析的字串。
  2. 位置為指向輸入的指針,一開始指向字串的起點。
  3. 解析日期部份以得年份月份日子,若沒有回傳值則演算法失效。
  4. 位置已超過輸入的結尾或在位置上的字符不是一個U+0054 LATIN CAPITAL LETTER T 字符(T),則演算法失效。否則,將位置往前移一個字符。
  5. 解析時間部份以得幾點幾分幾秒,若沒有回傳值則演算法失效。
  6. 位置已超過輸入的結尾,則演算法失效。
  7. 解析時區偏移部份以得時區整點時區分鐘,若沒有回傳值則演算法失效。
  8. 位置「尚未」超過輸入的結尾,則演算法失效。
  9. 時間年份月份日子幾時幾分幾秒減掉時區整點時區分鐘分的那個 UTC 時區的時刻。
  10. 時區與 UTC 差時區整點時區整點分。
  11. 回傳時間時區

給定輸入字串與位置,下面是解析時區偏移部份的規則,回傳一個時與分(時區)或是不回傳。若演算法裡的任何地方提到「演算法失效」,則代表在那個地方使用者代理會退出演算法且不回傳。

  1. 位置上的字符為 U+005A LATIN CAPITAL LETTER Z 字符(Z),則:
    1. 時區整點為 0。
    2. 時區分鐘為 0。
    3. 位置往前移一個字符。

    否則,若在位置上的字符是 U+002B PLUS SIGN(+)或 U+002D HYPHEN-MINUS(-),則:

    1. 若在位置上的字符是 U+002B PLUS SIGN(+),設正負號為「正號」。否則,那是個 U+002D HYPHEN-MINUS(-),設正負號為「負號」。
    2. 位置往前移一個字符。
    3. 蒐集一串在範圍 U+0030 DIGIT ZERO(0)到 U+0039 DIGIT NINE(9)裡的字符。若蒐集到的字符數量不正好是兩個,則演算法失效。否則,將串列當作十進位整數解讀。設時區整點為該整數。
    4. 時區整點不在 0 ≤ 時區整點 ≤ 23 的範圍,則演算法失效。
    5. 正負號為「負號」,則設時區整點為負的其值。
    6. 位置已超過輸入的結尾或是在位置上的字符不為 U+003A COLON 字符,則演算法失效。否則,將位置往前移一個字符。
    7. 蒐集一串在範圍 U+0030 DIGIT ZERO(0)到 U+0039 DIGIT NINE(9)裡的字符。若蒐集到的字符數量不正好是兩個,則演算法失效。否則,將串列當作十進位整數解讀。設時區分鐘為該整數。
    8. 時區分鐘不在 0 ≤ 時區分鐘 ≤ 23 的範圍,則演算法失效。
    9. 正負號為「負號」,則設時區分鐘為負的其值。

    否則,演算法失效。

  2. 回傳時區整點時區分鐘
星期

一個星期由週-年數與週數組成,代表一個從星期一開始的時期,為期七天。本日曆系統的每一個週-年有 52 或 53 個這種時期,如下面所定義。週-年 1970 裡週數為 1 的時期定義為公曆1969年12月29日(1969-12-29)星期一開始的七天。之後各週數以此類推。一個週-年週數 1 之前的那週是上一個週-年的最後一週,反之亦然。[GREGORIAN]

若根據延伸公曆(proleptic Gregorian)年份年的第一天(1月1日)是星期四,或是星期三且年份是一個可被 400 整除,或是可被 4 整除卻不被 100 整除的數,則週-年數年份有 53 週。其他週-年有 52 週。

週-年的最後一天的週數的算法:若該週-年有 53 週,最後一天的週數為 53。若該週-年有 52 週,最後一天的週數為 52。

注:一個特定日期的週-年數有可能與包含這天的年份不同。週-年 y 的第一週是有 y 第一個星期四的那一週。

若一個字串按照順序由以下部份組成,則該字串是一個表示年份週-年週數週的合法週字串

  1. 表示年份數字,四位以上,年份 > 0
  2. U+002D HYPHEN-MINUS 字符(-)
  3. U+0057 LATIN CAPITAL LETTER W 字符(W)
  4. 表示週數的兩位數字,1 ≤ 週數最大週數,其中最大週數年份週-年的最後一天的週數

下面是解析週字串的規則,回傳一個週-年數與週數或是不回傳。若演算法裡的任何地方提到「演算法失效」,則代表在那個地方使用者代理會退出演算法且不回傳。

  1. 輸入為要解析的字串。
  2. 位置為指向輸入的指針,一開始指向字串的起點。
  3. 蒐集一串在範圍 U+0030 DIGIT ZERO(0)到 U+0039 DIGIT NINE(9)裡的字符。若蒐集到的字符數量不足四,則演算法失效。否則,將串列當作十進位整數解讀。設年份為該整數。
  4. 年份不是一個大於零的數,則演算法失效。
  5. 位置已超過輸入的結尾或在位置上的字符不是一個 U+002D HYPHEN-MINUS 字符,則演算法失效。否則,將位置往前移一個字符。
  6. 位置已超過輸入的結尾或在位置上的字符不是一個 U+002D LATIN CAPITAL LETTER W 字符(W),則演算法失效。否則,將位置往前移一個字符。
  7. 蒐集一串在範圍 U+0030 DIGIT ZERO(0)到 U+0039 DIGIT NINE(9)裡的字符。若蒐集到的字符數量不正好是兩個,則演算法失效。否則,將串列當作十進位整數解讀。設週數為該整數。
  8. 最大週數年份週-年的最後一天的週數
  9. 週數不在 1 ≤ 週數最大週數 的範圍,則演算法失效。
  10. 位置尚未超過輸入的結尾,則演算法失效。
  11. 回傳週-年數年份與週數週數
模糊時間

以下任何一種字串都是合法的日期或時間字串

一個內容裡的合法日期或時間字串由零個以上 White_Space 字符、合法的日期與時間字串接者零個以上 White_Space 字符組成。


以下任何一種字串都是選擇性的加上時間的合法日期字串

一個內容裡選擇性的加上時間的合法日期字串由零個以上 White_Space 字符、選擇性的加上時間的合法日期字串接者零個以上 White_Space 字符組成。


下面是解析日期或時間字串的規則。本演算法使用「屬性內」或是「內容內」標記作為識別演算法變種的參數,回傳日期時間全球日期與時間,或是不回傳。若演算法裡的任何地方提到「演算法失效」,則代表在那個地方使用者代理會退出演算法且不回傳。

  1. 輸入為要解析的字串。
  2. 位置為指向輸入的指針,一開始指向字串的起點。
  3. 「內容內」變種用:跳過 White_Space 字符
  4. 開始位置位置的位置。
  5. 有日期有時間為真。
  6. 解析日期部份以得年份月份日子,若沒有回傳值則設有日期為假。
  7. 有日期為真,且位置尚未超過輸入的結尾,且在位置上的字符是一個U+0054 LATIN CAPITAL LETTER T 字符(T),則將位置往前移一個字符。

    否則,若有日期為真,且位置已超過輸入的結尾或是在位置上的字符不是一個U+0054 LATIN CAPITAL LETTER T 字符(T),則設有時間為假。

    否則,若有日期為假,讓位置回到開始位置的位置。

  8. 有時間為真,則解析時間部份以得幾時幾分幾秒,若沒有回傳值則演算法失效。
  9. 有日期有時間都為真,但是位置已超過輸入的結尾,則演算法失效。
  10. 有日期有時間都為真,解析時區偏移部份以得時區整點時區分鐘,若沒有回傳值則演算法失效。
  11. 「內容內」變種用:跳過 White_Space 字符
  12. 位置「尚未」超過輸入的結尾,則演算法失效。
  13. 有日期為真且有時間為假,則設日期年份月份日子日組成的日期,並回傳日期

    否則,若有時間為真且有日期為假,則設時間幾時幾分幾秒秒組成的時間,並回傳時間

    否則,設時間年份月份日子幾時幾分幾秒減掉時區整點時區分鐘分的那個 UTC 時區的時刻。設時區與 UTC 差時區整點時區整點分,並回傳時間時區

颜色

空格分开的token

一组空格分开的token是一个包含零个或者多个由一个或者多个空白字符分隔的词(称为token)的字符串,每个词由一个或者多个字符组成,这些字符都不能是空白字符。

逗号分开的token

参考

媒体查询