Format du Presse-papiers HTML
Les conditions requises pour transférer du texte HTML au moyen du Presse-papiers diffèrent selon le scénario. Cet article concerne le découpage et le collage de fragments d’un document HTML. Il peut y avoir des exigences pour transférer des documents HTML entiers dans le Presse-papiers ; Toutefois, cet article est piloté par l’obligation de transférer des fragments de texte HTML sélectionné. Par conséquent, une méthode qui exigeait que l’intégralité du document HTML soit copiée dans le Presse-papiers est considérée comme trop lourde.
Le CF_HTML
format du Presse-papiers permet de stocker un fragment de texte HTML brut et son contexte (c’est-à-dire du code HTML externe) dans le Presse-papiers au format ASCII. Cela permet d’examiner le contexte du fragment HTML, qui se compose de toutes les balises précédentes, 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 recommandations 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 est ici une exception à la règle générale selon laquelle l’API Windows utilise UTF-16 pour représenter des chaînes de texte, en particulier des chaînes lisibles par l’utilisateur (c’est-à-dire localisables).
Vous pouvez décrire la disposition générale ou la syntaxe du CF_HTML
Presse-papiers sous forme pseudo-Backus-Naur comme suit :
Notes
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 du Presse-papiers et les décalages, indiquant où le contexte et le fragment commencent et se terminent. La description est une liste de mots clés texte ASCII suivis d’une chaîne et séparés par un deux-points (:).
-
Version
: numéro de version vv du Presse-papiers. La version de départ estVersion:0.9
. Depuis Windows 10 20H2, il s’agit maintenantVersion:1.0
de . -
StartHTML
: décalage (en octets) du début du Presse-papiers au début du contexte, ou-1
en l’absence de contexte. -
EndHTML
: décalage (en octets) du début du Presse-papiers à la fin du contexte, ou-1
en l’absence de contexte. -
StartFragment
: décalage (en octets) du début du Presse-papiers au début du fragment. -
EndFragment
: décalage (en octets) du début du Presse-papiers à la fin du fragment. -
StartSelection
: Facultatif. Décalage (en octets) du début du Presse-papiers au début de la sélection. -
EndSelection
: Facultatif. Décalage (en octets) du début du Presse-papiers à la fin de la sélection.
Les StartSelection
mots clés et EndSelection
sont facultatifs et doivent tous deux être omis si vous ne souhaitez pas que l’application génère ces informations.
Les révisions ultérieures du format du CF_HTML
Presse-papiers peuvent étendre l’en-tête, par exemple, car le code HTML commence au StartHTML
décalage, puis plusieurs StartFragment
paires et EndFragment
peuvent être ajoutées ultérieurement pour prendre en charge la sélection non incohérente de fragments.
Syntaxe de décalage
Pour la commodité des programmes qui génèrent les décalages d’octets, les valeurs de décalage peuvent éventuellement être remplies '0'
à gauche avec une quantité arbitraire de zéro chiffre . La raison en est que les programmes qui recherchent 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 exempleStartHTML: 0000000000
). Plus tard, lorsque le décalage exact StartHTML
est connu (par exemple, 71), le programme peut remplacer les zéros les plus à droite par « 71 » dans la mémoire tampon (par exemple, résultant en 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 UTF-8 et ASCII correspondent, la description est toujours ASCII, mais les octets du contexte (à partir StartHTML
de ) peuvent utiliser d’autres caractères encodés en UTF-8.
Les extrémités des lignes dans l’en-tête du format du Presse-papiers (<br>
ci-dessus) peuvent être représentées par CRLF (Windows), LF (Unix) ou cr solitaire (archaïque).
Le fragment, la sélection et leur 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 |
---|---|---|
Context |
StartHTML et EndHTML |
Oui |
Fragment |
StartFragment et EndFragment |
Oui |
Sélection |
StartSelection et EndSelection |
Non |
Context
Le contexte est un document HTML valide et complet, bien que cela ne signifie pas que l’intégralité du document HTML source d’origine contenant la sélection de l’utilisateur sera reportée textuellement ; au contraire, il peut s’agir d’un document HTML minimal, mais bien formé.
Ce contexte contient le fragment et toutes les balises 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 <head>
complet qui permet d’utiliser les <base href="">
éléments et <title>
. Par exemple, cet élément peut être inséré pour obtenir ces informations supplémentaires. Une application qui copie un fragment de CODE HTML dans le Presse-papiers peut choisir de créer un <base href="">
élément 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 suffisamment d’informations sont incluses dans le fragment pour que le collage de base d’un fragment HTML se produise. Si le contexte n’est pas stocké, le fragment uniquement est stocké 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 unique <div>
qui contient 3 <p>
éléments. Un fragment constitué d’un <span>
élément qui contient trois <p>
éléments ne serait pas valide, car un <span>
élément (un élément) ne peut pas contenir d’éléments au niveau du 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 (à copier, par exemple). La sélection contient le texte sélectionné, ainsi que les balises d’ouverture et les attributs de tout é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 <!--StartFragment-->
HTML et <!--EndFragment-->
pour indiquer où commence et se termine le fragment ; ces commentaires HTML doivent être utilisés textuellement, sans espaces blancs 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 StartFragment
en-têtes 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 suffisamment d’informations sont incluses dans le fragment pour le collage de base. Si la sélection n’est pas stockée, et StartSelection
EndSelection
ne sont pas stockés dans l’en-tête.
Le cas échéant, la sélection correspond à 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 exact sélectionné, sans les balises de début et de fin bien formées et équilibrées, ni 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 quel é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 les opérations couper-coller HTML . d’autres applications peuvent suivre ou non ces scénarios. Le format du Presse-papiers décrit ici est destiné à permettre une flexibilité quant au fonctionnement d’une application. (Ces scénarios n’affichent que du code HTML correct, c’est-à-dire qu’aucune balise ne se chevauche.)
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 audacieuse.C’est en italique.
Lorsque votre utilisateur a chargé le texte HTML ci-dessus dans une application MSHTML (MSHTML, alias Trident, était le moteur d’Internet Explorer), MSHTML gère la copie d’une sous-chaîne de HTML comme suit :
- L’utilisateur sélectionne un texte sans espace blanc de début ou de fin, par exemple « bold This is bold italic This » dans l’exemple ci-dessus.
- Pour copier le texte dans le Presse-papiers, l’utilisateur clique sur le bouton de commande Copier.
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 au format 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 Item 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 html à partir d’une table
Lorsque l’utilisateur utilise sa souris pour effectuer une sélection de texte couvrant les cellules du tableau Item 6, Item 7, Item 10 et Item 11. Cette sélection est ensuite copiée dans le Presse-papiers.
Voici ce qui se trouve dans le Presse-papiers (notez qu’il s’agit de l’interprétation d’IE4/MSHTML). Des 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 que délimitée par StartSelection
et EndSelection
, est affichée en gras.
Scénario 3 - Collage d’un fragment d’une liste <ol>
ordonnée dans du 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 :
- Item 1
- Élément 2
- Élément 3
- Élément 4
- Élément 5
- Élément 6
Comment MSHTML gère la copie d’une sous-chaîne d’éléments de liste numérotés HTML
- L’utilisateur effectue une sélection de texte du début de l’élément 3 à l’élément 4 et jusqu’à la fin de l’élément 5. L’utilisateur appelle la commande Copier.
- 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 dépend de la
<!--Star/EndFragment -->
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 :
- Élément 3
- Élément 4
- É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
- Coller
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 : Couper le flic ». Comme s’il s’agissait de 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 de la commande Copier, son Presse-papiers ressemble à ceci (des 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 antérieur à « WYSIWYG » a été supprimé.
- L’élément de liste (
<li>Paste</li>
) a été supprimé, car il ne figurait pas dans la sélection de l’utilisateur. - Le « y » de « Copier » a été supprimé.