rtf. leksykon kieszonkowy

32

Click here to load reader

Upload: wydawnictwo-helion

Post on 28-Nov-2014

1.608 views

Category:

Documents


5 download

DESCRIPTION

RTF (Rich Text Format) jest formatem dokumentów. Nie jest to jednak język znaczników, który mógłby być użyty do ręcznego zakodowania całego dokumentu (choć jest to możliwe). Według założeń jego twórców, RTF jest formatem danych, które mogą być odczytywane i zapisywane przez aplikacje dowolnego rodzaju. Założenia te zostały spełnione: obecnie setki aplikacji korzysta właśnie z tego formatu. Elastyczność RTF sprawia, że jest to idealny format do wielu zastosowań i może być wykorzystany zarówno do generowania faktur i raportów, jak i do tworzenia słowników na podstawie baz danych słów.Niniejsza książka stanowi wygodne źródło wiedzy na temat formatu RTF i omawia sposoby użycia tego standardu, włącznie z informacjami niezbędnymi do napisania programu generującego pliki RTF.W leksykonie opisano:* Podstawową składnię RTF* Zapis akapitów w RFT* Formatowanie znaków* Strukturę dokumentu RTF* Funkcje dodatkowe* Style w kodzie RTF* Tworzenie tabel* Tworzenie plików pomocy MS WindowsCennym 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.

TRANSCRIPT

Page 1: RTF. Leksykon kieszonkowy

Wydawnictwo Helion

ul. Chopina 6

44-100 Gliwice

tel. (32)230-98-63

e-mail: [email protected]

PRZYK£ADOWY ROZDZIA£PRZYK£ADOWY ROZDZIA£

IDZ DOIDZ DO

ZAMÓW DRUKOWANY KATALOGZAMÓW DRUKOWANY KATALOG

KATALOG KSI¥¯EKKATALOG KSI¥¯EK

TWÓJ KOSZYKTWÓJ KOSZYK

CENNIK I INFORMACJECENNIK I INFORMACJE

ZAMÓW INFORMACJEO NOWO�CIACH

ZAMÓW INFORMACJEO NOWO�CIACH

ZAMÓW CENNIKZAMÓW CENNIK

CZYTELNIACZYTELNIA

FRAGMENTY KSI¥¯EK ONLINEFRAGMENTY KSI¥¯EK ONLINE

SPIS TRE�CISPIS TRE�CI

DODAJ DO KOSZYKADODAJ DO KOSZYKA

KATALOG ONLINEKATALOG ONLINE

RTF. LeksykonkieszonkowyAutor: Sean Burke

T³umaczenie: Marcin Jêdrysiak

ISBN: 83-7361-191-6

Tytu³ orygina³u: RTF Pocket Guide

Format: B5, stron: 174

RTF (Rich Text Format) jest formatem dokumentów. Nie jest to jednak jêzyk

znaczników, który móg³by byæ u¿yty do rêcznego zakodowania ca³ego dokumentu

(choæ jest to mo¿liwe). Wed³ug za³o¿eñ jego twórców, RTF jest formatem danych,

które mog¹ byæ odczytywane i zapisywane przez aplikacje dowolnego rodzaju.

Za³o¿enia te zosta³y spe³nione: obecnie setki aplikacji korzysta w³a�nie z tego formatu.

Elastyczno�æ RTF sprawia, ¿e jest to idealny format do wielu zastosowañ i mo¿e byæ

wykorzystany zarówno do generowania faktur i raportów, jak i do tworzenia s³owników

na podstawie baz danych s³ów.

Niniejsza ksi¹¿ka stanowi wygodne �ród³o wiedzy na temat formatu RTF i omawia

sposoby u¿ycia tego standardu, w³¹cznie z informacjami niezbêdnymi do napisania

programu generuj¹cego pliki RTF.

W leksykonie opisano:

• Podstawow¹ sk³adniê RTF

• Zapis akapitów w RFT

• Formatowanie znaków

• Strukturê dokumentu RTF

• Funkcje dodatkowe

• Style w kodzie RTF

• Tworzenie tabel

• Tworzenie plików pomocy MS Windows

Cennym uzupe³nieniem informacji o RTF jest rozdzia³ po�wiêcony pisaniu programów,

generuj¹cych pliki RTF, wraz z przyk³adowymi kodami �ród³owymi. Ta niewielka

ksi¹¿eczka bêdzie z pewno�ci¹ przydatna wszystkim, którzy chc¹ skorzystaæ z tego

uniwersalnego i wygodnego formatu zapisu dokumentów tekstowych.

Page 2: RTF. Leksykon kieszonkowy

Spis treści 3

Spis treści

Rozdział 1. Przedstawienie formatu RTF .............................. 5Dlaczego format RTF?....................................................................................... 6Podział książki.................................................................................................... 7„Witaj świecie” w dokumencie RTF.............................................................. 9Przedstawienie prostego dokumentu RTF................................................. 11Podstawowa składnia formatu RTF ............................................................ 15Akapity............................................................................................................... 21Formatowanie znaków................................................................................... 35Struktura dokumentu ..................................................................................... 47Dodatkowe funkcje.......................................................................................... 62Style..................................................................................................................... 84Tabele.................................................................................................................. 92

Rozdział 2. Tworzenie plików pomocy MS Windows....111Plik pomocy RTF — podstawy................................................................... 111Hiperłącza i wyskakujące łącza .................................................................. 114Dodatkowe informacje o tematach ............................................................ 117Rysunki ............................................................................................................ 121Problemy z plikami pomocy RTF .............................................................. 125Dodatkowe informacje.................................................................................. 126

