Freigeben über


HTML-Zwischenablageformat

Die Anforderungen für die Übertragung von HTML-Text mithilfe der Zwischenablage unterscheiden sich je nach Szenario. Dieser Artikel befasst sich mit dem Ausschneiden und Einfügen von Fragmenten eines HTML-Dokuments. Es kann Anforderungen für die Übertragung ganzer HTML-Dokumente über die Zwischenablage geben; Dieser Artikel wird jedoch durch eine Anforderung zum Übertragen von Fragmenten von ausgewähltem HTML-Text gesteuert. Daher wird eine Methode, die das gesamte HTML-Dokument in die Zwischenablage kopieren muss, als zu schwer angesehen.

Das CF_HTML Zwischenablageformat ermöglicht es, ein Fragment von unformatiertem HTML-Text und dessen Kontext (d. h. äußerer HTML) als ASCII in der Zwischenablage zu speichern. Dadurch kann der Kontext des HTML-Fragments, das aus allen vorherigen umgebenden Tags besteht, von einer Anwendung untersucht werden, damit die umgebenden Tags des HTML-Fragments mit ihren Attributen angegeben werden können. Obwohl es an Anwendungen liegt, zu entscheiden, wie solche Fragmente interpretiert werden sollen, sind hier einige grundlegende Richtlinien enthalten, die auf IE4/MSHTML-Implementierungen basieren.

Der offizielle Name der Zwischenablage (die von RegisterClipboardFormatverwendete Zeichenfolge ) ist "HTML Format".

Beschreibung

CF_HTML ist ein Textablageformat, wobei immer UTF-8-Codierung verwendet wird. Beachten Sie, dass die Verwendung von UTF-8 hier eine Ausnahme von der allgemeinen Regel ist, die von der Windows-API UTF-16 für die Darstellung von Textzeichenfolgen verwendet wird, insbesondere lesbare (d. h. lokalisierbare) Zeichenfolgen.

Sie können das allgemeine Layout oder die Syntax der CF_HTML Zwischenablage in Pseudo-Backus-Naur-Form wie folgt beschreiben:

Anmerkung

Diese Grammatik ist nicht-normative**

<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"

Beschreibungsüberschriften und Offsets

Der Beschreibungsheader enthält die Versionsnummer und offsets der Zwischenablage, die angibt, wo der Kontext und das Fragment beginnen und enden. Die Beschreibung ist eine Liste von ASCII-Textstichwörtern gefolgt von einer Zeichenfolge und getrennt durch einen Doppelpunkt (:)).

  • Version: Versionsnummer der Zwischenablage. Die Startversion ist Version:0.9. Ab Windows 10 20H2 ist dies jetzt Version:1.0.
  • StartHTML: Offset (in Bytes) vom Anfang der Zwischenablage bis zum Anfang des Kontexts oder -1, wenn kein Kontext vorhanden ist.
  • EndHTML: Offset (in Bytes) vom Anfang der Zwischenablage bis zum Ende des Kontexts oder -1, wenn kein Kontext vorhanden ist.
  • StartFragment: Offset (in Bytes) vom Anfang der Zwischenablage bis zum Anfang des Fragments.
  • EndFragment: Offset (in Bytes) vom Anfang der Zwischenablage bis zum Ende des Fragments.
  • StartSelection: Optional. Offset (in Byte) vom Anfang der Zwischenablage bis zum Anfang der Auswahl.
  • EndSelection: Optional. Offset (in Bytes) vom Anfang der Zwischenablage bis zum Ende der Auswahl.

Die Schlüsselwörter StartSelection und EndSelection sind optional und müssen beide ausgelassen werden, wenn die Anwendung diese Informationen nicht generieren soll.

Zukünftige Überarbeitungen des CF_HTML Zwischenablageformats können beispielsweise den Header erweitern, da der HTML-Code mit dem Offset StartHTML beginnt, dann können mehrere StartFragment und EndFragment Paare später hinzugefügt werden, um nicht zusammenhängende Auswahl von Fragmenten zu unterstützen.

