SlideShare una empresa de Scribd logo
1 de 32
Descargar para leer sin conexión
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:
 
 ]RCTFUCSTH]D   (TKFC[_ ]UWRGT VJ_ QH 0QXGODGT
   RCT_
 ]RCTFUCSTH]D   5CVWTFC[_ ]UWRGT VJ_ QH 0QXGODGT
   RCT_
 ]RCTFUCSTH]D   5WPFC[_ ]UWRGT VJ_ QH 0QXGODGT
   RCT_
 ]RCTFUCSTH]D   /QPFC[_ ]UWRGT UV_ QH GEGODGT
   RCT_
 ]RCTFUCSTH]D   6WGUFC[_ ]UWRGT PF_ QH GEGODGT
   RCT_
 ]RCTFUCSTH]D   9GFPGUFC[_ ]UWRGT TF_ QH GEGODGT
   RCT_
 ]RCTFUCSTH]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:
 ]RCTFUCSTH]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:
 ]RCTFUCSTH]D (TKFC[_ ]UWRGT VJ_ QH 0QXGODGT
   RCT_
 ]RCTFUCSTH]D 5CVWTFC[_ ]UWRGT VJ_ QH 0QXGODGT
   RCT_
 ]RCTFUCSTH]D 5WPFC[_ ]UWRGT VJ_ QH 0QXGODGT
   RCT_
 ]RCTFUCSTH]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(
   ]RCTFUC USTH U]D U_ U]UWRGT U_ QH U URCT_  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(
   ]RCTFUC FSTH F]D U_ U]UWRGT U_ QH U URCT_  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'%105A+0A#;
WUG EQPUVCPV #;A$+)   Y VYKRCEJ
 WUG EQPUVCPV #;A5/#..   Y VYKRCEJ

   1VYQTGPKG RNKMW K CRKUCPKG RTQNQIW
 QRGP 46( FCVGDQQMTVH QT FKG 
 RTKPV 46( ]TVHCPUKFGHH
 ]HQPVVDN]HHUYKUU #TKCN_]HHTQOCP 6KOGU 0GY 4QOCP__
 FGHNCPIRNCKPHU
  

   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'%105A+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(
       ]RCTFUC USTH U]D U_ U]UWRGT U_ QH U URCT_ 
         P 
        URCEG
        OQPVJ  OKCPC EEKQPMK FNC MCFGIQ OKGUKCEC
        FQYU= YGGMFC[? FC[ VJ
 FC[ OQPVJU= OQPVJ? [GCT 
         
     

     VJGP 
 5'%105A+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'0AA




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:
 VTQYFVTICRJENDTFTVDTFTYDTFTUENDTFTDDTFTY
 DTFTUENDTFTNDTFTYDTFTUENDTFTTDTFTYDTFTUEGNNZ
 ENDTFTVDTFTYDTFTUENDTFTDDTFTYDTFTUENDTFTNDTFTY
 DTFTUENDTFTTDTFTYDTFTUEGNNZ
 ENDTFTVDTFTYDTFTUENDTFTDDTFTYDTFTUENDTFTNDTFTY
 DTFTUENDTFTTDTFTYDTFTUEGNNZ
 RCTFKPVDNST]HUHD _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 ]RCTFUCSE HUDK  GUE
 FKT   RCT_  PP 
         PCINQYGM UVTQP[ PCYC MCVCNQIW




136                                         RTF. Leksykon kieszonkowy
HKNGATQY
 A 5KGAQH] A_ 6KOGAQH] A_  HQTGCEJ +VGOU
        LGFGP YKGTU FNC MCFGIQ RNKMW

     RTKPV ]RCTFUDUCHUDK =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
