= Zadanie zo shellu : wiki syntax =
== Úvod ==
Písať webové stránky priamo v HTML je
nepríjemná vec, preto sa ľudia tomu snažia vyhnúť.
Jeden zo spôsobov je napísať text s jednoduchými
a prehľadnými formátovacími značkami a previesť ho do HTML.
Wiki je jednoduchý a ľahko použiteľný jazyk,
ktorý sa používa ako zdrojový kód pre HTML.
Príklad zdrojového kódu v jazyku wiki:
{{{
= Toto je nadpis =
== Toto je podnadpis ==
Obsah odstavca
Odstavec môže mať veľa riadkov
Ďalší odstavec
Odstavec nemusí končiť iba prázdným riadkom, aj nadpis
ukončí odstavec.
== Druhý podnadpis ==
Blabla
= Ahoj =
== Končíme ==
Posledný odstavec.
}}}
Príklad zodpovedajúceho HTML
{{{
Toto je nadpis
Toto je podnadpis
Obsah odstavca
Odstavec môže mať veľa riadkov
Ďalší odstavec
Odstavec nemusí končiť iba prázdným riadkom, aj nadpis
ukončí odstavec.
Druhý podnadpis
Blabla
Ahoj
Končíme
Posledný odstavec.
}}}
A takto to HTML vyzerá v browseri:
{{{#!HTML
Toto je nadpis
Toto je podnadpis
Obsah odstavca
Odstavec môže mať veľa riadkov
Ďalší odstavec
Odstavec nemusí končiť iba prázdným riadkom, aj nadpis
ukončí odstavec.
Druhý podnadpis
Blabla
Ahoj
Končíme
Posledný odstavec.
}}}
== Zadanie ==
Napíšte shellovský skript, ktorého úlohou je prečítať text vo wiki syntaxi
zo svojho štandartného vstupu a zapísať zodpovedajúcu HTML ''stránku'' na svoj štandartný výstup. Aby vznikla funkčná HTML stránka, musí byť na začiatku
vypísaná táto záhadná vec
{{{
}}}
a na konci toto:
{{{
}}}
Medzi tými dvomi textami, samozrejme, musí byť štandartný vstup vo wiki syntaxi transformovaný do HTML. Predvediem to na cvičení, aby neboli nejasnosti.
Nechcem, aby váš skript ukladal svoj výstup sám od seba do súboru.
Má to byť textový filter, pretože tak je to flexibilnejšie a lepšie.
To znamená, že základné použitie je
{{{
vas_skript < vstupny_subor_vo_wiki_jazyku > subor_v_html
}}}
== Vzorový vstup a výstup ==
[[attachment:vzor_cviko1.zip]]
== Pomôcky ==
Toto nie je myslené ako predpis, ako to nevyhnutne má byť.
Ak to spravíte inak a lepšie, budem ešte šťastnejší a spokojnejší ako zvyčajne.
=== Základný cyklus ===
Základný cyklus v mojom riešení je
{{{
while read LINE
do
...
done
}}}
Vnútri prebieha spracovanie obsahu premennej LINE.
=== Testovanie na regulárne výrazy ===
V premennej LINE máme uložený aktuálny riadok,
bolo by dobre zistiť, či to je nadpis, podnadpis alebo trebárs prázdny
riadok.
Dá sa to robiť pomocou echa a grepu takto:
{{{
if test -n "`echo "$LINE" | grep 'regularny_vyraz_sem'`"
then
...
fi
}}}
To je proste testovanie neprázdnosti reťazca
Sú aj iné možnosti, jedna z nich je toto:
{{{
if echo "$LINE" | grep 'regularny_vyraz_sem' >/dev/null
then
...
fi
}}}
grep totiž dáva exit status 0 (t.j. pravda) iba ak regulárny výraz nájde
vo svojom štandartnom vstupe.
=== Transformácia textu ===
Ak potrebujem transformovať reťazec (povedzme z neho niečo
vystrihnúť) a priradiť ho do premennej, môžem použiť
idióm
{{{
TRANSFORMOVANY_TEXT=`echo "$NIECO" | sed 's/regularny_vyraz/cim_nahradit/'
}}}
=== Pasce a problémy ===
* Dajte si pozor na to, ako sa vytvárajú nové odstavce. Ja som potreboval dve pomocné stavové premenné. Toto je trochu na premýšľanie ale pomáhať s tým nebudem.
* Premenné radšej dereferencujte takto: {{{"$PREM"}}} a nie takto {{{$PREM}}}. Môžu totiž nastať problémy, ak je obsahom premennej reťazec obsahujúci medzery. Uznávam, že na cviku som nebol v tomto dosť dôsledný, mea culpa. Ak totiž ''viem'', že premenná neobsahuje medzery nemusím to robiť.