Offsetsyntax

Aus Gründen der Einfachheit der Programme, die die Byte-Offsets generieren, können die Offsetwerte optional mit einer beliebigen Menge von Nullziffern '0'links gepolstert werden. Der Grund dafür ist, dass Programme, die den HTML-Code für die Offsets sniffen, zehn (10) Nullen in den Ausgabepuffer für jedes Schlüsselwort schreiben können (z. B. StartHTML: 0000000000). Wenn später der genaue StartHTML Offset bekannt ist (z. B. 71), kann das Programm die rechtssten Nullen mit "71" im Puffer überschreiben (z. B. zu StartHTML: 0000000071).

Der einzige von der Zwischenablage unterstützte Zeichensatz ist Unicode (UTF-8). Da die ersten Zeichen von UTF-8 und ASCII übereinstimmen, ist die Beschreibung immer ASCII, aber die Bytes des Kontexts (beginnend bei StartHTML) können alle anderen Zeichen verwenden, die in UTF-8 codiert sind.

Die Enden von Zeilen im Header des Zwischenablageformats (<br> oben) können durch CRLF (Windows), LF (Unix) oder lone CR (archaisch) dargestellt werden.

Das Fragment, die Auswahl und deren Kontext

Element Beschreibungsheader Erfordert gültiges HTML für Start- und Endzeichenpositionen
Zusammenhang StartHTML und EndHTML Ja
Fragment StartFragment und EndFragment Ja
Auswahl StartSelection und EndSelection Nein

Zusammenhang

Der Kontext ist ein gültiges, vollständiges HTML-Dokument. Dies bedeutet jedoch nicht, dass das gesamte ursprüngliche HTML-Dokument, das die Auswahl des Benutzers enthält, verbatimt wird; Im Gegenteil, es kann ein minimales, aber wohlgeformtes HTML-Dokument sein.

Dieser Kontext enthält das Fragment und alle vorangehenden umgebenden Tags (Start- und Endtags; diese vorherigen umgebenden Tags stellen alle übergeordneten Knoten des Fragments bis zum HTML-Knoten dar). Der obige Beispielartikel verfügt über ein vollständiges HTML-<head>-Element, das die Verwendung von <base href=""> und <title> Elementen zulässt. Beispielsweise kann dieses Element eingefügt werden, um diese zusätzlichen Informationen zu erhalten. Eine Anwendung, die ein HTML-Fragment in die Zwischenablage kopiert, kann sich entscheiden, ein <base href=""> Element zu erstellen, um es in den Kontext einzuschließen, wenn ein solches Element noch nicht vorhanden ist. Auf diese Weise können nicht absolute URIs im HTML-Fragment aufgelöst werden.

Der Kontext ist optional, da ausreichende Informationen in das Fragment für die grundlegende Einzufügen eines HTML-Fragments einbezogen werden. Wenn der Kontext nicht gespeichert ist, wird das Fragment nur gespeichert und die StartHTML=EndHTML=-1.

Fragment

Das Fragment ( oben<fragment-text>) enthält ein gültiges HTML-Fragment.

Ein gültiges html-Fragment besteht aus einem einzelnen äußeren HTML-Element. Dieses Element kann untergeordnete HTML-Elemente enthalten, sofern sie ordnungsgemäß geschachtelt sind. Ein Fragment kann z. B. ein einzelnes <div> Element sein, das 3 <p> Elemente enthält. Ein Fragment, das aus einem <span>-Element besteht, das drei <p> Elemente enthält, wäre ungültig, da ein <span>-Element (ein Element) keine Elemente auf Blockebene als untergeordnete Elemente enthalten kann.

Daher stellt das Fragment effektiv den größeren Bereich auf dem Bildschirm dar, in dem der Benutzer seine Textauswahl vorgenommen hat (z. B. zum Kopieren). Die Auswahl enthält den markierten Text sowie die öffnenden Tags und Attribute aller Elemente, die ein Endtag im markierten Text enthalten, und Endtags am Ende des Fragments für jedes enthaltene Starttag. Dies sind alle Informationen, die für das grundlegende Einfügen eines HTML-Fragments erforderlich sind.

