HTML Pano Biçimi
HTML metnini pano aracılığıyla aktarma gereksinimleri senaryoya bağlı olarak farklılık gösterir. Bu makale, HTML belgesinin parçalarını kesme ve yapıştırmayla ilgilidir. Html belgelerinin tamamını pano üzerinden aktarma gereksinimleri olabilir; ancak bu makale, seçilen HTML metninin parçalarını aktarma gereksinimiyle karşılanır. Bu nedenle, HTML belgesinin tamamının panoya kopyalanması gereken bir yöntem çok ağır ağırlık olarak görülür.
CF_HTML
pano biçimi, ham HTML metninin bir parçasının ve bağlamının (dış HTML) panoda ASCII olarak depolanmasını sağlar. Bu, önceki tüm çevreleyen etiketlerden oluşan HTML parçasının bağlamının, HTML parçasının çevresindeki etiketlerin öznitelikleriyle not edilebilmesi için bir uygulama tarafından incelenmesini sağlar. Bu tür parçaların nasıl yorumeceğine karar vermek uygulamalara kalmış olsa da, IE4/MSHTML uygulamalarına dayalı olarak bazı temel yönergeler burada yer alır.
Panonun resmi adı (RegisterClipboardFormat
tarafından kullanılan dize) "HTML Format
".
Açıklama
CF_HTML
, her zaman UTF-8 kodlaması kullanan bir metin panosu biçimidir. Burada UTF-8 kullanımının, Windows API'sinin metin dizelerini, özellikle de insan tarafından okunabilir (yerelleştirilebilir) dizeleri temsil etmek için UTF-16 kullandığı genel kuralın bir istisnası olduğunu unutmayın.
CF_HTML
panosunun genel düzenini veya söz dizimini aşağıdaki gibi pseudo-Backus–Naur biçiminde açıklayabilirsiniz:
Not
Bu dil bilgisi normatif değildir**
<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"
Açıklama Üst Bilgileri ve Uzaklıkları
Açıklama üst bilgisi pano sürüm numarasını ve uzaklıkları içerir ve bağlamın ve parçanın nereden başlayıp biteceğini belirtir. Açıklama, ASCII metin anahtar sözcüklerinin ve ardından bir dizenin ve iki nokta üst üste (:)) ile ayrılmış bir listedir.
-
Version
: Panonun vv sürüm numarası. Başlangıç sürümüVersion:0.9
. Windows 10 20H2 itibarıyla bu artıkVersion:1.0
. -
StartHTML
: Panonun başından bağlamın başına kaydırma (bayt cinsinden) veya bağlam yoksa-1
. -
EndHTML
: Panonun başından bağlamın sonuna kaydırma (bayt cinsinden) veya bağlam yoksa-1
. -
StartFragment
: Panonun başından parçanın başına uzaklık (bayt cinsinden). -
EndFragment
: Panonun başından parçanın sonuna uzaklık (bayt cinsinden). -
StartSelection
: İsteğe bağlı. Panonun başından seçimin başına uzaklık (bayt cinsinden). -
EndSelection
: İsteğe bağlı. Panonun başından seçimin sonuna uzaklık (bayt cinsinden).
StartSelection
ve EndSelection
anahtar sözcükleri isteğe bağlıdır ve uygulamanın bu bilgileri oluşturmasını istemiyorsanız her ikisi de atlanmalıdır.
CF_HTML
pano biçiminin gelecekteki düzeltmeleri üst bilgiyi genişletebilir, örneğin HTML StartHTML
uzaklığında başladığından, daha sonra bitişik olmayan parça seçimini desteklemek için birden çok StartFragment
ve EndFragment
çifti eklenebilir.
Uzaklık söz dizimi
Bayt uzaklıklarını oluşturan programların kolaylık sağlaması için, uzaklık değerleri isteğe bağlı olarak '0'
rastgele bir sıfır basamak miktarıyla sola doldurulabilir. Bunun nedeni, uzaklıklar için HTML'yi algılayan programların her anahtar sözcük için çıkış arabelleğine on (10) sıfır yazabiliyor olmasıdır (örneğin, StartHTML: 0000000000
). Daha sonra, tam StartHTML
uzaklığı bilindiğinde (örneğin, 71), program arabellekte "71" ile en sağdaki sıfırların üzerine yazabilir (örneğin, StartHTML: 0000000071
ile sonuçlanır).
Pano tarafından desteklenen tek karakter kümesi Unicode (UTF-8) karakteridir. UTF-8 ve ASCII'nin ilk karakterleri eşleştiğinden, açıklama her zaman ASCII'dir, ancak bağlamın baytları (StartHTML
'den başlayarak) UTF-8'de kodlanmış diğer karakterleri kullanıyor olabilir.
Pano biçimi üst bilgisindeki (yukarıdaki<br>
) satırların uçları CRLF (Windows), LF (Unix) veya yalnız CR (arkaik) ile temsil edilebilir.
Parça, seçim ve bağlamı
Öğe | Açıklama üst bilgileri | Başlangıç ve bitiş karakter konumları için geçerli HTML gerektirir |
---|---|---|
Bağlam |
StartHTML ve EndHTML |
Evet |
Parça |
StartFragment ve EndFragment |
Evet |
Seleksiyon |
StartSelection ve EndSelection |
Hayır |
Bağlam
bağlamı geçerli, eksiksiz bir HTML belgesidir; ancak bu, kullanıcının seçimini içeren özgün kaynak HTML belgesinin tamamının ayrıntılı olarak taşınacağı anlamına gelmez; tam tersine, çok az ama iyi biçimlendirilmiş bir HTML belgesi olabilir.
Bu bağlam, parçası ve çevresindeki tüm etiketleri içerir (başlangıç ve bitiş etiketleri; önceki bu çevreleyen etiketler, HTML düğümüne kadar parçanın tüm üst düğümlerini temsil eder). Yukarıdaki örnek makalede, <base href="">
ve <title>
öğelerinin kullanımına izin veren eksiksiz bir HTML <head>
öğesi vardır. Örneğin, bu ek bilgileri almak için bu öğe eklenebilir. HTML'nin bir parçasını panoya kopyalayan bir uygulama, böyle bir öğe yoksa bağlama eklemek üzere bir <base href="">
öğesi oluşturmayı seçebilir. Bu şekilde, HTML parçasındaki mutlak olmayan URI'ler çözümlenebilir.
Html parçasının temel yapıştırılması için parçaya yeterli bilgi eklendiğinden, bağlam isteğe bağlıdır. Bağlam depolanmazsa, yalnızca parça depolanır ve StartHTML=EndHTML=-1
.
Parça
parçası (yukarıdaki<fragment-text>
) geçerli bir HTML parçası içerir.
Geçerli HTML parçası tek bir dış HTML öğesinden oluşur. Doğru iç içe yerleştirilmiş olmaları koşuluyla bu öğe alt HTML öğeleri içerebilir. Örneğin, bir parça, 3 <p>
öğe içeren tek bir <div>
öğesi olabilir. Üç <p>
öğesi içeren bir <span>
öğesinden oluşan bir parça, bir <span>
öğesi (bir öğe) alt öğe olarak blok düzeyinde öğeler içeremediğinden geçersiz olur.
Bu nedenle parça, kullanıcının metin seçimini yaptığı (örneğin, kopyalamak için) ekranda daha büyük alanı etkili bir şekilde temsil eder. Seçim, seçilen metnin yanı sıra, seçilen metin içinde bir bitiş etiketi olan herhangi bir öğenin açılış etiketlerini ve özniteliklerini ve dahil edilen herhangi bir başlangıç etiketi için parçanın sonundaki bitiş etiketlerini içerir. Bu, HTML parçasının temel yapıştırması için gereken tüm bilgilerdir.
parçası önce ve ardından html açıklamaları <!--StartFragment-->
ve parçanın nerede başlayıp bittiğini göstermek için <!--EndFragment-->
; bu HTML açıklamaları, her açıklamanın içinde boşluk karakteri olmadan kullanılmalıdır. Bu nedenle, parçanın başlangıcı ve sonu, bu açıklamaların ve StartFragment
ve EndFragment
üst bilgileri tarafından gösterilir. Araçların bu bilgileri üretmesi beklenir. Bu yedeklilik kasıtlıdır ve parçanın başlangıcını (bayt sayımından) bulabilmek ve parçanın konumunu doğrudan HTML ağacında işaretlemek için tanıtıldı.
Seleksiyon
Temel yapıştırma için parçaya yeterli bilgi eklendiğinden seçimi isteğe bağlıdır. Seçim depolanmazsa, hem StartSelection
hem de EndSelection
üst bilgide depolanmaz.
Varsa, seçim kullanıcının seçtiği tam metin aralığıdır (parça); bu, iyi biçimlendirilmiş ve dengeli başlangıç ve bitiş etiketleriyle bitiş etiketlerini olmadan tam olarak seçili metni belirterek parçaya daha fazla bilgi ekler.
unutmayın, seçim herhangi bir öğede başlayıp sonraki herhangi bir sonlanabilen bir metin çalıştırmasını temsil edebilir . Sonuç olarak, HTML kullanarak bir metin seçimini temsil etmek mümkün değildir.
Senaryo
Aşağıdaki senaryolarda IE4/MSHTML HTML düzenleyicisinin HTML kesme ve yapıştırma işlemlerini nasıl işlediği açıklanmaktadır; diğer uygulamalar bu senaryoları izleyebilir veya izlemeyebilir. Burada açıklanan pano biçimi, bir uygulamanın nasıl çalışmasını seçtiği konusunda esneklik sağlamak için tasarlanmıştır. (Bu senaryolarda yalnızca iyi HTML, yani çakışan etiketler gösterilmez.)
Senaryo 1 - HTML'nin Basit Parçası
Aşağıdaki HTML metnini varsayın:
<body>This is normal. <b>This is bold.</b> <i><b>This is bold italic.</b> This is italic.</i></body>
Bu, aşağıdaki gibi görünür:
Bu normaldir. Bu kalın.Bu kalın italik.Bu italik.
Kullanıcınız yukarıdaki HTML metnini MSHTML tabanlı bir uygulamaya yüklediğinde (MSHTML, Trident, Internet Explorer'ın altyapısıydı), MSHTML html alt dizesini kopyalama işlemini aşağıdaki gibi işler:
- Kullanıcı, yukarıdaki örnekten herhangi bir başında veya sonunda boşluk olmayan bir metin seçer. Örneğin, "kalın Bu kalın italik Bu".
- Metni panoya kopyalamak için kullanıcı Kopyala komut düğmesine tıklar.
MSHTML, bu HTML metnini Aşağıdaki gibi Windows Panosu'na yerleştirir:
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>
Senaryo 2 - HTML'de bir tablonun parçası
Aşağıdaki HTML metnini varsayın:
<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>
Bu, aşağıdaki gibi görünür:
Baş 1 Öğe 1 Öğe 2 Öğe 3 Öğe 4 Öğe 5 Öğe 6 Öğe 7 Öğe 8 Baş 2 Öğe 9 Öğe 10 Öğe 11 Öğe 12
MSHTML, bir tablodan HTML alt dizesini kopyalamayı nasıl işler?
Kullanıcı, Öğe 6 , Öğe 7, Öğe 10ve Öğe 11tablo hücrelerini kapsayan bir metin seçimi yapmak için faresini kullandığında. Bu seçim daha sonra panoya kopyalanır.
Aşağıdakiler panoda olacaklardır (bunun IE4/MSHTML'nin yorumu olduğuna dikkat edin). Netlik için satır sonları eklendi.
<!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>
StartSelection
ve EndSelection
tarafından sınırlandırılmış seçim kalın olarak gösterilir.
Senaryo 3 - Sıralı liste <ol>
bir parçasını düz metne yapıştırma
Aşağıdaki HTML metnini varsayın:
<BODY><OL TYPE="a"><LI>Item 1<LI>Item 2<LI>Item 3<LI>Item 4<LI>Item 5<LI>Item 6</OL></BODY>
Bu, aşağıdaki gibi görünür:
- Öğe 1
- Öğe 2
- Öğe 3
- Öğe 4
- Öğe 5
- Öğe 6
MSHTML, HTML numaralı liste öğelerinin alt dizesini kopyalamayı nasıl işler?
- Kullanıcı, 3 öğesinin başından 4 öğeye kadar ve öğe 5sonuna kadar bir metin seçimi yapar. Kullanıcı Kopyala komutunu çağırır.
- Aşağıdaki HTML panodadır (netlik için satır sonları eklenir) -
<!--Star/EndFragment -->
açıklamalarının tam konumu kullanıcının tarayıcının metin seçim mantığını nasıl işlediğine bağlıdır:
<html>
<body>
<ol>
<!-- StartFragment-->
<li>Item 3</li>
<li>Item 4</li>
<li>Item 5</li>
<!-- EndFragment-->
</ol>
</body>
</html>
Bu parça artık boş bir belgeye yapıştırılacaksa, aşağıdaki HTML oluşturulur:
<body>
<ol>
<li>Item 3</li>
<li>Item 4</li>
<li>Item 5</li>
</ol>
</body>
Bu, aşağıdaki gibi görünür:
- Öğe 3
- Öğe 4
- Öğe 5
Senaryo 5 - Kısmen seçili bir bölgeyi yapıştırma
Aşağıdaki HTML metnini varsayın:
<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>
Bu, aşağıdaki gibi görünür:
IE4/MSHTML, aşağıdaki desteği sağlayan bir WYSIWYG Düzenleyicisidir:
- Kesmek
- Kopya etmek
- Yapıştırmak
Bu Harika Bir Araç!
MSHTML, HTML liste öğelerinin alt dizesini kopyalamayı nasıl işler?
Kullanıcı faresini kullanarak bir metin seçimini sürükler, örneğin "destekleyen WYSIWYG Düzenleyicisi: Cut Cop". Düz metinmiş gibi, bu seçim şu bozuk HTML parçası gibi görünür:
WYSIWYG Editor, which supports:</p>
<ul>
<li>Cut</li>
<li>Cop
Kullanıcı Kopyala komut düğmesine bastığında pano şöyle görünür (netlik için satır sonları eklenmiştir; kalın metin kullanıcının gerçekten seçtiğini belirtir):
<html> <body> <!-- StartFragment--> <p>WYSIWYG Editor, which supports</p> <ul> <li>Cut</li> <li>Cop</li> </ul> <!-- EndFragment--> </body> </html>
Şu durumlara dikkat edin:
- "WYSIWYG" öncesi metin kaldırıldı.
- Liste öğesi (
<li>Paste</li>
) kullanıcının seçiminde yer almazken kaldırıldı. - "Kopyala" öğesindeki "y" kaldırıldı.