
	TWORZENIE FILTRÓW KONWERTA ORAZ JAK TO DZIAŁA
	---------------------------------------------

Instalacja określa bazowy katalog Konwerta, domyślnie /usr/local. Pliki
danych Konwerta i pomocnicze skrypty są instalowane w jego podkatalogu
share/konwert, który jest podzielony jak następuje:

filters - Pliki wykonywalne z tego katalogu są atomowymi filtrami
programu konwert. Większość z nich jest skryptami trsa, basha albo perla
albo ich kombinacjami.

aux - Dane i pomocnicze skrypty używane przez niektóre filtry. Nie są
wołane bezpośrednio przez konwerta.

devel - Pliki źródłowe filtrów i skrypty służące do budowania z nich
tych filtrów. Nie są potrzebne do normalnego używania programu konwert,
ale są przydatne do budowania nowych tablic konwersji, więc są
instalowane również.

Katalog lib/konwert zawiera pliki binarne, które nie powinny znaleźć się
w katalogu share. Zamiast nich w share/konwert są miękkie linki do nich.

konwert przekazuje swoim filtrom argumenty przez zmienną środowiskową
ARG, a nie jako normalne argumenty programu. Jest tak ponieważ większość
filtrów potraktowałaby te argumenty jako pliki źródłowe do
przetłumaczenia zamiast standardowego wejścia. Argumenty te są
oddzielone spacjami (w wywołaniu konwerta są oddzielone znakami `/').

Obejrzyj Makefile żeby zobaczyć, jak są budowane konkretne filtry.
Więcej szczegółów jest poniżej.

Ogólna zasada jest taka, że Makefile nie ma zapisanych w sobie na stałe
nazw filtrów. Zawiera on tylko reguły ich budowania, a właściwe listy
przetwarzanych plików są tworzone dynamicznie, na podstawie zawartości
odpowiednich katalogów źródłowych.

Kiedy mówimy o konwersjach zestawów znaków, format U konwerta oznacza
UTF-8 (Unikod). Każdy zestaw znaków ma filtr konwertujący go na UTF-8
i z powrotem. Większość konwersji na UTF-8 to proste skrypty trsa.

Trs nie wymaga określonego rozmieszczenia słów w swoim skrypcie - muszą
one tylko być oddzielone odstępami. Inne narzędzia zarządzające
tablicami konwersji wymagają jednakże, żeby reguły były umieszczane w
oddzielnych liniach; każda reguła składa się z pojedynczego znaku TAB,
napisu do przetłumaczenia, drugiego znaku TAB i napisu zastępującego
poprzedni.


	SCALANIE TABLIC KONWERSJI

Wiele zestawów znaków bazuje na innych, zmieniając tylko kilka liter.
Tablice konwersji tych zestawów na UTF-8 są tworzone przez scalenie
definicji zmienionych liter z oryginalną tablicą.

Te różnice są zapisane w plikach w katalogach devel/mergewith*, gdzie *
określa bazowy zestaw znaków. Na przykład devel/mergewithcp437/mazovia-UTF8
zawiera litery mazovii różniące się od cp437. Skrypt devel/mergetrs
łączy ze sobą dwie tablice albo więcej. Tablice wymienione wcześniej
mają pierwszeństwo (jest ono ważne tylko kiedy te tablice są później
odwracane).


	TRS I UTF-8

Trsowe określenie zbioru możliwych znaków przez \[...\] wymaga, żeby te
znaki były pojedynczymi bajtami. Niestety w UTF-8 znaki mogą być
zapisane w kilku bajtach. Skrypt devel/fixtrsutf8 upraszcza
przygotowanie właściwych skryptów trsa konwertujących UTF-8, nawet jeśli
używają \[...\].

Przyjmuje on niby-trsowy skrypt zawierający znaki UTF-8 wewnątrz \[...\]
i produkuje skrypt który będzie jednak działał. Wyrzuca on wspólne
przedrostki przed \[...\], powielając linie w razie potrzeby. Wynikowy
plik nie jest poprawnym UTF-8, ale działa z trsem.


	KONWERSJE Z UTF-8

Konwersje z UTF-8 są budowane zupełnie automatycznie, na podstawie
konwersji odwrotnej i jednej duże tablicy opisującej możliwości
zastąpienia znaków innymi. Tablica ta mówi, że jeśli dany znak jest
niedostępny, to powinien być zastąpiony takim a takim (albo napisem);
jeśli tamten wciąż jest niedostępny, to jeszcze innym; itd. Ostatnia
możliwość to zawsze ASCII, o którym zakładamy, że jest zawsze dostepne
(konwersje na zestawy znaków nie oparte na ASCII nie mogą być tworzone
w ten sposób). Tablica owa jest pamiętana w pliku devel/UTF8-charset
i jest całkowicie w UTF-8.

Przybliżenie może mieć dołączone `\}' z ciągiem znaków. Będzie wtedy
użyte tylko jeśli wszystkie te znaki będą dostępne, mimo że nie
występują we właściwym przybliżeniu. Niektóre znaki wymagają bowiem
różnych przybliżeń w zależności od dostępności innych znaków.

