HTML Klembord-indeling
De vereisten voor het overbrengen van HTML-tekst via het Klembord verschillen afhankelijk van het scenario. Dit artikel heeft betrekking op het knippen en plakken van fragmenten van een HTML-document. Er zijn mogelijk vereisten voor het overdragen van volledige HTML-documenten via het Klembord; Dit artikel wordt echter aangestuurd door een vereiste om fragmenten van geselecteerde HTML-tekst over te dragen. Een methode die vereist dat het hele HTML-document naar het klembord moet worden gekopieerd, wordt als te zwaar beschouwd.
Met de CF_HTML
klembordindeling kan een fragment van onbewerkte HTML-tekst en de bijbehorende context (dus buitenste HTML) als ASCII op het klembord worden opgeslagen. Hierdoor kan de context van het HTML-fragment, dat bestaat uit alle voorgaande omringende tags, worden onderzocht door een toepassing, zodat de omringende tags van het HTML-fragment kunnen worden genoteerd met hun kenmerken. Hoewel het aan toepassingen is om te bepalen hoe dergelijke fragmenten moeten worden geïnterpreteerd, worden hier enkele basisrichtlijnen opgenomen op basis van IE4/MSHTML-implementaties.
De officiële naam van het klembord (de tekenreeks die wordt gebruikt door RegisterClipboardFormat
) is "HTML Format
".
Beschrijving
CF_HTML
is een tekst klembordindeling, maar gebruikt altijd UTF-8-codering. Houd er rekening mee dat het gebruik van UTF-8 hier een uitzondering is op de algemene regel dat de Windows-API gebruikmaakt van UTF-16 voor het vertegenwoordigen van tekenreeksen, met name door mensen leesbare tekenreeksen (d.w. lokaliseerbare tekenreeksen).
U kunt de algemene indeling of syntaxis van het CF_HTML
klembord in pseudo-Backus-Naur-formulier als volgt beschrijven:
Notitie
Deze grammatica is niet-normatief**
<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"
Beschrijving kopteksten en verschuivingen
De beschrijvingskop bevat het versienummer en de offsets van het Klembord, waarmee wordt aangegeven waar de context en het fragment beginnen en eindigen. De beschrijving is een lijst met ASCII-teksttrefwoorden gevolgd door een tekenreeks en gescheiden door een dubbele punt (:).
-
Version
: vv-versienummer van het klembord. De beginversie isVersion:0.9
. Vanaf Windows 10 20H2 is dit nuVersion:1.0
. -
StartHTML
: Verschuiving (in bytes) vanaf het begin van het klembord tot het begin van de context of-1
als er geen context is. -
EndHTML
: Verschuiving (in bytes) vanaf het begin van het klembord tot het einde van de context of-1
als er geen context is. -
StartFragment
: Verschuiving (in bytes) vanaf het begin van het klembord tot het begin van het fragment. -
EndFragment
: Verschuiving (in bytes) vanaf het begin van het klembord tot het einde van het fragment. -
StartSelection
: optioneel. Verschuiving (in bytes) vanaf het begin van het klembord tot het begin van de selectie. -
EndSelection
: optioneel. Verschuiving (in bytes) vanaf het begin van het klembord tot het einde van de selectie.
De trefwoorden StartSelection
en EndSelection
zijn optioneel en moeten beide worden weggelaten als u niet wilt dat de toepassing deze informatie genereert.
Toekomstige revisies van de CF_HTML
klembordindeling kunnen bijvoorbeeld de koptekst uitbreiden, omdat de HTML begint bij de StartHTML
offset, kunnen meerdere StartFragment
en EndFragment
paren later worden toegevoegd om niet-aaneengesloten selectie van fragmenten te ondersteunen.
Verschuivingssyntaxis
Voor het gemak van de programma's die de byte-offsets genereren, kunnen de offsetwaarden eventueel links worden opgevuld met een willekeurige hoeveelheid nul cijfers '0'
. De reden hiervoor is dat programma's die de HTML voor de offsets snuiven tien (10) nullen naar de uitvoerbuffer kunnen schrijven voor elk trefwoord (bijvoorbeeld StartHTML: 0000000000
). Wanneer de exacte StartHTML
verschuiving later bekend is (bijvoorbeeld 71), kan het programma de meest rechtse nullen overschrijven met '71' in de buffer (bijvoorbeeld wat resulteert in StartHTML: 0000000071
).
De enige tekenset die door het Klembord wordt ondersteund, is Unicode (UTF-8). Omdat de eerste tekens van UTF-8 en ASCII overeenkomen, is de beschrijving altijd ASCII, maar de bytes van de context (beginnend bij StartHTML
) kunnen alle andere tekens gebruiken die zijn gecodeerd in UTF-8.
De uiteinden van regels in de koptekst van de klembordindeling (<br>
hierboven) kunnen worden vertegenwoordigd door CRLF (Windows), LF (Unix) of eenzame CR (archaïsch).
Het fragment, de selectie en de bijbehorende context
Element | Beschrijvingskoppen | Vereist geldige HTML voor begin- en eindtekenposities |
---|---|---|
Context |
StartHTML en EndHTML |
Ja |
Stuk |
StartFragment en EndFragment |
Ja |
Selectie |
StartSelection en EndSelection |
Nee |
Context
De context is een geldig, volledig HTML-document. Dit betekent echter niet dat het volledige HTML-document van de bron met de selectie van de gebruiker wordt overgedragen. integendeel, het kan een minimaal, maar goed opgemaakt HTML-document zijn.
Deze context bevat het fragment en alle voorgaande omringende tags (begin- en eindtags; deze voorgaande omringende tags vertegenwoordigen alle bovenliggende knooppunten van het fragment, tot het HTML-knooppunt). Het bovenstaande voorbeeldartikel bevat een volledig HTML-<head>
-element waarmee <base href="">
en <title>
elementen kunnen worden gebruikt. Dit element kan bijvoorbeeld worden ingevoegd om deze aanvullende informatie te verkrijgen. Een toepassing die een fragment van HTML naar het klembord kopieert, kan ervoor kiezen om een <base href="">
element te maken om het op te nemen in de context als een dergelijk element nog niet aanwezig is. Op deze manier kunnen niet-absolute URI's in het HTML-fragment worden omgezet.
De context is optioneel, omdat er voldoende informatie is opgenomen in het fragment voor het eenvoudig plakken van een HTML-fragment. Als de context niet is opgeslagen, wordt het fragment alleen opgeslagen en de StartHTML=EndHTML=-1
.
Stuk
Het fragment (<fragment-text>
hierboven) bevat een geldig HTML-fragment.
Een geldig HTML-fragment bestaat uit één buitenste HTML-element. Dit element kan onderliggende HTML-elementen bevatten, mits ze correct zijn genest. Een fragment kan bijvoorbeeld één <div>
element zijn dat 3 <p>
elementen bevat. Een fragment dat bestaat uit een <span>
element dat drie <p>
elementen bevat, is ongeldig omdat een <span>
element (een element) geen elementen op blokniveau kan bevatten als onderliggende elementen.
Het fragment vertegenwoordigt dus in feite het groter gebied scherm waarin de gebruiker de tekstselectie heeft gemaakt (bijvoorbeeld om te kopiëren). De selectie bevat de geselecteerde tekst plus de openingstags en kenmerken van elk element met een eindtag binnen de geselecteerde tekst en eindtags aan het einde van het fragment voor alle opgenomen begintags. Dit is alle informatie die nodig is voor het eenvoudig plakken van een HTML-fragment.
Het fragment moet worden voorafgegaan en gevolgd door de HTML-opmerkingen <!--StartFragment-->
en <!--EndFragment-->
om aan te geven waar het fragment begint en eindigt; deze HTML-opmerkingen moeten worden gebruikt exacte, zonder spaties binnen elke opmerking zelf. Het begin en einde van het fragment worden dus aangegeven door de aanwezigheid van deze opmerkingen en door de StartFragment
en EndFragment
kopteksten. Hulpprogramma's zullen naar verwachting deze informatie produceren. Deze redundantie is opzettelijk en is geïntroduceerd om het begin van het fragment (uit het aantal byte) te vinden en de positie van het fragment rechtstreeks in de HTML-structuur te markeren.
Selectie
De selectie is optioneel omdat er voldoende informatie is opgenomen in het fragment voor eenvoudige plakken. Als de selectie niet is opgeslagen, worden zowel StartSelection
als EndSelection
niet opgeslagen in de koptekst.
Indien aanwezig, is de selectie het exacte tekstbereik dat de gebruiker heeft geselecteerd (binnen het fragment); Hiermee voegt u meer informatie toe aan het fragment door de exacte geselecteerde tekst aan te geven, zonder de goed opgemaakte en evenwichtige begin- en eindtags en eindtags.
Houd er rekening mee dat de selectie een uitvoering van tekst kan voorstellen die in een bepaald element kan beginnen en in volgende of bovenliggende element kan eindigen. Daarom is het onmogelijk om een tekstselectie weer te geven met behulp van HTML.
Scenario 's
In de volgende scenario's wordt beschreven hoe de IE4/MSHTML HTML-editor HTML-knip- en plakbewerkingen verwerkt; andere toepassingen kunnen deze scenario's wel of niet volgen. De hier beschreven klembordindeling is bedoeld om flexibiliteit te bieden voor de manier waarop een toepassing ervoor kiest om te functioneren. (In deze scenario's wordt alleen goede HTML weergegeven, dus geen overlappende tags.)
Scenario 1 - Eenvoudig fragment van HTML
Stel de volgende HTML-tekst in:
<body>This is normal. <b>This is bold.</b> <i><b>This is bold italic.</b> This is italic.</i></body>
Dit wordt als volgt weergegeven:
Dit is normaal. Dit is vetgedrukt.Dit is vet cursief.Dit is cursief.
Wanneer uw gebruiker de bovenstaande HTML-tekst heeft geladen in een MSHTML-toepassing (MSHTML, ook wel Trident, was de engine van Internet Explorer), kopieert MSHTML als volgt een subtekenreeks van HTML:
- De gebruiker selecteert een tekst zonder voorloop- of volgspaties, bijvoorbeeld 'Vetgedrukt Dit is cursief dit' in het bovenstaande voorbeeld.
- Als u de tekst naar het klembord wilt kopiëren, klikt de gebruiker op de opdrachtknop Kopiëren.
MSHTML plaatst deze HTML-tekst als volgt in het Windows Klembord:
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>
Scenario 2- Fragment van een tabel in HTML
Stel de volgende HTML-tekst in:
<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>
Dit wordt als volgt weergegeven:
Kop 1 Item 1 Item 2 Item 3 Item 4 Item 5 Item 6 Item 7 Item 8 Kop 2 Item 9 Item 10 Item 11 Item 12
Hoe MSHTML een subtekenreeks van HTML uit een tabel afhandelt
Wanneer de gebruiker de muis gebruikt om een tekstselectie te maken voor de tabelcellen Item 6, Item 7, Item 10en Item 11. Deze selectie wordt vervolgens gekopieerd naar het Klembord.
Wat volgt is wat er op het klembord staat (let op: de interpretatie van IE4/MSHTML). Regeleinden zijn voor duidelijkheid toegevoegd.
<!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>
De selectie, zoals gescheiden door StartSelection
en EndSelection
, wordt vet weergegeven.
Scenario 3: een fragment van een geordende lijst plakken <ol>
in tekst zonder opmaak
Stel de volgende HTML-tekst in:
<BODY><OL TYPE="a"><LI>Item 1<LI>Item 2<LI>Item 3<LI>Item 4<LI>Item 5<LI>Item 6</OL></BODY>
Dit wordt als volgt weergegeven:
- Item 1
- Item 2
- Item 3
- Item 4
- Item 5
- Item 6
Hoe MSHTML een subtekenreeks van genummerde HTML-lijstitems verwerkt
- De gebruiker maakt een tekstselectie vanaf het begin van item 3, tot item 4en tot het einde van item 5. De gebruiker roept de opdracht Kopiëren aan.
- De volgende HTML bevindt zich op het klembord (regeleinden toegevoegd voor duidelijkheid): de exacte locatie van de
<!--Star/EndFragment -->
opmerkingen is afhankelijk van de manier waarop de gebruiker de tekstselectielogica van de browser heeft verwerkt:
<html>
<body>
<ol>
<!-- StartFragment-->
<li>Item 3</li>
<li>Item 4</li>
<li>Item 5</li>
<!-- EndFragment-->
</ol>
</body>
</html>
Als dit fragment nu in een leeg document zou worden geplakt, wordt de volgende HTML gemaakt:
<body>
<ol>
<li>Item 3</li>
<li>Item 4</li>
<li>Item 5</li>
</ol>
</body>
Dit wordt als volgt weergegeven:
- Item 3
- Item 4
- Item 5
Scenario 5: een gedeeltelijk geselecteerde regio plakken
Stel de volgende HTML-tekst in:
<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>
Dit wordt als volgt weergegeven:
IE4/MSHTML is een WYSIWYG Editor die ondersteuning biedt voor:
- Snijden
- Kopiëren
- Plakken
Dit is een geweldige tool!
Hoe MSHTML een subtekenreeks van HTML-lijstitems verwerkt
De gebruiker gebruikt de muis om een tekstselectie te slepen, bijvoorbeeld "WYSIWYG Editor die ondersteuning biedt voor: Cut Cop". Alsof het tekst zonder opmaak was, zou die selectie eruitzien als dit verbroken HTML-fragment:
WYSIWYG Editor, which supports:</p>
<ul>
<li>Cut</li>
<li>Cop
Wanneer de gebruiker op de opdrachtknop Kopiëren drukt, ziet het klembord er als volgt uit (regeleinden zijn voor duidelijkheid toegevoegd; de vetgedrukte tekst geeft aan wat de gebruiker daadwerkelijk heeft geselecteerd):
<html> <body> <!-- StartFragment--> <p>WYSIWYG Editor, which supports</p> <ul> <li>Cut</li> <li>Cop</li> </ul> <!-- EndFragment--> </body> </html>
Merk op dat:
- De tekst vóór WYSIWYG is verwijderd.
- Het lijstitem (
<li>Paste</li>
) is verwijderd omdat deze niet in de selectie van de gebruiker stond. - De 'y' van 'Kopiëren' is verwijderd.