Warning:
This wiki has been archived and is now read-only.
HTML5/common-microsyntaxes
通用微語法
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 的字符。
部份下述的微解析器按照以下的模式:有一個輸入變數放正在解析的字串,另一個位置變數指向輸入裡要解析的下一個字符。
對於按照這個模式的解析器,要求使用者代理蒐集一串字符意會著使用者代理必須執行以下演算法,其中字符集是要蒐集的字符集合。
- 設輸入與位置為呼叫此演算法的相同名稱的變數。
- 設結果為空字串。
- 當位置沒超過輸入的結尾且位於位置的字符在字符集裡,將該字符附上結果的結尾並將位置向前移到輸入裡的下一個字符。
- 回傳結果。
跳過空白步驟代表使用者代理必須蒐集一串空白字符。跳過 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)裡的字符,以十進位表示各個數。
月份
一個月份是指某一個沒有時區資訊且沒有年、月以外的日期資訊的特定 延伸公曆(proleptic Gregorian)日期。[GREGORIAN]
若一個字串按照順序由以下部份組成,則該字串是一個表示年份年月份月的合法月份字串:
下面是解析月份字串的規則,回傳一個年份與月份或是不回傳。若演算法裡的任何地方提到「演算法失效」,則代表在那個地方使用者代理會退出演算法且不回傳。
- 設輸入為要解析的字串。
- 設位置為指向輸入的指針,一開始指向字串的起點。
- 解析月份部份以得年份與月份,若沒有回傳值則演算法失效。
- 若位置尚未超過輸入的結尾,則演算法失效。
給定輸入字串與位置,下面是解析月份部份的規則,回傳一個年份與月份或是不回傳。若演算法裡的任何地方提到「演算法失效」,則代表在那個地方使用者代理會退出演算法且不回傳。
- 蒐集一串在範圍 U+0030 DIGIT ZERO(0)到 U+0039 DIGIT NINE(9)裡的字符。若蒐集到的字符數量不足四,則演算法失效。否則,將串列當作十進位整數解讀。設年份為該整數。
- 若年份不是一個大於零的數,則演算法失效。
- 若位置已超過輸入的結尾或在位置上的字符不是一個 U+002D HYPHEN-MINUS 字符,則演算法失效。否則,將位置往前移一個字符。
- 蒐集一串在範圍 U+0030 DIGIT ZERO(0)到 U+0039 DIGIT NINE(9)裡的字符。若蒐集到的字符數量不正好是兩個,則演算法失效。否則,將串列當作十進位整數解讀。設月份為該整數。
- 若月份不在 1 ≤ 月份 ≤ 12 的範圍,則演算法失效。
- 回傳年份與月份。
日期
一個日期是指某一個沒有時區資訊,由年、月、日組成的特定 延伸公曆(proleptic Gregorian)日期。[GREGORIAN]
若一個字串按照順序由以下部份組成,則該字串是一個表示年份年月份月日子日的合法日期字串:
- 表示年份年月份月的合法月份字串
- U+002D HYPHEN-MINUS 字符(-)
- 表示日子的兩位數字,1 ≤ 日子 ≤ 最大天數,其中最大天數是年份年月份月裡的天數
下面是解析日期字串的規則,回傳一個日期或是不回傳。若演算法裡的任何地方提到「演算法失效」,則代表在那個地方使用者代理會退出演算法且不回傳。
- 設輸入為要解析的字串。
- 設位置為指向輸入的指針,一開始指向字串的起點。
- 解析日期部份以得年份、月份與日子,若沒有回傳值則演算法失效。
- 若位置尚未超過輸入的結尾,則演算法失效。
- 設日期為年份年月份月日子日組成的日期。
- 回傳日期。
給定輸入字串與位置,下面是解析日期部份的規則,回傳一個年份、月份與日子或是不回傳。若演算法裡的任何地方提到「演算法失效」,則代表在那個地方使用者代理會退出演算法且不回傳。
- 解析月份部份以得年份與月份,若沒有回傳值則演算法失效。
- 設最大天數為年份年月份月裡的天數
- 若位置已超過輸入的結尾或在位置上的字符不是一個 U+002D HYPHEN-MINUS 字符,則演算法失效。否則,將位置往前移一個字符。
- 蒐集一串在範圍 U+0030 DIGIT ZERO(0)到 U+0039 DIGIT NINE(9)裡的字符。若蒐集到的字符數量不正好是兩個,則演算法失效。否則,將串列當作十進位整數解讀。設日子為該整數。
- 若日子不在 1 ≤ 日子 ≤ 最大天數 的範圍,則演算法失效。
- 回傳年份、月份與日子。
時間
一個時間是指某一個沒有時區資訊,由時、分、秒與秒的小數組成的特定時間。
若一個字串按照順序由以下部份組成,則該字串是一個表示幾時時幾分分幾秒秒的合法時間字串:
下面是解析時間字串的規則,回傳一個時間或是不回傳。若演算法裡的任何地方提到「演算法失效」,則代表在那個地方使用者代理會退出演算法且不回傳。
- 設輸入為要解析的字串。
- 設位置為指向輸入的指針,一開始指向字串的起點。
- 解析時間部份以得幾時、幾分與幾秒,若沒有回傳值則演算法失效。
- 若位置尚未超過輸入的結尾,則演算法失效。
- 設時間為幾時時幾分分幾秒秒組成的時間。
- 回傳時間。
給定輸入字串與位置,下面是解析時間部份的規則,回傳一個時、分與秒或是不回傳。若演算法裡的任何地方提到「演算法失效」,則代表在那個地方使用者代理會退出演算法且不回傳。
- 蒐集一串在範圍 U+0030 DIGIT ZERO(0)到 U+0039 DIGIT NINE(9)裡的字符。若蒐集到的字符數量不正好是兩個,則演算法失效。否則,將串列當作十進位整數解讀。設幾時為該整數。
- 若幾時不在 0 ≤ 幾時 ≤ 23 的範圍,則演算法失效。
- 若位置已超過輸入的結尾或在位置上的字符不是一個 U+003A COLON 字符,則演算法失效。否則,將位置往前移一個字符。
- 蒐集一串在範圍 U+0030 DIGIT ZERO(0)到 U+0039 DIGIT NINE(9)裡的字符。若蒐集到的字符數量不正好是兩個,則演算法失效。否則,將串列當作十進位整數解讀。設幾分為該整數。
- 若幾分不在 0 ≤ 幾分 ≤ 59 的範圍,則演算法失效。
- 設幾秒為 "0" 字串
- 若位置尚未超過輸入的結尾且在位置上的字符為 U+003A COLON,則執行這些子步驟:
- 將位置指向輸入的下一個字符。
- 若位置已超過輸入的結尾,或是位置指向輸入的最後一個字符,又或從位置開始的下「兩」的輸入裡的字符不都在範圍 U+0030 DIGIT ZERO(0)到 U+0039 DIGIT NINE(9)裡,則演算法失效。
- 蒐集一串在範圍 U+0030 DIGIT ZERO(0)到 U+0039 DIGIT NINE(9)裡或正好是 U+002E FULL STOP 的字符。若蒐集到的串列裡有超過一個 U+002E FULL STOP 字符,或串列裡的最後一個字符是 U+002E FULL STOP 字符,則演算法失效。否則,設幾秒為蒐集到的字串而不是先前的值。
- 將幾秒當作十進位的數(有可能有小數部份)解讀。設幾秒為該數而不是字串版本。
- 若幾秒不在 0 ≤ 幾秒 < 60 的範圍,則演算法失效。
- 回傳幾時、幾分與幾秒。
本地日期與時間
一個本地日期與時間是一個不帶有時區,由年、月、日組成的特定 延伸公曆(proleptic Gregorian)日期與由時、分、秒與秒的小數組成的時間。[GREGORIAN]
若一個字串按照順序由以下部份組成,則該字串是一個表示日期與時間的合法的本地日期與時間字串:
下面是解析本地日期與時間字串的規則,回傳一個日期與時間或是不回傳。若演算法裡的任何地方提到「演算法失效」,則代表在那個地方使用者代理會退出演算法且不回傳。
- 設輸入為要解析的字串。
- 設位置為指向輸入的指針,一開始指向字串的起點。
- 解析日期部份以得年份、月份與日子,若沒有回傳值則演算法失效。
- 若位置已超過輸入的結尾或在位置上的字符不是一個U+0054 LATIN CAPITAL LETTER T 字符(T),則演算法失效。否則,將位置往前移一個字符。
- 解析時間部份以得幾時、幾分與幾秒,若沒有回傳值則演算法失效。
- 若位置尚未超過輸入的結尾,則演算法失效。
- 設日期為年份年月份月日子日組成的日期。
- 設時間為幾時時幾分分幾秒秒組成的時間。
- 回傳日期與時間。
全球日期與時間
一個全球日期與時間是一個由年、月、日組成的特定 延伸公曆(proleptic Gregorian)日期與由時、分、秒與秒的小數組成的時間,帶有由帶有正負號的時與分組成的時區偏移。[GREGORIAN]
若一個字串按照順序由以下部份組成,則該字串是一個表示日期、時間與時區偏移的合法的全球日期與時間字串:
二十世紀中業 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 時間 日並帶有用來作為往返紀錄或是顯示用的時區偏移資訊,或是不回傳。若演算法裡的任何地方提到「演算法失效」,則代表在那個地方使用者代理會退出演算法且不回傳。
- 設輸入為要解析的字串。
- 設位置為指向輸入的指針,一開始指向字串的起點。
- 解析日期部份以得年份、月份與日子,若沒有回傳值則演算法失效。
- 若位置已超過輸入的結尾或在位置上的字符不是一個U+0054 LATIN CAPITAL LETTER T 字符(T),則演算法失效。否則,將位置往前移一個字符。
- 解析時間部份以得幾點、幾分與幾秒,若沒有回傳值則演算法失效。
- 若位置已超過輸入的結尾,則演算法失效。
- 解析時區偏移部份以得時區整點與時區分鐘,若沒有回傳值則演算法失效。
- 若位置「尚未」超過輸入的結尾,則演算法失效。
- 設時間為年份年月份月日子日幾時時幾分分幾秒減掉時區整點時時區分鐘分的那個 UTC 時區的時刻。
- 設時區與 UTC 差時區整點時時區整點分。
- 回傳時間與時區。
給定輸入字串與位置,下面是解析時區偏移部份的規則,回傳一個時與分(時區)或是不回傳。若演算法裡的任何地方提到「演算法失效」,則代表在那個地方使用者代理會退出演算法且不回傳。
- 若位置上的字符為 U+005A LATIN CAPITAL LETTER Z 字符(Z),則:
- 設時區整點為 0。
- 設時區分鐘為 0。
- 將位置往前移一個字符。
否則,若在位置上的字符是 U+002B PLUS SIGN(+)或 U+002D HYPHEN-MINUS(-),則:
- 若在位置上的字符是 U+002B PLUS SIGN(+),設正負號為「正號」。否則,那是個 U+002D HYPHEN-MINUS(-),設正負號為「負號」。
- 將位置往前移一個字符。
- 蒐集一串在範圍 U+0030 DIGIT ZERO(0)到 U+0039 DIGIT NINE(9)裡的字符。若蒐集到的字符數量不正好是兩個,則演算法失效。否則,將串列當作十進位整數解讀。設時區整點為該整數。
- 若時區整點不在 0 ≤ 時區整點 ≤ 23 的範圍,則演算法失效。
- 若正負號為「負號」,則設時區整點為負的其值。
- 若位置已超過輸入的結尾或是在位置上的字符不為 U+003A COLON 字符,則演算法失效。否則,將位置往前移一個字符。
- 蒐集一串在範圍 U+0030 DIGIT ZERO(0)到 U+0039 DIGIT NINE(9)裡的字符。若蒐集到的字符數量不正好是兩個,則演算法失效。否則,將串列當作十進位整數解讀。設時區分鐘為該整數。
- 若時區分鐘不在 0 ≤ 時區分鐘 ≤ 23 的範圍,則演算法失效。
- 若正負號為「負號」,則設時區分鐘為負的其值。
否則,演算法失效。
- 回傳時區整點與時區分鐘。
星期
一個星期由週-年數與週數組成,代表一個從星期一開始的時期,為期七天。本日曆系統的每一個週-年有 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。
若一個字串按照順序由以下部份組成,則該字串是一個表示年份週-年週數週的合法週字串:
- 表示年份的數字,四位以上,年份 > 0
- U+002D HYPHEN-MINUS 字符(-)
- U+0057 LATIN CAPITAL LETTER W 字符(W)
- 表示週數的兩位數字,1 ≤ 週數 ≤ 最大週數,其中最大週數是年份週-年的最後一天的週數
下面是解析週字串的規則,回傳一個週-年數與週數或是不回傳。若演算法裡的任何地方提到「演算法失效」,則代表在那個地方使用者代理會退出演算法且不回傳。
- 設輸入為要解析的字串。
- 設位置為指向輸入的指針,一開始指向字串的起點。
- 蒐集一串在範圍 U+0030 DIGIT ZERO(0)到 U+0039 DIGIT NINE(9)裡的字符。若蒐集到的字符數量不足四,則演算法失效。否則,將串列當作十進位整數解讀。設年份為該整數。
- 若年份不是一個大於零的數,則演算法失效。
- 若位置已超過輸入的結尾或在位置上的字符不是一個 U+002D HYPHEN-MINUS 字符,則演算法失效。否則,將位置往前移一個字符。
- 若位置已超過輸入的結尾或在位置上的字符不是一個 U+002D LATIN CAPITAL LETTER W 字符(W),則演算法失效。否則,將位置往前移一個字符。
- 蒐集一串在範圍 U+0030 DIGIT ZERO(0)到 U+0039 DIGIT NINE(9)裡的字符。若蒐集到的字符數量不正好是兩個,則演算法失效。否則,將串列當作十進位整數解讀。設週數為該整數。
- 設最大週數是年份週-年的最後一天的週數。
- 若週數不在 1 ≤ 週數 ≤ 最大週數 的範圍,則演算法失效。
- 若位置尚未超過輸入的結尾,則演算法失效。
- 回傳週-年數年份與週數週數。
模糊時間
以下任何一種字串都是合法的日期或時間字串:
一個內容裡的合法日期或時間字串由零個以上 White_Space 字符、合法的日期與時間字串接者零個以上 White_Space 字符組成。
以下任何一種字串都是選擇性的加上時間的合法日期字串:
一個內容裡選擇性的加上時間的合法日期字串由零個以上 White_Space 字符、選擇性的加上時間的合法日期字串接者零個以上 White_Space 字符組成。
下面是解析日期或時間字串的規則。本演算法使用「屬性內」或是「內容內」標記作為識別演算法變種的參數,回傳日期、時間、全球日期與時間,或是不回傳。若演算法裡的任何地方提到「演算法失效」,則代表在那個地方使用者代理會退出演算法且不回傳。
- 設輸入為要解析的字串。
- 設位置為指向輸入的指針,一開始指向字串的起點。
- 「內容內」變種用:跳過 White_Space 字符。
- 設開始位置為位置的位置。
- 設有日期與有時間為真。
- 解析日期部份以得年份、月份與日子,若沒有回傳值則設有日期為假。
- 若有日期為真,且位置尚未超過輸入的結尾,且在位置上的字符是一個U+0054 LATIN CAPITAL LETTER T 字符(T),則將位置往前移一個字符。
否則,若有日期為真,且位置已超過輸入的結尾或是在位置上的字符不是一個U+0054 LATIN CAPITAL LETTER T 字符(T),則設有時間為假。
否則,若有日期為假,讓位置回到開始位置的位置。
- 若有時間為真,則解析時間部份以得幾時、幾分與幾秒,若沒有回傳值則演算法失效。
- 若有日期、有時間都為真,但是位置已超過輸入的結尾,則演算法失效。
- 若有日期、有時間都為真,解析時區偏移部份以得時區整點與時區分鐘,若沒有回傳值則演算法失效。
- 「內容內」變種用:跳過 White_Space 字符。
- 若位置「尚未」超過輸入的結尾,則演算法失效。
- 若有日期為真且有時間為假,則設日期為年份年月份月日子日組成的日期,並回傳日期。
否則,若有時間為真且有日期為假,則設時間為幾時時幾分分幾秒秒組成的時間,並回傳時間。
否則,設時間為年份年月份月日子日幾時時幾分分幾秒減掉時區整點時時區分鐘分的那個 UTC 時區的時刻。設時區與 UTC 差時區整點時時區整點分,並回傳時間與時區。
颜色
空格分开的token
一组空格分开的token是一个包含零个或者多个由一个或者多个空白字符分隔的词(称为token)的字符串,每个词由一个或者多个字符组成,这些字符都不能是空白字符。