Najczęściej niedostępne znaki są zamieniane przybliżeniami ASCII,
zamiast różnymi ośmiobitowymi napisami. Tablica konwersji z UTF-8 jest
więc konstruowana z trzech części:

* Znaki całkowicie dostępne w docelowym zestawie (nie licząc ASCII).
  Tablica ta jest czytana z pliku zajmującego się konwersją odwrotną
  (na UTF-8).

* Znaki, które powinny być zastąpione jakimiś ośmiobitowymi napisami.
  Te i tylko te znaki są zapisane we właściwym filtrze z UTF-8.

* Znaki przybliżane przez ASCII. Ta tablica jest w aux/UTF8-ascii. Opisuje
  ona również znaki z poprzednich części (ponieważ jest jedna dla
  wszystkich zestawów), ale jest ładowana po nich, więc tłumaczenia tych
  samych znaków mają niższy priorytet. Ta tablica jest pierwszą
  i ostatnią kolumną pliku devel/UTF8-charset.

Skrypt aux/UTF8-charset jest używany przez prawie wszystkie konwersje
z UTF-8. Obsługuje on argumenty przekazane przez konwerta w zmiennej
ARG i składa odpowiednie tablice razem. Właściwe filtry z UTF-8 wołają
go tylko z pewnymi argumentami.

Katalog aux/argcharset zawiera kilka wspólnych filtrów, przez które jest
przepuszczany konwertowany tekst, jeśli przekażemy odpowiedni argument
filtrowi UTF8-charset (argument jest nazwą pliku z tego katalogu).


	BEZPOŚREDNIE KONWERSJE MIĘDZY ZESTAWAMI ZNAKÓW

Pomiędzy niektórymi parami zestawów znaków są bezpośrednie konwersje,
oprócz konwersji przez tymczasowy format UTF-8. Daje to przyspieszenie
konwersji (i nic więcej).

Filtry takie są tworzone automatycznie. W pliku devel/charset-charset
zapisane są tylko nazwy zestawów znaków, pomiędzy którymi będą tworzone
konwersje. Z linijki zawierającej więcej niż jedno słowo tworzone są
kombinacje każdy z każdym, przy czym słowa zaczynające się albo kończące
na `-' są brane pod uwagę tylko w jednym kierunku. Na przykład jeśli
mamy:

iso2 cp1250 cp852 -ascii

to zostaną utworzone konwersje iso2-cp1250, iso2-cp852, iso2-ascii,
cp1250-iso2, cp1250-cp852, cp1250-ascii, cp852-iso2, cp852-cp1250
i cp852-ascii. Przykładowa konwersja cp1250-iso2 zostanie utworzona na
podstawie tabel charsets/cp1250-UTF8, charsets/iso2-UTF8
i devel/UTF8-charset.

Utworzone w ten sposób filtry używają wspólnego skryptu
aux/charset-charset. Jeśli wśród argumentów konwersji będą takie, które
wymagają pośredniej postaci UTF-8, to konwersja odbędzie się tak jak
pomiędzy formatami nie posiadającymi bezpośredniej konwersji.


	ROZPOZNAWANIE ZESTAWÓW ZNAKÓW - KONWERSJA `any'