Rozdział 3. Przykładowe programy .................................... 127Generator kalendarza.................................................................................... 127Program wyświetlający zawartość katalogu............................................ 134Program do projektowania kopert na płyty (origami) .......................... 140Narzędzie do pobierania metadanych RTF ............................................. 152Uwagi na temat analizy plików RTF......................................................... 155

Rozdział 4. Użyteczne informacje ........................................ 157Tabela znaków ASCII-RTF .......................................................................... 157Sekwencje ucieczki dla polskich znaków ................................................. 165Kody języków RTF ........................................................................................ 166Konwersja odległości na twipy................................................................... 168

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

Page 3: RTF. Leksykon kieszonkowy

Rozdział 3. Przykładowe programy 127

Rozdział 3. Przykładowe programyStandard RTF, podobnie jak każdy inny format dokumentów, na-biera znaczenia dopiero w kontekście jego wykorzystania, czylisposobu 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. Wszystkieomawiane narzędzia i programy pokazują sposób wykorzysta-nia różnych funkcji, jakie zapewnia standard RTF.

Wszystkie opisane w tym rozdziale programy zostały napisanew Perlu. Aby ułatwić poznanie ich działania, w kodzie źródło-wym umieszczono obszerne komentarze. Jeżeli Czytelnik planujegenerowanie własnych dokumentów RTF z poziomu aplikacji Perl,warto skorzystać z kilku przydatnych modułów, jakie są dostępnew bibliotece CPAN (http://search.cpan.org). Godne polecenia sąprzede wszystkim moduły RTF::Writer i RTF::Generator. Żadenz 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 APIlub modułów Perl.

Generator kalendarza1

Przedstawiony tu program tworzy nowy plik RTF, zapisujeprolog 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ą czytelnikomzmodyfikować kod samodzielnie — przyp. tłum.

Page 4: RTF. Leksykon kieszonkowy

128 RTF. Leksykon kieszonkowy

są tworzone za pomocą pętli �����) i zamyka dokument, doda-jąc pojedynczy znak „}”. Każdy akapit stanowi nagłówek dlastrony kalendarza. Na poszczególnych stronach umieszczane sąnagłówki dla kolejnych dni tygodnia. Gotowy kalendarz możnawydrukować, dzięki czemu zawsze dostępny będzie przydatnyterminarz 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 ��� z parametrem w postaci dość dużej liczby.

Poniżej przedstawiono fragment kodu źródłowego pliku RTF:

���� ������������������� ���������������������������������� ��������� ����!�����������"���� ������!��������������������������� ��������� ����!�����������"�# ����� ���������������������������� ��������� ����������������$�# �����%��������������&�'���������� ��������� ����������������(��� �������������# �����&�'���������� ��������� ����������������)� #�� ����� �������� �����&�'���������� ��������� ����������������(���� �����*��������������&�'���������� �����

Deklaracje poszczególnych akapitów różnią się — dla sobotyi niedzieli przydzielane jest mniej miejsca (tylko 2900 twipówzamiast 6060 twipów). To ustawienie jest w programie kontro-lowane przez zmienną +���'�, która otrzymuje wartość stałej&,-./01 lub &,-."$,22 w zależności od wartości zmiennej +���3 ��.Dla każdego miesiąca stosowana jest inna czcionka. Odbywa sięto poprzez dodanie do �� wyniku operacji ��#���4��, gdzie 4 jestoperatorem modułu w Perlu. Oczywiście wszystkie używane

Page 5: RTF. Leksykon kieszonkowy

Rozdział 3. Przykładowe programy 129

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óbieutworzenia polskiego kalendarza. Poszczególne ciągi w doku-mencie RTF nie przechodzą przez procedurę obsługi sekwencjiucieczki. 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ędzieużycie polskich nazw miesięcy i dni tygodnia, należy zmienićodpowiednio wiersz ���#��. W takim przypadku w kodzie pro-gramu mogą pojawić się wiersze w następującej postaci:

���� ������������%���5�#�� 6��7�3��� �8�� #������ �����

Page 6: RTF. Leksykon kieszonkowy

130 RTF. Leksykon kieszonkowy

Większość procesorów tekstu odrzuci dokument RTF zawierającytaki wiersz, gdyż użyto w nim znaku ł. Ponieważ jest to 8-bitowyznak, należy zastąpić go właściwą sekwencją ucieczki (w tym przy-padku będzie to sekwencja �9� ) w sposób opisany w rozdziale 1.

Drugi problem jest związany z faktem, że program umieszczaw kodzie dokumentu RTF wartości numeryczne bez sprawdzenia,czy są one liczbami całkowitymi. W przedstawionym wcześniejfragmencie kodu użyto wartości, które z całą pewnością są licz-bami całkowitymi (6060 i 2900). Wyobraźmy sobie jednak, żeprogram został przystosowany do druku na papierze o innychrozmiarach (obecnie używany jest papier w formacie US letter).Większy odstęp pomiędzy kolejnymi nagłówkami ustawiono na10 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 kodprogramu przyjmie następującą postać:

����'�#���#��&,-./01���:;�<��!=����'�#���#��&,-."$,22�:;�&,-./01�>��=�?��������������'��&,-./01

Sprawi to, że stała &,-."$,22 uzyska wartość 2834,5, a kod źró-dłowy dokumentu RTF będzie wyglądał tak jak poniżej:

