Partager via


Format du Presse-papiers HTML

Les conditions requises pour le transfert de texte HTML au moyen du Presse-papiers diffèrent selon le scénario. Cet article concerne la coupe et le collage de fragments d’un document HTML. Il peut y avoir des exigences pour transférer des documents HTML entiers via le Presse-papiers ; Toutefois, cet article est piloté par une exigence de transfert de fragments de texte HTML sélectionné. Par conséquent, une méthode qui exigeait que l’intégralité du document HTML soit copié dans le Presse-papiers est considérée comme trop lourde.

Le format de presse-papiers CF_HTML permet de stocker un fragment de texte HTML brut et son contexte (c’est-à-dire du code HTML externe) dans le Presse-papiers sous forme ASCII. Cela permet au contexte du fragment HTML, qui se compose de toutes les balises environnantes précédentes, d’être examiné par une application afin que les balises environnantes du fragment HTML puissent être notées avec leurs attributs. Bien qu’il incombe aux applications de décider comment interpréter ces fragments, certaines instructions de base sont incluses ici en fonction des implémentations IE4/MSHTML.

Le nom officiel du Presse-papiers (la chaîne utilisée par RegisterClipboardFormat) est «HTML Format».

Description

CF_HTML est un format de presse-papiers de texte, bien qu’il utilise toujours l’encodage UTF-8. Notez que l’utilisation de UTF-8 ici est une exception à la règle générale que l’API Windows utilise UTF-16 pour représenter des chaînes de texte, en particulier des chaînes lisibles par l’homme (c’est-à-dire localisables).

Vous pouvez décrire la disposition générale ou la syntaxe du Presse-papiers CF_HTML sous forme pseudo-Backus-Naur comme suit :

Note

Cette grammaire n’est pas 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"

En-têtes et décalages de description

L’en-tête de description inclut le numéro de version et les décalages du Presse-papiers, indiquant où le contexte et le fragment commencent et se terminent. La description est une liste de mots clés de texte ASCII suivis d’une chaîne et séparées par un signe deux-points (:).

  • Version: numéro de version vv du Presse-papiers. La version de départ est Version:0.9. À partir de Windows 10 20H2, il s’agit maintenant de Version:1.0.
  • StartHTML: décalage (en octets) entre le début du Presse-papiers et le début du contexte, ou -1 s’il n’y a pas de contexte.
  • EndHTML: offset (en octets) du début du Presse-papiers à la fin du contexte, ou -1 si aucun contexte n’est défini.
  • StartFragment: offset (en octets) du début du Presse-papiers au début du fragment.
  • EndFragment: Décalage (en octets) entre le début du Presse-papiers et la fin du fragment.
  • StartSelection: facultatif. Décalage (en octets) entre le début du Presse-papiers et le début de la sélection.
  • EndSelection: facultatif. Décalage (en octets) entre le début du Presse-papiers et la fin de la sélection.

Les mots clés StartSelection et EndSelection sont facultatifs et doivent être omis si vous ne souhaitez pas que l’application génère ces informations.

Les prochaines révisions du format presse-papiers CF_HTML peuvent étendre l’en-tête, par exemple, car le code HTML commence au décalage StartHTML, puis plusieurs paires StartFragment et EndFragment peuvent être ajoutées ultérieurement pour prendre en charge la sélection noncontigue des fragments.

Syntaxe de décalage

Pour la commodité des programmes générant les décalages d’octets, les valeurs de décalage peuvent éventuellement être laissées avec une quantité arbitraire de zéro chiffre '0'. La raison en est que les programmesiffant le code HTML pour les décalages peuvent écrire dix (10) zéros dans sa mémoire tampon de sortie pour chaque mot clé (par exemple, StartHTML: 0000000000). Plus tard, lorsque le décalage exact StartHTML est connu (par exemple, 71), le programme peut remplacer les zéros les plus à droite avec « 71 » dans la mémoire tampon (par exemple, ce qui entraîne StartHTML: 0000000071).

Le seul jeu de caractères pris en charge par le Presse-papiers est Unicode (UTF-8). Étant donné que les premiers caractères de la correspondance UTF-8 et ASCII correspondent, la description est toujours ASCII, mais les octets du contexte (commençant à StartHTML) peuvent utiliser tous les autres caractères encodés dans UTF-8.

