You are on page 1of 32

IDZ DO

PRZYKADOWY ROZDZIA
SPIS TRECI

KATALOG KSIEK
KATALOG ONLINE
ZAMW DRUKOWANY KATALOG

RTF. Leksykon
kieszonkowy
Autor: Sean Burke
Tumaczenie: Marcin Jdrysiak
ISBN: 83-7361-191-6
Tytu oryginau: RTF Pocket Guide
Format: B5, stron: 174

TWJ KOSZYK
DODAJ DO KOSZYKA

CENNIK I INFORMACJE
ZAMW INFORMACJE
O NOWOCIACH
ZAMW CENNIK

CZYTELNIA
FRAGMENTY KSIEK ONLINE

Wydawnictwo Helion
ul. Chopina 6
44-100 Gliwice
tel. (32)230-98-63
e-mail: helion@helion.pl

RTF (Rich Text Format) jest formatem dokumentw. Nie jest to jednak jzyk
znacznikw, ktry mgby by uyty do rcznego zakodowania caego dokumentu
(cho jest to moliwe). Wedug zaoe jego twrcw, RTF jest formatem danych,
ktre mog by odczytywane i zapisywane przez aplikacje dowolnego rodzaju.
Zaoenia te zostay spenione: obecnie setki aplikacji korzysta wanie z tego formatu.
Elastyczno RTF sprawia, e jest to idealny format do wielu zastosowa i moe by
wykorzystany zarwno do generowania faktur i raportw, jak i do tworzenia sownikw
na podstawie baz danych sw.
Niniejsza ksika stanowi wygodne rdo wiedzy na temat formatu RTF i omawia
sposoby uycia tego standardu, wcznie z informacjami niezbdnymi do napisania
programu generujcego pliki RTF.
W leksykonie opisano:
Podstawow skadni RTF
Zapis akapitw w RFT
Formatowanie znakw
Struktur dokumentu RTF
Funkcje dodatkowe
Style w kodzie RTF
Tworzenie tabel
Tworzenie plikw pomocy MS Windows
Cennym uzupenieniem informacji o RTF jest rozdzia powicony pisaniu programw,
generujcych pliki RTF, wraz z przykadowymi kodami rdowymi. Ta niewielka
ksieczka bdzie z pewnoci przydatna wszystkim, ktrzy chc skorzysta z tego
uniwersalnego i wygodnego formatu zapisu dokumentw tekstowych.

Spis treci
Rozdzia 1. Przedstawienie formatu RTF .............................. 5
Dlaczego format RTF?....................................................................................... 6
Podzia ksiki.................................................................................................... 7
Witaj wiecie w dokumencie RTF.............................................................. 9
Przedstawienie prostego dokumentu RTF................................................. 11
Podstawowa skadnia formatu RTF ............................................................ 15
Akapity............................................................................................................... 21
Formatowanie znakw ................................................................................... 35
Struktura dokumentu ..................................................................................... 47
Dodatkowe funkcje.......................................................................................... 62
Style..................................................................................................................... 84
Tabele.................................................................................................................. 92

Rozdzia 2. Tworzenie plikw pomocy MS Windows.... 111


Plik pomocy RTF podstawy................................................................... 111
Hipercza i wyskakujce cza .................................................................. 114
Dodatkowe informacje o tematach ............................................................ 117
Rysunki ............................................................................................................ 121
Problemy z plikami pomocy RTF .............................................................. 125
Dodatkowe informacje.................................................................................. 126

Rozdzia 3. Przykadowe programy .................................... 127


Generator kalendarza.................................................................................... 127
Program wywietlajcy zawarto katalogu............................................ 134
Program do projektowania kopert na pyty (origami) .......................... 140
Narzdzie do pobierania metadanych RTF ............................................. 152
Uwagi na temat analizy plikw RTF......................................................... 155

Rozdzia 4. Uyteczne informacje ........................................ 157


Tabela znakw ASCII-RTF .......................................................................... 157
Sekwencje ucieczki dla polskich znakw ................................................. 165
Kody jzykw RTF ........................................................................................ 166
Konwersja odlegoci na twipy................................................................... 168

Skorowidz................................................................................... 171

Spis treci

Rozdzia 3. Przykadowe programy