���� ���<��!������������ ���������������������������������� ��������� �����������������"���� ������!��������������������������� ��������� �����������������"�# ����� ���������������������������� ��������� ���<��!���������$�# �����%��������������&�'���������� �����

Ponieważ parametrami słów kluczowych RTF mogą być tylko licz-by całkowite, polecenie ����� *< zostanie zinterpretowane jako����� * (czyli polecenie ��� z argumentem 2834) i dwa znaki <,przez co na wydruku pojawią się nagłówki <"���� �����!�����

Page 7: RTF. Leksykon kieszonkowy

Rozdział 3. Przykładowe programy 131

������������� i <"�# ���� �������������������� . 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 �#�, które może być użyte w następujący sposób:

���#��@(��9���� ���4������4����4����4��������4������4���4������9A�#A���� ����������� ������������

Drugie polecenie �#� jest w gruncie rzeczy niepotrzebne, ponie-waż operator 4 w Perlu zawsze zwraca wartość całkowitą, alewarto zachować ostrożność.

Programiści znający dobrze formaty (�)���#�� szybko odgadną, żeidentyczny efekt można uzyskać za pomocą formatu 4 (liczbacałkowita wyrażona dziesiętnie), który zastąpi polecenie �#�:

���#��@(��9���� ���������������4����4��������4������4���4������9A�#A��+���'���+��#���4���

Ta metoda działa równie dobrze jak poprzednia, a wybór jednejz nich jest zależny od osobistych upodobań programisty.

Przedstawione tu podejście do generowania dokumentów RTFmoże być zaadaptowane w celu drukowania kart pytań i odpo-wiedzi zamiast kalendarza. Karty tego typu są często stosowanedo nauczania języków obcych. Jeżeli dokument jest drukowanydwustronnie, program powinien umieścić wszystkie pytania najednej 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 kartymoże pobierać dane wejściowe z pliku zawierającego kolejnewiersze w postaci �������:������, na przykład �����3:3��BC3�lub ������ :'6���D.

Page 8: RTF. Leksykon kieszonkowy

132 RTF. Leksykon kieszonkowy

Poniżej przedstawiono pełny kod programu generującego ka-lendarz:

?E>���>��#>������������<=��������'�=�������#�#8�=?�F5��8����#���6�����'�����'���#�����#�G�����G�?�5�����6��������#��3�#��������� ��H

?�&���#�'G�������'�I����'�#���#��"JKL�&".0�.&,-�:;��*�M����M���=����'�#���#��&,-./01���:;�����=�?��������'�����'�#���#��&,-."$,22�:;��!��=�?��������'�

?�L����6�#������3����6�����#��������8����#�@(���A; ������3���A���� ���+E=���#��@(��9����%��#��� �������#���������������,����=���%������#�(���������@���#=��� ����#8%� �����#���<�9=

?�&���#�'G�������'����6�3���#���6�#�6����?�������'���� #����8� #�����N��#����:���F�O�#��������������$��'�������,�������$��������O�#��O�������,�8������"����������L'���������������&�'�����H=���N �����:���F�"�# ���$�# ���(��� ���)� #�� ���(���� ������ ���"���� ��H=

?�P���# ��6�G��������6�#��#��'������3�� ����6�'�8�� #�����+���#�:�����FH=���+�# �:�+���#�Q� ���M�"JKL�&".0�.&,-=

�����F+���#�R:�+�# H�����F+�����+��#���+ ����+���3 ��H�:�F8�����F+���#HHS<�*� ��T=�����+���'��:�&,-./01=

Page 9: RTF. Leksykon kieszonkowy

Rozdział 3. Przykładowe programy 133

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

�����#���@(����9���� ���4������4����4����4��������4������4���4������9�����A�#A�����+���'������+��#���4����?�6���#��'6'��#3�� ���3�6 �8��������'�����+ ���S+���3 ��T��+ ������F+ ��H��+��#���S+��#��T��+�����Q�����%!�����=

��+���#�Q:�"JKL�&".0�.&,-=�

?�U�3�#'6�#�����6��3#��'������3�����6���G�'���6����8�������#��@(��A�A='����F@(�H=�V��=

���������?���#3'G��6���'�G�'������'������6������3� ��� #����?�������'���#����6�3�� � �:;�A� A�� 6��3��'6�����?�#���6����#����6���� ����A��������� ��AE

�����+#�:����F+.S�T�WW��H=�������#�9��9��#�����+#��# �+#�::��#�F+#H=��+#�4:�%��=�������#�9��9����+#�::�%%����+#�::�%�����+#�::�% =��+#�4:�%�=�������#�9��9����+#�::�%=�������#�9# 9����+#�::��=�������#�9� 9����+#�::� =�������#�9��9=�

..J�&..

Page 10: RTF. Leksykon kieszonkowy

134 RTF. Leksykon kieszonkowy

Program wyświetlającyzawartość katalogu

Przedstawiony w tej części rozdziału program odczytuje podanykatalog (lub bieżący katalog, jeżeli nie podano innego) i tworzywydruk jego zawartości, który jest umieszczany w tabelach doku-mentu RTF. Innymi słowy, jest to bardziej rozbudowana wersjapolecenia ���X� w Uniksie lub �� w systemie MS-DOS.

