HTML 剪貼簿格式
藉由剪貼簿傳輸 HTML 文字的需求會根據案例而有所不同。 本文涉及剪下和貼上 HTML 檔的片段。 可能需要透過剪貼簿傳輸整個 HTML 檔;不過,本文是由傳輸所選 HTML 文字片段的需求所驅動。 因此,需要將整個 HTML 檔複製到剪貼簿的方法被視為太重。
剪 CF_HTML
貼簿格式可讓原始 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 (原型) 表示。
片段、選取專案及其內容
Element | 描述標頭 | 開始和結束字元位置需要有效的 HTML |
---|---|---|
上下文 | StartHTML 和 EndHTML |
Yes |
Fragment | StartFragment 和 EndFragment |
Yes |
選取項目 | StartSelection 和 EndSelection |
No |
上下文
內容是有效的完整 HTML 檔 -雖然這並不表示包含使用者選取範圍的整個原始原始 HTML 檔將會逐字顯示;相反,它可以是最少但格式正確的 HTML 檔。
此 內容 包含 片段 和先前所有周圍標記(開始和結束卷標;這些前面的周圍標記代表片段的所有父節點,直到 HTML 節點為止)。 上述範例文章有一個完整的 HTML <head>
元素,允許 使用 <base href="">
和 <title>
元素。 例如,您可以插入這個專案以取得這項其他資訊。 將 HTML 片段複製到剪貼簿的應用程式可以選擇建立 <base href="">
元素,以在這類專案不存在時將其包含在內容中。 如此一來,就可以解析 HTML 片段中的非絕對 URI。
內容是選擇性的,因為片段中包含足夠的資訊,以便進行 HTML 片段的基本貼上。 如果未儲存內容,則只會儲存片段和 StartHTML=EndHTML=-1
。
Fragment
片段 (<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, 也稱為 Trident,是 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 的子字串
當使用者使用滑鼠選取表格單元格專案 6、專案 7、專案 10 和專案 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>
選取範圍會以 和 EndSelection
分隔StartSelection
,以粗體顯示。
案例 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 結尾進行文字選取。 用戶會叫用 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」。