Les extrémités des lignes au format Presse-papiers (<br> ci-dessus) peuvent être représentées par CRLF (Windows), LF (Unix) ou cr seul (archaïque).

Fragment, sélection et contexte

Élément En-têtes de description Nécessite du code HTML valide pour les positions des caractères de début et de fin
Contexte StartHTML et EndHTML Oui
Fragment StartFragment et EndFragment Oui
Sélection StartSelection et EndSelection Non

Contexte

Le contexte est un document HTML valide et complet. Toutefois, cela ne signifie pas que l’intégralité du document HTML source d’origine contenant la sélection de l’utilisateur sera transféré en détail ; au contraire, il peut s’agir d’un document HTML minimal, mais bien formé.

Ce contexte contient le fragment et toutes les balises environnantes précédentes (balises de début et de fin ; ces balises précédentes représentent tous les nœuds parents du fragment, jusqu’au nœud HTML). L’exemple d’article ci-dessus contient un élément html complet <head> qui permet d’utiliser des éléments <base href=""> et <title>. Par exemple, cet élément peut être inséré pour obtenir ces informations supplémentaires. Une application copiant un fragment de CODE HTML dans le Presse-papiers peut choisir de créer un élément <base href=""> pour l’inclure dans le contexte si un tel élément n’est pas déjà présent. De cette façon, les URI non absolus dans le fragment HTML peuvent être résolus.

Le contexte est facultatif, car des informations suffisantes sont incluses dans le fragment pour le collage de base d’un fragment HTML à mettre en place. Si le contexte n’est pas stocké, le fragment est stocké uniquement et le StartHTML=EndHTML=-1.

Fragment

Le fragment (<fragment-text> ci-dessus) contient un fragment HTML valide.

Un fragment HTML valide se compose d’un seul élément HTML externe. Cet élément peut contenir des éléments HTML descendants, à condition qu’ils soient correctement imbriqués. Par exemple, un fragment peut être un élément <div> unique qui contient 3 éléments <p>. Un fragment constitué d’un élément <span> qui contient trois éléments <p> n’est pas valide, car un élément <span> (un élément) ne peut pas contenir d’éléments de niveau bloc en tant qu’enfants.

Ainsi, le fragment représente efficacement la plus grande zone à l’écran dans laquelle l’utilisateur a effectué sa sélection de texte (par exemple). La sélection contient le texte sélectionné, ainsi que les balises d’ouverture et les attributs d’un élément qui a une balise de fin dans le texte sélectionné, et les balises de fin à la fin du fragment pour toute balise de début incluse. Il s’agit de toutes les informations requises pour le collage de base d’un fragment HTML.

Le fragment doit être précédé et suivi des commentaires HTML <!--StartFragment--> et <!--EndFragment--> pour indiquer où le fragment commence et se termine ; ces commentaires HTML doivent être utilisés verbatim, sans chars d’espace blanc dans chaque commentaire lui-même. Ainsi, le début et la fin du fragment sont indiqués par la présence de ces commentaires et par les en-têtes StartFragment et EndFragment. Les outils sont censés produire ces informations. Cette redondance est intentionnelle et a été introduite pour pouvoir trouver le début du fragment (à partir du nombre d’octets) et marquer la position du fragment directement dans l’arborescence HTML.

Sélection

La sélection est facultative, car des informations suffisantes sont incluses dans le fragment pour le collage de base. Si la sélection n’est pas stockée, les StartSelection et les EndSelection ne sont pas stockées dans l’en-tête.

S’il est présent, la sélection est la plage de texte exacte que l’utilisateur a sélectionnée (dans le fragment ) ; cela ajoute plus d’informations au fragment en indiquant le texte sélectionné exact, sans les balises de début et d’extrémité bien formées et équilibrées et les balises de fin.

N’oubliez pas que la sélection peut représenter une série de texte qui peut commencer dans n’importe quel élément donné et se terminer par n’importe quelle élément ultérieur - ou ancêtre - . Par conséquent, il est impossible de représenter une sélection de texte à l’aide du code HTML.

Scénarios

Les scénarios suivants décrivent comment l’éditeur HTML IE4/MSHTML gère le découpage et le collage HTML ; d’autres applications peuvent ou non suivre ces scénarios. Le format du Presse-papiers décrit ici est destiné à permettre la flexibilité de la façon dont une application choisit de fonctionner. (Ces scénarios n’affichent que du code HTML correct, autrement dit, pas de balises qui se chevauchent.)