Podstawowa struktura tego programu jest bardzo prosta. Po uru-chomieniu program sprawdza obecność argumentu wiersza pole-ceń (zmienna +,@1YS�T), w razie potrzeby odczytuje bieżący ka-talog, a następnie wywołuje trzy podprocedury (���.�����, ��� ��i ���.�# ), a następnie kończy pracę.

Generowanie kodu tabeli odbywa się w funkcji ����.���, którejargumentami są nazwa, wielkość i data modyfikacji pliku. Funkcjaumieszcza te informacje w komórce tabeli zbudowanej z trzechkolumn; na przykład wiersz tabeli zawierającej komórki �*�<**,'���%8�� i ��� Z� Z� �� I�[ jest wyrażany w postaci następują-cego bloku kodu źródłowego RTF:

����� ���8���!��'��� ����� ��%<��� ���'��� ����� ��%<��� ���'��� ����� ��%<��� ���'��� ����� ��%<��� ���'���V%��*�'��� ����� ��%<��� ���'��� ����� ��%<��� ���'��� ����� ��%<��� ���'��� ����� ��%<��� ���'���V�%���'��� ����� ��%<��� ���'��� ����� ��%<��� ���'��� ����� ��%<��� ���'��� ����� ��%<��� ���'���V�������� ��#���������%���%����*�<**��'����������'���%8����'�����'���%����� Z� Z� �� �9 ��[��'��������

Na szczęście ten mało czytelny kod dokumentu RTF jest tworzonyautomatycznie poprzez wywołanie funkcji ����.���F�������� �������������������H. Znaczenie poszczególnych poleceń do genero-wania tabel zostało przedstawione szczegółowo w podrozdziale„Tabele” w rozdziale 1.

Page 11: RTF. Leksykon kieszonkowy

Rozdział 3. Przykładowe programy 135

Podprocedury ��', �# i '� można wykorzystać we własnych pro-gramach. Pierwsza podprocedura implementuje prostą funkcjędo obsługi sekwencji ucieczki, natomiast podprocedury �# i '�pozwalają na podawanie wszystkich długości w calach lub cen-tymetrach zamiast w twipach. Działanie obu podprocedur możnasprawdzić w funkcji ����.���, w której poszczególne polecenia�'���V���������� zostały oparte na liście �#F�<H���#F*�<H���#F<[<H.Z pewnością jest to znacznie wygodniejsza metoda definiowa-nia odległości niż lista %��*���%��������, która wymaga ręcznegoprzeliczania centymetrów lub cali na twipy.

Wybór funkcji �#F������H lub '�F������H jest zależny od prefe-rencji użytkownika, ponieważ jednostki długości i tak muszązostać przeliczone na twipy przed utworzeniem tabeli. Wartoporównać tę metodę ze sposobem użyciem polecenia �#� wewcześniejszym przykładzie programu generującego kod RTF.

Poniżej przedstawiono pełny kod źródłowy omawianego pro-gramu:

?E>���>��#>������������<=��������'�=�������#�#8�=?�F5��8����#���6�����'�����'���#�����#�G�����G�?�5�����6��������#��3�#��������� ��H

���+ ���:�+,@1YS�T�WW�99=�?�O�6����#����� �#����8���#��������6������'�#����?�#���6�����������'�6�������'����6�'�8��3�����8�

��F+ ������99����+ ������9>9H�������K� =�?�6��� ���#�����������3����#3'G��8��'� ��+ ���:�8��'� FH=��?�(���6���6#�����������'����#���'��63�����#������3��AA�

Page 12: RTF. Leksykon kieszonkowy

136 RTF. Leksykon kieszonkowy

?�5�6����#������'���G�����#���G�������������#��3�����8E ���A������6#��� '6���'�3�����8��+ ��A��#�����Z��+ ����# �Z �.��# �Z��.=

?�)�����#����� ���'� �����3�#�G�'�'����6���3��?������'G������G�'���6����8����I���.�����F�+ ���H=��� ��F�+ ���H=���.�# F�+ ���H=�V��=

?ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ?�(�6���� ���'� ��������'#�'6�I

�����#���#�F%**��M�+.S�TH����?�������'����Z;������

����'����#�F�<�[�M�+.S�TH����?�'�#��������Z;������

������'����?�6���'�#��� �#�8��'��8��G�3��������#��3� �@(������+�#�:�+.S�T=��+�#�:\��FS]ZA9^��+�.�Z6,ZU�Z!�TH���������������#��FA��94��VA��� F+%HH��8=���?�5��'� ������3�#�G�����'�G������'G��#�6�G�����������8�#�����?�����#��������8�G��_#�'� ��ZZ�����6���6 6����%�������#�+�#=�?ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

?�&�3����'G����6�'��6���##�'��8�����#�'�� ��6�������#��� �#�'�����3�I��F�N0������4"�6�.����4(���.���H=

������� ����������?���3�#�#���8���#�8��6� �#������8���������+ ���:�+.S�T=���'�#. ��F+ ��H=��?������#��� �#�'�

�����#��9���� ��������'����<������9����'F+ ��H��9������9��A�#�#A=���?�#�8����3�����#�I�#�6���3�����8�

Page 13: RTF. Leksykon kieszonkowy

Rozdział 3. Przykładowe programy 137

������.���F+.��+"�6�.��+.���+(���.��+.��H������'��N0����=���?�G� �#������6� ���3�6 �8�����3�

�����#��9���� ���%**����%**�����������S5����ET�9��#�����N0����=

�������#=�

?ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

�����'�#. �����?��U����#��� �#�'�����3���?���F�6���#����6�6���#3'G����� ��H��?�)�3��6������#��������������#3'G�������������3����?�����+ ���:�+.S�T=�����# ��F0���+ ��H���� ���A������6#�������6�'�+ ��I�+EA=����F�+������+����.�����H=

�������F ���#� F�+�����:���� ��F0�H�HH�����#�V�����+��������99����+��������99=���������N0������+����=����F�+"�6�.��+�������+(���.��+������H�:�FZ%�Z%H=

�������+����.�����:�A+ ��>+����A=����F�+"�6�.��+�������+(���.��+������H�:�����F�����F+����.����H�HS[�!T��������Z��+����.����=���

��'���� ��F0�H=��N0�����:��������.#����N0����=����?�$�6#��6���#�'�A��.#���A�#��A��.����A�����A��.��6�A�������#=�

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

Page 14: RTF. Leksykon kieszonkowy

138 RTF. Leksykon kieszonkowy

������.������+(���.��+���R:;�+(���.��+����������.��6���+"�6�.��+���R:;�+"�6�.��+����

?ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

��������.������?�)�8�#�����#��������6���������6�#�6��������3��'����� �������3���?��F�6���#����6�6���#3'G����� ��H

����F+#�����+��6���+����H�:�N.=�����+#���.�������:�99=����F+��6��::�Z%H��?����6�6#�'6#�3� ���3�����8�����+#���.�������:�9���9=�?���8�����#������+�����:�99=����+��6��:�99=

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

�����#��9����� ���8���!�9=�?�5�'6���3� �3����'G�������6��@(������+��� ����:�G��#�AA������9�'��� �9��+.��9��� ��%<��� ��9�������F�������H=�?����'6�#�����6���3�'��3���� 6�

�����#��+��� �����9�'���V9��+.��A�#A���������#F�<H���#F*�<H���#F<[<H=���?� �3����'G�������G�����3���� 6��3����3�������?���6���3���������'����6#�� ����#���6���#��'

�����#�����?�����G��3�����3����'��6�������'�I���9���� ��#���������%���%���9�����'F+��6�H��9��'����9�����?������#�#��� �������G��!���#3�����K����������8�����#�����9�������9��+#���.����������'F+#���H��9��'����9�����?������#�#��� ������G��(�����@���#���9��'���%��9����'F+����H��9��'����9�����?�������� 3���#����!���#3�����,����

Page 15: RTF. Leksykon kieszonkowy

Rozdział 3. Przykładowe programy 139

���9����9��A�#�#A��=

�������#=�?ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

�������.�����������+ ���:�+.S�T=�����#��RR9J�&.@(�."(,@(9=����%��#��� �������#����������������,����=���%���� ��#�K����������=����������#�(����=��� ����#8%��*��� ��'��������#����*�#������

J�&.@(�."(,@(

��?���8����3�����#��6������G�'���'��63����8� 6�#�I�����#��9���� ������� ��������#������%����#�������9�������'F+ ����9�9��������. ���F����HH�����9�Z���'��8#�����9��A�#�#A=�������#=�

�������.�# ������+ ���:�+.S�T=�����#��A�#��#A=�������#=�

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

..J�&..

Page 16: RTF. Leksykon kieszonkowy

140 RTF. Leksykon kieszonkowy

Program domyślnie nie otwiera nowego pliku, a jedynie wysyłakod RTF do standardowego wyjścia. Użytkownik może jednakprzekierować wyjście w powłoce. Poniżej pokazano sposób wy-konania 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 projektowaniakopert 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

Page 17: RTF. Leksykon kieszonkowy

Rozdział 3. Przykładowe programy 141

CD. To narzędzie będzie szczególnie przydatne dla osób, którezawsze mają więcej nagranych płyt CD-R niż pustych pudełekna nie.2

Po uruchomieniu program oczekuje na wprowadzenie informacji,które zostaną wydrukowane na etykiecie, a następnie generujeplik 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 stronyprzedstawiono 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ń ����8����8� �������������������, które zostały przedstawione w podrozdziale „Do-kładne pozycjonowanie akapitów” w rozdziale 1. Bez funkcjidokładnego pozycjonowania akapitów nie ma żadnej gwarancji,że tekst będzie widoczny po zagięciu strony. Ta sama metodajest zresztą używana do drukowania tekstu na naklejkach i ko-pertach.

Bardzo ważną rolę odgrywa polecenie �����Z��������� �����. Jeżeliużytkownik wprowadzi zbyt dużo informacji, program ukryjenadmiarowy tekst. Co więcej, wszystkie informacje, jakie sąwpisywane przez użytkownika, przechodzą przez procedurę ��',która zapewnia obsługę nietypowych znaków. Jeżeli więc zo-stanie podany tekst G�3��`����3�, program automatycznie zmo-dyfikuje go, przez co ciąg wynikowy będzie miał prawidłowąpostać G�3���9!'����3�.

2 Chciałbym podziękować Tomowi Hullowi z wydziału matematykiMerrimack College, który zaprojektował sposób zaginania strony. Więcejinformacji można znaleźć pod adresami http://web.merrimack.edu/hullt/i http://papercdcase.com/.

Page 18: RTF. Leksykon kieszonkowy

142 RTF. Leksykon kieszonkowy

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 jestwykonanie pewnych obliczeń matematycznych. Kod wykonującyto zadanie został umieszczony w podprocedurze ��#�, która jestwywołana w różnych miejscach programu.

Rysunek 3.3 przedstawia wygląd pliku wygenerowanego przezprzykł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 ��#�F���%%�����%��*��%%���H, ale bardziej skomplikowane konstrukcje typu ��#�F��5�8�.a��8��M >*��5�8�.)� ����5�8�.a��8��M >*H. 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 zmianawszystkich rozmiarów kartki papieru. To zadanie można sobieznacznie ułatwić, jeżeli zamiast konkretnych wartości zdefinio-wano zmienne, ponieważ wyrażenia typu 5�8�.a��8��M >* uła-twiają błyskawiczne przeliczanie rozmiarów.

Page 19: RTF. Leksykon kieszonkowy

Rozdział 3. Przykładowe programy 143

Rysunek 3.3. Koperta origami na płytę CD

Program może odczytywać dane wejściowe z pliku, na przykład:

4���������"�)�**���+!��,�

Oczywiście można również użyć standardowego wejścia, naprzykład:

Page 20: RTF. Leksykon kieszonkowy

144 RTF. Leksykon kieszonkowy

Rysunek 3.4. Wygląd dokumentu w programie TextEdit

4��������-��"�)�**���+!��,�

lub:

4��������.#��!)���/�������

Program może również odczytywać dane bezpośrednio z konsoli:

4�������)����� 6���3��� ����3�� 3�����#�����#���#�'��#�G�J#������JL��F'�#����Q6H!�����������"�!���������#���$!���������#���%!���������#���&'�������(��������� �#������ �)�������� *�� �+������� *,���������� ��-

Niezależnie od wybranej metody, program zapisze informacjeo okładce płyty CD do pliku cd_case.rtf. Wyjście z programuodbywa 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 wynikowymożna otworzyć w procesorze tekstu i dokonać edycji etykiety

Page 21: RTF. Leksykon kieszonkowy

Rozdział 3. Przykładowe programy 145

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:

?E>���>��#>������������<=��������'�=�������#�#8�=?�F5��8����#���6�����'�����'���#�����#�G�����G�?�5�����6��������#��3�#��������� ��H

?ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ?�&�3����'G�������'�I

����'�#���#��,*�:;��=��?�U���#���#��%��G����� ��3�G��6�#��������6��,*

Page 22: RTF. Leksykon kieszonkowy

146 RTF. Leksykon kieszonkowy

Rysunek 3.6. Krok 2 — poziome złożenie kartki

����'�#���#��0#'����������:;�%**�=�?�F�����'6�##�3�3�#����G�H

����'�#���#��5�8�.)� ����:;��,*�^�%%!�!�I�F�<�M�0#'���������H=����'�#���#��5�8�.a��8���:;��,*�^�%�� *�I�F�%%�M�0#'���������H=

����'�#���#��"�� 8�#�����:;�%>��M�0#'���������=�?���68�� #��#����������������������������������?�#�� �3�� #��'����6���3�� �#������'�#���#��K&.&��������:;�"�� 8�#�Q�*[<�M�0#'���������=����'�#���#��)�#8."�6����:;�F5�8�.)� ���Z�K&.&�������H�>��=

����'�#���#�������.2�#�.a��8���:;��*��M�%�=

?ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ?�&�3����'G�� ��'��6���##�'��8�����#�'�I

Page 23: RTF. Leksykon kieszonkowy

Rozdział 3. Przykładowe programy 147

Rysunek 3.7. Krok 3 — włożenie płyty CD

���+����:�A' .'������A=���N��#��=

?�1���#��'6��'����8����I

8��.�#���FH=���#F@(���A;+���AH���� ���A������6#�������6�'�+���� ��6�����I�+EA= �'.�#���FH= ���.��� .8�� ��FH=���#�.��V�FH='����F@(�H=���#��A�#_����6�#��+����FA��Z��+�����A���G���H�#A=�V��=

?ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

����8��.�#����

Page 24: RTF. Leksykon kieszonkowy

148 RTF. Leksykon kieszonkowy

Rysunek 3.8. Krok 4 — zamknięcie koperty

�����#��A)����� 6���3��� ����3�� 3�����#�����#���#�'��#�G�J#��������JL��FA�����F+]L�:\��>$")�#>H�^�A'�#����Q6H�#A�I�A'�#����Q H�#A����#�����N,@1Y=����?�)����#��3�����6�G����6���6#��� ��������������'�G#�8�����?��)�# �����6����'�#����Q6��#�����������6���3����##�����?���������� �����#�������8�G��'�#����Q

��N��#���:�R;=��?�5����#��� �#�'����G�'����'��F6����3�����?����# �� ���8����G�'�������3�#����H

���#����F�8�����>�">��N��#��H��?����3� �#�'����G�'����'��������#��A�#��'�#�����������^�U����������'��������3�� 3��#A=����N��#���:�F�9.9�H=�?������������6���

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

?ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

���� �'.�#�����?�5�'6���3����3��@(�

�����#���@(��9����%��#��

Page 25: RTF. Leksykon kieszonkowy

Rozdział 3. Przykładowe programy 149

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

���� �����

9���#�F<�Q�5�8�.)� ��H���#�F<�Q�5�8�.a��8��H=

�������#=�

?ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

�������#�.��V����?�U�����#���6�������'��N��#��������'�6�G#�����6����6'6�#����?��3���'���6��6�'������ ���'� ������'F+��#�H

�����#���@(��9���� �����8����8����V4�������4������4�������Z4�9��������#�F+.�Q�<H��?��6�'������3����'6��'��3�����'�

����)�#8."�6��Q�"�� 8�#�����5�8�.a��8���Z�5�8�.a��8���M�%>*�����Z�K&.&��������Z������.2�#�.a��8�������K&.&��������Z���M�"�� 8�#�����K&.&��������Z���M�"�� 8�#�Q������.2�#�.a��8�����=

�����#��@(��A�#��������������*��A�����?�5����3�6�#���������6�8�������6�����N��#���^���'F������N��#��H�I�99�����A��#A=

�������'�����+��#��FN��#��H��������#��@(��A�#����#��A����'F+��#�H��A�#A=���

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

Page 26: RTF. Leksykon kieszonkowy

150 RTF. Leksykon kieszonkowy

?ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

������'����?�6���'�#���'��8��G�3��������#��3� �@(������+�#�:�+.S�T=��+�#�:\��FS]ZA9^��+�.�Z6,ZU�Z!�TH���������������#��FA��94��VA��� F+%HH��8=���?�_6���#��G�������'�G���3��#'G���'��'63��#�6�G�����������8�#��������#�+�#=�

?ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

���� ���.��� .8�� ����?�������#�����6���3�'����#��E

��?�������#���ZZZZZZZ�#�� �������#�F�������������5�8�.a��8��M >*��������5�8�.)� �����5�8�.a��8��M >*�H=

��?�������#����W��W���� �8���� �� �������#�F)�#8."�6��Q�"�� 8�#>������������)�#8."�6���5�8�.a��8���H=����#�F5�8�.)� ���Z�)�#8."�6��Z�"�� 8�#>������������5�8�.)� ���Z�)�#8."�6����5�8�.a��8���H=

��?�������#��������>���� ��8� ��#�G���#����?�����������>���������#�F�)�#8."�6���5�8�.a��8��M >*������������F5�8�.a��8��M >*H�Q�)�#8."�6��H=����#�F�)�#8."�6���5�8�.a��8��M >*������������F5�8�.a��8��M >*H�Z�)�#8."�6��H=����#�F�5�8�.)� ���Z�)�#8."�6���5�8�.a��8��M >*���������5�8�.)� ����F5�8�.a��8��M >*H�Q�)�#8."�6��H=����#�F�5�8�.)� ���Z�)�#8."�6���5�8�.a��8��M >*���������5�8�.)� ����F5�8�.a��8��M >*H�Z�)�#8."�6��H=�������#=�

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

Page 27: RTF. Leksykon kieszonkowy

Rozdział 3. Przykładowe programy 151

���+6.'��#�=��?�6���##����'6#�3�

������#����?�������#�����#���FV��H� ��FV����H����F+V%�+�%�+V��+��H�:������#�F<�Q�+.H��N.=

��?�"���� 6�#������#��#���'6����'������������������K���=��'���3�A��#�FH�����8��'6����'������������A��#�����N.�::�*=

��?�_6��3�#���������6� #�'������8��8��#�8����8������#������+#�.V�:�F+V%�R�+V�H�^�+V%�I�+V�=�����+#�.��:�F+�%�R�+��H�^�+�%�I�+��=

��+V%�Z:�+#�.V=�+V��Z:�+#�.V=�+�%�Z:�+#�.�=�+���Z:�+#�.�=��?�)�����6� #��FV%��%H���FV����H�� #��6������ ������8��8��#�8������8�

�����+��:����F+V%�Z�+V�H=�?�� ��8���'�����6����������+��:����F+�%�Z�+��H=�?�� ��8���'������#����+6.'��#�QQ=

�����#���@(��9�M� �� ��V��8�� �����8�� � �8�4�� ���#�� ���V4�� ����4��� ���V4�� ����4�� �V4�� ��4��� �V��6�4�� ����6�4�� ���#��4��� ���#�'��4�� ���#�'�84�� ���#�'��4��

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

..J�&..

Page 28: RTF. Leksykon kieszonkowy

152 RTF. Leksykon kieszonkowy

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 ��#��. Są to takie metadane jak ��������������������i ����������������������. 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 ����������������������.Konieczne jest pobranie tytułu każdego dokumentu i przekazaniego do głównego katalogu artykułów. Typowy dokument rozpo-czyna się od następującego kodu RTF, który jest generowanyprzez 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����� �� ������8���V���I���������#��8���V���I���������'�#��#���8���V���I������'������������������b�#������1�/a��'������������ ����� �%%�������#**�������������� ����� �%%��� ���#�!��������# ��� ��#����#����8��%��#����� ����#��'������M�'����#����#��'������������#��*[����� ��'������#�G���# �'�#�V�������#��V�����#�#��������'� #���#�� �

Program użytkownika musi pobrać tytuł tego dokumentu, czyliSpectroscopic study of blue compact galaxies. III. Empirical popula-tion synthesis.

Page 29: RTF. Leksykon kieszonkowy

Rozdział 3. Przykładowe programy 153

Gdyby Word umieszczał każde pole metadanych w oddzielnymwierszu, wystarczyłoby użyć narzędzia grep do wyszukania ciągu������, a następnie odczytać żądany wiersz w postaci �������"��'Z����'���'���� ����������'����'��8���V����000�J�����'���������Z���#���#������. Niestety, MS Word, podobnie jak większość proce-sorów tekstu, nie tworzy uporządkowanego i czytelnego koduRTF. Oznacza to, że narzędzia typu grep nie będą zbyt przydatne.

Skutecznym rozwiązaniem tego problemu będzie wczytanie całegodokumentu do pamięci i wyszukanie tekstu, który jest zgodnyze wzorcem ���������������� ��. Ten sam wzorzec można wyrazićjako wyrażenie regularne Perla — �>����������MFS]��TQH��>.

Niektóre dokumenty mogą jednak zawierać osadzone rysunki,przez co ich wielkość znacznie wzrasta. Należy jednak sobieprzypomnieć, że grupa ��#�� (zawierająca pole ������ i wszystkieinne metadane) zawsze znajduje się na początku dokumentu,przed jakimikolwiek danymi. Teoretycznie również sekcje plikuRTF umieszczone przed grupą ��#�� mogą być bardzo duże, alew praktycznie wszystkich przypadkach ta grupa znajduje sięw pierwszych 10 kB pliku. Wystarczy więc odczytać do pamięcitylko początkowy fragment dokumentu i wykonać żądaną operację.

Utworzyliśmy już wyrażenie warunkowe �>����������MFS]��TQH��>do wyszukiwania tekstu i odkryliśmy sposób badania dokumen-tów. Pozostała część rozwiązania wymaga jedynie otworzeniakażdego dokumentu, którego nazwa została podana w wierszupoleceń. Odczytany tytuł musi być przekazany przez proceduręzastępującą sekwencję ucieczki właściwymi znakami:

