You are here: PSPad forum > České diskuzní fórum > Ke zvýrazňování párových tagů v HTML / XHTML

Ke zvýrazňování párových tagů v HTML / XHTML

#1 Ke zvýrazňování párových tagů v HTML / XHTML

Posted by: myf | Date: 06/23/2013 15:32 | IP: IP Logged

Nevšiml jsem si, že by k tomuto tématu už existovala podobná diskuse.

tl;dr:
- u volitelně párových nehledat drakonicky; 'drakonické' nechat pro XHTML/XML
- pokud možno optimalizovat dohledávání
- umožnit vypnutí zvýrazňování úplně či pouze pro volitelné značky.

Nejspíš mne místní kodéři ukamenují, ale přesto bych rád poukázal na fakt, že zvýrazňování párových tagů pro HTML je v PSPadu přinejmenším problematické.

Syntaxe HTML dovoluje u některých párových tagů vynechat jejich zavírací značku. Týká se to těch, u kterých samotný kontext jednoznačně definuje jejich konec bez potřeby explicitní uzavírací značky. Například v konstrukci ..</td><td>.. je </td> zcela redundantní a browserům při zpracování kódu na stromovou strukturu DOMu nikterak nenapomáhá (*1). Je pravda, že XHTML mánie posledních let vůči cílenému vynechávání volitelných ukončovacích značek přinesla obecnou averzi, ale to nic nemění na tom, že se jedná o 'standardní' mechanismus HTML, který nota bene některé autority doporučují coby optimalizační techniku.

Dokumentace viz:
http://www.whatwg.org/specs/web-apps/current-work/multipage/syntax.html#optional-tags
http://www.w3.org/TR/REC-html40/index/elements.html

Nejpalčivěji a v podstatě nejjednodušší případ: odstavec <p>. Odstavec je blokovým prvkem a nemůže obsahovat žádné blokové prvky (*2). To znamená, že výskyt dalšího otevíracího tagu <p> či jiného blokového prvku (*2) předchozí odstavec ukončí. </p> je tedy volitelná a ve své podstatě zbytečná značka (*3). (*4) V PSPadu by tedy bylo možné stávající algoritmus 'ochytřit' a ukončit hledání párového </p> ihned po výstu následujícího <p> či jiného blokového prvku (*2).

Pokročilý příklad: definiční listy a seznamy.
<dl> nemůže přímo obsahovat nic než <dt> a <dd>
<ul> a <ol> nemůže přímo obsahovat nic než <li>
</dt>, </dd>, </li> jsou volitelné.
Nemá smysl pokoušet se je dohledávat po výskytu otevírací značky sousedícího (<li>..<li>) prvku z téže skupiny a po výskytu konečné značky mateřského elementu (<li>..</ul>).
Kvůli možnosti vnořování by zde případné 'ochytření' algoritmu muselo obsahovat i počítání úrovně vnoření.

Nejsložitější je asi 'tabulka'
1) Tabulka <table> -> s koncem se čeká na zavírací značku </table> na stejné úrovni zanoření (případně na konec dokumentu). Nuda, povinně párový. Nemůže obsahovat nic než <thead> / <tbody> / <tfoot>, tyto padají dovnitř. (<caption>, <colgroup> apod pro stručnost vynechávám)
2) Logický blok <thead> / <tbody> / <tfoot> -> s koncem se čeká na zavírací značku na stejné úrovni zanoření nebo na výskyt sousedícího <thead> / <tbody> / <tfoot> nebo na konec mateřského elementu (</table>). Nemůže obsahovat nic než uzly <tr>, tyto padají dovnitř. Vynechání automaticky vytvoří <tbody>.
3) Řádek <tr> -> ..ditto.. nebo na výskyt sousedícího <tr> nebo na konec mateřského uzlu (thead, tbody, tfoot). Nemůže obsahovat nic neř <td>, tyto padají dovnitř.
č) Buňka <td> -> ..ditto.. <td>. Obsah padá dovnitř. Buňka tabulky může obsahovat vnořené tabulky i jiné bloky.

Stejně jako u seznamů, kvůli možnosti vnořování nelze tedy tak snadno zjednodušit algoritmus dohledání koncových značek na slepý výskyt dalšího <td>, protože tento může být potomkem vnořené <table>. Bylo by potřeba zde počítat neuzavřené vnořené <table> v průběhu dohledávání.

Vyplývající Doporučení a návrhy jsem shrnul už v tl;dr. Doufám, že jsem tímto nikoho příliš nerozlítil :]

---

*1 možná spíše škodí: pokud by mezi </td> a <td> byl bílý znak, znamená to textový uzel a browser tehdy musí domyslet, že tento na je špatném místě a zahodit jej, což je oproti prostému vynechání zbytečná režie

*2 blokové prvky HTML: address, blockquote, dir, div, dl, fieldset, footer, form, h1, h2, h3, h4, h5, h6, hr, main, menu, ol, pre, table, ul, (+ blokové prvky HTML5: article, aside, header, hgroup, nav, section).

*3 nemluvím zde o okrajových případech zanořování neviditelných uzlů. <p><script /> v některých broserech pochopí parser značku script jako potomka, v jiných jako souseda odstavce.

*4 PSPad momentálně po otevíracímu <p> zbytečně a drakonicky dohledává párové </p> do samého konce dokumentu, zatímco by mohl a dokonce měl skončit už na výskytu onoho následujícího <p> či jiného blokového prvku. Mít (validní) HTML knihu s neuzavřenými odstavci a čekat, až si po vstupu do prvního <p> PSPad celou knihu přečte až do konce, aby po usilovném a bezvýsledném hledání ono první <p> obarvil červeně je smutná námaha.

Options: Reply | Quote | Up ^






Editor PSPad - freeware editor, © 2001 - 2017 Jan Fiala
Hosted by Webhosting TOJEONO.CZ, design by WebDesign PAY & SOFT, code Petr Dvořák