Mezinárodní soutěž v programování

ICP '2000

Úloha korespondenčního kola

Jednoduchý prohlížeč

Napište prohlížeč stránek zapsaných v jednoduchém značkovacím jazyce. Značkovací jazyk umožňuje používání libovolně pojmenovaných značek. Značka označí vždy část dokumentu. Například:

<paragraph>The sample paragraph</paragraph>

Takto označené části dokumentu se říká element. Je vždy ohraničen počáteční značkou (má tvar <název>) a koncovou značkou (má tvar </název>). Název elementu může obsahovat pouze znaky anglické abecedy, rozlišuje se přitom mezi malými a velkými písmeny.

Dokument může obsahovat libovolné množství elementů, které do sebe mohou být libovolně vnořovány. Celý dokument musí být vždy obsažen v jednom elementu.

<article>
  <author>James Brown</author>
  <title>Sample doc</title>
  <para>First sample paragraph. It contains <em>some
	marked text</em> inside.</para>
  <para>Second very simple paragraph.</para>
  <para>Last paragraph contains link to
  	<link><target>second.sml</target>other file</link>.
	Paragraph then continues.</para>
</article>

Protože znak '<' má speciální význam ve značkách, do dokumentu se zapisuje jako sekvence znaků '&lt;'. Ampersand '&' se zapisuje jako '&amp;'. Například dokument

<document>3 &lt; 5</document>

se zobrazí jako '3 < 5'.

Při zobrazování jsou konce řádek chápány jako mezery a více mezer jdoucích bezprostředně za sebou je chápáno jako jedna mezera.

Zobrazení dokumentu bude definováno stylem uloženým v samostatném souboru s příponou sty. Styl, který se použije, se určí podle názvu kořenového elementu. Například styl pro náš ukázkový dokument se bude načítat ze souboru article.sty, protože celý dokument je uzavřen v elementu article. Styly se budou hledat v adresáři, který půjde určit v konfiguraci vašeho programu. Pokud se styl nenalezne v tomto adresáři, bude se soubor hledat ve stejném adresáři jako je uložen zobrazovaný dokument. Pokud ani tam nebude styl nalezen, prohlížeč ohlásí chybu a nebude dokument zobrazovat.

Soubor s definicí stylu používá rovněž syntaxi našeho jednoduchého značkovacího jazyka. Pro každý element, který se vyskytuje v dokumentu, obsahuje styl definici jeho zobrazení. Pro každý element se ve stylu určí jeho barva, velikost písma a typ zobrazení.

<style>
  <article>
    <display>block</display>
    <size>12</size>
    <color>
	  <red>0</red>
	  <green>0</green>
	  <blue>0</blue>
    </color>
  </article>
  <author>
    <display>block</display>
    <size>11</size>
    <color>
	  <red>0</red>
	  <green>255</green>
	  <blue>0</blue>
    </color>
  </author>
  <title>
    <display>block</display>
    <size>20</size>
    <color>
	  <red>0</red>
	  <green>0</green>
	  <blue>255</blue>
    </color>
  </title>
  <para>
    <display>block</display>
  </para>
  <em>
    <display>inline</display>
    <color>
	  <red>255</red>
	  <green>0</green>
	  <blue>0</blue>
    </color>
  </em>
  <link>
    <display>inline</display>
    <color>
	  <red>0</red>
	  <green>0</green>
	  <blue>255</blue>
    </color>
  </link>
  <target>
    <display>fileref</display>
    <color>
	  <red>0</red>
	  <green>0</green>
	  <blue>255</blue>
    </color>
  </target>
</style>

Každý element ve stylu může obsahovat tři elementy -- display, size a color.

Obsah elementu display definuje způsob zobrazení elementu. Hodnota block určuje, že element se bude formátovat jako samostatný odstavec -- před ním i za ním dojde k zalomení řádky. Hodnota inline pouze element zobrazí jako součást nadřazeného elementu s případnou změnu velikosti písma a barvy. Hodnota fileref říká, že element obsahuje jméno souboru, na který vede odkaz. Bezprostředně nadřazený element pak slouží k aktivaci odkazu -- například kliknutím myší.

Obsah elementu size obsahuje velikost písma v pixelech. Písmo o této velikosti se použije pro zobrazení elementu.

Obsah elementu color určuje barvu zobrazení obsahu elementu. Barva je definována pomocí složek v barevném modelu RGB. Podelementy red, green a blue obsahují hodnotu odpovídající barevné složky jako celé číslo od 0 do 255.

Uvádění elementů color a size ve stylu je nepovinné. Hodnota těchto parametrů se dědí z nadřazených elementů.

Prohlížeč v libovolném okamžiku umožní výběr souboru, který si chceme prohlížet. Mezi soubory lze přecházet i pomocí vytvořených odkazů. Předpokládejte, že dokumenty obsahují pouze znaky ze znakové sady us-ascii. Jména souborů v odkazech mohou obsahovat znaky '..', které mají význam přechodu do adresáře na vyšší úrovni. Pro oddělování adresářů používejte znak '/'.

Volitelně můžete prohlížeč rozšířit o podporu obrázků. Ve stylu půjde použít v elementu display ještě hodnotu picture. Obsah elementu pak bude chápán jako jméno souboru obsahujícího obrázek ve vámi podporovaných formátech.

Prohlížeč můžete rozšířit o podporu protokolu HTTP. Místo jména souboru v odkazu pak půjde použít URL adresu.

Snažte se napsat co nejefektivněji část prohlížeče, která se stará o zobrazování. Pro zobrazení nemůžete použít žádnou již hotovou komponentu (například Internet Explorer). Protože náš jazyk je podmnožinou XML, můžete pro čtení dokumentů použít již existující knihovny. Není to však podmínkou.