Dem Fragment sollte gefolgt von den HTML-Kommentaren <!--StartFragment--> und <!--EndFragment-->, um anzugeben, wo das Fragment beginnt und endet; Diese HTML-Kommentare müssen verwendet werden, ohne Leerzeichen innerhalb jedes Kommentars selbst. Somit wird der Anfang und das Ende des Fragments durch das Vorhandensein dieser Kommentare und durch die kopfzeilen StartFragment und EndFragment angegeben. Tools werden erwartet, dass diese Informationen erzeugt werden. Diese Redundanz ist beabsichtigt und wurde eingeführt, um den Anfang des Fragments (aus der Byteanzahl) zu finden und die Position des Fragments direkt in der HTML-Struktur zu markieren.

Auswahl

Die Auswahl ist optional, da ausreichende Informationen im Fragment für die grundlegende Einzufügen enthalten sind. Wenn die Auswahl nicht gespeichert ist, werden sowohl StartSelection als auch EndSelection nicht in der Kopfzeile gespeichert.

Wenn vorhanden, ist die Auswahl der exakten Textbereich, den der Benutzer ausgewählt hat (innerhalb des Fragments); Dadurch werden dem Fragment weitere Informationen hinzugefügt, indem der genaue markierte Text ohne die wohlgeformten und ausgewogenen Anfangs- und Endtags und Endtags angegeben werden.

Denken Sie daran, dass die Auswahl eine Textausführung darstellen kann, die in einem beliebigen Element beginnen kann und jedem nachfolgenden oder vorgängern Element enden kann. Folglich ist es unmöglich, eine Textauswahl mit HTML darzustellen.

Drehbücher

In den folgenden Szenarien wird beschrieben, wie der IE4/MSHTML HTML-Editor HTML-Ausschneiden und Einfügen verarbeitet. andere Anwendungen können diesen Szenarien folgen oder nicht. Das hier beschriebene Format der Zwischenablage soll flexibilität für die Funktionsweise einer Anwendung ermöglichen. (In diesen Szenarien werden nur gute HTML-Code angezeigt, d. h., keine überlappenden Tags.)

Szenario 1 – Einfaches HTML-Fragment

Gehen Sie vom folgenden HTML-Text aus:

<body>This is normal. <b>This is bold.</b> <i><b>This is bold italic.</b> This is italic.</i></body>

Dies wird wie folgt angezeigt:

Dies ist normal. Dies ist fett formatiert.Dies ist fett kursiv.Dies ist kursiv.

Wenn Der Benutzer den obigen HTML-Text in eine MSHTML-basierte Anwendung geladen hat (MSHTML, auch als Trident bezeichnet, war das Modul von Internet Explorer), verarbeitet MSHTML das Kopieren einer Teilzeichenfolge von HTML wie folgt:

  1. Der Benutzer wählt einen Text ohne führende oder nachfolgende Leerzeichen aus, z. B. "Fett fett kursiv" aus dem obigen Beispiel.
  2. Um den Text in die Zwischenablage zu kopieren, klickt der Benutzer auf die Befehlsschaltfläche "Kopieren".

MSHTML platziert diesen HTML-Text wie folgt in die Windows-Zwischenablage:

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>

Szenario 2 : Fragment einer Tabelle in HTML

Gehen Sie vom folgenden HTML-Text aus:

<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>

Dies wird wie folgt angezeigt:

Kopf 1 Element 1 Element 2 Artikel 3 Element 4
Artikel 5 Element 6 Artikel 7 Artikel 8
Kopf 2 Artikel 9 Element 10 Element 11 Element 12

So behandelt MSHTML das Kopieren einer Teilzeichenfolge von HTML aus einer Tabelle

