Alfabeleri oluşturma işinde yardımı olsun diye küçük bir program yazdım. D kodu üretiyor.
Benim sistemimdeki /usr/share/X11/locale/en_US.UTF-8/Compose dosyasını; sistemdeki grep, sed, vs. programları kullanarak tarıyor ve sonuçta çıktıya şöyle bir D kodu yazıyor:
module tr.harfler;
/*
* UYARI: Bu dosya otomatik olarak üretilmiştir.
* Değişikliklerinizi kaybedebilirsiniz.
*/
struct Harf
{
dchar kod;
}
// ... kısaltarak gösteriyorum ...
immutable a = Harf ('a');
immutable A = Harf ('A');
immutable a_aksan = HarfGrubu("àáâãäåāăąǎǟǡǻȁȃȧḁạảấầẩẫậắằẳẵặⓐ");
immutable A_aksan = HarfGrubu("ÀÁÂÃÄÅĀĂĄǍǞǠǺȀȂȦḀẠẢẤẦẨẪẬẮẰẲẴẶⒶ");
immutable a_hepsi = a ~ a_aksan;
immutable A_hepsi = A ~ A_aksan;
// ...
Üretilen o dosyayı da trileri'ye ekleyeceğim ve alfabeleri o parçaları bir araya getirerek oluşturacağım:
a ~ a_aksan ~ b ~ b_aksan ~ c ~ ç ~ (c_aksan - ç) ~ ... z
Nasıl olacağından tam emin değilim daha... :)
Yukarıda gösterdiğim Compose isimli dosyada şöyle satırlar var:
<dead_circumflex> <a> : "â" U00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX
Program, kodu oradaki 'â' gibi karakterleri toplayarak üretiyor. Ama kod mükemmel değil. Üzerinde oynamam gerekti. Üretilen kod üzerinde elle değişiklik yaptığım için, üreten programı projeye eklemek istemedim. Örneğin üretilen kodun içine gereken yerlere uyarılar koyuyor:
// XXX Farklı uzunluk
immutable b = Harf ('b');
immutable B = Harf ('B');
immutable b_aksan = HarfGrubu("ƀḃḅḇⓑ");
immutable B_aksan = HarfGrubu("ḂḄḆⒷ");
immutable b_hepsi = b ~ b_aksan;
immutable B_hepsi = B ~ B_aksan;
Oradaki 'ḇ' karakterinin büyüğü yok; onun için onu çıkarttım. Böyle başkaları da var...
Dosyayı harfler.d olarak projeye ekleyeceğim.
Üreten program da şu:
import std.process;
import std.cstream;
import std.uni;
import std.conv;
import std.string;
void main()
{
dout.writefln(dosyaBaşlığı);
harfleriÜret("aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ");
}
void harfleriÜret(string latinler)
{
for (int i = 0; i != latinler.length; i += 2) {
harfiÜret(latinler[i], latinler[i + 1]);
}
}
void harfiÜret(char küçük, char büyük)
{
dstring küçük_aksanlılar = aksanlıları("SMALL", küçük);
dstring büyük_aksanlılar = aksanlıları("CAPITAL", büyük);
if (küçük_aksanlılar.length != büyük_aksanlılar.length) {
dout.writefln("// XXX Farklı uzunluk");
}
dout.writefln(`immutable %s = Harf ('%s');`, küçük, küçük);
dout.writefln(`immutable %s = Harf ('%s');`, büyük, büyük);
dout.writefln(`immutable %s_aksan = HarfGrubu("%s");`, küçük, küçük_aksanlılar);
dout.writefln(`immutable %s_aksan = HarfGrubu("%s");`, büyük, büyük_aksanlılar);
dout.writefln(`immutable %s_hepsi = %s ~ %s_aksan;`, küçük, küçük, küçük);
dout.writefln(`immutable %s_hepsi = %s ~ %s_aksan;`, büyük, büyük, büyük);
dout.writefln();
}
dstring aksanlıları(string küçük_büyük_belirteci, char harf)
{
string kaynakDosya = "/usr/share/X11/locale/en_US.UTF-8/Compose";
// Örnek: "LATIN SMALL LETTER A"
string belirteç = "LATIN " ~ küçük_büyük_belirteci ~ " LETTER "
~ `.*\<` ~ text(toUniUpper(harf)) ~ `\>`;
string harfSatırınıSeçen = `grep -w '` ~ belirteç ~ `' ` ~ kaynakDosya;
string satırınBaşınıSilen = `sed 's/.*: "//g'`;
string satırınSonunuSilen = `sed 's/ # .*//g'`;
string çiftSatırlarıSilen = `uniq`;
string harfiYalnızBırakan = `sed 's/".*//g'`;
string satırSonuKarakteriniSilen = `sed ':a;N;$!ba;s/\n//g'`;
string bütünKomut = harfSatırınıSeçen
~ "| " ~ satırınBaşınıSilen
~ "| " ~ satırınSonunuSilen
~ "| " ~ çiftSatırlarıSilen
~ "| " ~ harfiYalnızBırakan
~ "| " ~ satırSonuKarakteriniSilen;
return dtext(strip(shell(bütünKomut)));
}
auto dosyaBaşlığı =
// ------------------------------------
q{module tr.harfler;
/*
* UYARI: Bu dosya otomatik olarak üretilmiştir.
* Değişikliklerinizi kaybedebilirsiniz.
*/
struct Harf
{
dchar kod;
}
struct HarfGrubu
{
dstring grup;
HarfGrubu opSub(Harf çıkan) const
{
dstring sonuç;
foreach (harf; grup) {
if (harf != çıkan.kod) {
sonuç ~= harf;
}
}
return HarfGrubu(sonuç);
}
HarfGrubu opCat_r(Harf eklenen) const
{
return HarfGrubu(eklenen.kod ~ grup);
}
}
};
// ------------------------------------
Daha önce kullanmadığım bazı olanaklar var:
- '
merhaba
' gibi ters kesmeli dizgiler - kod yazabilmek için 'q{ ... }' dizgileri
- std.process modülündeki shell işlevi; çalıştırdığı komutun çıktısını string olarak döndürüyor
Ali
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]