HTML Urklippsformat
Kraven för att överföra HTML-text med hjälp av Urklipp varierar beroende på scenario. Den här artikeln handlar om att klippa ut och klistra in fragment i ett HTML-dokument. Det kan finnas krav för att överföra hela HTML-dokument via Urklipp. Den här artikeln drivs dock av ett krav på att överföra fragment av markerad HTML-text. Därför ses en metod som krävde att hela HTML-dokumentet kopieras till Urklipp som för tungviktare.
Med CF_HTML
Urklippsformat kan ett fragment av html-råtext och dess kontext (dvs. yttre HTML) lagras i Urklipp som ASCII. Detta gör att kontexten för HTML-fragmentet, som består av alla föregående omgivande taggar, kan granskas av ett program så att de omgivande taggarna i HTML-fragmentet kan noteras med deras attribut. Även om det är upp till program att bestämma hur sådana fragment ska tolkas, ingår vissa grundläggande riktlinjer här baserat på IE4/MSHTML-implementeringar.
Urklipps officiella namn (strängen som används av RegisterClipboardFormat
) är "HTML Format
".
Beskrivning
CF_HTML
är ett texturklippsformat, men använder alltid UTF-8-kodning. Observera att användningen av UTF-8 här är ett undantag från den allmänna regeln att Windows API använder UTF-16 för att representera textsträngar, särskilt läsbara strängar (t.ex. localizable).
Du kan beskriva den allmänna layouten eller syntaxen för CF_HTML
Urklipp i formatet pseudo-Backus–Naur så här:
Not
Den här grammatiken är inte normativ**
<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"
Beskrivningsrubriker och förskjutningar
Beskrivningsrubriken innehåller versionsnumret och förskjutningarna i Urklipp, som anger var kontexten och fragmentet börjar och slutar. Beskrivningen är en lista över nyckelord för ASCII-text följt av en sträng och avgränsad med ett kolon (:).
-
Version
: vv versionsnummer för Urklipp. Startversionen ärVersion:0.9
. Från och med Windows 10 20H2 är detta nuVersion:1.0
. -
StartHTML
: Förskjutning (i byte) från början av Urklipp till början av kontexten, eller-1
om ingen kontext. -
EndHTML
: Förskjutning (i byte) från början av Urklipp till slutet av kontexten, eller-1
om det inte finns någon kontext. -
StartFragment
: Förskjutning (i byte) från början av Urklipp till början av fragmentet. -
EndFragment
: Förskjutning (i byte) från början av Urklipp till slutet av fragmentet. -
StartSelection
: Valfritt. Förskjutning (i byte) från början av Urklipp till början av markeringen. -
EndSelection
: Valfritt. Förskjutning (i byte) från början av Urklipp till slutet av markeringen.
Nyckelorden StartSelection
och EndSelection
är valfria och måste utelämnas om du inte vill att programmet ska generera den här informationen.
Framtida revisioner av CF_HTML
Urklippsformat kan utöka rubriken, till exempel eftersom HTML-koden börjar vid StartHTML
förskjutning kan flera StartFragment
och EndFragment
par läggas till senare för att stödja icke-sammanhängande urval av fragment.
Förskjutningssyntax
För att underlätta för de program som genererar byteförskjutningarna kan förskjutningsvärdena vara valfritt vänster vadderade med en godtycklig mängd noll siffror '0'
. Anledningen till detta är att program som sniffar HTML för förskjutningarna kan skriva tio (10) nollor till utdatabufferten för varje nyckelord (t.ex. StartHTML: 0000000000
). Senare, när den exakta StartHTML
offset är känd (t.ex. 71), kan programmet skriva över de högra nollor med "71" i bufferten (t.ex. vilket resulterar i StartHTML: 0000000071
).
Den enda teckenuppsättning som stöds av Urklipp är Unicode (UTF-8). Eftersom de första tecknen i UTF-8 och ASCII matchar är beskrivningen alltid ASCII, men byteen i kontexten (från och med StartHTML
) kan använda andra tecken som kodas i UTF-8.
Linjernas ändar i urklippsformatrubriken (<br>
ovan) kan representeras av CRLF (Windows), LF (Unix) eller ensam CR (ålderdomlig).
Fragmentet, markeringen och deras kontext
Element | Beskrivningsrubriker | Kräver giltig HTML för start- och slutteckenpositioner |
---|---|---|
Sammanhang |
StartHTML och EndHTML |
Ja |
Fragment |
StartFragment och EndFragment |
Ja |
Urval |
StartSelection och EndSelection |
Nej |
Sammanhang
Den kontexten är ett giltigt, fullständigt HTML-dokument , men det innebär inte att hela det ursprungliga HTML-källdokumentet som innehåller användarens val överförs ordagrant. Tvärtom kan det vara ett minimalt, men välformat HTML-dokument.
Den här kontexten innehåller det fragmentet och alla föregående omgivande taggar (start- och sluttaggar; dessa föreliggande taggar representerar alla överordnade noder i fragmentet, tills HTML-noden). Ovanstående exempelartikel innehåller ett fullständigt HTML-<head>
-element som tillåter användning av <base href="">
och <title>
element. Det här elementet kan till exempel infogas för att hämta den här ytterligare informationen. Ett program som kopierar ett fragment av HTML till Urklipp kan välja att skapa ett <base href="">
element som ska inkluderas i kontexten om ett sådant element inte redan finns. På så sätt kan icke-absoluta URI:er i HTML-fragmentet lösas.
Den kontexten är valfri, eftersom tillräcklig information ingår i fragmentet för att grundläggande klistra in ett HTML-fragment ska äga rum. Om kontexten inte lagras lagras bara fragmentet och StartHTML=EndHTML=-1
.
Fragment
Det fragmentet (<fragment-text>
ovan) innehåller ett giltigt HTML-fragment.
Ett giltigt HTML-fragment består av ett enda yttre HTML-element. Det här elementet kan innehålla underordnade HTML-element förutsatt att de är korrekt kapslade. Ett fragment kan till exempel vara ett enda <div>
element som innehåller 3 <p>
element. Ett fragment som består av ett <span>
element som innehåller tre <p>
element skulle vara ogiltigt eftersom ett <span>
-element (ett element) inte kan innehålla element på blocknivå som underordnade element.
Därför representerar fragmentet effektivt större område på skärmen, som användaren gjorde sin textmarkering (till exempel för att kopiera). Markeringen innehåller den markerade texten plus de inledande taggarna och attributen för alla element som har en sluttagg i den markerade texten och sluttaggar i slutet av fragmentet för alla starttaggar som ingår. Det här är all information som krävs för grundläggande klistra in ett HTML-fragment.
Det fragmentet bör föregås och följas av HTML-kommentarerna <!--StartFragment-->
och <!--EndFragment-->
för att ange var fragmentet börjar och slutar. Dessa HTML-kommentarer måste användas ordagranna, utan blankstegstecken i varje kommentar. Därför indikeras början och slutet av fragmentet av förekomsten av dessa kommentarer och av StartFragment
- och EndFragment
-rubrikerna. Verktygen förväntas producera den här informationen. Den här redundansen är avsiktlig och introducerades för att kunna hitta början av fragmentet (från byteantalet) och markera positionen för fragmentet direkt i HTML-trädet.
Urval
Valet är valfritt eftersom tillräckligt med information ingår i fragmentet för grundläggande klistra in. Om markeringen inte lagras lagras inte både StartSelection
och EndSelection
i rubriken.
Om det finns är den markeringen det exakta textintervall som användaren har valt (inom det fragmentet); Detta lägger till mer information i fragmentet genom att ange exakt vald text, utan de välformulerade och balanserade start- och sluttaggar och sluttaggar.
Kom ihåg att den markeringen kan representera en körning av text som kan starta i ett visst element och sluta i alla efterföljande - eller överordnade - element. Därför är det omöjligt att representera en textmarkering med HTML.
Scenarier
Följande scenarier beskriver hur IE4/MSHTML HTML-redigeraren hanterar HTML-klipp ut och klistra in; andra program kanske eller kanske inte följer dessa scenarier. Urklippsformatet som beskrivs här är avsett att ge flexibilitet för hur ett program väljer att fungera. (Dessa scenarier visar endast bra HTML, det vill säga inga överlappande taggar.)
Scenario 1 – Enkelt fragment av HTML
Anta följande HTML-text:
<body>This is normal. <b>This is bold.</b> <i><b>This is bold italic.</b> This is italic.</i></body>
Detta visas på följande sätt:
Det här är normalt. Det här är fetstil.Det här är fet kursivt.Det här är kursivt.
När användaren har läst in HTML-texten ovan i ett MSHTML-baserat program (MSHTML, aka Trident, var Internet Explorers motor), hanterar MSHTML kopiering av en delsträng av HTML på följande sätt:
- Användaren väljer en text utan inledande eller avslutande blanksteg, t.ex. "fetstil Det här är fetstil kursivt" i exemplet ovan.
- Om du vill kopiera texten till Urklipp klickar användaren på kommandoknappen Kopiera.
MSHTML placerar html-texten i Urklipp i Windows på följande sätt:
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 av en tabell i HTML
Anta följande HTML-text:
<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>
Detta visas på följande sätt:
Huvud 1 Objekt 1 Objekt 2 Objekt 3 Objekt 4 Objekt 5 Objekt 6 Objekt 7 Objekt 8 Huvud 2 Objekt 9 Objekt 10 Objekt 11 Objekt 12
Hur MSHTML hanterar kopiering av en delsträng av HTML från en tabell
När användaren använder musen för att göra en textmarkering som täcker tabellcellerna objekt 6objekt 7objekt 10och objekt 11. Den här markeringen kopieras sedan till Urklipp.
Följande är vad som kommer att finnas i Urklipp (observera att detta är IE4/MSHTML:s tolkning). Radbrytningar har lagts till för tydlighetens skull.
<!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>
Markeringen, som avgränsas av StartSelection
och EndSelection
, visas i fetstil.
Scenario 3 – Klistra in ett fragment av en ordnad lista <ol>
i oformaterad text
Anta följande HTML-text:
<BODY><OL TYPE="a"><LI>Item 1<LI>Item 2<LI>Item 3<LI>Item 4<LI>Item 5<LI>Item 6</OL></BODY>
Detta visas på följande sätt:
- Objekt 1
- Objekt 2
- Objekt 3
- Objekt 4
- Objekt 5
- Objekt 6
Så här hanterar MSHTML kopiering av en delsträng av HTML-numrerade listobjekt
- Användaren gör en textmarkering från början av objekt 3, genom objekt 4och till slutet av objekt 5. Användaren anropar kommandot Kopiera.
- Följande HTML finns i Urklipp (radbrytningar läggs till för tydlighetens skull) – den exakta platsen för
<!--Star/EndFragment -->
kommentarer beror på hur användaren hanterade webbläsarens logik för textval:
<html>
<body>
<ol>
<!-- StartFragment-->
<li>Item 3</li>
<li>Item 4</li>
<li>Item 5</li>
<!-- EndFragment-->
</ol>
</body>
</html>
Om det här fragmentet nu skulle klistras in i ett tomt dokument skapas följande HTML:
<body>
<ol>
<li>Item 3</li>
<li>Item 4</li>
<li>Item 5</li>
</ol>
</body>
Detta visas på följande sätt:
- Objekt 3
- Objekt 4
- Objekt 5
Scenario 5 – Klistra in en delvis vald region
Anta följande HTML-text:
<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>
Detta visas på följande sätt:
IE4/MSHTML är en WYSIWYG-redigerare som stöder:
- Skära
- Kopia
- Klistra
Detta är ett bra verktyg!
Så här hanterar MSHTML kopiering av en delsträng av HTML-listobjekt
Användaren använder musen för att dra en textmarkering, t.ex. "WYSIWYG Editor that supports: Cut Cop". Som om det vore oformaterad text skulle markeringen se ut som det här brutna HTML-fragmentet:
WYSIWYG Editor, which supports:</p>
<ul>
<li>Cut</li>
<li>Cop
När användaren trycker på kommandoknappen Kopiera ser urklipp ut så här (radbrytningar har lagts till för tydlighetens skull. Den fetstilade texten anger vad användaren faktiskt har valt):
<html> <body> <!-- StartFragment--> <p>WYSIWYG Editor, which supports</p> <ul> <li>Cut</li> <li>Cop</li> </ul> <!-- EndFragment--> </body> </html>
Observera att:
- Texten före "WYSIWYG" togs bort.
- Listobjektet (
<li>Paste</li>
) togs bort eftersom inget av det fanns i användarens val. - "y" från "Copy" har tagits bort.