Wenn der Benutzer die Maus verwendet, um eine Textauswahl zu erstellen, die die Tabellenzellen Element 6, Element 7, Element 10und Element 11. Diese Auswahl wird dann in die Zwischenablage kopiert.

Es folgt, was sich in der Zwischenablage befindet (beachten Sie, dass dies die Interpretation von IE4/MSHTML ist). Aus Gründen der Übersichtlichkeit wurden Zeilenumbrüche hinzugefügt.

<!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>

Die Auswahl, die durch StartSelection und EndSelectiongetrennt ist, wird fett dargestellt.

Szenario 3 : Einfügen eines Fragments einer sortierten Liste <ol> in Nur-Text

Gehen Sie vom folgenden HTML-Text aus:

<BODY><OL TYPE="a"><LI>Item 1<LI>Item 2<LI>Item 3<LI>Item 4<LI>Item 5<LI>Item 6</OL></BODY>

Dies wird wie folgt angezeigt:

  1. Element 1
  2. Element 2
  3. Artikel 3
  4. Element 4
  5. Artikel 5
  6. Element 6

So verarbeitet MSHTML das Kopieren einer Teilzeichenfolge von HTML-nummerierten Listenelementen

  1. Der Benutzer trifft eine Textauswahl vom Anfang Element 3, bis Element 4und bis zum Ende Element 5. Der Benutzer ruft den Befehl "Kopieren" auf.
  2. Der folgende HTML-Code befindet sich in der Zwischenablage (Zeilenumbrüche zur Übersichtlichkeit hinzugefügt) – die genaue Position der <!--Star/EndFragment --> Kommentare hängt davon ab, wie der Benutzer die Textauswahllogik seines Browsers behandelt:
<html>
<body>
<ol>
<!-- StartFragment-->
<li>Item 3</li>
<li>Item 4</li>
<li>Item 5</li>
<!-- EndFragment-->
</ol>
</body>
</html>

Wenn dieses Fragment nun in ein leeres Dokument eingefügt werden soll, wird der folgende HTML-Code erstellt:

<body>
<ol>
<li>Item 3</li>
<li>Item 4</li>
<li>Item 5</li>
</ol>
</body>

Dies wird wie folgt angezeigt:

  1. Artikel 3
  2. Element 4
  3. Artikel 5

Szenario 5 – Einfügen eines teilweise ausgewählten Bereichs

Gehen Sie vom folgenden HTML-Text aus:

<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>

Dies wird wie folgt angezeigt:

IE4/MSHTML ist ein WYSIWYG-Editor, der Folgendes unterstützt:

  • Schneiden
  • Kopieren
  • Kleister

Dies ist ein großartiges Tool!

So behandelt MSHTML das Kopieren einer Teilzeichenfolge von HTML-Listenelementen

Der Benutzer verwendet die Maus, um eine Textauswahl zu ziehen, z. B. "WYSIWYG Editor, der Folgendes unterstützt: Cut Cop". Als wäre es Nur-Text, würde diese Auswahl wie dieses fehlerhafte HTML-Fragment aussehen:

WYSIWYG Editor, which supports:</p>
<ul>
  <li>Cut</li>
  <li>Cop

Wenn der Benutzer die Befehlsschaltfläche "Kopieren" drückt, sieht die Zwischenablage wie folgt aus (Zeilenumbrüche wurden zur Übersichtlichkeit hinzugefügt; der fett formatierte Text zeigt an, was der Benutzer tatsächlich ausgewählt hat):

<html>
<body>
<!-- StartFragment-->
<p>WYSIWYG Editor, which supports</p>
<ul>
	<li>Cut</li>
	<li>Cop</li>
</ul>
<!-- EndFragment-->
</body>
</html>

Beachten Sie Folgendes:

  • Der Text vor "WYSIWYG" wurde entfernt.
  • Das Listenelement (<li>Paste</li>) wurde entfernt, da keines davon in der Auswahl des Benutzers enthalten war.
  • Das "y" aus "Kopieren" wurde entfernt.

Siehe auch

Zwischenablage