Scénario 1 - Fragment simple de HTML

Supposons que le texte HTML suivant :

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

Cela s’affiche comme suit :

C’est normal. C’est gras.Il s’agit d’une italique gras.C’est italique.

Lorsque votre utilisateur a chargé le texte HTML ci-dessus dans une application MSHTML (MSHTML, aka Trident, était le moteur d’Internet Explorer), MSHTML gère la copie d’une sous-chaîne de HTML comme suit :

  1. L’utilisateur sélectionne un texte sans espace blanc de début ou de fin, par exemple « gras » dans l’exemple ci-dessus.
  2. Pour copier le texte dans le Presse-papiers, l’utilisateur clique sur le bouton Copier la commande.

MSHTML place ce texte HTML dans le Presse-papiers Windows comme suit :

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>

Scénario 2 - Fragment d’une table en HTML

Supposons que le texte HTML suivant :

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

Cela s’affiche comme suit :

Tête 1 Élément 1 Élément 2 Élément 3 Élément 4
Élément 5 Élément 6 Élément 7 Élément 8
Tête 2 Élément 9 Élément 10 Élément 11 Élément 12

Comment MSHTML gère la copie d’une sous-chaîne de code HTML à partir d’une table

Lorsque l’utilisateur utilise sa souris pour effectuer une sélection de texte couvrant les cellules du tableau Élément 6, Élément 7, Élément 10et Élément 11. Cette sélection est ensuite copiée dans le Presse-papiers.

Ce qui suit est ce qui sera dans le Presse-papiers (notez qu’il s’agit de l’interprétation d’IE4/MSHTML). Les sauts de ligne ont été ajoutés pour plus de clarté.

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

La sélection, telle qu’elle est délimitée par StartSelection et EndSelection, s’affiche en gras.

Scénario 3 : collage d’un fragment d’une liste ordonnée <ol> en texte brut

Supposons que le texte HTML suivant :

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

Cela s’affiche comme suit :

  1. Élément 1
  2. Élément 2
  3. Élément 3
  4. Élément 4
  5. Élément 5
  6. Élément 6

Comment MSHTML gère la copie d’une sous-chaîne d’éléments de liste numérotés HTML

  1. L’utilisateur effectue une sélection de texte à partir du début de élément 3, via élément 4et à la fin de élément 5. L’utilisateur appelle la commande Copier.
  2. Le code HTML suivant se trouve dans le Presse-papiers (sauts de ligne ajoutés pour plus de clarté) : l’emplacement précis des commentaires <!--Star/EndFragment --> dépend de la façon dont l’utilisateur a géré la logique de sélection de texte de son navigateur :
<html>
<body>
<ol>
<!-- StartFragment-->
<li>Item 3</li>
<li>Item 4</li>
<li>Item 5</li>
<!-- EndFragment-->
</ol>
</body>
</html>

Si ce fragment devait maintenant être collé dans un document vide, le code HTML suivant sera créé :

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

Cela s’affiche comme suit :

  1. Élément 3
  2. Élément 4
  3. Élément 5

Scénario 5 - Collage d’une région partiellement sélectionnée

Supposons que le texte HTML suivant :

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

Cela s’affiche comme suit :

IE4/MSHTML est un éditeur WYSIWYG qui prend en charge :

  • Couper
  • Copier
  • Pâte

C’est un excellent outil !

Comment MSHTML gère la copie d’une sous-chaîne d’éléments de liste HTML

L’utilisateur utilise sa souris pour faire glisser une sélection de texte, par exemple « Éditeur WYSIWYG qui prend en charge : Cut Cop ». Comme s’il s’agissait d’un texte brut, cette sélection ressemblerait à ce fragment HTML rompu :

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

Lorsque l’utilisateur appuie sur le bouton Copier la commande, son Presse-papiers ressemble à ceci (les sauts de ligne ont été ajoutés pour plus de clarté ; le texte en gras indique ce que l’utilisateur a réellement sélectionné) :

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

Observez que :

  • Le texte avant « WYSIWYG » a été supprimé.
  • L’élément de liste (<li>Paste</li>) a été supprimé, car aucun d’entre eux n’était dans la sélection de l’utilisateur.
  • Le « y » de « Copy » a été supprimé.

Voir aussi

Presse-papiers