RTF. Leksykon kieszonkowy
Upcoming SlideShare
Loading in...5
×
 

RTF. Leksykon kieszonkowy

on

  • 1,526 views

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 ...

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.

Statistics

Views

Total Views
1,526
Views on SlideShare
1,526
Embed Views
0

Actions

Likes
0
Downloads
4
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

RTF. Leksykon kieszonkowy RTF. Leksykon kieszonkowy Document Transcript

  • IDZ DO PRZYK£ADOWY ROZDZIA£ SPIS TRE CI RTF. Leksykon kieszonkowy KATALOG KSI¥¯EK Autor: Sean Burke KATALOG ONLINE T³umaczenie: Marcin Jêdrysiak ISBN: 83-7361-191-6 ZAMÓW DRUKOWANY KATALOG Tytu³ orygina³u: RTF Pocket Guide Format: B5, stron: 174 TWÓJ KOSZYK DODAJ DO KOSZYKA 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, CENNIK I INFORMACJE 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. ZAMÓW INFORMACJE Elastyczno æ RTF sprawia, ¿e jest to idealny format do wielu zastosowañ i mo¿e byæ O NOWO CIACH wykorzystany zarówno do generowania faktur i raportów, jak i do tworzenia s³owników na podstawie baz danych s³ów. ZAMÓW CENNIK 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. CZYTELNIA W leksykonie opisano: FRAGMENTY KSI¥¯EK ONLINE • 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. Wydawnictwo Helion ul. Chopina 6 44-100 Gliwice tel. (32)230-98-63 e-mail: helion@helion.pl
  • Spis treści Rozdział 1. Przedstawienie formatu RTF .............................. 5 Dlaczego format RTF?....................................................................................... 6 Podział książki.................................................................................................... 7 „Witaj świecie” w dokumencie RTF.............................................................. 9 Przedstawienie prostego dokumentu RTF................................................. 11 Podstawowa składnia formatu RTF ............................................................ 15 Akapity............................................................................................................... 21 Formatowanie znaków ................................................................................... 35 Struktura dokumentu ..................................................................................... 47 Dodatkowe funkcje.......................................................................................... 62 Style..................................................................................................................... 84 Tabele.................................................................................................................. 92 Rozdział 2. Tworzenie plików pomocy MS Windows.... 111 Plik pomocy RTF — podstawy................................................................... 111 Hiperłącza i wyskakujące łącza .................................................................. 114 Dodatkowe informacje o tematach ............................................................ 117 Rysunki ............................................................................................................ 121 Problemy z plikami pomocy RTF .............................................................. 125 Dodatkowe informacje.................................................................................. 126 Rozdział 3. Przykładowe programy .................................... 127 Generator kalendarza.................................................................................... 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......................................................... 155 Rozdział 4. Użyteczne informacje ........................................ 157 Tabela znaków ASCII-RTF .......................................................................... 157 Sekwencje ucieczki dla polskich znaków ................................................. 165 Kody języków RTF ........................................................................................ 166 Konwersja odległości na twipy................................................................... 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 zmieniłem tego, ponieważ pozwala to na omówienie pewnych funkcji, które nie są używane w polskich dokumentach, a które mogą być przydatne. 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 RTF:  ]>RCTF>UC>ST>H]>D (TKFC[_ ]>UWRGT VJ_ QH 0QXGODGT >RCT_ ]>RCTF>UC>ST>H]>D 5CVWTFC[_ ]>UWRGT VJ_ QH 0QXGODGT >RCT_ ]>RCTF>UC>ST>H]>D 5WPFC[_ ]>UWRGT VJ_ QH 0QXGODGT >RCT_ ]>RCTF>UC>ST>H]>D /QPFC[_ ]>UWRGT UV_ QH &GEGODGT >RCT_ ]>RCTF>UC>ST>H]>D 6WGUFC[_ ]>UWRGT PF_ QH &GEGODGT >RCT_ ]>RCTF>UC>ST>H]>D 9GFPGUFC[_ ]>UWRGT TF_ QH &GEGODGT >RCT_ ]>RCTF>UC>ST>H]>D 6JWTUFC[_ ]>UWRGT VJ_ QH &GEGODGT >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]>D 2QPKGFKC 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ć: WUG EQPUVCPV &#;A$+)   WUG EQPUVCPV &#;A5/#..  &#;A$+)   RQNQYC YCTVQUEK &#;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[_ ]>UWRGT VJ_ QH 0QXGODGT >RCT_ ]>RCTF>UC>ST>H]>D 5CVWTFC[_ ]>UWRGT VJ_ QH 0QXGODGT >RCT_ ]>RCTF>UC>ST>H]>D 5WPFC[_ ]>UWRGT VJ_ QH 0QXGODGT >RCT_ ]>RCTF>UC>ST>H]>D /QPFC[_ ]>UWRGT UV_ 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[ VJ QH 130 RTF. Leksykon kieszonkowy
  • 0QXGODGT  i 5WPFC[ VJ QH 0QXGODGT . 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: RTKPV 46( ]>RCTF>UC U>ST>H U]>D U_ U]>UWRGT U_ QH U U>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 polecenie KPV: RTKPV 46( ]>RCTF>UC F>ST>H F]>D U_ U]>UWRGT U_ QH U U>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ń programisty. 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 C DQQMMUKæ MC lub VQ TGCFE[VCè. Rozdział 3. Przykładowe programy 131
  • Poniżej przedstawiono pełny kod programu generującego ka- lendarz: WUTDKPRGTN TGSWKTG  WUG UVTKEV WUG YCTPKPIU 2TQITCO PCNG[ WTWEJCOKCE Y PQTOCNPGL YGTULK 2GTNC QRV[OCNPC MQPVTQNC DNGFQY &GHKPKELG UVCN[EJ WUG EQPUVCPV 5'%10&5A+0A&#;  
  • 
  •  WUG EQPUVCPV &#;A$+)   Y VYKRCEJ WUG EQPUVCPV &#;A5/#..   Y VYKRCEJ 1VYQTGPKG RNKMW K CRKUCPKG RTQNQIW QRGP 46( FCVGDQQMTVH QT FKG  RTKPV 46( ]>TVH>CPUK>FGHH ]>HQPVVDN]>H>HUYKUU #TKCN_]>H>HTQOCP 6KOGU 0GY 4QOCP__ >FGHNCPI>RNCKP>HU  &GHKPKELG VCDNKE Y[UWMKYCPKC PCYCOK OKGUKGE[ K FPK V[IQFPKC O[ "OQPVJU  SY ,CPWCT[ (GDTWCT[ /CTEJ #RTKN /C[ ,WPG ,WN[ #WIWUV 5GRVGODGT 1EVQDGT 0QXGODGT &GEGODGT  O[ "FQYU  SY 5WPFC[ /QPFC[ 6WGUFC[ 9GFPGUFC[ 6JWTUFC[ (TKFC[ 5CVWTFC[  -CNGPFCT LGUV VYQTQP[ PC ECN[ TQM QF DKGCEGIQ FPKC O[ VJGP  VKOG  O[ GPF  VJGP 
  • 5'%10&5A+0A&#; YJKNG VJGP  GPF ] O[ [GCT OQPVJ FC[ YGGMFC[  IOVKOG VJGP =? O[ URCEG  &#;A$+) 132 RTF. Leksykon kieszonkowy
  • URCEG  &#;A5/#.. KH YGGMFC[   QT YGGMFC[   RTKPVH 46( ]>RCTF>UC U>ST>H U]>D U_ U]>UWRGT U_ QH U U>RCT_  >P  URCEG OQPVJ  OKCPC EEKQPMK FNC MCFGIQ OKGUKCEC FQYU= YGGMFC[? FC[ VJ FC[  OQPVJU= OQPVJ? [GCT   VJGP  5'%10&5A+0A&#; _ <CMQPEGPKG K COMPKGEKG RNKMW QTC Y[LUEKG RTQITCOW RTKPV 46( _  ENQUG 46(  GZKV UWD VJ ] (WPMELC YTCECLCEC YNCUEKY[ RT[TQUVGM FNC FPKC OKGUKCEC PC RT[MNCF   TF  FKGMK EGOW PKG QUVCPKG W[VC FCVC (GDTWCT[ VJ O[ P  CDU A=? ^^   TGVWTP VJ WPNGUU P CPF P  KPV P  P   TGVWTP VJ KH P   QT P   QT P   P   TGVWTP UV KH P   TGVWTP PF KH P   TGVWTP TF KH P   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>DTFTY >DTFTU>ENDTFTT>DTFTY>DTFTU>EGNNZ >ENDTFTV>DTFTY>DTFTU>ENDTFTD>DTFTY>DTFTU>ENDTFTN>DTFTY >DTFTU>ENDTFTT>DTFTY>DTFTU>EGNNZ >RCTF>KPVDN>ST]>HU>H>D _>EGNN >SN]>H ENKRIKH_>EGNN >SE]>HU  > C_>EGNN >TQY Na szczęście ten mało czytelny kod dokumentu RTF jest tworzony automatycznie poprzez wywołanie funkcji HKNGATQY PCYC YKGNMQ è 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 RTF. Poniżej przedstawiono pełny kod źródłowy omawianego pro- gramu: WUTDKPRGTN TGSWKTG  WUG UVTKEV WUG YCTPKPIU 2TQITCO PCNG[ WTWEJCOKCE Y PQTOCNPGL YGTULK 2GTNC QRV[OCNPC MQPVTQNC DNGFQY O[ FKT  #4)8=? ^^   ,GGNK PKG RQFCPQ CTIWOGPVC YKGTUC RQNGEGPKG PCNG[ Y[UYKGVNKE CYCTVQUE DKGCEGIQ MCVCNQIW KH FKT GS  QT FKT GS  ] WUG %YF CNCFQYCPKG DKDNKQVGMK HWPMELK IGVEYF FKT  IGVEYF  6GTC OQPC Y[UYKGVNKE RGNPC UEKGMG C PKG V[NMQ  _ Rozdział 3. Przykładowe programy 135
  • 2TGTYCPKG RTCE[ LGUNK PKG LGUV VQ RQRTCYP[ MCVCNQI FKG 0KG OQPC QFE[VCE MCVCNQIW FKT WPNGUU G FKT CPF F A CPF T A 9[YQNCPKG RQFRTQEGFWT Y[MQPWLCE[EJ YU[UVMKG QRGTCELG K Y[LUEKG RTQITCOW TVHAUVCTV FKT  TVHFKT FKT  TVHAGPF FKT  GZKV  6T[ RQFRTQEGFWT[ RQOQEPKEG UWD KP ] KPV 
  • A=? _ ECNG  VYKR[ UWD EO ] KPV 
  • A=? _ EGPV[OGVT[  VYKR[ UWD GUE ] YTQEGPKG FCPGIQ EKCIW LCMQ RQRTCYP[ MQF 46( O[ KP  A=? KP ` U] =@ !> >AC#< ? _ ]URTKPVH >> Z QTF  _GI 2TQEGFWTC Y[MQPWLG YKGEGL QRGTCELK PK LGUV VQ Y[OCICPG CNG PKG QDUNWIWLG 7PKEQFG  RCVT TQFKCN  TGVWTP KP _  &GMNCTCELC VTGEJ OKGPP[EJ INQDCNP[EJ FQ CRKU[YCPKC FCP[EJ RNKMW O[ "+VGOU 5KGAQH 6KOGAQH  UWD TVHFKT ] Y[MQPCPKG INQYPGIQ CFCPKC RTQITCOW O[ FKT  A=? UECPAFKT FKT  RQDTCPKG FCP[EJ RTKPV ]>RCTF>UC>SE >HU>D>K  GUE FKT  >RCT_  >P>P  PCINQYGM UVTQP[ PCYC MCVCNQIW 136 RTF. Leksykon kieszonkowy
  • HKNGATQY A 5KGAQH] A_ 6KOGAQH] A_ HQTGCEJ "+VGOU LGFGP YKGTU FNC MCFGIQ RNKMW RTKPV ]>RCTF>UD>UC>HU>D>K =2WUV[ ?_ WPNGUU "+VGOU TGVWTP _  UWD UECPAFKT ] <GDTCPKG FCP[EJ RNKMW W[YCPG RTG HWPMELG TVHFKT 9[MQT[UV[YCPG UC V[RQYG HWPMELG U[UVGOW RNKMQY O[ FKT  A=? QRGPFKT +0 FKT QT FKG 0KG OQPC QVYQT[E FKT  O[ KVGO HWNNARCVJ  YJKNG FGHKPGF KVGO  TGCFFKT +0 ] PGZV KH KVGO GS  QT KVGO GS   RWUJ "+VGOU KVGO 5KGAQH] KVGO_ 6KOGAQH] KVGO_    O[ HWNNARCVJ  FKT KVGO  5KGAQH] KVGO_ 6KOGAQH] KVGO_  UVCV HWNNARCVJ =? KH H HWNNARCVJ _ ENQUGFKT +0  "+VGOU  UQTV D[APCOG "+VGOU /QPC OKGPKE D[APCOG PC D[AVKOG NWD D[AUKG TGVWTP _ 6T[ URQUQD[ UQTVQYCPKC UWD D[APCOG ] WUG NQECNG WE C EOR WE D _ Rozdział 3. Przykładowe programy 137
  • UWD D[AVKOG ] 6KOGAQH] C_  6KOGAQH] D_ _ UWD D[AUKG ] 5KGAQH] C_  5KGAQH] D_ _  UWD HKNGATQY ] 9[IGPGTQYCPKG YKGTUC VCDGNK PCYC YKGNMQUEKC K FCVC RNKMW W[YCPG RTG HWPMELG TVHFKT O[ PCOG UKG VKOG  "A O[ PCOGAHQTOCV   KH UKG   ] 0CU PCEPKM FNC MCVCNQIW PCOGAHQTOCV  >D  RQITWDKGPKG VKOG   UKG   _ GNUG ] 6Q LGUV RNKM VKOG  HQTOCVAFCVG VKOG   YJKNG UKG ` U >F >F>F>F ^    &QFCPKG RTGEKPMQY FQ YKGNMQUEK RNKMW    _ RTKPV >VTQYF>VTICRJ  2QECVGM FGMNCTCELK YKGTUC 46( O[ DQTFGTU  LQKP  OCR >ENDTFT  A  >DTFTY>DTFTU  SY V D N T  YNCEGPKG YU[UVMKEJ MTCYGFK RTKPV DQTFGTU >EGNNZ  A >P HQT KP   KP   KP   FGMNCTCELG RTCYGL MTCYGFK MQOQTMK YU[UVMKG YCTVQUEK OQPC FQYQNPKG OKGPKCE RTKPV GOKULC MQOQTGM K KEJ CYCTVQUEK >RCTF>KPVDN>ST]>HU>H>D  GUE UKG  _>EGNN  Y[TQYPCPKG FQ RTCYGL  RWPMVQY %QWTKGT RQITWDKGPKG >SN]>H  PCOGAHQTOCV GUE PCOG  _>EGNN  Y[TQYPCPKG FQ NGYGL 6KOGU 4QOCP >SE]>HU  GUE VKOG  _>EGNN  Y[RQUTQFMQYCPKG  RWPMVQY #TKCN 138 RTF. Leksykon kieszonkowy
  • >TQY  >P>P  TGVWTP _  UWD TVHAUVCTV ] O[ FKT  A=? RTKPV  '0&A46(A56#46  ]>TVH>CPUK>FGHH ]>HQPVVDN ]>H>HUYKUU #TKCN_]>H>HOQFGTP %QWTKGT 0GY_ ]>H>HTQOCP 6KOGU__ >FGHNCPI>YKFQYEVTN>RNCKP>HU>PQRTQQH '0&A46(A56#46 0CINQYGM UVTQP[ CYKGTCLCE[ UEKGMG K IQFKPG RTKPV ]>JGCFGT >RCTF>ST>RNCKP>H>HU>K>PQRTQQH  GUE FKT   HQTOCVAFCVG VKOG   R>EJRIP>RCT_  >P>P  TGVWTP _ UWD TVHAGPF ] O[ FKT  A=? RTKPV >P_>P  TGVWTP _ UWD HQTOCVAFCVG ] O[ VKOG  A=? O[ ; / & J O  NQECNVKOG VKOG =  ? TGVWTP URTKPVH F F F F F  ;  /  & J O _ 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 5 TVHFKTRN >YKPFQYU>FGUMVQR>U[ODQN HQPV VCDNG 6'/2 >FKTTVH %> UVCTV 6'/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> E RNKMK. 2 Chciałbym podziękować Tomowi Hullowi z wydziału matematyki Merrimack College, który zaprojektował sposób zaginania 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 przykład: EFECUG V[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 EFECUG  V[VWNAKAUEKGMKVZV lub: NU N DCEMWRU ^ EFECUG Program może również odczytywać dane bezpośrednio z konsoli: EFECUG 9RTQYCF VGMUV FNC QMNCFMK C PCUVGRPKG PCEKUPKL 'PVGT K '1( EQPVTQN 6[VW R [V[ %& 6[VW EKG MK  6[VW EKG MK  6[VW EKG MK  =2Q CMQ EGPKW PCNG [ PCEKUPæè EQPVTQN & NWD EQPVTQN < Y PQY[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  WUG UVTKEV WUG YCTPKPIU 2TQITCO PCNG[ WTWEJCOKCE Y PQTOCNPGL YGTULK 2GTNC QRV[OCNPC MQPVTQNC DNGFQY  &GMNCTCELC UVCN[EJ WUG EQPUVCPV #   <OKGP  PC  LGUNK FTWMWLGU PC RCRKGTG # Rozdział 3. Przykładowe programy 145
  • Rysunek 3.6. Krok 2 — poziome złożenie kartki WUG EQPUVCPV +PEJGUVYKRU   YURQNE[PPKM MQPYGTULK WUG EQPUVCPV 2CIGA9KFVJ  # !   
  • +PEJGUVYKRU  WUG EQPUVCPV 2CIGA*GKIJV  # !   
  • +PEJGUVYKRU  WUG EQPUVCPV 5OKFIGP  
  • +PEJGUVYKRU WYINGFPKGPKG PKGFQMNCFPQUEK RT[ UMNCFCPKW WUG EQPUVCPV %&A&KCOGVGT  5OKFIGP 
  • +PEJGUVYKRU WUG EQPUVCPV 9KPIA5KG  2CIGA9KFVJ  %&A&KCOGVGT   WUG EQPUVCPV (KTUVA.KPGA*GKIJV  
  •   &GMNCTCELC FYQEJ OKGPP[EJ INQDCNP[EJ 146 RTF. Leksykon kieszonkowy
  • Rysunek 3.7. Krok 3 — włożenie płyty CD O[ QWV  EFAECUGTVH  O[ "NKPGU )NQYPC EGUE RTQITCOW IGVAKPRWV  QRGP 46( QWV QT FKG 0KG OQPC QVYQT[E QWV FQ CRKUW  FQEAKPVTQ  FTCYAHQNFAIWKFGU  RTKPVAVGZV  ENQUG 46(  RTKPV >P7VYQTQPQ QWV  U QWV DCLVQY >P  GZKV  UWD IGVAKPRWV ] Rozdział 3. Przykładowe programy 147
  • Rysunek 3.8. Krok 4 — zamknięcie koperty RTKPV 9RTQYCF VGMUV FNC QMNCFMK C PCUVGRPKG PCEKUPKL 'PVGT K '1(  @1 ` O/59KP ! EQPVTQN >P  EQPVTQN F >P WPNGUU "#4)8 9[DTCP[ MNCYKU LGUV CNGP[ QF U[UVGOW QRGTCE[LPGIQ 9KPFQYU W[YC EQPVTQN  PCVQOKCUV YU[UVMKG KPPG U[UVGO[ FQO[UNPKG Y[OCICLC EQPVTQN F "NKPGU    2QDTCPKG FCP[EJ YGLUEKQY[EJ RNKMW UVCPFCTFQYGIQ YGLUEKC NWD MQPUQNK WPNGUU ITGR O>5 "NKPGU ] DTCM FCP[EJ YGLUEKQY[EJ RTKPV >P0KE PKG YRKUCNGU! <TQDKO[ YKGE RWUVC QMNCFMG>P  "NKPGU  A  RWUV[ YKGTU _ EJQOR "NKPGU  WUWPKGEKG PCMQY >P TGVWTP _  UWD FQEAKPVTQ ] 2QECVGM RNKMW 46( RTKPVH 46( ]>TVH>CPUK 148 RTF. Leksykon kieszonkowy
  • >FGHH]>HQPVVDN ]>H >HTQOCP 6KOGU 0GY 4QOCP__ >RCRGTY U >RCRGTJ U >FGHNCPI>RNCKP>H>HU ]>RCTF>RCT_  KPV  2CIGA9KFVJ  KPV  2CIGA*GKIJV  TGVWTP _  UWD RTKPVAVGZV ] <CRKUCPKG CYCTVQUEK "NKPGU Y RTGE[[LPKG TQOKGUEQP[O CMCRKEKG W[EKGO RQFRTQEGFWT[ GUE NKPG  RTKPVH 46( ]>RCTF >RXRI>RJRI >RQUZ U >RQU[ U >CDUY U >CDUJ U  OCR KPV A   W[EKG V[NMQ NKED ECNMQYKV[EJ 9KPIA5KG 5OKFIGP 2CIGA*GKIJV  2CIGA*GKIJV
  •   %&A&KCOGVGT  (KTUVA.KPGA*GKIJV %&A&KCOGVGT  
  • 5OKFIGP %&A&KCOGVGT  
  • 5OKFIGP (KTUVA.KPGA*GKIJV  RTKPV 46( >P>>H>>HU]>>HU  2QYKGMUGPKG RKGTYUGIQ YKGTUC "NKPGU ! GUE UJKHV "NKPGU   _>P  HQTGCEJ O[ NKPG "NKPGU ] RTKPV 46( >P>>NKPG  GUE NKPG  >P  _ RTKPV 46( >P>>RCT_>P_  MQPKGE FQMWOGPVW TGVWTP _ Rozdział 3. Przykładowe programy 149
  •  UWD GUE ] YTQEGPKG EKCIW LCMQ RQRTCYP[ MQF 46( O[ KP  A=? KP ` U] =@ !> >AC#< ? _ ]URTKPVH >> Z QTF  _GI 7[YCPG LGUV YKGEGL UGMYGPELK WEKGEMK PK LGUV VQ Y[OCICPG TGVWTP KP _  UWD FTCYAHQNFAIWKFGU ] T[UQYCPKG YU[UVMKEJ NKPKK T[UQYCPKG  PC FQNG NKPG  2CIGA*GKIJV
  •  2CIGA9KFVJ 2CIGA*GKIJV
  •   T[UQYCPKG ^ ^ QF IQT[ FQ FQNW NKPG 9KPIA5KG 5OKFIGP  9KPIA5KG 2CIGA*GKIJV  NKPG 2CIGA9KFVJ  9KPIA5KG  5OKFIGP  2CIGA9KFVJ  9KPIA5KG 2CIGA*GKIJV  T[UQYCPKG >  YGFNWI FQNPGL NKPKK  > NKPG 9KPIA5KG 2CIGA*GKIJV
  •   2CIGA*GKIJV
  •  9KPIA5KG  NKPG 9KPIA5KG 2CIGA*GKIJV
  •   2CIGA*GKIJV
  •   9KPIA5KG  NKPG 2CIGA9KFVJ  9KPIA5KG 2CIGA*GKIJV
  •  2CIGA9KFVJ 2CIGA*GKIJV
  •  9KPIA5KG  NKPG 2CIGA9KFVJ  9KPIA5KG 2CIGA*GKIJV
  •  2CIGA9KFVJ 2CIGA*GKIJV
  •   9KPIA5KG  TGVWTP _  2QFRTQEGFWTC IGPGTWLCEC MQF 46( FNC NKPKK RQOKGF[ FYQOC RWPMVCOK PC UVTQPKG 150 RTF. Leksykon kieszonkowy
  • O[ AEQWPV OKGPPC NKEPKMC UWD NKPG ] T[UQYCPKG NKPKK Z[ FQ Z[ O[ Z [ Z [  OCR KPV  A  "A 5RTCYFGPKG KUVPKGPKC EVGTGEJ RCTCOGVTQY WUG %CTR ETQCM NKPG Y[OCIC EVGTGEJ RCTCOGVTQY WPNGUU "A   7[UMCPKG YURQNTGFP[EJ NGYGIQ IQTPGIQ TQIW UVTQP[ O[ PYAZ  Z  Z ! Z  Z O[ PYA[  [  [ ! [  [ Z  PYAZ Z  PYAZ [  PYA[ [  PYA[ 9URQNTGFPG Z[ K Z[ QFPQUC UKG FQ NGYGIQ IQTPGIQ TQIW O[ Y  CDU Z  Z  QFNGINQUE Y RQKQOKG O[ J  CDU [  [  QFNGINQUE Y RKQPKG AEQWPV  RTKPVH 46( ]>
  • >FQ>FQDZRCIG>FQD[RCIG>FQFJIV U>FRNKPG >FRRVZ U>FRRV[ U >FRRVZ U>FRRV[ U >FRZ U>FR[ U >FRZUKG U>FR[UKG U >FRNKPGY U >FRNKPGEQT U>FRNKPGEQI U>FRNKPGEQD U _  AEQWPV Z [ Z [ PYAZ PYA[ Y J  ITWDQUE NKPKK  MQNQT 4)$ 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 ]>CWVJQT PCYC CWVQTC_ i ]>VKVNG V[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 _6KOGU 0GY 4QOCP_]>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 >UPGZV 0QTOCN_]
  • >EU >CFFKVKXG &GHCWNV 2CTCITCRJ (QPV__]>KPHQ]>VKVNG 5RGEVTQUEQRKE UVWF[ QH DNWG EQO RCEV ICNCZKGU +++ 'ORKTKECN RQRWNCVKQP U[PVJGUKU_]>CWVJQT _]>MG[YQTFU FYCTH ICNCZKGU GXQNWVKQP ICNCZKGU UVGNNCT EQP VGPV ICNCZKGU UVCT ENWUVGTU_]>QRGTCVQT :GPQV[RQ )O$*_] >ETGCVKO>[T>OQ>F[>JT>OKP_]>TGXVKO>[T>OQ>F[ >JT>OKP_]>XGTUKQP_]>GFOKPU_]>PQHRCIGU_]>PQHYQTFU_ ]>PQHEJCTU_]
  • >EQORCP[ _]>PQHEJCTUYU_]>XGTP__>YKFQYEVTN >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 ]>VKVNG 5RGE VTQUEQRKE UVWF[ QH DNWG EQORCEV ICNCZKGU +++ 'ORKTKECN RQRWNC VKQP U[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 ]>VKVNG LCMK 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ą operację. 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 WUG UVTKEV HQTGCEJ O[ KP "#4)8 ] PGZV WPNGUU H KP CPF T A 2QOKPKGEKG PKGE[VGNP[EJ RNKMQY Rozdział 3. Przykładowe programy 153
  • QRGP +0 KP QT YCTP 0KG OQPC QVYQT[E KP FQ QFE[VW >P  PGZV TGCF +0 A A QT YCTP 0KG OQPC FQMQPCE QFE[VW KP >P  PGZV ENQUG +0  O@>]>>TVHU QT YCTP 6Q PKG LGUV RNKM 46( KP>P  PGZV O>]>>VKVNG>U
  • =@>_? >_U QT YCTP $TCM V[VWNW Y KP>P  PGZV RTKPV 6 KP  WPGUE   >P  _ UWD WPGUE ] O[ Z  A=? Z ` U=>EO>EL?I WUWPKGEKG PKGRQVTGDP[EJ PCMQY PQYGIQ YKGTUC Z ` U>> =CH#(?]_ RCEM %  JGZ  GI FGMQFQYCPKG > ZZ TGVWTP Z _ 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 począ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 poleceń: RGTN TVHAVKVNGRN CUVTQTVH CUVTQTVH 5RGEVTQUEQRKE UVWF[ QH DNWG EQORCEV ICNCZKGU +++ 'ORKTKECN RQRWNCVKQP U[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 ]>VKVNG LCMK 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 ]>VKVNG 1RVKOKKPI >]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 ]>K 0CXCLQ /CFG 'CUKGT_ D[ +TX[ )QQUGP_ Użyty wzorzec zatrzyma się na pierwszym znaku „}”, dlatego odczytany zostanie tylko ciąg: 5GG ]>K 0CXCLQ /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ęzyku. 156 RTF. Leksykon kieszonkowy