FFF
^   
           QFCPKG RTGEKPMQY FQ YKGNMQUEK RNKMW     
      _

      RTKPV VTQYFVTICRJ  2QECVGM FGMNCTCELK YKGTUC 46(
      O[ DQTFGTU  LQKP  OCR ENDTFT  A  DTFTYDTFTU 
        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
        RCTFKPVDNST]HUHD  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  PP
     
   TGVWTP
 _
  

 UWD TVHAUVCTV ]
   O[ FKT  A=?
   RTKPV  '0A46(A56#46 
 ]TVHCPUKFGHH
 ]HQPVVDN ]HHUYKUU #TKCN_]HHOQFGTP %QWTKGT 0GY_
 ]HHTQOCP 6KOGU__
 FGHNCPIYKFQYEVTNRNCKPHUPQRTQQH

 '0A46(A56#46

       0CINQYGM UVTQP[ CYKGTCLCE[ UEKGMG K IQFKPG
     RTKPV ]JGCFGT RCTFSTRNCKPHHUKPQRTQQH 
       GUE
 FKT       HQTOCVAFCVG
VKOG
          REJRIPRCT_  PP 
     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'0AA




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 YKPFQYUFGUMVQRU[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ń RXRIRJRI 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 CDUJQM 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 %AKCOGVGT  5OKFIGP

Más contenido relacionado

Más de Wydawnictwo Helion

Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktycznePozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczneWydawnictwo Helion
 
E-wizerunek. Internet jako narzędzie kreowania image'u w biznesie
E-wizerunek. Internet jako narzędzie kreowania image'u w biznesieE-wizerunek. Internet jako narzędzie kreowania image'u w biznesie
E-wizerunek. Internet jako narzędzie kreowania image'u w biznesieWydawnictwo Helion
 
Microsoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Microsoft Visual C++ 2008. Tworzenie aplikacji dla WindowsMicrosoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Microsoft Visual C++ 2008. Tworzenie aplikacji dla WindowsWydawnictwo Helion
 
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie IICo potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie IIWydawnictwo Helion
 
Makrofotografia. Magia szczegółu
Makrofotografia. Magia szczegółuMakrofotografia. Magia szczegółu
Makrofotografia. Magia szczegółuWydawnictwo Helion
 
Java. Efektywne programowanie. Wydanie II
Java. Efektywne programowanie. Wydanie IIJava. Efektywne programowanie. Wydanie II
Java. Efektywne programowanie. Wydanie IIWydawnictwo Helion
 
Ajax, JavaScript i PHP. Intensywny trening
Ajax, JavaScript i PHP. Intensywny treningAjax, JavaScript i PHP. Intensywny trening
Ajax, JavaScript i PHP. Intensywny treningWydawnictwo Helion
 
PowerPoint 2007 PL. Seria praktyk
PowerPoint 2007 PL. Seria praktykPowerPoint 2007 PL. Seria praktyk
PowerPoint 2007 PL. Seria praktykWydawnictwo Helion
 
Serwisy społecznościowe. Budowa, administracja i moderacja
Serwisy społecznościowe. Budowa, administracja i moderacjaSerwisy społecznościowe. Budowa, administracja i moderacja
Serwisy społecznościowe. Budowa, administracja i moderacjaWydawnictwo Helion
 
Serwer SQL 2008. Administracja i programowanie
Serwer SQL 2008. Administracja i programowanieSerwer SQL 2008. Administracja i programowanie
Serwer SQL 2008. Administracja i programowanieWydawnictwo Helion
 
USB. Praktyczne programowanie z Windows API w C++
USB. Praktyczne programowanie z Windows API w C++USB. Praktyczne programowanie z Windows API w C++
USB. Praktyczne programowanie z Windows API w C++Wydawnictwo Helion
 
Microsoft Visual Studio 2008. Księga eksperta
Microsoft Visual Studio 2008. Księga ekspertaMicrosoft Visual Studio 2008. Księga eksperta
Microsoft Visual Studio 2008. Księga ekspertaWydawnictwo Helion
 

Más de Wydawnictwo Helion (20)

Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktycznePozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
 
E-wizerunek. Internet jako narzędzie kreowania image'u w biznesie
E-wizerunek. Internet jako narzędzie kreowania image'u w biznesieE-wizerunek. Internet jako narzędzie kreowania image'u w biznesie
E-wizerunek. Internet jako narzędzie kreowania image'u w biznesie
 
Microsoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Microsoft Visual C++ 2008. Tworzenie aplikacji dla WindowsMicrosoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Microsoft Visual C++ 2008. Tworzenie aplikacji dla Windows
 
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie IICo potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
 
Makrofotografia. Magia szczegółu
Makrofotografia. Magia szczegółuMakrofotografia. Magia szczegółu
Makrofotografia. Magia szczegółu
 
Windows PowerShell. Podstawy
Windows PowerShell. PodstawyWindows PowerShell. Podstawy
Windows PowerShell. Podstawy
 
Java. Efektywne programowanie. Wydanie II
Java. Efektywne programowanie. Wydanie IIJava. Efektywne programowanie. Wydanie II
Java. Efektywne programowanie. Wydanie II
 
JavaScript. Pierwsze starcie
JavaScript. Pierwsze starcieJavaScript. Pierwsze starcie
JavaScript. Pierwsze starcie
 
Ajax, JavaScript i PHP. Intensywny trening
Ajax, JavaScript i PHP. Intensywny treningAjax, JavaScript i PHP. Intensywny trening
Ajax, JavaScript i PHP. Intensywny trening
 
PowerPoint 2007 PL. Seria praktyk
PowerPoint 2007 PL. Seria praktykPowerPoint 2007 PL. Seria praktyk
PowerPoint 2007 PL. Seria praktyk
 
Excel 2007 PL. Seria praktyk
Excel 2007 PL. Seria praktykExcel 2007 PL. Seria praktyk
Excel 2007 PL. Seria praktyk
 
Access 2007 PL. Seria praktyk
Access 2007 PL. Seria praktykAccess 2007 PL. Seria praktyk
Access 2007 PL. Seria praktyk
 
Word 2007 PL. Seria praktyk
Word 2007 PL. Seria praktykWord 2007 PL. Seria praktyk
Word 2007 PL. Seria praktyk
 
Serwisy społecznościowe. Budowa, administracja i moderacja
Serwisy społecznościowe. Budowa, administracja i moderacjaSerwisy społecznościowe. Budowa, administracja i moderacja
Serwisy społecznościowe. Budowa, administracja i moderacja
 
AutoCAD 2008 i 2008 PL
AutoCAD 2008 i 2008 PLAutoCAD 2008 i 2008 PL
AutoCAD 2008 i 2008 PL
 
Bazy danych. Pierwsze starcie
Bazy danych. Pierwsze starcieBazy danych. Pierwsze starcie
Bazy danych. Pierwsze starcie
 
Inventor. Pierwsze kroki
Inventor. Pierwsze krokiInventor. Pierwsze kroki
Inventor. Pierwsze kroki
 
Serwer SQL 2008. Administracja i programowanie
Serwer SQL 2008. Administracja i programowanieSerwer SQL 2008. Administracja i programowanie
Serwer SQL 2008. Administracja i programowanie
 
USB. Praktyczne programowanie z Windows API w C++
USB. Praktyczne programowanie z Windows API w C++USB. Praktyczne programowanie z Windows API w C++
USB. Praktyczne programowanie z Windows API w C++
 
Microsoft Visual Studio 2008. Księga eksperta
Microsoft Visual Studio 2008. Księga ekspertaMicrosoft Visual Studio 2008. Księga eksperta
Microsoft Visual Studio 2008. Księga eksperta
 

RTF. Leksykon kieszonkowy

  • 1. 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
  • 2. 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
  • 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
  • 4. 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: ]RCTFUCSTH]D (TKFC[_ ]UWRGT VJ_ QH 0QXGODGT RCT_ ]RCTFUCSTH]D 5CVWTFC[_ ]UWRGT VJ_ QH 0QXGODGT RCT_ ]RCTFUCSTH]D 5WPFC[_ ]UWRGT VJ_ QH 0QXGODGT RCT_ ]RCTFUCSTH]D /QPFC[_ ]UWRGT UV_ QH GEGODGT RCT_ ]RCTFUCSTH]D 6WGUFC[_ ]UWRGT PF_ QH GEGODGT RCT_ ]RCTFUCSTH]D 9GFPGUFC[_ ]UWRGT TF_ QH GEGODGT RCT_ ]RCTFUCSTH]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
  • 5. 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: ]RCTFUCSTH]D 2QPKGFKC GM_ ITWFPKC RCT_ Rozdział 3. Przykładowe programy 129
  • 6. 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: ]RCTFUCSTH]D (TKFC[_ ]UWRGT VJ_ QH 0QXGODGT RCT_ ]RCTFUCSTH]D 5CVWTFC[_ ]UWRGT VJ_ QH 0QXGODGT RCT_ ]RCTFUCSTH]D 5WPFC[_ ]UWRGT VJ_ QH 0QXGODGT RCT_ ]RCTFUCSTH]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
  • 7. 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( ]RCTFUC USTH U]D U_ U]UWRGT U_ QH U URCT_ 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( ]RCTFUC FSTH F]D U_ U]UWRGT U_ QH U URCT_ 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
  • 8. 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'%105A+0A#;
  • 9. WUG EQPUVCPV #;A$+) Y VYKRCEJ WUG EQPUVCPV #;A5/#.. Y VYKRCEJ 1VYQTGPKG RNKMW K CRKUCPKG RTQNQIW QRGP 46( FCVGDQQMTVH QT FKG RTKPV 46( ]TVHCPUKFGHH ]HQPVVDN]HHUYKUU #TKCN_]HHTQOCP 6KOGU 0GY 4QOCP__ FGHNCPIRNCKPHU 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
  • 10. 5'%105A+0A#; YJKNG VJGP GPF ] O[ [GCT OQPVJ FC[ YGGMFC[ IOVKOG VJGP=? O[ URCEG #;A$+) 132 RTF. Leksykon kieszonkowy
  • 11. URCEG #;A5/#.. KH YGGMFC[ QT YGGMFC[ RTKPVH 46( ]RCTFUC USTH U]D U_ U]UWRGT U_ QH U URCT_ P URCEG OQPVJ OKCPC EEKQPMK FNC MCFGIQ OKGUKCEC FQYU= YGGMFC[? FC[ VJ FC[ OQPVJU= OQPVJ? [GCT VJGP 5'%105A+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'0AA Rozdział 3. Przykładowe programy 133
  • 12. 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: VTQYFVTICRJENDTFTVDTFTYDTFTUENDTFTDDTFTY DTFTUENDTFTNDTFTYDTFTUENDTFTTDTFTYDTFTUEGNNZ ENDTFTVDTFTYDTFTUENDTFTDDTFTYDTFTUENDTFTNDTFTY DTFTUENDTFTTDTFTYDTFTUEGNNZ ENDTFTVDTFTYDTFTUENDTFTDDTFTYDTFTUENDTFTNDTFTY DTFTUENDTFTTDTFTYDTFTUEGNNZ RCTFKPVDNST]HUHD _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
  • 13. 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
  • 14. 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
  • 15. A=? _ ECNG VYKR[ UWD EO ] KPV
  • 16. 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 ]RCTFUCSE HUDK GUE FKT RCT_ PP PCINQYGM UVTQP[ PCYC MCVCNQIW 136 RTF. Leksykon kieszonkowy
  • 17. HKNGATQY A 5KGAQH] A_ 6KOGAQH] A_ HQTGCEJ +VGOU LGFGP YKGTU FNC MCFGIQ RNKMW RTKPV ]RCTFUDUCHUDK =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
  • 18. 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 FFF ^ QFCPKG RTGEKPMQY FQ YKGNMQUEK RNKMW _ RTKPV VTQYFVTICRJ 2QECVGM FGMNCTCELK YKGTUC 46( O[ DQTFGTU LQKP OCR ENDTFT A DTFTYDTFTU 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 RCTFKPVDNST]HUHD 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
  • 19. TQY PP TGVWTP _ UWD TVHAUVCTV ] O[ FKT A=? RTKPV '0A46(A56#46 ]TVHCPUKFGHH ]HQPVVDN ]HHUYKUU #TKCN_]HHOQFGTP %QWTKGT 0GY_ ]HHTQOCP 6KOGU__ FGHNCPIYKFQYEVTNRNCKPHUPQRTQQH '0A46(A56#46 0CINQYGM UVTQP[ CYKGTCLCE[ UEKGMG K IQFKPG RTKPV ]JGCFGT RCTFSTRNCKPHHUKPQRTQQH GUE FKT HQTOCVAFCVG VKOG REJRIPRCT_ PP 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'0AA Rozdział 3. Przykładowe programy 139
  • 20. 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 YKPFQYUFGUMVQRU[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
  • 21. 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ń RXRIRJRI 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 CDUJQM 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
  • 22. 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
  • 24. . 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
  • 25. uła- twiają błyskawiczne przeliczanie rozmiarów. 142 RTF. Leksykon kieszonkowy
  • 26. 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
  • 27. 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
  • 28. 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
  • 29. Rysunek 3.6. Krok 2 — poziome złożenie kartki WUG EQPUVCPV +PEJGUVYKRU YURQNE[PPKM MQPYGTULK WUG EQPUVCPV 2CIGA9KFVJ # !
  • 30. +PEJGUVYKRU WUG EQPUVCPV 2CIGA*GKIJV # !
  • 32. +PEJGUVYKRU WYINGFPKGPKG PKGFQMNCFPQUEK RT[ UMNCFCPKW WUG EQPUVCPV %AKCOGVGT 5OKFIGP
  • 33. +PEJGUVYKRU WUG EQPUVCPV 9KPIA5KG 2CIGA9KFVJ %AKCOGVGT WUG EQPUVCPV (KTUVA.KPGA*GKIJV
  • 34. GMNCTCELC FYQEJ OKGPP[EJ INQDCNP[EJ 146 RTF. Leksykon kieszonkowy
  • 35. 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 DCLVQYP GZKV UWD IGVAKPRWV ] Rozdział 3. Przykładowe programy 147
  • 36. 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 FP 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 O5 NKPGU ] DTCM FCP[EJ YGLUEKQY[EJ RTKPV P0KE PKG YRKUCNGU! TQDKO[ YKGE RWUVC QMNCFMGP NKPGU A RWUV[ YKGTU _ EJQOR NKPGU WUWPKGEKG PCMQY P TGVWTP _ UWD FQEAKPVTQ ] 2QECVGM RNKMW 46( RTKPVH 46( ]TVHCPUK 148 RTF. Leksykon kieszonkowy
  • 37. FGHH]HQPVVDN ]H HTQOCP 6KOGU 0GY 4QOCP__ RCRGTY U RCRGTJ U FGHNCPIRNCKPHHU ]RCTFRCT_ 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 RXRIRJRI RQUZ U RQU[ U CDUY U CDUJ U OCR KPV A W[EKG V[NMQ NKED ECNMQYKV[EJ 9KPIA5KG 5OKFIGP 2CIGA*GKIJV 2CIGA*GKIJV
  • 39. 5OKFIGP %AKCOGVGT
  • 40. 5OKFIGP (KTUVA.KPGA*GKIJV RTKPV 46( PHHU]HU 2QYKGMUGPKG RKGTYUGIQ YKGTUC NKPGU ! GUE UJKHV NKPGU _P HQTGCEJ O[ NKPG NKPGU ] RTKPV 46( PNKPG GUE NKPG P _ RTKPV 46( PRCT_P_ MQPKGE FQMWOGPVW TGVWTP _ Rozdział 3. Przykładowe programy 149
  • 41. 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
  • 43. 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
  • 45. 9KPIA5KG NKPG 9KPIA5KG 2CIGA*GKIJV
  • 47. 9KPIA5KG NKPG 2CIGA9KFVJ 9KPIA5KG 2CIGA*GKIJV
  • 49. 9KPIA5KG NKPG 2CIGA9KFVJ 9KPIA5KG 2CIGA*GKIJV
  • 51. 9KPIA5KG TGVWTP _ 2QFRTQEGFWTC IGPGTWLCEC MQF 46( FNC NKPKK RQOKGF[ FYQOC RWPMVCOK PC UVTQPKG 150 RTF. Leksykon kieszonkowy
  • 52. 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( ]
  • 53. FQFQDZRCIGFQD[RCIGFQFJIV UFRNKPG FRRVZ UFRRV[ U FRRVZ UFRRV[ U FRZ UFR[ U FRZUKG UFR[UKG U FRNKPGY U FRNKPGEQT UFRNKPGEQI UFRNKPGEQD U _ AEQWPV Z [ Z [ PYAZ PYA[ Y J ITWDQUE NKPKK MQNQT 4)$ NKPKK TGVWTP _ AA'0AA Rozdział 3. Przykładowe programy 151
  • 54. 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: ]TVHCPUKCPUKERIWE FGHHFGHNCPIFGHNCPIHG ]HQPVVDN]HHTQOCPHEJCTUGVHRTS]
  • 55. RCPQUG _6KOGU 0GY 4QOCP_]HHTQOCPHEJCTUGV HRTS]
  • 56. RCPQUG _)GQTIKC__]EQNQTVDN TGFITGGPDNWGTGFITGGPDNWG_]UV[NGUJGGV]S NK TKYKFEVNRCTCURCNRJCCURPWOHCCWVQCFLWUVTKIJVTKPNKP KVCR HHUNCPINCPIHGEITKFNCPIPR NCPIHGPR UPGZV 0QTOCN_]
  • 57. 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[TOQF[JTOKP_]TGXVKO[TOQF[ JTOKP_]XGTUKQP_]GFOKPU_]PQHRCIGU_]PQHYQTFU_ ]PQHEJCTU_]
  • 58. EQORCP[ _]PQHEJCTUYU_]XGTP__YKFQYEVTN HVPDLCGPFFQEPQZNCVVQ[GPGZRUJTVPPQWNVTNUREFPVDNPUDFD Program użytkownika musi pobrać tytuł tego dokumentu, czyli Spectroscopic study of blue compact galaxies. III. Empirical popula- tion synthesis. 152 RTF. Leksykon kieszonkowy
  • 59. 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]VKVNGU
  • 60. =@_? _. 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]VKVNGU
  • 61. =@_? _ 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
  • 62. 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( KPP PGZV O]VKVNGU
  • 63. =@_? _U QT YCTP $TCM V[VWNW Y KPP PGZV RTKPV 6 KP WPGUE P _ UWD WPGUE ] O[ Z A=? Z ` U=EOEL?I WUWPKGEKG PKGRQVTGDP[EJ PCMQY PQYGIQ YKGTUC Z ` U =CH#(?]_RCEM % JGZ GI FGMQFQYCPKG ZZ TGVWTP Z _ AA'0AA 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]VKVNGU
  • 64. =@_? _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
  • 65. Uwagi na temat analizy plików RTF Należy zwrócić uwagę, że mogą wystąpić pewne problemy z wy- rażeniem regularnym O]VKVNGU
  • 66. =@_? _, 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]VKVNGU
  • 67. =@_? _ jest fakt, że prawidłowo odczytywane są jedynie pola VKVNG i inne metadane dokumentu. Nie jest Rozdział 3. Przykładowe programy 155
  • 68. 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] HQQVPQVGU
  • 69. =@_? _. Zastanówmy się jednak, co się stanie po odnalezieniu następującego kodu: ]HQQVPQVGRCTFRNCKPEJHVP 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