Specjalny format wejściowy any/JĘZYK (np. any/pl) rozpozna kodowanie
automatycznie, na podstawie częstości znaków znalezionych w tekście.
Z każdym językiem jest skojarzony zbiór możliwych kodowań używanych dla
niego i średnie częstości jego liter (wyłączając litery ASCII).

Oczekiwane częstości znaków każdego kodowania są mnożone przez
odpowiednie częstości z konwertowanego tekstu i dodawane razem.
Kodowanie z najwiekszym wynikiem jest wtedy używane do konwersji.

Skrypt filters/any-UTF8 pobiera informacje o języku z odpowiedniego
pliku aux/any/* (próbując każdy argument z ARG jako kod jezyka - zbiór
dostępnych języków jest wyznaczony przez zawartość tego katalogu).

Format tych plików jest prosty: Każda linia składa się z oddzielonych
odstępami nazwy kodowania (jak w filters/*-UTF8) i reprezentacji każdego
znaku w tym kodowaniu. `-' zamiast niego oznacza, że ten znak nie będzie
brany pod uwagę. Reprezentacje te są używane tylko do rozpoznania
kodowania - ostatecznie normalna konwersja jest wykonywana przez
filters/*-UTF8.

Specjalne kodowanie o nazwie `%' zawiera tylko częstości tych znaków
(niekoniecznie w procentach).

Nazwa kodowania może składać się z kilku konwersji oddzielonych przez
`|'. Do ostatniej będzie dołączone `-UTF8' i każda zostanie wzięta
z katalogu filters.

iso1 nie jest tutaj używane, bo jest podzbiorem cp1252.

Pliki źródłowe dla aux/any/* znadują się w katalogu devel/any. Jedyna
różnica jest taka, że niektóre nazwy kodowań mogą być wypisane bez
reprezentacji znaków. Drugim kodowaniem, po tym specjalnym `%', musi być
utf8, i zostanie ono użyte do uzupełnienia tamtych opisów kodowań.

Mając przykładowe teksty w jakimś języku, do zrobienia tych statystyk
możemy użyć skryptów devel/whichletters i devel/frequencies. Tekst musi
być w jakimś ośmiobitowym kodowaniu (np. ISO-8859-x, ale nie UTF-8 ani
SGMLowe encje). `whichletters pliki... >l' wyszukuje znaki o kodach
128..255. Możemy je teraz przejrzeć usuwając ewentualne śmieci. Dalej
`frequencies l pliki... | konwert X-utf8 >f', gdzie X jest oznaczeniem
odpowiedniego kodowania, i dopisujemy co trzeba.

Konwersja filter/htmlchariso1-iso1 jest wewnętrznie używana przez
niektóre automatycznie rozpoznawane konwersje. Jest ona podobna do
htmlchar-iso1, ale idzie bezpośrednio do iso1 pomijając utf8
i konwertuje również &#128;...&#159;, które błędnie są używane przez
niektóre edytory HTMLa do reprezentacji rozszerzonych znaków z kodowań
innych niż ISO-8859-1.

Filtr obsługuje teraz języki cs (czeski), de (niemiecki), el (grecki),
eo (Esperanto), es (hiszpański), fr (francuski), he (hebrajski),
it (włoski), pl (polski), pt (portugalski), ru (rosyjski)
i sv (szwedzki).


	ALIASY

Niektóre zestawy znaków są dostępne pod wieloma nazwami, np. cp1250 albo
wince. Jest to zaimplementowane przez twarde linki tworzone podczas
instalacji, na podstawie informacji z pliku devel/aliases.


	TWORZENIE TABLIC KONWERSJI Z INNYCH FORMATÓW

Skrypt devel/hex-trs konwertuje tablicę z formatu ftp.unicode.org na format
trs. Nie jest tutaj używany, ale załączony dla wygody.


-- 
 __("<   Marcin Kowalczyk * qrczak@knm.org.pl http://qrczak.home.ml.org/
 \__/       GCS/M d- s+:-- a21 C+++>+++$ UL++>++++$ P+++ L++>++++$ E->++
  ^^                W++ N+++ o? K? w(---) O? M- V? PS-- PE++ Y? PGP->+ t
QRCZAK                  5? X- R tv-- b+>++ DI D- G+ e>++++ h! r--%>++ y-