?E>���>��#>����

��������'�=

�����'�����+�#�FN,@1YH���#�V���#�����Z��+�#��# �Z��.=�?�5���#��'���#��'6����#�'�����3��

Page 30: RTF. Leksykon kieszonkowy

154 RTF. Leksykon kieszonkowy

�����#�0���+�#���������#F�A������6#�������6�'�+�#� ��� '6���I���+E�#A�H��#�V�=����� �0���+.��%�.����������#FA������6#�� �3�#�'�� '6����6�+�#I���+E�#AH��#�V���'����F0�H=���>]������>����������#F�A(��#���G�������3�@(�I�+�#�#A�H��#�V�=

���>����������MFS]��TQH��>��������#FA/��3����������+�#�#AH��#�V�=�����#��A(�+�#I�A���#��'F+%H��A�#A=�

�����#��'������+V�:�+.S�T=��+V�:\��>S�'��'GT>>8=��?����#��'���#������6��#�'��6#�3���#���8���������6���+V�:\��>��9FS�Z�,Z��Z!T��H>��'3FAKA����VF+%HH>�8=�?��� �3� ���#����9VV�������#�+V=�

..J�&..

Większa część kodu jest odpowiedzialna za obsługę rzadkichlub nietypowych błędów. Program sprawdza, czy każdy plik.rtf można otworzyć i odczytać, a także czy zawiera na początkusekwencję znaków ����. Najważniejsza operacja jest wykonywanaprzez wiersz zawierający wyrażenie regularne �>����������MFS]��TQH��>�, które zapisuje tytuł dokumentu do zmiennej +%.Uzyskany tytuł jest wyświetlany na ekranie.

