共用方式為


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: 選用。 從剪貼簿開頭到選取範圍結尾的位移(以位元組為單位)。

StartSelectionEndSelection 關鍵詞是選擇性的,如果您不想讓應用程式產生這項資訊,則必須同時省略兩者。

剪貼簿格式的未來修訂 CF_HTML 可能會延伸標頭,例如,因為 HTML 會從位移開始 StartHTML ,然後稍後可以新增多個 StartFragmentEndFragment 配對,以支援不連續的片段選取。

位移語法

為了方便程式產生位元組位移,位移值可能會選擇性地以任意零位數 '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
上下文 StartHTMLEndHTML Yes
Fragment StartFragmentEndFragment Yes
選取項目 StartSelectionEndSelection 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 樹狀結構中的位置。

選取項目

選取範圍是選擇性的,因為片段中包含足夠的資訊以進行基本貼上。 如果未儲存選取範圍, StartSelectionEndSelection 都不會儲存在標頭中。

如果存在,則 選取 範圍是 用戶選取的確切 文字範圍(在 片段內):這會藉由指出確切選取的文字,以將更多資訊新增至片段而沒有 格式正確且平衡的開始和結束卷標和結束標記。

請記住,選取範圍可以代表文字的執行,該文字可以在任何指定的元素中開始,並以任何後續的 - 或上階 - 元素結尾。 因此,不可能使用 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 的子字元串,如下所示:

  1. 使用者從上述範例中選取不含任何前置或尾端空格符的文字,例如「粗體這是粗體斜體。」。
  2. 若要將文字複製到剪貼簿,用戶按下 [複製] 命令按鈕。

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. 項目 1
  2. 項目 2
  3. 項目 3
  4. 專案 4
  5. 專案5
  6. 專案 6

MSHTML 如何處理複製 HTML 編號清單專案的子字串

  1. 使用者從專案 3 開始,到專案 4,以及專案 5 結尾進行文字選取。 用戶會叫用 Copy 命令。
  2. 下列 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>

這會如下所示:

  1. 項目 3
  2. 專案 4
  3. 專案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」。

另請參閱

剪貼簿