HTML 剪貼簿格式
藉由剪貼簿傳輸 HTML 文字的需求會根據案例而有所不同。 本文涉及剪下和貼上 HTML 檔的片段。 可能需要透過剪貼簿傳輸整個 HTML 檔;不過,本文是由傳輸所選 HTML 文字片段的需求所驅動。 因此,需要將整個 HTML 檔複製到剪貼簿的方法被視為太重。
CF_HTML
剪貼簿格式允許將原始 HTML 文字及其內容片段儲存在剪貼簿上做為 ASCII。 這可讓應用程式檢查 HTML 片段的內容,其中包含上述所有周圍捲標,以便使用其屬性來指出 HTML 片段的周圍標籤。 雖然應用程式必須決定如何解譯這類片段,但這裡會根據 IE4/MSHTML 實作來包含一些基本指導方針。
剪貼簿的官方名稱(RegisterClipboardFormat
使用的字串)是“HTML Format
”。
描述
CF_HTML
是文字剪貼簿格式,但一律使用UTF-8編碼。 請注意,這裡使用UTF-8是 Windows API 使用 UTF-16 來代表文字字串的一般規則的例外,尤其是人類可讀取的字串,也就是可本地化的字元串。
您可以在虛擬 Backus–Naur 窗體中描述 CF_HTML
剪貼簿的一般配置或語法,如下所示:
注意
此文法為非規範**
<cf-html> ::= <description-header> <context>
<context> ::= [<preceding-context>] <fragment> [<trailing-context>]
<description-header> ::= "Version:" <version> <br> ( <header-offset-keyword> ":" <header-offset-value> <br> )*
<header-offset-keyword> ::= "StartHTML" | "EndHTML" | "StartFragment" | "EndFragment" | "StartSelection" | "EndSelection"
<header-offset-value> ::= { Base 10 (decimal) integer string with optional _multiple_ leading zero digits (see "Offset syntax" below) }
<version> ::= "0.9" | "1.0"
<fragment> ::= <fragment-start-comment> <fragment-text> <fragment-end-comment>
<fragment-start-comment> ::= "<!--StartFragment -->"
<fragment-end-comment> ::= "<!--EndFragment -->"
<preceding-context> ::= { Arbitrary HTML }
<trailing-context> ::= { Arbitrary HTML }
<fragment-text> ::= { Arbitrary HTML }
<br> ::= "\r" | "\n" | "\r\n"
描述標頭和位移
描述標頭包含剪貼簿版本號碼和位移,指出內容和片段開始和結束的位置。 描述是 ASCII 文字關鍵詞的清單,後面接著字串,並以冒號分隔(:)。
-
Version
:剪貼簿的 vv 版本號碼。 起始版本Version:0.9
。 從 Windows 10 20H2 起,現在Version:1.0
。 -
StartHTML
:從剪貼簿開頭到內容開頭的位移(以位元組為單位),如果沒有內容,則-1
。 -
EndHTML
:從剪貼簿開頭到內容結尾的位移(以位元組為單位),如果沒有內容,則-1
。 -
StartFragment
:從剪貼簿開頭到片段開頭的位移(以位元組為單位)。 -
EndFragment
:從剪貼簿開頭到片段結尾的位移(以位元組為單位)。 -
StartSelection
:選擇性。 從剪貼簿開頭到選取範圍的開頭位移(以位元組為單位)。 -
EndSelection
:選擇性。 從剪貼簿開頭到選取範圍結尾的位移(以位元組為單位)。
StartSelection
和 EndSelection
關鍵詞是選擇性的,如果您不想讓應用程式產生這項資訊,則必須同時省略兩者。
CF_HTML
剪貼簿格式的未來修訂可能會延伸標頭,例如,因為 HTML 會從 StartHTML
位移開始,因此稍後可以新增多個 StartFragment
和 EndFragment
組,以支援不連續的片段選取。
位移語法
為了方便產生位元組位移的程式,位移值可能會選擇性地以任意數量的零位數填補 '0'
。 原因是程式探查位移的 HTML 可能會為每個關鍵詞的輸出緩衝區寫入 10 個零(例如 StartHTML: 0000000000
)。 稍後,當確切的 StartHTML
位移已知時(例如 71),程式可以在緩衝區中以 「71」 覆寫最右邊的零(例如產生 StartHTML: 0000000071
)。
剪貼簿支援的唯一字元集是 Unicode (UTF-8)。 因為UTF-8和 ASCII 的第一個字元相符,所以描述一律是 ASCII,但是內容位元組(從 StartHTML
開始)可以使用以UTF-8編碼的任何其他字元。
剪貼簿格式標頭中的行尾(<br>
以上)可能以CRLF (Windows)、LF (Unix) 或孤獨的CR(原型) 表示。
片段、選取專案及其內容
元素 | 描述標頭 | 開始和結束字元位置需要有效的 HTML |
---|---|---|
上下文 |
StartHTML 和 EndHTML |
是的 |
片段 |
StartFragment 和 EndFragment |
是的 |
選擇 |
StartSelection 和 EndSelection |
不 |
上下文
內容 是有效的、完整的 HTML 檔-雖然這並不表示包含使用者選取範圍的整個原始原始原始 HTML 檔案將會逐字顯示:相反地,它可以是最少但格式正確的 HTML 檔。
此 內容 包含 片段 和所有先前周圍標記(開始和結束卷標;這些前面的周圍標記代表片段的所有父節點,直到 HTML 節點為止)。 上述範例文章有完整的 HTML <head>
元素,允許使用 <base href="">
和 <title>
專案。 例如,您可以插入這個專案以取得這項其他資訊。 將 HTML 片段複製到剪貼簿的應用程式可以選擇建立 <base href="">
專案,如果這類專案尚未存在,則將其包含在內容中。 如此一來,就可以解析 HTML 片段中的非絕對 URI。
內容 是選擇性的,因為片段中包含足夠的資訊,以便進行 HTML 片段的基本貼上。 如果未儲存內容,則只會儲存片段,且 StartHTML=EndHTML=-1
。
片段
片段 (上述<fragment-text>
) 包含有效的 HTML 片段。
有效的 HTML 片段是由單一外部 HTML 元素所組成。 此元素可能包含子系 HTML 元素,前提是它們已正確巢狀。 例如,片段可以是包含 3 個 <p>
元素的單一 <div>
專案。 包含三個 <p>
元素的 <span>
項目組成的片段無效,因為 <span>
專案(元素)不能包含區塊層級元素做為子系。
因此,片段實際上代表螢幕上 更大的區域,使用者在其中進行文字選取(例如複製)。 選取範圍包含選取的文字加上任何元素的開頭標記和屬性,這些元素在選取的文字中具有結束標記,以及包含之任何開始標記的片段結尾標記。 這是 HTML 片段基本貼上所需的所有資訊。
片段 應前面加上 HTML 批注 <!--StartFragment-->
和 <!--EndFragment-->
,以指出片段的開始和結束位置:這些 HTML 批註必須使用 逐字,而且每個批注本身內沒有空格符。 因此,片段的開頭和結尾會以這些批註 和 StartFragment
和 EndFragment
標頭 來表示。 工具應該會產生這項資訊。 此備援是刻意的,並引進來能夠尋找片段的開頭(從位元組計數),並直接標記片段在 HTML 樹狀結構中的位置。
選擇
選取範圍 是選擇性的,因為片段中包含足夠的資訊以進行基本貼上。 如果未儲存選取範圍,StartSelection
和 EndSelection
都不會儲存在標頭中。
如果有,選取範圍 是用戶選取的 確切 文字範圍(在 片段內):這會將詳細資訊新增至片段,方法是指出確切選取的文字,而不 格式正確的開始和結束標記和結束標記。
請記住,選取範圍 可以代表文字的執行,該文字可以在任何指定的元素中開始,並以結尾 任何後續或上階 - 元素。 因此,不可能使用 HTML 來代表文字選取範圍。
場景
下列案例說明 IE4/MSHTML HTML 編輯器如何處理 HTML 剪下和貼上;其他應用程式可能或可能不會遵循這些案例。 此處所述的剪貼簿格式旨在讓應用程式選擇運作的彈性。 (這些案例只顯示良好的 HTML,也就是沒有重疊的標記。
案例 1 - HTML 的簡單片段
假設下列 HTML 文字:
<body>This is normal. <b>This is bold.</b> <i><b>This is bold italic.</b> This is italic.</i></body>
這會如下所示:
這是正常的。 這是粗體。這是粗體斜體。這是斜體。
當使用者將上述 HTML 文字載入 MSHTML 型應用程式時(MSHTML,又稱為 三叉星,是 Internet Explorer 的引擎),MSHTML 會處理複製 HTML 的子字串,如下所示:
- 使用者從上述範例中選取不含任何前置或尾端空格符的文字,例如「粗體這是粗體斜體。」。
- 若要將文字複製到剪貼簿,用戶按下 [複製] 命令按鈕。
MSHTML 會將此 HTML 文字放入 Windows 剪貼簿,如下所示:
Version:1.0
StartHTML:0121
EndHTML:0272
StartFragment:0006
EndFragment:0106
StartSelection:0180
EndSelection:0225
<html><!--StartFragment--><body>This is normal. <b>This is bold.</b> <i><b>This is bold italic.</b> This is italic.</i></body><!--EndFragment--></html>
案例 2 - HTML 中數據表的片段
假設下列 HTML 文字:
<BODY><TABLE BORDER><TR><TH ROWSPAN=2>Head1</TH><TD>Item 1</TD><TD>Item 2</TD><TD>Item 3</TD><TD>Item 4</TD></TR><TR><TD>Item 5</TD><TD>Item 6</TD><TD>Item 7</TD><TD>Item 8</TD></TR><TR><TH>Head2</TH><TD>Item 9</TD><TD>Item 10</TD><TD>Item 11</TD><TD>Item 12</TD></TR></TABLE></BODY>
這會如下所示:
前端 1 專案1 專案2 專案3 專案 4 專案5 專案 6 專案7 專案8 前端 2 專案 9 專案 10 專案11 專案12
MSHTML 如何處理從數據表複製 HTML 的子字串
當使用者使用滑鼠選取表格單元格時,Item 6、Item 7、Item 10,以及 Item 11。 然後,此選取範圍會複製到剪貼簿中。
以下是剪貼簿上的內容(請注意這是 IE4/MSHTML 的解譯)。 為了清楚起見,已新增換行符。
<!DOCTYPE
<HTML>
<BODY>
<TABLE BORDER>
<!--StartFragment-->
**<TR>
<TD>Item 6</TD>
<TD>Item 7</TD>
</TR>
<TR>
<TD>Item 10</TD>
<TD>Item 11</TD>
</TR>**
<!--EndFragment-->
</TABLE>
</BODY>
</HTML>
選取範圍是以 StartSelection
和 EndSelection
分隔,以粗體顯示。
案例 3 - 將已排序列表的片段貼入純文字 <ol>
假設下列 HTML 文字:
<BODY><OL TYPE="a"><LI>Item 1<LI>Item 2<LI>Item 3<LI>Item 4<LI>Item 5<LI>Item 6</OL></BODY>
這會如下所示:
- 專案1
- 專案2
- 專案3
- 專案 4
- 專案5
- 專案 6
MSHTML 如何處理複製 HTML 編號清單專案的子字串
- 使用者從 專案 3開始選取文字,到專案 4 ,到專案 5 結尾專案 5。 用戶會叫用 Copy 命令。
- 下列 HTML 位於剪貼簿中(為了清楚起見,新增換行符) -
<!--Star/EndFragment -->
批注的精確位置取決於使用者如何處理其瀏覽器的文字選取邏輯:
<html>
<body>
<ol>
<!-- StartFragment-->
<li>Item 3</li>
<li>Item 4</li>
<li>Item 5</li>
<!-- EndFragment-->
</ol>
</body>
</html>
如果此片段現在要貼到空白檔中,將會建立下列 HTML:
<body>
<ol>
<li>Item 3</li>
<li>Item 4</li>
<li>Item 5</li>
</ol>
</body>
這會如下所示:
- 專案3
- 專案 4
- 專案5
案例 5 - 貼上部分選取的區域
假設下列 HTML 文字:
<p>IE4/MSHTML is a WYSIWYG Editor that supports:</p>
<ul><li>Cut<li>Copy<li>Paste</ul>
<p>This is a Great Tool!</p>
這會如下所示:
IE4/MSHTML 是支援下列的 WYSIWYG 編輯器:
- 切
- 複製
- 糊
這是絕佳的工具!
MSHTML 如何處理複製 HTML 清單專案的子字串
使用者使用滑鼠拖曳文字選取範圍,例如「支援:剪下 Cop 的 WYSIWYG 編輯器」。 就好像是純文字,該選取範圍看起來會像這個中斷的HTML片段:
WYSIWYG Editor, which supports:</p>
<ul>
<li>Cut</li>
<li>Cop
當使用者按下 [複製] 命令按鈕時,其剪貼簿看起來會像這樣(為了清楚起見,已新增換行符;粗體文字代表用戶實際選取的內容):
<html> <body> <!-- StartFragment--> <p>WYSIWYG Editor, which supports</p> <ul> <li>Cut</li> <li>Cop</li> </ul> <!-- EndFragment--> </body> </html>
請注意:
- 已移除 「WYSIWYG」 之前的文字。
- 清單專案 (
<li>Paste</li>
) 已移除,因為使用者選取範圍中沒有任何專案。 - 已移除 「Copy」 中的 「y」。