Poniżej przedstawiono typową sesję pracy z programem, któryzwraca tytuł dokumentu przekazanego poprzez wiersz poleceń:

4���������*���������������2��������� �%����"��'����'���'���� ����������'����'��8���V����000�J�����'������������#���#������

Page 31: RTF. Leksykon kieszonkowy

Rozdział 3. Przykładowe programy 155

Uwagi na temat analizy plików RTF

Należy zwrócić uwagę, że mogą wystąpić pewne problemy z wy-rażeniem regularnym �>����������MFS]��TQH��>, jakie zostało użytedo implementacji koncepcji wzorca ���������������� ��. Tworząckod programu, przyjęto założenie, że tytuł nie może zawieraćznaków „}” ani żadnych innych kodów formatujących (patrzrozdział 1.). Oznacza to, że nigdy nie będzie możliwe użycietytułu ������� P���������� ��� K�����#8�����, a jedynie ������P����������K�����#8����. Użyte w naszym programie wyrażenieregularne zawiedzie, jeżeli znak „}” nie został wyrażony jako�9[ (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 ������L�����6�#8��9[���V��9[ �1��������. W takim przypadku wyrażenieregularne odszuka ciąg L�����6�#8��9[���V��9[ �1�������, a pod-procedura �#��'F+%H prawidłowo zastąpi sekwencje ucieczki, dziękiczemu uzyskamy pełny tytuł dokumentu. Równie dobrze możnawyrazić ten sam tytuł w postaci �������L�����6�#8����V����1���Z�����. Wyrażenie regularne odszuka teraz jedynie początkowy ciągL�����6�#8��. 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 „}” zwyklestosowane jedynie w matematyce i informatyce, dlatego problemwystępuje dość rzadko. Pozostawiam Czytelnikowi zadanie utwo-rzenia wyrażenia regularnego, które w elegancki sposób rozwiążeten 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 ������� ������ ��� �� jako wyrażenia regularnego�>����������MFS]��TQH��> jest fakt, że prawidłowo odczytywanesą jedynie pola ������ i inne metadane dokumentu. Nie jest

Page 32: RTF. Leksykon kieszonkowy

156 RTF. Leksykon kieszonkowy

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 wszystkichprzypisów w dokumencie. Po zapoznaniu się z opisem koduprzypisów w rozdziale 1. użytkownik zadecydował, że wystarczywykorzystać wyrażenie regularne, zastępując słowo kluczowe����� przez słowo ����#���. W efekcie uzyskano wyrażenie �>�������#�����MFS]��TQH��>. Zastanówmy się jednak, co się stanie poodnalezieniu następującego kodu:

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

Użyty wzorzec zatrzyma się na pierwszym znaku „}”, dlategoodczytany zostanie tylko ciąg: "����������G��$� ��J�����, nato-miast dalsza część przypisu (���0����1����#) 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 analizytakiego kodu. Bardzo proste narzędzia po prostu odczytują kolejnepolecenia 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 natemat 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.