Standard RTF, podobnie jak kady inny format dokumentw, nabiera znaczenia dopiero w kontekcie jego wykorzystania, czyli
sposobu formatowania, odczytywania i zapisywania dokumentw. Kwestie analizowania i przetwarzania kodu RTF wykraczaj
jednak poza tematyk niniejszej ksiki, aczkolwiek przedstawione w tym rozdziale przykadowe programy przedstawiaj
typowe problemy i trudnoci, na jakie mona natkn si w czasie generowania dokumentw RTF z poziomu aplikacji. Wszystkie
omawiane narzdzia i programy pokazuj sposb wykorzystania rnych funkcji, jakie zapewnia standard RTF.
Wszystkie opisane w tym rozdziale programy zostay napisane
w Perlu. Aby uatwi poznanie ich dziaania, w kodzie rdowym umieszczono obszerne komentarze. Jeeli Czytelnik planuje
generowanie wasnych dokumentw RTF z poziomu aplikacji Perl,
warto skorzysta z kilku przydatnych moduw, jakie s dostpne
w bibliotece CPAN (http://search.cpan.org). Godne polecenia s
przede wszystkim moduy RTF::Writer i RTF::Generator. aden
z tych moduw nie zostanie jednak uyty w poniszych przykadach, poniewa przedstawiaj one sposoby generowania dokumentw RTF bez porednictwa dodatkowych interfejsw API
lub moduw Perl.

Generator kalendarza1
Przedstawiony tu program tworzy nowy plik RTF, zapisuje
prolog dokumentu oraz kolejne akapity (poszczeglne akapity
1

Program tworzy kalendarz w jzyku angielskim. Nie zmieniem tego,


poniewa pozwala to na omwienie pewnych funkcji, ktre nie s
uywane w polskich dokumentach, a ktre mog by przydatne.
Wtreci rozdziau umieciem informacje, ktre pozwol czytelnikom
zmodyfikowa kod samodzielnie przyp. tum.

Rozdzia 3. Przykadowe programy

127

s tworzone za pomoc ptli ) i zamyka dokument, dodajc pojedynczy znak }. Kady akapit stanowi nagwek dla
strony kalendarza. Na poszczeglnych stronach umieszczane s
nagwki dla kolejnych dni tygodnia. Gotowy kalendarz mona
wydrukowa, dziki czemu zawsze dostpny bdzie przydatny
terminarz do zapisywania notatek, terminw spotka i podobnych informacji.
Aby uzyska puste miejsce pomidzy kolejnymi nagwkami, naley uy polecenia  z parametrem w postaci do duej liczby.
Poniej przedstawiono fragment kodu rdowego pliku RTF:

   
  
   
   

  ! 
" !
   
   

  ! 
"#  
   
   

   
$# %
  &' 
   

   
( 
  # &' 
   

   
) # 
   &' 
   

   
(  *
  &' 
   

Deklaracje poszczeglnych akapitw rni si dla soboty


i niedzieli przydzielane jest mniej miejsca (tylko 2900 twipw
zamiast 6060 twipw). To ustawienie jest w programie kontrolowane przez zmienn + ', ktra otrzymuje warto staej
&,-./01 lub &,-."$,22 w zalenoci od wartoci zmiennej +3 .
Dla kadego miesica stosowana jest inna czcionka. Odbywa si
to poprzez dodanie do  wyniku operacji #4, gdzie 4 jest
operatorem moduu w Perlu. Oczywicie wszystkie uywane

128

RTF. Leksykon kieszonkowy

czcionki s definiowane w tablicy czcionek. Rysunek 3.1 przedstawia przykadowe strony kalendarza.

Rysunek 3.1. Przykadowe strony kalendarza


Z dziaaniem programu mog by zwizane dwa drobne problemy, ktre mog ujawni si po dokonaniu zmian w kodzie
rdowym.
Na pierwszy potencjalny problem mona natkn si przy prbie
utworzenia polskiego kalendarza. Poszczeglne cigi w dokumencie RTF nie przechodz przez procedur obsugi sekwencji
ucieczki. Nie ma potrzeby uywania takiej procedury w oryginalnym kodzie programu, poniewa nie s uywane znaki typu
\, {, } lub 8-bitowe znaki. Jeeli jednak konieczne bdzie
uycie polskich nazw miesicy i dni tygodnia, naley zmieni
odpowiednio wiersz #. W takim przypadku w kodzie programu mog pojawi si wiersze w nastpujcej postaci:

   %
5# 673 8  #   

Rozdzia 3. Przykadowe programy

129

Wikszo procesorw tekstu odrzuci dokument RTF zawierajcy


taki wiersz, gdy uyto w nim znaku . Poniewa jest to 8-bitowy
znak, naley zastpi go waciw sekwencj ucieczki (w tym przypadku bdzie to sekwencja 9 ) w sposb opisany w rozdziale 1.
Drugi problem jest zwizany z faktem, e program umieszcza
w kodzie dokumentu RTF wartoci numeryczne bez sprawdzenia,
czy s one liczbami cakowitymi. W przedstawionym wczeniej
fragmencie kodu uyto wartoci, ktre z ca pewnoci s liczbami cakowitymi (6060 i 2900). Wyobramy sobie jednak, e
program zosta przystosowany do druku na papierze o innych
rozmiarach (obecnie uywany jest papier w formacie US letter).
Wikszy odstp pomidzy kolejnymi nagwkami ustawiono na
10 cm, a mniejszy odstp na 5 cm.
Zgodnie z tabel Konwersja rnych jednostek dugoci na twipy
w rozdziale 4. ustalono, e 10 cm to 5669 twipw, dlatego kod
programu przyjmie nastpujc posta:
'##&,-./01:;<!=
'##&,-."$,22:;&,-./01>=?  '&,-./01

Sprawi to, e staa &,-."$,22 uzyska warto 2834,5, a kod rdowy dokumentu RTF bdzie wyglda tak jak poniej:

  <! 
  
   
   

    
" !
   
   

    
"#  
   
   

  <! 
$# %
  &' 
   

Poniewa parametrami sw kluczowych RTF mog by tylko liczby cakowite, polecenie  * < zostanie zinterpretowane jako
 * (czyli polecenie  z argumentem 2834) i dwa znaki <,
przez co na wydruku pojawi si nagwki <" !

130

RTF. Leksykon kieszonkowy

  i <"#    . Do przeksztacania wartoci numerowych na posta liczb cakowitych w wikszoci jzykw programowania (wcznie z Perlem) suy polecenie #, ktre moe by uyte w nastpujcy sposb:
#@(
9
  4 4
44
  444  9 A#A



 

Drugie polecenie # jest w gruncie rzeczy niepotrzebne, poniewa operator 4 w Perlu zawsze zwraca warto cakowit, ale
warto zachowa ostrono.
Programici znajcy dobrze formaty () # szybko odgadn, e
identyczny efekt mona uzyska za pomoc formatu 4 (liczba
cakowita wyraona dziesitnie), ktry zastpi polecenie #:
#@(
9
   
44
  444  9 A#A
+ '
+#4

Ta metoda dziaa rwnie dobrze jak poprzednia, a wybr jednej


z nich jest zaleny od osobistych upodoba programisty.
Przedstawione tu podejcie do generowania dokumentw RTF
moe by zaadaptowane w celu drukowania kart pyta i odpowiedzi zamiast kalendarza. Karty tego typu s czsto stosowane
do nauczania jzykw obcych. Jeeli dokument jest drukowany
dwustronnie, program powinien umieci wszystkie pytania na
jednej stronie (na przykad a book lub to read), a odpowiadajce im odpowiedzi na drugiej (na przykad ksika lub
czyta). Po przeciciu gotowej strony na p pozwoli uzyska
dwie karty pyta i odpowiedzi. Program generujcy takie karty
moe pobiera dane wejciowe z pliku zawierajcego kolejne
wiersze w postaci : 
 , na przykad 3:3BC3
lub   :'6D.

Rozdzia 3. Przykadowe programy

131

Poniej przedstawiono peny kod programu generujcego kalendarz:


?E> >#>  
 <=
 '=
 ##8=
?F5 8 #6 ''# #G G
?5 6 #3#  H
?&#'G'I
'##"JKL&".0.&,-:;*MM=
'##&,-./01:;=? '
'##&,-."$,22:;!=? '
?L 6# 36 # 8
 #@(A; 3 A  +E=
#@(9
 %# 

#
, =
% #(@#=
 #8%  #<
9=
?&#'G'63#6#6
?' #8 #
N#:F
O#   $ ', $O#
O,8"  L'  &'
H=
N :F
"# $# ( ) # (    " 
H=
?P#  6G 6##' 3 6'8 #
+#:FH=
+# :+#Q M"JKL&".0.&,-=
F+#R:+# H

F+ +#+ +3 H:F8F+#HHS<* T=


+ ':&,-./01=

132

RTF. Leksykon kieszonkowy

+ ':&,-."$,22+3 :: +3 ::=


 #@(
9
  4 4
44
  444  9
A#A
+ '
+#4?6#'6'#3 36 8'
+ S+3 T+ F+ H+#S+#T+ Q
%!
=
+#Q:"JKL&".0.&,-=

?U3#'6#63#' 3 6G'6 8 
#@(AA=
'F@(H=
V=


?#3'G6 'G'' 6 3  #


?'# 63  :;A A 63'6
?#6#6 A   AE
+#:F+.STWWH=
  #99#+## +#::#F+#H=
+#4:%=
  #99+#::%% +#::% +#::% =
+#4:%=
  #99+#::%=
  #9# 9+#::=
  #9 9+#:: =
  #99=

..J&..

Rozdzia 3. Przykadowe programy

133

Program wywietlajcy
zawarto katalogu
Przedstawiony w tej czci rozdziau program odczytuje podany
katalog (lub biecy katalog, jeeli nie podano innego) i tworzy
wydruk jego zawartoci, ktry jest umieszczany w tabelach dokumentu RTF. Innymi sowy, jest to bardziej rozbudowana wersja
polecenia X w Uniksie lub  w systemie MS-DOS.
Podstawowa struktura tego programu jest bardzo prosta. Po uruchomieniu program sprawdza obecno argumentu wiersza polece (zmienna +,@1YST), w razie potrzeby odczytuje biecy katalog, a nastpnie wywouje trzy podprocedury ( . ,  
i .# ), a nastpnie koczy prac.
Generowanie kodu tabeli odbywa si w funkcji . , ktrej
argumentami s nazwa, wielko i data modyfikacji pliku. Funkcja
umieszcza te informacje w komrce tabeli zbudowanej z trzech
kolumn; na przykad wiersz tabeli zawierajcej komrki *<**,
' % 8 i  Z Z   I[ jest wyraany w postaci nastpujcego bloku kodu rdowego RTF:
   8 !'  %< '  %<
 '  %< '  %< 'V%*
'  %< '  %< '  %<
 '  %< 'V%
'  %< '  %< '  %<
 '  %< 'V
  #
%%*<**'

' % 8'
'
% Z Z  9 [' 

Na szczcie ten mao czytelny kod dokumentu RTF jest tworzony


automatycznie poprzez wywoanie funkcji . F

 
 H. Znaczenie poszczeglnych polece do generowania tabel zostao przedstawione szczegowo w podrozdziale
Tabele w rozdziale 1.

134

RTF. Leksykon kieszonkowy

Podprocedury ', # i ' mona wykorzysta we wasnych programach. Pierwsza podprocedura implementuje prost funkcj
do obsugi sekwencji ucieczki, natomiast podprocedury # i '
pozwalaj na podawanie wszystkich dugoci w calach lub centymetrach zamiast w twipach. Dziaanie obu podprocedur mona
sprawdzi w funkcji . , w ktrej poszczeglne polecenia
'V
 zostay oparte na licie #F <H#F* <H#F< [<H.
Z pewnoci jest to znacznie wygodniejsza metoda definiowania odlegoci ni lista %*%, ktra wymaga rcznego
przeliczania centymetrw lub cali na twipy.
Wybr funkcji #F H lub 'F H jest zaleny od preferencji uytkownika, poniewa jednostki dugoci i tak musz
zosta przeliczone na twipy przed utworzeniem tabeli. Warto
porwna t metod ze sposobem uyciem polecenia # we
wczeniejszym przykadzie programu generujcego kod RTF.
Poniej przedstawiono peny kod rdowy omawianego programu:
?E> >#>  
 <=
 '=
 ##8=
?F5 8 #6 ''# #G G
?5 6 #3#  H
+  :+,@1YSTWW9 9=
?O6#  # 8# 6 '#
?#6'6 '6'838
F+  9 9 +  9 >9H

K =?6 #3#3'G8'


+  :8' FH=
?( 66#' #'63#3A A


Rozdzia 3. Przykadowe programy

135

?5 6 # 'G#G  #38E


A6# '6'38+  A
#Z+  # Z .# Z .=
?)#  '  3#G''63
?  'GG'6 8 I
. F+  H=
  F+  H=
.# F+  H=
V=
?ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
?( 6  '   '#'6I
#
#F%**M+.STH?'Z; 
'
#F<[M+.STH?'# Z; 
'
?6 '# #8'8G3  #3 @(
+#:+.ST=
+#:\
FS]ZA9^+ .Z6,ZUZ!TH

 #FA94VA F+%HH8=
?5 '  3#G'G  'G#6G8#
?#8G_#' ZZ  6 6 6%
  #+#=

?ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
?&3 'G 6'6##'8#' 6 # #'
 3I
FN04"6.4(.H=
   
?3##8#86 # 8 
+  :+.ST=
'#.  F+  H=?  # #'
 #9
  '<9'F+  H9  9A##A=
?#83 #I#638

136

RTF. Leksykon kieszonkowy

. F+.+"6.
+.+(.
+.H 'N0=
?G # 6 36 8 3
 #9
  %**%**S5ET9#N0=
  #=

?ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
'#.  

?U # #' 3


?F6# 66#3'G   H
?)3 6# #3'G 3
?
+  :+.ST=
 #  F0+  H  A6# 6'+  I+EA=
F++. H=
F # F+:   F0HHH

#V+9 9 +9 9=


 N0+=
F+"6.
++(.
+H:FZ%Z%H=
+. :A+  >+A=
F+"6.
++(.
+H:
FF+. HHS[!T
Z+. =

'  F0H=
N0: .#N0=
?$6#6#'A.#A#A.AA.6A
  #=

?( 6  #I
.#
'='F+H' 'F+H

Rozdzia 3. Przykadowe programy

137

.
+(.
+R:;+(.
+
.6
+"6.
+R:;+"6.
+
?ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
. 

?)8# # 66#63'  3


?F6# 66#3'G   H
F+#+6+H:N.=
+#. :99=
F+6::Z%H
?66#'6#3 38
+#. :99=? 8 #
+:99=
+6:99=

?(G 3
+: . F+H=
%+6:\>F HF   FW+HH>+%+>
?& # 6'#3 3' 3I% *<:;A% *<A

 #9   8 !9=?5'63 3 'G 6@(
+  :G#AA 9' 9 +. 9 %< 9
F H=?'6#63'3  6
 #+  9'V9+.A#A
 #F <H#F* <H#F< [<H=? 3 'G G
3  63 3
?63 '6# #6#'
 #?G3 3'6 'I
9  #
%%9'F+6H9'9
? ##  G! #3K   8 #
9
9+#. 'F+#H9'9
? ## G(@#
9'
%9'F+H9'9
?   3#! #3, 

138

RTF. Leksykon kieszonkowy

9 9A##A
=
  #=

?ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
 . 

+  :+.ST=
 #RR9J&.@(."(,@(9=

 %# 

#
, =
%  #K  =

 #(=
 #8%* '  #*# 
J&.@(."(,@(
?83 #6 G''638 6#I
 #9
      #%# 9
'F+   99  . FHH
9Z ' 8#  9A##A=
  #=

 .# 

+  :+.ST=
 #A##A=
  #=

 . 

+:+.ST=
F+-+$+&++H:F'F+HHS<* %T=
  # #A4* Z4 Z4 4 I4 A+-Q%!+$Q%+&
++=

..J&..

Rozdzia 3. Przykadowe programy

139

Program domylnie nie otwiera nowego pliku, a jedynie wysya


kod RTF do standardowego wyjcia. Uytkownik moe jednak
przekierowa wyjcie w powoce. Poniej pokazano sposb wykonania tej operacji w systemie Windows:
KI; 

 ! "#  #$
%&'(
 
KI;  %&'(
 

Rysunek 3.2 przedstawia uzyskany dokument w oknie MS Word.

Rysunek 3.2. Wynik programu rtfdir

Program do projektowania
kopert na pyty (origami)
Kolejny przykadowy program generuje pojedyncz stron, ktra po waciwym zagiciu moe posuy jako koperta dla pyty

140

RTF. Leksykon kieszonkowy

CD. To narzdzie bdzie szczeglnie przydatne dla osb, ktre


zawsze maj wicej nagranych pyt CD-R ni pustych pudeek
na nie.2
Po uruchomieniu program oczekuje na wprowadzenie informacji,
ktre zostan wydrukowane na etykiecie, a nastpnie generuje
plik RTF z etykiet umieszczon we waciwym miejscu strony.
Drukowane s rwnie linie wskazujce miejsce zagicia strony.
Sposb tworzenia koperty na pyt i kolejno zaginania strony
przedstawiono dokadnie na rysunkach od 3.5 do 3.8.
Program wykorzystuje dwie zaawansowane funkcje RTF, a mianowicie dokadne pozycjonowanie akapitw i rysowanie linii.
Tekst jest rozmieszczany za pomoc polece   8  8  
 , ktre zostay przedstawione w podrozdziale Dokadne pozycjonowanie akapitw w rozdziale 1. Bez funkcji
dokadnego pozycjonowania akapitw nie ma adnej gwarancji,
e tekst bdzie widoczny po zagiciu strony. Ta sama metoda
jest zreszt uywana do drukowania tekstu na naklejkach i kopertach.
Bardzo wan rol odgrywa polecenie Z  . Jeeli
uytkownik wprowadzi zbyt duo informacji, program ukryje
nadmiarowy tekst. Co wicej, wszystkie informacje, jakie s
wpisywane przez uytkownika, przechodz przez procedur ',
ktra zapewnia obsug nietypowych znakw. Jeeli wic zostanie podany tekst G3` 3, program automatycznie zmodyfikuje go, przez co cig wynikowy bdzie mia prawidow
posta G39!' 3.

Chciabym podzikowa Tomowi Hullowi z wydziau matematyki


Merrimack College, ktry zaprojektowa sposb zaginania strony. Wicej
informacji mona znale pod adresami http://web.merrimack.edu/hullt/
i http://papercdcase.com/.

Rozdzia 3. Przykadowe programy

141

Konstrukcja suca do rysowania linii jest bardziej rozbudowan wersj analogicznej konstrukcji z podrozdziau Rysowanie linii w rozdziale 1. Generowanie kodu RTF dla linii przechodzcej przez dwa punkty jest bardziej skomplikowane ni
interpolacja dwch par punktw (x,y), poniewa konieczne jest
wykonanie pewnych oblicze matematycznych. Kod wykonujcy
to zadanie zosta umieszczony w podprocedurze #, ktra jest
wywoana w rnych miejscach programu.
Rysunek 3.3 przedstawia wygld pliku wygenerowanego przez
przykadowy program.
Niestety, prostsze edytory tekstu nie obsuguj niektrych zaawansowanych funkcji RTF, ktre su, na przykad, do dokadnego pozycjonowania akapitw i rysowania linii. Prawidowo odczytywany jest jedynie tekst znajdujcy si w otwieranym pliku.
Rysunek 3.4 przedstawia ten sam dokument w oknie programu TextEdit, czyli prostego edytora tekstu, ktry stanowi cz
systemu Mac OS X.
Czytelnik moe si zastanawia, dlaczego w programie nie s
uywane konkretne wartoci, jak na przykad #F%%%*
%%H, ale bardziej skomplikowane konstrukcje typu #F
58.a8M >* 58.)  58.a8M >*H. Istniej dwie przyczyny, dla ktrych zastosowano takie rozwizanie. Po pierwsze,
uycie takich wyrae pozwala lepiej zrozumie geometri zagi
i sposobw zoenia origami (w tym celu warto zoy i ponownie rozoy kopert, a nastpnie przyjrze si liniom skadania). Druga przyczyna jest bardziej praktyczna przy zmianie formatu papieru z US letter na A4 konieczna jest zmiana
wszystkich rozmiarw kartki papieru. To zadanie mona sobie
znacznie uatwi, jeeli zamiast konkretnych wartoci zdefiniowano zmienne, poniewa wyraenia typu 58.a8M >* uatwiaj byskawiczne przeliczanie rozmiarw.

142

RTF. Leksykon kieszonkowy

Rysunek 3.3. Koperta origami na pyt CD


Program moe odczytywa dane wejciowe z pliku, na przykad:
4 " )*
*
+!
 ,

Oczywicie mona rwnie uy standardowego wejcia, na


przykad:

Rozdzia 3. Przykadowe programy

143

Rysunek 3.4. Wygld dokumentu w programie TextEdit


4- " )*
*
+!
 ,

lub:
4.#!) /

Program moe rwnie odczytywa dane bezporednio z konsoli:


4
)  63 3 3# ##'#GJ# JL
F'# Q6H
!"
!#$
!#%
!#&
' (  # ) * + *,



 -

Niezalenie od wybranej metody, program zapisze informacje


o okadce pyty CD do pliku cd_case.rtf. Wyjcie z programu
odbywa si za pomoc klawiszy Ctrl+C. Jeeli nie podano adnych informacji, program utworzy pust kopert, czyli stron
bez nadruku, ale ze wszystkimi liniami zagicia. Plik wynikowy
mona otworzy w procesorze tekstu i dokona edycji etykiety
144

RTF. Leksykon kieszonkowy

lub natychmiast go wydrukowa. Sposb zoenia koperty przedstawiono na rysunkach od 3.5 do 3.8.

Rysunek 3.5. Krok 1 pionowe zoenie kartki


Poniej przedstawiono peny kod programu:
?E> >#>  
 <=
 '=
 ##8=
?F5 8 #6 ''# #G G
?5 6 #3#  H
?ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
?&3 'G'I
'##,*:;=?U##%G 3G6#
   6,*

Rozdzia 3. Przykadowe programy

145

Rysunek 3.6. Krok 2 poziome zoenie kartki


'##0#' :;%**=?F '6##33# GH
'##58.) :;,*^%%!!IF <M0#' H=
'##58.a8:;,*^% *IF%%M0#' H=
'##" 8#:;%>M0#' =?68 ##
?# 3 #' 63 #
'##K&.& :;" 8#Q* [<M0#' =
'##)#8."6:;F58.) ZK&.& H>=
'## .2#.a8:;*M%=
?ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
?&3 'G '6##'8#'I

146

RTF. Leksykon kieszonkowy

Rysunek 3.7. Krok 3 woenie pyty CD


+:A' .' A=
N#=
?1#'6' 8 I
8.# FH=
 #F@(A;+AH  A6# 6'+ 6 I+EA=
'.# FH=
. .8 FH=
#.VFH=
'F@(H=
#A#_ 6#+FAZ+AGH#A=
V=
?ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
8.# 

Rozdzia 3. Przykadowe programy

147

Rysunek 3.8. Krok 4 zamknicie koperty


 #A)  63 3 3# ##'#GJ#
JLFA
F+]L:\>$")#>H^A'# Q6H#AIA'# Q H#A
#N,@1Y=
?) #36G66#   'G#8
?)# 6'# Q6#63##
? #8G'# Q
N#:R;=?5 # #'G''F6 3
?#  8G'3#H
#F8  >">N#H
? 3 #'G''
 #A#'# ^U ' 3 3 #A=
N#:F9.9H=?  6

' FN#H=?#'6#3#
  #=

?ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
 '.# 
?5'63 3@(
 #@(9
 %#

148

RTF. Leksykon kieszonkowy

 
#
 #(@#=
   4   4 #8%  #

    
9#F <Q58.) H#F <Q58.a8H=
  #=

?ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
 #.V

?U #6 'N# '6G# 66'6#


?3 '66'  '  'F+#H
 #@(9
    8  8
 V4 4
4Z4
9 #F+.Q <H?6'3'6'3'
)#8."6Q" 8#
58.a8Z58.a8M%>*
ZK&.& Z .2#.a8
K&.& ZM" 8#
K&.& ZM" 8#Q .2#.a8
=
 #@(A#
*A
?536#  68 6
N#^'FN#HI99
A#A=
 '+#FN#H

 #@(A##A'F+#HA#A=

 #@(A#  #A=?3#' 3#
  #=

Rozdzia 3. Przykadowe programy

149

?ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
'
?6 '#'8G3  #3 @(
+#:+.ST=
+#:\
FS]ZA9^+ .Z6,ZUZ!TH

 #FA94VA F+%HH8=
?_6#G'G3#'G''63#6G8#
  #+#=

?ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
 . .8 
? #63'#E
? #ZZZZZZZ# 
#F58.a8M >*
58.) 58.a8M >*H=
? #WW 8   
#F)#8."6Q" 8#>
)#8."658.a8H=
#F58.) Z)#8."6Z" 8#>
58.) Z)#8."658.a8H=
? #> 8 #G#
?>
#F)#8."658.a8M >*
F58.a8M >*HQ)#8."6H=
#F)#8."658.a8M >*
F58.a8M >*HZ)#8."6H=
#F58.) Z)#8."658.a8M >*
58.) F58.a8M >*HQ)#8."6H=
#F58.) Z)#8."658.a8M >*
58.) F58.a8M >*HZ)#8."6H=
  #=

?ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
?5 '  8# G'3 @( #
?  6  #3# #
150

RTF. Leksykon kieszonkowy

+6.'#=?6##'6#3
#
? ##FVH FVH
F+V%+%+V+H: #F <Q+.HN.=
?"  6###'6 '   
K =
' 3A#FH8'6 '   A#N.::*=
?_63#  6 #'88 #8 8 #
+#.V:F+V%R+VH^+V%I+V=
+#.:F+%R+H^+%I+=
+V%Z:+#.V=+VZ:+#.V=+%Z:+#.=+Z:+#.=
?)  6 #FV%%HFVH #6 88 #8
 8
+:F+V%Z+VH=? 8' 6
+:F+%Z+H=? 8' #
+6.'#QQ=
 #@(9
M  V 8  8  84 #
 V4 4 V4 4
 V4 4 V64 64
 #4 #' 4 #'84 #'4

9+6.'#
+V%+%+V+
+#.V+#.++
%<?8 '#
?3 @1/#
=
  #=

..J&..

Rozdzia 3. Przykadowe programy

151

Narzdzie do pobierania metadanych RTF


W podrozdziale Struktura dokumentu w rozdziale 1. poznalimy metadane dokumentu, ktre mog by wyraone w postaci grupy #. S to takie metadane jak
 

i
 . W tej czci ksiki poznamy prosty program, ktry wyszukuje pola metadanych w dokumentach RTF.
Zamy, e uytkownik otrzyma zadanie skatalogowania cyfrowej biblioteki z artykuami naukowymi. W bibliotece znajduje si kilka tysicy takich artykuw w postaci plikw RTF,
a ich pene tytuy s zapisane w polu
  .
Konieczne jest pobranie tytuu kadego dokumentu i przekazanie
go do gwnego katalogu artykuw. Typowy dokument rozpoczyna si od nastpujcego kodu RTF, ktry jest generowany
przez program MS Word:

 %##' 8%<'% [ #8%  #8%

#
 #'  
M #
 <*< *(@#=
[ #' 
 
M #*<<*<  1 8=
' =
  8 #=  8 #<<=

%
  '     # G 8 ##
 [#8% #8% '8  #8# %
#8# % #V =
M'% &
5 8  #=
#
 
 )"#)
 0,
111&

)
 " 



3   8VI#8VI '#
#8VI ' 
   b# 1/a

'    %% #**


    %%
 #!
 # 
 #
# 8%
# 

#' 
M' # 
#' 
 #*[ ' 
#G# '#V#V  ##  ' ## 

Program uytkownika musi pobra tytu tego dokumentu, czyli


Spectroscopic study of blue compact galaxies. III. Empirical population synthesis.

152

RTF. Leksykon kieszonkowy

Gdyby Word umieszcza kade pole metadanych w oddzielnym


wierszu, wystarczyoby uy narzdzia grep do wyszukania cigu
, a nastpnie odczyta dany wiersz w postaci
" 'Z
 ' ' ' '8V 000 J  '  Z
##. Niestety, MS Word, podobnie jak wikszo proce-

sorw tekstu, nie tworzy uporzdkowanego i czytelnego kodu


RTF. Oznacza to, e narzdzia typu grep nie bd zbyt przydatne.
Skutecznym rozwizaniem tego problemu bdzie wczytanie caego
dokumentu do pamici i wyszukanie tekstu, ktry jest zgodny
ze wzorcem
 . Ten sam wzorzec mona wyrazi
jako wyraenie regularne Perla >
MFS]TQH>.
Niektre dokumenty mog jednak zawiera osadzone rysunki,
przez co ich wielko znacznie wzrasta. Naley jednak sobie
przypomnie, e grupa # (zawierajca pole  i wszystkie
inne metadane) zawsze znajduje si na pocztku dokumentu,
przed jakimikolwiek danymi. Teoretycznie rwnie sekcje pliku
RTF umieszczone przed grup # mog by bardzo due, ale
w praktycznie wszystkich przypadkach ta grupa znajduje si
w pierwszych 10 kB pliku. Wystarczy wic odczyta do pamici
tylko pocztkowy fragment dokumentu i wykona dan operacj.
Utworzylimy ju wyraenie warunkowe >
MFS]TQH>
do wyszukiwania tekstu i odkrylimy sposb badania dokumentw. Pozostaa cz rozwizania wymaga jedynie otworzenia
kadego dokumentu, ktrego nazwa zostaa podana w wierszu
polece. Odczytany tytu musi by przekazany przez procedur
zastpujc sekwencj ucieczki waciwymi znakami:
?E> >#>  
 '=
 '+#FN,@1YH

#V#Z+## Z .=?5#'#'6#' 3

Rozdzia 3. Przykadowe programy

153

 #0+#  #FA6# 6'+#  '6I


+E#AH#V=
  0+.%.  #FA6# 3#' '66+#I
+E#AH#V
'F0H=
>]
 >  #FA(#G 3@(I+##AH#V=
>
MFS]TQH>  #FA/ 3+##AH#V=
 #A(+#IA#'F+%HA#A=

#'

+V:+.ST=
+V:\>S''GT>>8=?#'#  6#'6#3#8
 6
+V:\>9FSZ,ZZ!T
H> '3FAKAVF+%HH>8=?
 3 #9VV
  #+V=

..J&..

Wiksza cz kodu jest odpowiedzialna za obsug rzadkich


lub nietypowych bdw. Program sprawdza, czy kady plik
.rtf mona otworzy i odczyta, a take czy zawiera na pocztku
sekwencj znakw
 . Najwaniejsza operacja jest wykonywana
przez wiersz zawierajcy wyraenie regularne >
M
FS]TQH>, ktre zapisuje tytu dokumentu do zmiennej +%.
Uzyskany tytu jest wywietlany na ekranie.
Poniej przedstawiono typow sesj pracy z programem, ktry
zwraca tytu dokumentu przekazanego poprzez wiersz polece:
4 *
 2 
  % " ' ' ' ' '8V 000
J  '  ##

154

RTF. Leksykon kieszonkowy

Uwagi na temat analizy plikw RTF


Naley zwrci uwag, e mog wystpi pewne problemy z wyraeniem regularnym >
MFS]TQH>, jakie zostao uyte
do implementacji koncepcji wzorca
 . Tworzc
kod programu, przyjto zaoenie, e tytu nie moe zawiera
znakw } ani adnych innych kodw formatujcych (patrz
rozdzia 1.). Oznacza to, e nigdy nie bdzie moliwe uycie
tytuu
 P 
 K#8 , a jedynie

P  K#8 . Uyte w naszym programie wyraenie
regularne zawiedzie, jeeli znak } nie zosta wyraony jako
9[ (co jest zalecane w niniejszej ksice), ale jako  (co rwnie jest dozwolone w specyfikacji standardu RTF).
Wyobramy sobie, e otrzymalimy dokument zatytuowany Optimizing {n,xN} Grammars. Tytu ten mona wyrazi jako

L 6#89[V9[ 1  . W takim przypadku wyraenie
regularne odszuka cig L 6#89[V9[ 1  , a podprocedura #'F+%H prawidowo zastpi sekwencje ucieczki, dziki
czemu uzyskamy peny tytu dokumentu. Rwnie dobrze mona
wyrazi ten sam tytu w postaci
L 6#8
V1 Z
 . Wyraenie regularne odszuka teraz jedynie pocztkowy cig
L 6#8 . Najprostszym sposobem rozwizania tego problemu bdzie upewnienie si, e aden dokument nie zosta zakodowany w ten sposb. W tym celu wystarczy jedynie wyszuka sekwencj znakw 
. Na szczcie znaki { i } zwykle
stosowane jedynie w matematyce i informatyce, dlatego problem
wystpuje do rzadko. Pozostawiam Czytelnikowi zadanie utworzenia wyraenia regularnego, ktre w elegancki sposb rozwie
ten problem, a jednoczenie w dalszym cigu bdzie zatrzymywao si po odczytaniu tylko znaku {.
Znacznie powaniejszym problemem zwizanym z implementacj wzorca
    jako wyraenia regularnego
>
MFS]TQH> jest fakt, e prawidowo odczytywane
s jedynie pola  i inne metadane dokumentu. Nie jest
Rozdzia 3. Przykadowe programy

155

moliwe zastosowanie tego podejcia dla innych struktur RTF,


w ktrych wykorzystywane s kody formatujce i zagniedone grupy.
Zamy, e konieczne jest przechwycenie zawartoci wszystkich
przypisw w dokumencie. Po zapoznaniu si z opisem kodu
przypisw w rozdziale 1. uytkownik zadecydowa, e wystarczy
wykorzysta wyraenie regularne, zastpujc sowo kluczowe
 przez sowo #. W efekcie uzyskano wyraenie >

#MFS]TQH>. Zastanwmy si jednak, co si stanie po
odnalezieniu nastpujcego kodu:

#   #'#
I"
G$ J 0 1#

Uyty wzorzec zatrzyma si na pierwszym znaku }, dlatego


odczytany zostanie tylko cig: "
G$ J , natomiast dalsza cz przypisu (0 1#) zostanie pominita.
Niestety, nie da si rozwiza tego problemu poprzez modyfikacj wyraenia regularnego, gdy takie wyraenia nie obsuguj
zagniedonych grup. W tym przypadku konieczne jest dopasowanie znaku } do otwierajcego znaku { z uwzgldnieniem wszystkich zagniedonych grup
, jakie znajduj si
wewntrz tej pary znakw.
W takiej sytuacji najlepszym rozwizaniem bdzie uycie prawdziwego analizatora kodu RTF. Istniej dwa podejcia do analizy
takiego kodu. Bardzo proste narzdzia po prostu odczytuj kolejne
polecenia kodu rdowego, natomiast zoone aplikacje kompiluj
kod RTF do postaci rozbudowanych drzew, ktrych struktura reprezentuje poszczeglne elementy dokumentu (na przykad akapity i tabele). Nie oznacza to jednak, e taki program zapewni informacje o danej strukturze grupy w pliku. Dalsza dyskusja na
temat obu metod analizy wykracza jednak poza tematyk niniejszej ksiki, gdy jest to gwnie domena interfejsw API konkretnych bibliotek programistycznych w wybranym jzyku.

156

RTF. Leksykon kieszonkowy

You might also like