Cyfroteka.pl

klikaj i czytaj online

Cyfro
Czytomierz
00257 013886 11051771 na godz. na dobę w sumie
RTF. Leksykon kieszonkowy - książka
RTF. Leksykon kieszonkowy - książka
Autor: Liczba stron: 176
Wydawca: Helion Język publikacji: polski
ISBN: 83-7361-191-6 Data wydania:
Lektor:
Kategoria: ebooki >> komputery i informatyka >> programowanie >> inne - programowanie
Porównaj ceny (książka, ebook, audiobook).

RTF (Rich Text Format) jest formatem dokumentów. Nie jest to jednak język znaczników, który mógłby być użyty do ręcznego zakodowania całego dokumentu (choć jest to możliwe). Według założeń jego twórców, RTF jest formatem danych, które mogą być odczytywane i zapisywane przez aplikacje dowolnego rodzaju. Założenia te zostały spełnione: obecnie setki aplikacji korzysta właśnie z tego formatu. Elastyczność RTF sprawia, że jest to idealny format do wielu zastosowań i może być wykorzystany zarówno do generowania faktur i raportów, jak i do tworzenia słowników na podstawie baz danych słów.

Niniejsza książka stanowi wygodne źródło wiedzy na temat formatu RTF i omawia sposoby użycia tego standardu, włącznie z informacjami niezbędnymi do napisania programu generującego pliki RTF.

W leksykonie opisano: Cennym uzupełnieniem informacji o RTF jest rozdział poświęcony pisaniu programów, generujących pliki RTF, wraz z przykładowymi kodami źródłowymi. Ta niewielka książeczka będzie z pewnością przydatna wszystkim, którzy chcą skorzystać z tego uniwersalnego i wygodnego formatu zapisu dokumentów tekstowych.

Znajdź podobne książki Ostatnio czytane w tej kategorii

Darmowy fragment publikacji:

IDZ DO IDZ DO PRZYK£ADOWY ROZDZIA£ PRZYK£ADOWY ROZDZIA£ SPIS TREĎCI SPIS TREĎCI KATALOG KSI¥¯EK KATALOG KSI¥¯EK KATALOG ONLINE KATALOG ONLINE ZAMÓW DRUKOWANY KATALOG ZAMÓW DRUKOWANY KATALOG TWÓJ KOSZYK TWÓJ KOSZYK DODAJ DO KOSZYKA DODAJ DO KOSZYKA CENNIK I INFORMACJE CENNIK I INFORMACJE ZAMÓW INFORMACJE ZAMÓW INFORMACJE O NOWOĎCIACH O NOWOĎCIACH ZAMÓW CENNIK ZAMÓW CENNIK CZYTELNIA CZYTELNIA FRAGMENTY KSI¥¯EK ONLINE FRAGMENTY KSI¥¯EK ONLINE Wydawnictwo Helion ul. Chopina 6 44-100 Gliwice tel. (32)230-98-63 e-mail: helion@helion.pl RTF. Leksykon kieszonkowy Autor: Sean Burke T³umaczenie: Marcin Jêdrysiak ISBN: 83-7361-191-6 Tytu³ orygina³u: RTF Pocket Guide Format: B5, stron: 174 RTF (Rich Text Format) jest formatem dokumentów. Nie jest to jednak jêzyk znaczników, który móg³by byæ u¿yty do rêcznego zakodowania ca³ego dokumentu (choæ jest to mo¿liwe). Wed³ug za³o¿eñ jego twórców, RTF jest formatem danych, które mog¹ byæ odczytywane i zapisywane przez aplikacje dowolnego rodzaju. Za³o¿enia te zosta³y spe³nione: obecnie setki aplikacji korzysta w³aġnie z tego formatu. Elastycznoġæ RTF sprawia, ¿e jest to idealny format do wielu zastosowañ i mo¿e byæ wykorzystany zarówno do generowania faktur i raportów, jak i do tworzenia s³owników na podstawie baz danych s³ów. Niniejsza ksi¹¿ka stanowi wygodne ĥród³o wiedzy na temat formatu RTF i omawia sposoby u¿ycia tego standardu, w³¹cznie z informacjami niezbêdnymi do napisania programu generuj¹cego pliki RTF. W leksykonie opisano: • Podstawow¹ sk³adniê RTF • Zapis akapitów w RFT • Formatowanie znaków • Strukturê dokumentu RTF • Funkcje dodatkowe • Style w kodzie RTF • Tworzenie tabel • Tworzenie plików pomocy MS Windows Cennym uzupe³nieniem informacji o RTF jest rozdzia³ poġwiêcony pisaniu programów, generuj¹cych pliki RTF, wraz z przyk³adowymi kodami ĥród³owymi. Ta niewielka ksi¹¿eczka bêdzie z pewnoġci¹ przydatna wszystkim, którzy chc¹ skorzystaæ z tego uniwersalnego i wygodnego formatu zapisu dokumentów tekstowych. Spis treści Rozdział 1. Przedstawienie formatu RTF .............................. 5 Dlaczego format RTF?...................................................f.................................... 6 Podział książki...................................................f................................................. 7 „Witaj świecie” w dokumencie RTF...................................................f........... 9 Przedstawienie prostego dokumentu RTF................................................. 11 Podstawowa składnia formatu RTF ...................................................f......... 15 Akapity...................................................f...................................................f......... 21 Formatowanie znaków ...................................................f................................ 35 Struktura dokumentu ...................................................f.................................. 47 Dodatkowe funkcje...................................................f....................................... 62 Style...................................................f...................................................f............... 84 Tabele...................................................f...................................................f............ 92 Rozdział 2. Tworzenie plików pomocy MS Windows.... 111 Plik pomocy RTF — podstawy...................................................f................ 111 Hiperłącza i wyskakujące łącza ...................................................f............... 114 Dodatkowe informacje o tematach ...................................................f......... 117 Rysunki ...................................................f...................................................f...... 121 Problemy z plikami pomocy RTF ...................................................f........... 125 Dodatkowe informacje...................................................f............................... 126 Rozdział 3. Przykładowe programy .................................... 127 Generator kalendarza...................................................f................................. 127 Program wyświetlający zawartość katalogu............................................ 134 Program do projektowania kopert na płyty (origami) .......................... 140 Narzędzie do pobierania metadanych RTF ............................................. 152 Uwagi na temat analizy plików RTF...................................................f...... 155 Rozdział 4. Użyteczne informacje ........................................ 157 Tabela znaków ASCII-RTF ...................................................f....................... 157 Sekwencje ucieczki dla polskich znaków ................................................. 165 Kody języków RTF ...................................................f..................................... 166 Konwersja odległości na twipy...................................................f................ 168 Skorowidz.................................................................................... 171 Spis treści 3 Rozdział 3. Przykładowe programy Standard RTF, podobnie jak każdy inny format dokumentów, na- biera znaczenia dopiero w kontekście jego wykorzystania, czyli sposobu formatowania, odczytywania i zapisywania dokumen- tów. Kwestie analizowania i przetwarzania kodu RTF wykraczają jednak poza tematykę niniejszej książki, aczkolwiek przedsta- wione w tym rozdziale przykładowe programy przedstawiają typowe problemy i trudności, na jakie można natknąć się w cza- sie generowania dokumentów RTF z poziomu aplikacji. Wszystkie omawiane narzędzia i programy pokazują sposób wykorzysta- nia różnych funkcji, jakie zapewnia standard RTF. Wszystkie opisane w tym rozdziale programy zostały napisane w Perlu. Aby ułatwić poznanie ich działania, w kodzie źródło- wym umieszczono obszerne komentarze. Jeżeli Czytelnik planuje generowanie własnych dokumentów RTF z poziomu aplikacji Perl, warto skorzystać z kilku przydatnych modułów, jakie są dostępne w bibliotece CPAN (http://search.cpan.org). Godne polecenia są przede wszystkim moduły RTF::Writer i RTF::Generator. Żaden z tych modułów nie zostanie jednak użyty w poniższych przy- kładach, ponieważ przedstawiają one sposoby generowania do- kumentów RTF bez pośrednictwa dodatkowych interfejsów API lub modułów Perl. Generator kalendarza1 Przedstawiony tu program tworzy nowy plik RTF, zapisuje prolog dokumentu oraz kolejne akapity (poszczególne akapity 1 Program tworzy kalendarz w języku angielskim. Nie zzmieniłem tego, ponieważ pozwala to na omówienie pewnych funkcji, kztóre nie są używane w polskich dokumentach, a które mogą być przyzdatne. Wtreści rozdziału umieściłem informacje, które pozwolą czytelnikom zmodyfikować kod samodzielnie — przyp. tłum. Rozdział 3. Przykładowe programy 127 są tworzone za pomocą pętli YJKNG) i zamyka dokument, doda- jąc pojedynczy znak „}”. Każdy akapit stanowi nagłówek dla strony kalendarza. Na poszczególnych stronach umieszczane są nagłówki dla kolejnych dni tygodnia. Gotowy kalendarz można wydrukować, dzięki czemu zawsze dostępny będzie przydatny terminarz do zapisywania notatek, terminów spotkań i podob- nych informacji. Aby uzyskać puste miejsce pomiędzy kolejnymi nagłówkami, na- leży użyć polecenia UC z parametrem w postaci dość dużej liczby. Poniżej przedstawiono fragment kodu źródłowego pliku FRTF:  ] RCTF UC ST H] D(TKFC[_] UWRGTVJ_QH0Q]XGODGT  RCT_ ] RCTF UC ST H] D5CVWTFC[_] UWRGTVJ_QH0QXGODGT  RCT_ ] RCTF UC ST H] D5WPFC[_] UWRGTVJ_QH0QXGO]DGT  RCT_ ] RCTF UC ST H] D/QPFC[_] UWRGTUV_QH GEGOD]GT  RCT_ ] RCTF UC ST H] D6WGUFC[_] UWRGTPF_QH GEG]ODGT  RCT_ ] RCTF UC ST H] D9GFPGUFC[_] UWRGTTF_QH G]EGODGT  RCT_ ] RCTF UC ST H] D6JWTUFC[_] UWRGTVJ_QH GE]GODGT  RCT_  Deklaracje poszczególnych akapitów różnią się — dla soboty i niedzieli przydzielane jest mniej miejsca (tylko 2900 twipów zamiast 6060 twipów). To ustawienie jest w programie kontro- lowane przez zmienną URCEG, która otrzymuje wartość stałej #;A$+) lub #;A5/#.. w zależności od wartości zmiennej YGGMFC[. Dla każdego miesiąca stosowana jest inna czcionka. Odbywa się to poprzez dodanie do H wyniku operacji OQPVJ, gdzie  jest operatorem modułu w Perlu. Oczywiście wszystkie używane 128 RTF. Leksykon kieszonkowy czcionki są definiowane w tablicy czcionek. Rysunek 3.1 przed- stawia przykładowe strony kalendarza. Rysunek 3.1. Przykładowe strony kalendarza Z działaniem programu mogą być związane dwa drobne pro- blemy, które mogą ujawnić się po dokonaniu zmian w kodzie źródłowym. Na pierwszy potencjalny problem można natknąć się przy próbie utworzenia polskiego kalendarza. Poszczególne ciągi w doku- mencie RTF nie przechodzą przez procedurę obsługi sekwencji ucieczki. Nie ma potrzeby używania takiej procedury w orygi- nalnym kodzie programu, ponieważ nie są używane znaki typu „”, „{”, „}” lub 8-bitowe znaki. Jeżeli jednak konieczne będzie użycie polskich nazw miesięcy i dni tygodnia, należy zmienić odpowiednio wiersz RTKPVH. W takim przypadku w kodzie pro- gramu mogą pojawić się wiersze w następującej postaci: ] RCTF UC ST H] D2QPKGFKCđGM_ITWFPKC RCT_ Rozdział 3. Przykładowe programy 129 Większość procesorów tekstu odrzuci dokument RTF zawierający taki wiersz, gdyż użyto w nim znaku ł. Ponieważ jest to 8-bitowy znak, należy zastąpić go właściwą sekwencją ucieczki (w tym przy- padku będzie to sekwencja D) w sposób opisany w rozdziale 1. Drugi problem jest związany z faktem, że program umieszcza w kodzie dokumentu RTF wartości numeryczne bez sprawdzenia, czy są one liczbami całkowitymi. W przedstawionym wcześniej fragmencie kodu użyto wartości, które z całą pewnością są licz- bami całkowitymi (6060 i 2900). Wyobraźmy sobie jednak, że program został przystosowany do druku na papierze o innych rozmiarach (obecnie używany jest papier w formacie US letter). Większy odstęp pomiędzy kolejnymi nagłówkami ustawiono na 10 cm, a mniejszy odstęp na 5 cm. Zgodnie z tabelą „Konwersja różnych jednostek długości na twipy” w rozdziale 4. ustalono, że 10 cm to 5669 twipów, dlatego kod programu przyjmie następującą postać: WUGEQPUVCPV #;A$+)  WUGEQPUVCPV #;A5/#..  #;A$+)RQNQYCYCTVQUEK #;A$+) Sprawi to, że stała #;A5/#.. uzyska wartość 2834,5, a kod źró- dłowy dokumentu RTF będzie wyglądał tak jak poniżej: ] RCTF UC ST H] D(TKFC[_] UWRGTVJ_QH0QX]GODGT  RCT_ ] RCTF UC ST H] D5CVWTFC[_] UWRGTVJ_QH0QXGODGT  RCT_ ] RCTF UC ST H] D5WPFC[_] UWRGTVJ_QH0QXGODGT  RCT_ ] RCTF UC ST H] D/QPFC[_] UWRGTUV_QH GEGODGT]  RCT_ Ponieważ parametrami słów kluczowych RTF mogą być tylko licz- by całkowite, polecenie UC zostanie zinterpretowane jako UC (czyli polecenie UC z argumentem 2834) i dwa znaki , przez co na wydruku pojawią się nagłówki 5CVWTFC[VJQH 130 RTF. Leksykon kieszonkowy 0QXGODGT i 5WPFC[VJQH0QXGODGT. Do przekształ- cania wartości numerowych na postać liczb całkowitych w więk- szości języków programowania (włącznie z Perlem) służy pole- cenie KPV, które może być użyte w następujący sposób: RTKPV46(  ] RCTF UCU ST HU] DU_U] UWRGTU_QHUU RCT_  P KPV URCEG  KPV OQPVJ  Drugie polecenie KPV jest w gruncie rzeczy niepotrzebne, ponie- waż operator  w Perlu zawsze zwraca wartość całkowitą, ale warto zachować ostrożność. Programiści znający dobrze formaty (U)RTKPVH szybko odgadną, że identyczny efekt można uzyskać za pomocą formatu F (liczba całkowita wyrażona dziesiętnie), który zastąpi polecenFie KPV: RTKPV46(  ] RCTF UCF ST HF] DU_U] UWRGTU_QHUU RCT_  P URCEG OQPVJ Ta metoda działa równie dobrze jak poprzednia, a wybór jednej z nich jest zależny od osobistych upodobań programistFy. Przedstawione tu podejście do generowania dokumentów RTF może być zaadaptowane w celu drukowania kart pytań i odpo- wiedzi zamiast kalendarza. Karty tego typu są często stosowane do nauczania języków obcych. Jeżeli dokument jest drukowany dwustronnie, program powinien umieścić wszystkie pytania na jednej stronie (na przykład „a book” lub „to read”), a odpowia- dające im odpowiedzi na drugiej (na przykład „książka” lub „czytać”). Po przecięciu gotowej strony na pół pozwoli uzyskać dwie karty pytań i odpowiedzi. Program generujący takie karty może pobierać dane wejściowe z pliku zawierającego kolejne wiersze w postaci R[VCPKGQFRQYKGFļ, na przykład CDQQMMUKæľMC lub VQTGCFE[VCè. Rozdział 3. Przykładowe programy 131 Poniżej przedstawiono pełny kod programu generującego ka- lendarz: WUTDKPRGTN TGSWKTG WUGUVTKEV WUGYCTPKPIU  2TQITCOPCNG[WTWEJCOKCEYPQTOCNPGLYGTULK 2GTNCQRV[OCNPCMQPVTQNCDNGFQY  GHKPKELGUVCN[EJ WUGEQPUVCPV5 10 5A+0A #;    WUGEQPUVCPV #;A$+) YVYKRCEJ WUGEQPUVCPV #;A5/#.. YVYKRCEJ 1VYQTGPKGRNKMWKCRKUCPKGRTQNQIW QRGP46( FCVGDQQMTVHQTFKG RTKPV46( ] TVH CPUK FGHH ] HQPVVDN] H HUYKUU#TKCN_] H HTQOCP6KOGU0GY4QOCP__ FGHNCPI RNCKP HU   GHKPKELGVCDNKEY[UWMKYCPKCPCYCOK OKGUKGE[KFPKV[IQFPKC O[ OQPVJUSY ,CPWCT[(GDTWCT[/CTEJ#RTKN/C[,WPG ,WN[#WIWUV5GRVGODGT1EVQDGT0QXGODGT GEGODGT  O[ FQYUSY 5WPFC[/QPFC[6WGUFC[9GFPGUFC[6JWTUFC[(TKFC[5CVWTFC[]  -CNGPFCTLGUVVYQTQP[PCECN[TQMQFDKGCEGIQFPKC O[VJGPVKOG  O[GPFVJGP  5 10 5A+0A #; YJKNG VJGPGPF ] O[ [GCTOQPVJFC[YGGMFC[  IOVKOG VJGP =? O[URCEG #;A$+) 132 RTF. Leksykon kieszonkowy URCEG #;A5/#..KHYGGMFC[QTYGGMFC[ RTKPVH46(  ] RCTF UCU ST HU] DU_U] UWRGTU_QHUU RC]T_   P URCEG OQPVJOKCPCEEKQPMKFNCMCFGIQOKGUKCEC FQYU=YGGMFC[?FC[VJ FC[ OQPVJU=OQPVJ?[GCT   VJGP 5 10 5A+0A #; _  CMQPEGPKGKCOMPKGEKGRNKMWQTCY[LUEKGRTQITCOW RTKPV46(_ ENQUG 46(  GZKV UWDVJ] (WPMELCYTCECLCECYNCUEKY[RT[TQUVGMFNCFPKC OKGUKCECPCRT[MNCF TFFKGMKEGOW PKGQUVCPKGW[VCFCVC(GDTWCT[VJ O[PCDU A=?^^  TGVWTP VJ WPNGUUPCPFPKPV P  P TGVWTP VJ KHPQTPQTP P TGVWTP UV KHP TGVWTP PF KHP TGVWTP TF KHP TGVWTP VJ  _ AA 0 AA Rozdział 3. Przykładowe programy 133 Program wyświetlający zawartość katalogu Przedstawiony w tej części rozdziału program odczytuje podany katalog (lub bieżący katalog, jeżeli nie podano innego) i tworzy wydruk jego zawartości, który jest umieszczany w tabelach doku- mentu RTF. Innymi słowy, jest to bardziej rozbudowana wersja polecenia NUŌN w Uniksie lub FKT w systemie MS-DOS. Podstawowa struktura tego programu jest bardzo prosta. Po uru- chomieniu program sprawdza obecność argumentu wiersza pole- ceń (zmienna #4)8=?), w razie potrzeby odczytuje bieżący ka- talog, a następnie wywołuje trzy podprocedury (TVHAUVCTV, TVHFKT i TVHAGPF), a następnie kończy pracę. Generowanie kodu tabeli odbywa się w funkcji HKNGATQY, której argumentami są nazwa, wielkość i data modyfikacji pliku. Funkcja umieszcza te informacje w komórce tabeli zbudowanej z trzech kolumn; na przykład wiersz tabeli zawierającej komórki , ENKRIKH i   jest wyrażany w postaci następują- cego bloku kodu źródłowego RTF: VTQYF VTICRJ ENDTFTV DTFTY DTFTU ENDTFTD DTFTY DTFTU ENDTFTN DTFTY DTFTU ENDTFTT DTFTY DTFTU EGNNZ] ENDTFTV DTFTY DTFTU ENDTFTD DTFTY DTFTU ENDTFTN DTF]TY DTFTU ENDTFTT DTFTY DTFTU EGNNZ ENDTFTV DTFTY DTFTU ENDTFTD DTFTY DTFTU ENDTFTN DTF]TY DTFTU ENDTFTT DTFTY DTFTU EGNNZ RCTF KPVDN ST] HU H D_ EGNN SN] HENKRIKH_ EGNN SE] HU C_ EGNN TQY Na szczęście ten mało czytelny kod dokumentu RTF jest tworzony automatycznie poprzez wywołanie funkcji HKNGATQY PCYCYKGNMQħè FCVCAOQF[HKMCELK . Znaczenie poszczególnych poleceń do genero- wania tabel zostało przedstawione szczegółowo w podrozdziale „Tabele” w rozdziale 1. 134 RTF. Leksykon kieszonkowy Podprocedury GUE, KP i EO można wykorzystać we własnych pro- gramach. Pierwsza podprocedura implementuje prostą funkcję do obsługi sekwencji ucieczki, natomiast podprocedury KP i EO pozwalają na podawanie wszystkich długości w calach lub cen- tymetrach zamiast w twipach. Działanie obu podprocedur można sprawdzić w funkcji HKNGATQY, w której poszczególne polecenia EGNNZ2TCY[-QPKGE zostały oparte na liście KP  KP  KP  . Z pewnością jest to znacznie wygodniejsza metoda definiowa- nia odległości niż lista , która wymaga ręcznego przeliczania centymetrów lub cali na twipy. Wybór funkcji KP FđWIQħè lub EO FđWIQħè jest zależny od prefe- rencji użytkownika, ponieważ jednostki długości i tak muszą zostać przeliczone na twipy przed utworzeniem tabeli. Warto porównać tę metodę ze sposobem użyciem polecenia KPV we wcześniejszym przykładzie programu generującego kod FRTF. Poniżej przedstawiono pełny kod źródłowy omawianego pro- gramu: WUTDKPRGTN TGSWKTG WUGUVTKEV WUGYCTPKPIU  2TQITCOPCNG[WTWEJCOKCEYPQTOCNPGLYGTULK 2GTNCQRV[OCNPCMQPVTQNCDNGFQY O[FKT#4)8=?^^   ,GGNKPKGRQFCPQCTIWOGPVCYKGTUCRQNGEGPKG PCNG[Y[UYKGVNKECYCTVQUEDKGCEGIQMCVCNQIW KH FKTGS  QTFKTGS  ] WUG YFCNCFQYCPKGDKDNKQVGMKHWPMELKIGVEYF FKTIGVEYF  6GTCOQPCY[UYKGVNKERGNPCUEKGMGCPKGV[NMQ _ Rozdział 3. Przykładowe programy 135 2TGTYCPKGRTCE[LGUNKPKGLGUVVQRQRTCYP[MCVCNQI FKG0KGOQPCQFE[VCEMCVCNQIWFKT WPNGUUGFKTCPFFACPFTA 9[YQNCPKGRQFRTQEGFWTY[MQPWLCE[EJYU[UVMKG QRGTCELGKY[LUEKGRTQITCOW TVHAUVCTV FKT  TVHFKT FKT  TVHAGPF FKT  GZKV  6T[RQFRTQEGFWT[RQOQEPKEG UWDKP]KPV  A=? _ECNG VYKR[ UWDEO]KPV  A=? _EGPV[OGVT[ VYKR[ UWDGUE]YTQEGPKGFCPGIQEKCIWLCMQRQRTCYP[MQF46( O[KPA=? KP`U] =@ !  AC# ? _ ]URTKPVH  ZQTF  _GI 2TQEGFWTCY[MQPWLGYKGEGLQRGTCELKPKLGUVVQY[OCICPG CNGPKGQDUNWIWLG7PKEQFGRCVTTQFKCN TGVWTPKP _   GMNCTCELCVTGEJOKGPP[EJINQDCNP[EJFQCRKU[YCPKCFCP[EJ RNKMW O[  +VGOU5KGAQH6KOGAQH  UWDTVHFKT]Y[MQPCPKGINQYPGIQCFCPKCRTQITCOW O[FKTA=? UECPAFKT FKT RQDTCPKGFCP[EJ RTKPV ] RCTF UC SE HU D K GUE FKT   RCT_ ] P P PCINQYGMUVTQP[PCYCMCVCNQIW 136 RTF. Leksykon kieszonkowy HKNGATQY A5KGAQH]A_6KOGAQH]A_ HQTGCEJ +VGOU LGFGPYKGTUFNCMCFGIQRNKMW RTKPV ] RCTF UD UC HU D K=2WUV[?_ WPNGUU +VGOU] TGVWTP _  UWDUECPAFKT]  GDTCPKGFCP[EJRNKMW  W[YCPGRTGHWPMELGTVHFKT 9[MQT[UV[YCPGUCV[RQYGHWPMELGU[UVGOWRNKMQY  O[FKTA=? QRGPFKT +0FKT QTFKG0KGOQPCQVYQT[EFKT O[ KVGOHWNNARCVJ  YJKNG FGHKPGF KVGOTGCFFKT +0  ] PGZVKHKVGOGS  QTKVGOGS   RWUJ +VGOUKVGO  5KGAQH]KVGO_6KOGAQH]KVGO_    O[HWNNARCVJFKTKVGO  5KGAQH]KVGO_6KOGAQH]KVGO_   UVCV HWNNARCVJ  =? KHHHWNNARCVJ _ ENQUGFKT +0   +VGOUUQTVD[APCOG +VGOU /QPCOKGPKED[APCOGPCD[AVKOGNWDD[AUKG TGVWTP _ 6T[URQUQD[UQTVQYCPKC UWDD[APCOG]WUGNQECNGWE C EORWE D _ Rozdział 3. Przykładowe programy 137 UWDD[AVKOG]6KOGAQH]C_ 6KOGAQH]D__ UWDD[AUKG]5KGAQH]C_ 5KGAQH]D__  UWDHKNGATQY] 9[IGPGTQYCPKGYKGTUCVCDGNKPCYCYKGNMQUEKCKFCVC]RNKMW  W[YCPGRTGHWPMELGTVHFKT O[ PCOGUKGVKOG  A O[PCOGAHQTOCV  KH UKG ]0CUPCEPKMFNCMCVCNQIW PCOGAHQTOCV D RQITWDKGPKG VKOG  UKG  _GNUG]6QLGUVRNKM VKOGHQTOCVAFCVG VKOG  YJKNGUKG`U F F F F ^   QFCPKGRTGEKPMQYFQYKGNMQUEKRNKMW  _ RTKPV VTQYF VTICRJ 2QECVGMFGMNCTCELKYKGTUC46( O[DQTFGTULQKPOCR ENDTFT A DTFTY DTFTU]  SY VDNT YNCEGPKGYU[UVMKEJMTCYGFK RTKPVDQTFGTU EGNNZ A P HQTKP  KP  KP  FGMNCTCELGRTCYGL MTCYGFKMQOQTMK YU[UVMKGYCTVQUEKOQPCFQYQNPKGOKGPKCE RTKPVGOKULCMQOQTGMKKEJCYCTVQUEK  RCTF KPVDN ST] HU H D GUE UKG  _ EGNN  Y[TQYPCPKGFQRTCYGLRWPMVQY QWTKGTRQITWDKGPK]G  SN] H PCOGAHQTOCVGUE PCOG  _ EGNN  Y[TQYPCPKGFQNGYGL6KOGU4QOCP  SE] HU GUE VKOG  _ EGNN  Y[RQUTQFMQYCPKGRWPMVQY#TKCN 138 RTF. Leksykon kieszonkowy  TQY  P P  TGVWTP _  UWDTVHAUVCTV] O[FKTA=? RTKPV 0 A46(A56#46  ] TVH CPUK FGHH ] HQPVVDN] H HUYKUU#TKCN_] H HOQFGTP QWTKGT0GY_ ] H HTQOCP6KOGU__ FGHNCPI YKFQYEVTN RNCKP HU PQRTQQH 0 A46(A56#46 0CINQYGMUVTQP[CYKGTCLCE[UEKGMGKIQFKPG RTKPV ] JGCFGT RCTF ST RNCKP H HU K PQRTQQH  GUE FKT  HQTOCVAFCVG VKOG   R EJRIP RCT_  P P TGVWTP _ UWDTVHAGPF] O[FKTA=? RTKPV P_ P TGVWTP _ UWDHQTOCVAFCVG] O[VKOGA=? O[ ;/ JO  NQECNVKOG VKOG  =? TGVWTPURTKPVHFFFFF; /   JO _ AA 0 AA Rozdział 3. Przykładowe programy 139 Program domyślnie nie otwiera nowego pliku, a jedynie wysyła kod RTF do standardowego wyjścia. Użytkownik może jednak przekierować wyjście w powłoce. Poniżej pokazano sposób wy- konania tej operacji w systemie Windows:  RGTNŌ5TVHFKTRN YKPFQYU FGUMVQR U[ODQNHQPVVCDNG 6 /2 FKTTVH  UVCTV6 /2 FKTTVH Rysunek 3.2 przedstawia uzyskany dokument w oknie MS Word. Rysunek 3.2. Wynik programu rtfdir Program do projektowania kopert na płyty (origami) Kolejny przykładowy program generuje pojedynczą stronę, któ- ra po właściwym zagięciu może posłużyć jako koperta dla płyty 140 RTF. Leksykon kieszonkowy CD. To narzędzie będzie szczególnie przydatne dla osób, które zawsze mają więcej nagranych płyt CD-R niż pustych pudełek na nie.2 Po uruchomieniu program oczekuje na wprowadzenie informacji, które zostaną wydrukowane na etykiecie, a następnie generuje plik RTF z etykietą umieszczoną we właściwym miejscu strony. Drukowane są również linie wskazujące miejsce zagięcia strony. Sposób tworzenia koperty na płytę i kolejność zaginania strony przedstawiono dokładnie na rysunkach od 3.5 do 3.8. Program wykorzystuje dwie zaawansowane funkcje RTF, a mia- nowicie dokładne pozycjonowanie akapitów i rysowanie linii. Tekst jest rozmieszczany za pomocą poleceń RXRI RJRI RQU[0 CDUY0 CDUJ0, które zostały przedstawione w podrozdziale „Do- kładne pozycjonowanie akapitów” w rozdziale 1. Bez funkcji dokładnego pozycjonowania akapitów nie ma żadnej gwarancji, że tekst będzie widoczny po zagięciu strony. Ta sama metoda jest zresztą używana do drukowania tekstu na naklejkach i ko- pertach. Bardzo ważną rolę odgrywa polecenie CDUJ QMđCFPC9[UQMQħè. Jeżeli użytkownik wprowadzi zbyt dużo informacji, program ukryje nadmiarowy tekst. Co więcej, wszystkie informacje, jakie są wpisywane przez użytkownika, przechodzą przez procedurę GUE, która zapewnia obsługę nietypowych znaków. Jeżeli więc zo- stanie podany tekst LCMKGħRNKMK, program automatycznie zmo- dyfikuje go, przez co ciąg wynikowy będzie miał prawidłową postać LCMKG ERNKMK. 2 Chciałbym podziękować Tomowi Hullowi z wydziału matematyki Merrimack College, który zaprojektował sposób zaginanzia strony. Więcej informacji można znaleźć pod adresami http://web.merrimack.edu/hullt/ i http://papercdcase.com/. Rozdział 3. Przykładowe programy 141 Konstrukcja służąca do rysowania linii jest bardziej rozbudo- waną wersją analogicznej konstrukcji z podrozdziału „Rysowa- nie linii” w rozdziale 1. Generowanie kodu RTF dla linii prze- chodzącej przez dwa punkty jest bardziej skomplikowane niż interpolacja dwóch par punktów (x,y), ponieważ konieczne jest wykonanie pewnych obliczeń matematycznych. Kod wykonujący to zadanie został umieszczony w podprocedurze NKPG, która jest wywołana w różnych miejscach programu. Rysunek 3.3 przedstawia wygląd pliku wygenerowanego przez przykładowy program. Niestety, prostsze edytory tekstu nie obsługują niektórych za- awansowanych funkcji RTF, które służą, na przykład, do dokład- nego pozycjonowania akapitów i rysowania linii. Prawidłowo od- czytywany jest jedynie tekst znajdujący się w otwieranym pliku. Rysunek 3.4 przedstawia ten sam dokument w oknie progra- mu TextEdit, czyli prostego edytora tekstu, który stanowi część systemu Mac OS X. Czytelnik może się zastanawiać, dlaczego w programie nie są używane konkretne wartości, jak na przykład NKPG   , ale bardziej skomplikowane konstrukcje typu NKPG  2CIGA*GKIJV 2CIGA9KFVJ 2CIGA*GKIJV  . Istnieją dwie przy- czyny, dla których zastosowano takie rozwiązanie. Po pierwsze, użycie takich wyrażeń pozwala lepiej zrozumieć geometrię zagięć i sposobów złożenia origami (w tym celu warto złożyć i po- nownie rozłożyć kopertę, a następnie przyjrzeć się liniom skła- dania). Druga przyczyna jest bardziej praktyczna — przy zmia- nie formatu papieru z US letter na A4 konieczna jest zmiana wszystkich rozmiarów kartki papieru. To zadanie można sobie znacznie ułatwić, jeżeli zamiast konkretnych wartości zdefinio- wano zmienne, ponieważ wyrażenia typu 2CIGA*GKIJV  uła- twiają błyskawiczne przeliczanie rozmiarów. 142 RTF. Leksykon kieszonkowy Rysunek 3.3. Koperta origami na płytę CD Program może odczytywać dane wejściowe z pliku, na prFzykład: EFECUGV[VWNAKAUEKGMKVZV Oczywiście można również użyć standardowego wejścia, na przykład: Rozdział 3. Przykładowe programy 143 Rysunek 3.4. Wygląd dokumentu w programie TextEdit EFECUGV[VWNAKAUEKGMKVZV lub: NUŌNDCEMWRU^EFECUG Program może również odczytywać dane bezpośrednio z Fkonsoli: EFECUG 9RTQYCFVGMUVFNCQMNCFMKCPCUVGRPKGPCEKUPKL PVGTK 1(  EQPVTQN 6[VWđRđ[V[ 6[VWđħEKGľMK 6[VWđħEKGľMK 6[VWđħEKGľMK =2QCMQēEGPKWPCNGľ[PCEKUPæèEQPVTQN NWDEQPVTQN YPQY[O YKGTUW? Niezależnie od wybranej metody, program zapisze informacje o okładce płyty CD do pliku cd_case.rtf. Wyjście z programu odbywa się za pomocą klawiszy Ctrl+C. Jeżeli nie podano żad- nych informacji, program utworzy pustą kopertę, czyli stronę bez nadruku, ale ze wszystkimi liniami zagięcia. Plik wynikowy można otworzyć w procesorze tekstu i dokonać edycji etykiety 144 RTF. Leksykon kieszonkowy lub natychmiast go wydrukować. Sposób złożenia koperty przed- stawiono na rysunkach od 3.5 do 3.8. Rysunek 3.5. Krok 1 — pionowe złożenie kartki Poniżej przedstawiono pełny kod programu: WUTDKPRGTN TGSWKTG WUGUVTKEV WUGYCTPKPIU  2TQITCOPCNG[WTWEJCOKCEYPQTOCNPGLYGTULK 2GTNCQRV[OCNPCMQPVTQNCDNGFQY   GMNCTCELCUVCN[EJ WUGEQPUVCPV#  OKGPPCLGUNKFTWMWLGUPC RCRKGTG# Rozdział 3. Przykładowe programy 145 Rysunek 3.6. Krok 2 — poziome złożenie kartki WUGEQPUVCPV+PEJGUVYKRU  YURQNE[PPKMMQPYGTULK WUGEQPUVCPV2CIGA9KFVJ #!  +PEJGUVYKRU  WUGEQPUVCPV2CIGA*GKIJV #!  +PEJGUVYKRU  WUGEQPUVCPV5OKFIGP  +PEJGUVYKRUWYINGFPKGPKG PKGFQMNCFPQUEKRT[UMNCFCPKW WUGEQPUVCPV A KCOGVGT 5OKFIGP  +PEJGUVYKRU WUGEQPUVCPV9KPIA5KG  2CIGA9KFVJ A KCOGVGT  WUGEQPUVCPV(KTUVA.KPGA*GKIJV     GMNCTCELCFYQEJOKGPP[EJINQDCNP[EJ 146 RTF. Leksykon kieszonkowy Rysunek 3.7. Krok 3 — włożenie płyty CD O[QWVEFAECUGTVH O[ NKPGU )NQYPCEGUERTQITCOW IGVAKPRWV  QRGP 46( QWV QTFKG0KGOQPCQVYQT[EQWVFQCRKUW] FQEAKPVTQ  FTCYAHQNFAIWKFGU  RTKPVAVGZV  ENQUG 46(  RTKPV P7VYQTQPQQWV UQWVDCLVQY P GZKV  UWDIGVAKPRWV] Rozdział 3. Przykładowe programy 147 Rysunek 3.8. Krok 4 — zamknięcie koperty RTKPV9RTQYCFVGMUVFNCQMNCFMKCPCUVGRPKGPCEKUPKL PVG]T K 1(   @1`O/59KP !EQPVTQN PEQPVTQN F P WPNGUU #4)8 9[DTCP[MNCYKULGUVCNGP[QFU[UVGOWQRGTCE[LPGIQ 9KPFQYUW[YCEQPVTQN PCVQOKCUVYU[UVMKGKPPG U[UVGO[FQO[UNPKGY[OCICLCEQPVTQN F  NKPGU 2QDTCPKGFCP[EJYGLUEKQY[EJ RNKMW UVCPFCTFQYGIQYGLUEKCNWDMQPUQNK WPNGUU ITGRO 5 NKPGU ]DTCMFCP[EJYGLUEKQY[EJ RTKPV P0KEPKGYRKUCNGU! TQDKO[YKGERWUVCQMNCFMG] P  NKPGU  A  RWUV[YKGTU _ EJQOR NKPGU WUWPKGEKGPCMQY P TGVWTP _  UWDFQEAKPVTQ]2QECVGMRNKMW46( RTKPVH46( ] TVH CPUK 148 RTF. Leksykon kieszonkowy FGHH] HQPVVDN] H HTQOCP6KOGU0GY4QOCP__ RCRGTYU RCRGTJU FGHNCPI RNCKP H HU ] RCTF RCT_ KPV  2CIGA9KFVJ KPV  2CIGA*GKIJV  TGVWTP _  UWDRTKPVAVGZV]  CRKUCPKGCYCTVQUEK NKPGUYRTGE[[LPKGTQOKGUEQP[O CMCRKEKGW[EKGORQFRTQEGFWT[GUE NKPG  RTKPVH46( ] RCTF RXRI RJRI RQUZU RQU[U CDUYU CDUJU OCRKPV A  W[EKGV[NMQNKEDECNMQYKV[EJ 9KPIA5KG 5OKFIGP 2CIGA*GKIJV2CIGA*GKIJV   A KCOGVGT(KTUVA.KPGA*GKIJV  A KCOGVGT 5OKFIGP  A KCOGVGT 5OKFIGP (KTUVA.KPGA*GKIJV  RTKPV46( P H HU] HU 2QYKGMUGPKGRKGTYUGIQYKGTUC  NKPGU!GUE UJKHV NKPGU   _ P HQTGCEJO[NKPG NKPGU ] RTKPV46( P NKPGGUE NKPG  P _ RTKPV46( P RCT_ P_MQPKGEFQMWOGPVW TGVWTP _ Rozdział 3. Przykładowe programy 149  UWDGUE]YTQEGPKGEKCIWLCMQRQRTCYP[MQF46( O[KPA=? KP`U] =@ !  AC# ? _ ]URTKPVH  ZQTF  _GI 7[YCPGLGUVYKGEGLUGMYGPELKWEKGEMKPKLGUVVQY[OCICPG TGVWTPKP _  UWDFTCYAHQNFAIWKFGU]T[UQYCPKGYU[UVMKEJNKPKK T[UQYCPKGPCFQNG NKPG 2CIGA*GKIJV  2CIGA9KFVJ2CIGA*GKIJV   T[UQYCPKG^^QFIQT[FQFQNW NKPG 9KPIA5KG 5OKFIGP 9KPIA5KG2CIGA*GKIJV  NKPG 2CIGA9KFVJ9KPIA5KG5OKFIGP 2CIGA9KFVJ9KPIA5KG2CIGA*GKIJV  T[UQYCPKG YGFNWIFQNPGLNKPKK  NKPG 9KPIA5KG2CIGA*GKIJV   2CIGA*GKIJV   9KPIA5KG  NKPG 9KPIA5KG2CIGA*GKIJV   2CIGA*GKIJV  9KPIA5KG  NKPG 2CIGA9KFVJ9KPIA5KG2CIGA*GKIJV  2CIGA9KFVJ 2CIGA*GKIJV   9KPIA5KG  NKPG 2CIGA9KFVJ9KPIA5KG2CIGA*GKIJV  2CIGA9KFVJ 2CIGA*GKIJV  9KPIA5KG  TGVWTP _  2QFRTQEGFWTCIGPGTWLCECMQF46(FNCNKPKK RQOKGF[FYQOCRWPMVCOKPCUVTQPKG 150 RTF. Leksykon kieszonkowy O[AEQWPVOKGPPCNKEPKMC UWDNKPG]T[UQYCPKGNKPKK Z[ FQ Z[ O[ Z[Z[ OCRKPV  A  A 5RTCYFGPKGKUVPKGPKCEVGTGEJRCTCOGVTQY WUG CTR ETQCMNKPG Y[OCICEVGTGEJRCTCOGVTQYWPNGUU A 7[UMCPKGYURQNTGFP[EJNGYGIQIQTPGIQTQIWUVTQP[ O[PYAZ ZZ !ZZ O[PYA[ [[ ![[ ZPYAZZPYAZ[PYA[[PYA[ 9URQNTGFPG Z[ K Z[ QFPQUCUKGFQNGYGIQIQTPGIQ TQIW O[YCDU ZZ QFNGINQUEYRQKQOKG O[JCDU [[ QFNGINQUEYRKQPKG AEQWPV  RTKPVH46( ] FQ FQDZRCIG FQD[RCIG FQFJIVU FRNKPG FRRVZU FRRV[U FRRVZU FRRV[U FRZU FR[U FRZUKGU FR[UKGU FRNKPGYU FRNKPGEQTU FRNKPGEQIU FRNKPGEQDU _ AEQWPV Z[Z[ PYAZPYA[YJ ITWDQUENKPKK MQNQT4)$NKPKK  TGVWTP _ AA 0 AA Rozdział 3. Przykładowe programy 151 Narzędzie do pobierania metadanych RTF W podrozdziale „Struktura dokumentu” w rozdziale 1. pozna- liśmy metadane dokumentu, które mogą być wyrażone w po- staci grupy KPHQ. Są to takie metadane jak ] CWVJQTPCYCCWVQTC_ i ] VKVNGV[VWđFQMWOGPVW_. W tej części książki poznamy prosty pro- gram, który wyszukuje pola metadanych w dokumentach RTF. Załóżmy, że użytkownik otrzymał zadanie skatalogowania cy- frowej biblioteki z artykułami naukowymi. W bibliotece znaj- duje się kilka tysięcy takich artykułów w postaci plików RTF, a ich pełne tytuły są zapisane w polu ] VKVNG V[VWđ FQMWOGPVW_. Konieczne jest pobranie tytułu każdego dokumentu i przekazanie go do głównego katalogu artykułów. Typowy dokument rozpo- czyna się od następującego kodu RTF, który jest generowany przez program MS Word: ] TVH CPUK CPUKERI WE FGHH FGHNCPI FGHNCPIHG ] HQPVVDN] H HTQOCP HEJCTUGV HRTS] RCPQUG _6KOGU0GY4QOCP_] H HTQOCP HEJCTUGV] HRTS] RCPQUG_)GQTIKC__] EQNQTVDN TGF ITGGP DNWG TGF ITGGP DNWG_] UV[NGUJGGV] S] NK TK YKFEVNRCT CURCNRJC CURPWO HCCWVQ CFLWUVTKIJV TKP] NKP KVCR H HU NCPI NCPIHG EITKF NCPIPR NCPIHGPR UPGZV0QTOCN_] EU CFFKVKXG GHCWNV 2CTCITCRJ(QPV__] KPHQ] VKVNG5RGEVTQUEQRKEUVWF[QHDNWGEQO RCEVICNCZKGU+++ ORKTKECNRQRWNCVKQPU[PVJGUKU_] CWVJQT _] MG[YQTFUFYCTHICNCZKGUGXQNWVKQPICNCZKGUUVGNNC]TEQP VGPVICNCZKGUUVCTENWUVGTU_] QRGTCVQT:GPQV[RQ)O$*_] ETGCVKO [T OQ F[ JT OKP_] TGXVKO [T OQ F[ JT OKP_] XGTUKQP_] GFOKPU_] PQHRCIGU_] PQHYQTFU_ ] PQHEJCTU_] EQORCP[_] PQHEJCTUYU_] XGTP__ YKFQYEV]TN HVPDL CGPFFQE PQZNCVVQ[GP GZRUJTVP PQWNVTNURE FPVDNPUDFD Program użytkownika musi pobrać tytuł tego dokumentu, czyli Spectroscopic study of blue compact galaxies. III. Empirical popula- tion synthesis. 152 RTF. Leksykon kieszonkowy Gdyby Word umieszczał każde pole metadanych w oddzielnym wierszu, wystarczyłoby użyć narzędzia grep do wyszukania ciągu VKVNG, a następnie odczytać żądany wiersz w postaci ] VKVNG5RGE VTQUEQRKEUVWF[QHDNWGEQORCEVICNCZKGU+++ ORKTKECNRQRWNC VKQPU[PVJGUKU. Niestety, MS Word, podobnie jak większość proce- sorów tekstu, nie tworzy uporządkowanego i czytelnego kodu RTF. Oznacza to, że narzędzia typu grep nie będą zbyt przydatne. Skutecznym rozwiązaniem tego problemu będzie wczytanie całego dokumentu do pamięci i wyszukanie tekstu, który jest zgodny ze wzorcem ] VKVNGLCMKħVGMUV_. Ten sam wzorzec można wyrazić jako wyrażenie regularne Perla — O ] VKVNG U =@ _? _. Niektóre dokumenty mogą jednak zawierać osadzone rysunki, przez co ich wielkość znacznie wzrasta. Należy jednak sobie przypomnieć, że grupa KPHQ (zawierająca pole VKVNG i wszystkie inne metadane) zawsze znajduje się na początku dokumentu, przed jakimikolwiek danymi. Teoretycznie również sekcje pliku RTF umieszczone przed grupą KPHQ mogą być bardzo duże, ale w praktycznie wszystkich przypadkach ta grupa znajduje się w pierwszych 10 kB pliku. Wystarczy więc odczytać do pamięci tylko początkowy fragment dokumentu i wykonać żądaną oFperację. Utworzyliśmy już wyrażenie warunkowe O ] VKVNG U =@ _? _ do wyszukiwania tekstu i odkryliśmy sposób badania dokumen- tów. Pozostała część rozwiązania wymaga jedynie otworzenia każdego dokumentu, którego nazwa została podana w wierszu poleceń. Odczytany tytuł musi być przekazany przez procedurę zastępującą sekwencję ucieczki właściwymi znakami: WUTDKPRGTN WUGUVTKEV HQTGCEJO[KP #4)8 ] PGZVWPNGUUHKPCPFTA2QOKPKGEKGPKGE[VGNP[EJRNKMQY Rozdział 3. Przykładowe programy 153 QRGP+0KPQTYCTP 0KGOQPCQVYQT[EKPFQQFE[VW  P PGZV TGCF+0AAQTYCTP 0KGOQPCFQMQPCEQFE[VWKP  P PGZV ENQUG +0  O@ ] TVHUQTYCTP 6QPKGLGUVRNKM46(KP P PGZV O ] VKVNG U =@ _? _UQTYCTP $TCMV[VWNWYKP P PGZV RTKPV6KPWPGUE   P _ UWDWPGUE] O[ZA=? Z`U= EO EL?IWUWPKGEKGPKGRQVTGDP[EJPCMQYPQYGIQ YKGTUC Z`U =CH#(?]_ RCEM  JGZ  GI FGMQFQYCPKG ZZ TGVWTPZ _ AA 0 AA Większa część kodu jest odpowiedzialna za obsługę rzadkich lub nietypowych błędów. Program sprawdza, czy każdy plik .rtf można otworzyć i odczytać, a także czy zawiera na pFoczątku sekwencję znaków ] TVH. Najważniejsza operacja jest wykonywana przez wiersz zawierający wyrażenie regularne O ] VKVNG U =@ _? _U, które zapisuje tytuł dokumentu do zmiennej . Uzyskany tytuł jest wyświetlany na ekranie. Poniżej przedstawiono typową sesję pracy z programem, który zwraca tytuł dokumentu przekazanego poprzez wiersz Fpoleceń: RGTNTVHAVKVNGRNCUVTQTVH CUVTQTVH5RGEVTQUEQRKEUVWF[QHDNWGEQORCEVICNCZKGU]+++  ORKTKECNRQRWNCVKQPU[PVJGUKU 154 RTF. Leksykon kieszonkowy Uwagi na temat analizy plików RTF Należy zwrócić uwagę, że mogą wystąpić pewne problemy z wy- rażeniem regularnym O ] VKVNG U =@ _? _, jakie zostało użyte do implementacji koncepcji wzorca ] VKVNGLCMKħVGMUV_. Tworząc kod programu, przyjęto założenie, że tytuł nie może zawierać znaków „}” ani żadnych innych kodów formatujących (patrz rozdział 1.). Oznacza to, że nigdy nie będzie możliwe użycie tytułu ] VKVNG -CVCUVTQHC ] K JCNNGPIGTC__, a jedynie ] VKVNG -CVCUVTQHC JCNNGPIGTC_. Użyte w naszym programie wyrażenie regularne zawiedzie, jeżeli znak „}” nie został wyrażony jako F (co jest zalecane w niniejszej książce), ale jako _ (co rów- nież jest dozwolone w specyfikacji standardu RTF). Wyobraźmy sobie, że otrzymaliśmy dokument zatytułowany Opti- mizing {n,xN} Grammars. Tytuł ten można wyrazić jako ] VKVNG 1RVKOKKPI D0Z0 F)TCOOCTU_. W takim przypadku wyrażenie regularne odszuka ciąg 1RVKOKKPI D0Z0 F)TCOOCTU, a pod- procedura WPGUE  prawidłowo zastąpi sekwencje ucieczki, dzięki czemu uzyskamy pełny tytuł dokumentu. Równie dobrze można wyrazić ten sam tytuł w postaci ] VKVNG1RVKOKKPI ]0Z0 _)TCO OCTU_. Wyrażenie regularne odszuka teraz jedynie początkowy ciąg 1RVKOKKPI . Najprostszym sposobem rozwiązania tego pro- blemu będzie upewnienie się, że żaden dokument nie został za- kodowany w ten sposób. W tym celu wystarczy jedynie wyszu- kać sekwencję znaków ]. Na szczęście znaki „{” i „}” zwykle stosowane jedynie w matematyce i informatyce, dlatego problem występuje dość rzadko. Pozostawiam Czytelnikowi zadanie utwo- rzenia wyrażenia regularnego, które w elegancki sposób rozwiąże ten problem, a jednocześnie w dalszym ciągu będzie zatrzymy- wało się po odczytaniu tylko znaku „{”. Znacznie poważniejszym problemem związanym z implementa- cją wzorca ] VKVNG LCMKħ VGMUV_ jako wyrażenia regularnego O ] VKVNG U =@ _? _ jest fakt, że prawidłowo odczytywane są jedynie pola VKVNG i inne metadane dokumentu. Nie jest Rozdział 3. Przykładowe programy 155 możliwe zastosowanie tego podejścia dla innych struktur RTF, w których wykorzystywane są kody formatujące i zagnieżdżo- ne grupy. Załóżmy, że konieczne jest przechwycenie zawartości wszystkich przypisów w dokumencie. Po zapoznaniu się z opisem kodu przypisów w rozdziale 1. użytkownik zadecydował, że wystarczy wykorzystać wyrażenie regularne, zastępując słowo kluczowe VKVNG przez słowo HQQVPQVG. W efekcie uzyskano wyrażenie O ] HQQVPQVG U =@ _? _. Zastanówmy się jednak, co się stanie po odnalezieniu następującego kodu: ] HQQVPQVG RCTF RNCKP EJHVP 5GG] K0CXCLQ/CFG CUKGT_D[+TX[)QQUGP_ Użyty wzorzec zatrzyma się na pierwszym znaku „}”, dlatego odczytany zostanie tylko ciąg: 5GG] K0CXCLQ/CFG CUKGT, nato- miast dalsza część przypisu (D[+TX[)QQUGP) zostanie pominięta. Niestety, nie da się rozwiązać tego problemu poprzez modyfi- kację wyrażenia regularnego, gdyż takie wyrażenia nie obsługują zagnieżdżonych grup. W tym przypadku konieczne jest dopa- sowanie znaku „}” do otwierającego znaku „{” z uwzględnie- niem wszystkich zagnieżdżonych grup ]_, jakie znajdują się wewnątrz tej pary znaków. W takiej sytuacji najlepszym rozwiązaniem będzie użycie praw- dziwego analizatora kodu RTF. Istnieją dwa podejścia do analizy takiego kodu. Bardzo proste narzędzia po prostu odczytują kolejne polecenia kodu źródłowego, natomiast złożone aplikacje kompilują kod RTF do postaci rozbudowanych drzew, których struktura re- prezentuje poszczególne elementy dokumentu (na przykład aka- pity i tabele). Nie oznacza to jednak, że taki program zapewni in- formacje o żądanej strukturze grupy w pliku. Dalsza dyskusja na temat obu metod analizy wykracza jednak poza tematykę niniej- szej książki, gdyż jest to głównie domena interfejsów API kon- kretnych bibliotek programistycznych w wybranym językFu. 156 RTF. Leksykon kieszonkowy
Pobierz darmowy fragment (pdf)

Gdzie kupić całą publikację:

RTF. Leksykon kieszonkowy
Autor:

Opinie na temat publikacji:


Inne popularne pozycje z tej kategorii:


Czytaj również:


Prowadzisz stronę lub blog? Wstaw link do fragmentu tej książki i współpracuj z Cyfroteką: