Tagy, styly a atributy

Upřesnění datových struktur textu a práce s nimi.

Author Králík, Einstein, Lišák
Date created 16.4.1999
Project KTTV
Version $Id: tags_and_styles.html,v 2.2 1999/04/27 14:06:01 kendy Exp $

Během další práce na projektu byly Einsteinovou zásluhou odhaleny problémy, které předchozí analýza nejen nepokrývá, ale někdy řeší i chybně. Tyto nedostatky a nepřesnosti by měl upravovat následující dokument.

Odstavec a řádky textu

Stále platí, že odstavec obyčejného textu (a asi i ostatní druhy odstavců) je členěn na řádky, každý řádek je "stylově nezávislý", tj. pro zjištění aktuálního stylu na konkrétní pozici v textu je nutné projít právě jen tento řádek. Na rozdíl od předchozí verze, kdy mél mít řádek na začáktu textu uvedeny všechny tagy určující počáteční styl, má nyní každý řádek ve své hlavičce instanci struktury kStyleInfo, která obsahuje úplnou informaci o řezu, velikosti, barvě a atributech písma (v tomto případě písma na začátku řádku). Také uzavírací tagy na konci řádku byly vypuštěny. Výhodou uložení kStyleInfo v hlavičce je, že při přeformátovávání se nemusí tagy přesunuté ze začátky někam doprostřed řádku slévat a mazat a naopak vytvářet na začátku tagy nové, stačí jenom podle přidaného/ubraného kusu řádku aktualizovat kStyleInfo.

Dále platí, že styl odstavce (kromě případných speciálních nastavení - centrování apod.) pouze určuje nastavení atributů (včetně stisknutých tlačítek na toolbaru ;-)), řezu, et cetera na začátku odstavce, tj. cokoliv s ním uživatel v odstavci provede, to tam má.

Párové a nepárové tagy

Tagy se logicky dělí zhruba do tří skupin. První jsou tagy měnící atributy písma, tj. kurzívu, tučnost, .... Ty jsou v kStyleInfo reprezentovány v bitovém poli, takže každý atribut se dá "zapnout" a "vypnout" a odstavec je vždy schopen rozeznat, jakým písmem má pokračovat. Tyto atributy jsou reprezentovány jako párové tagy a při změně atributu se před a za kurzor vkláda dvojice - <začátek>|<konec> při nastavení atributu a <konec>|<začátek> při vypnutí (znak "|" představuje kursor). To zajistí korektní vkládání a zobrazování textu. Vznikají tak sice posloupnosti tagů zapínajících a následně vypínajících nějaký styl bez efektu (není mezi nimi žádný text), ovšem správnost chování editoru to neovlivní a dají se poměrně jednoduše slévat (viz dále).

Opačný přístup představují tagy měnící řez, barvu a velikost písma. Ty jsou v kStyleInfo reprezentovány jako jedna právě aktuální hodnota, kterou není, bez procházení předchozího textu, možné "vypnout". Tyto tagy jsou nepárové a mají význam změny příslušné vlastnosti (když uživatel změní barvu písma z černé na červenou a napíše tak kus textu, změnu zpět neprovede jako "vypnutí" červené, ale opět jako změnu barvy z červené na černou). Tomu odpovídá i uživatelské ovládání, kde se nová hodnota vybere z nabízeného seznamu, zatímco atributy se volí stiskem/uvolněním tlačítka.

Někde mezi těmito dvěma skupinami jsou indexy. Jsou sice v kStyleInfo reprezentovány jednou hodnotou, ale při ukončení konkrétního typu indexu je snadné rozhodnout, který nastavit jako aktuální (např. při ukončení dolního indexu horního indexu se nastavi jako aktivní horní index). Této povaze indexů odpovídá i ovládání (viz uživatelská příručka). Tagy pro indexy jsou opět párové, přestože na rozdíl od HTML nejsou do sebe vnořovatelné, ale každý tag určuje přesný druh indexu.

Skupiny tagů, slévání

Při pohybu kurzorem po textu platí invariant, že např. při stisku šipky doprava dojde k posunu o jeden znak na obrazovce, bez ohledu na to, kolik tagů se mezi těmito znaky nachází (Pozn.: Kursor má svou vlastní instanci kStyleInfo, nesoucí informaci o písmu na pozici kursoru, resp. jakým písmem začít psát, kdyby bylo třeba). Tj. kurzor bude muset při pohybu přeskakovat skupiny tagů, které mají při výše popsaném způsobu změny atributů tendenci vznikat. Skupiny mohou obsahovat dvojice tagů zapínajících/vypínajících stejný atribut. To sice nevadí, ale aby nerostl počet zbytečných tagů v dokumentu nade všechny meze, bude třeba takovéto skupinky slévat, buď při pohybu kursoru nebo na jiném vlákně jednou za čas, např. při přeformátování. Slévání je možné realizovat třeba tak, že se porovnají dvě instance kStyleInfo odpovídající začátku a konci skupiny a místo staré skupiny se vloží pouze tagy reprezentující skutečný rozdíl ve stylech (atributech, ...). Jediná situace, kdy je dvojice počáteční/ukončovací tag bez textu mezi nimi v pořádku, je ihned po změně atributu, kdy se taková dvojice vloží kolem kursoru a očekává se, že uživatel začne zadávat text s daným atributem.