John Perr tarafından. Yazar Hakkında: 1994'ten beri Linux kullanıcısı; LinuxFocus'un Fransız editörlerinden biridir. İçindekiler: |
Özet:
Bu ders, m4 makro işlemci kullanılarak metin veya HTML dosyalarının bakımının nasıl kolaylaştırılacağını anlatmaktadır.
Metin editörleri kullanılırken bir makro komut diline sıkça ihtiyaç duyulur. Bu editörlerin çoğu, kendi özelliklerinde bu dilleri zaten bulundururlar. C derleyicisi de programcılar için böyle bir özelliği C önişlemcisi CPP sayesinde sağlamaktadır. Konfigürasyon dosyalarının ya da küçük bir sanalyörenin (web site) bakımı yapılacağı zaman, GNU/m4 makro işlemcisi iş yükünü hayli azaltabilir. GNU/m4 makro işlemcisi, tüm linux sürümlerinin bir parçası olmakla birlikte, Unix kullanıcıları için de bir standart haline gelmiştir.
Aşağıda, küçük bir sanalyöredeki birtakım HTML dosyalarının bakımı yapılırken GNU/m4 makro işlemcisinin nasıl kullanılacağını göreceğiz. Bu sistem, tüm yöreyi uyumlu bir tasarımda tutmamıza yardımcı olacak. Elbette Unix araçlarıyla aynı sonucu almanın çeşitli yolları vardır; bu da Unix'in güzelliği.
Bu teknik, herkesçe bilinen sendmail.cf'nin oluşturulmasında kullanılır. Eric Allman tarafından tasarlanan ve Berkeley Üniversitesi'nden temin edilebilecek bir m4 makro kiti bulunmaktadır
.GNU/m4 makro işlemci, metin ve HTML düzenlemeyle sınırlı değildir. CPP'nin özelliklerini geliştirmek isteyen programcılar, ya da diğer dillerle CPP'ninkine eşit özellikler elde etmek isteyenler için, GNU/m4 makro işlemci çok kullanışlıdır.
Bir makro işlemcisi, kullanıcı tarafından tanımlanan komutları (makrolar) yorumlayan bir programdır. Makrolar işlenmek için genellikle metnin içine gömülürler. Örnek olarak bu tanımlama:
define(YAZAR,`Agatha Christie<[email protected]>')
"YAZAR" kelimesinin metnin herhangi bir yerinde kullanılabilmesini sağlar. m4 ile işlendiğinde bu kelime, "Agatha Christie<[email protected]>" ile değiştirilir. Aşağıda da gösterileceği gibi daha birçok kullanışlı özellik bulunmaktadır.
Diyelim ki farklı dillerdeki aynı sayfalara sahip bir sanalyöreyi güncelleyeceğiz. Dahsı, yöreye uyumlu bir görünüm sağlamak için tüm sayfalar aynı başlık ve bitişe sahip olmalıdır. Basitlik olması bakımından ve tarayıcı (browser) kullanımına gerek olmaması için, örneğimiz salt metin içerecek. Bu ayrıca, lynx kullanıcılarının da yöremizi kolaylıkla ziyaret edebilmelerini sağlayacak. Aşağıda bir sayfa için HTML kodu verilmiştir:
<!-- Başlığın başı --> <HTML> <HEAD> <TITLE>Lynx anasayfa</TITLE> <META name="description" content="Site lynx et m4"> </HEAD> <BODY BGCOLOR="#FFFFFF" LINK="#008000" VLINK="#808080" ALINK="#8080FF"> <TABLE> <TBODY> <TR><TD align=middle colspan="2"> <H1>Lynx, karakter-hücresel ekranlar için tam nitelikli bir World Wide Web istemcisi.</H1> <TR><TD align="left" valign="top" width="15%"> <a href="./index-en.html">İngilizce</A><BR> <a href="./index-fr.html">Fransızca</A><BR> <a href="./index-es.html">İtalyanca</A><BR> <a href="./index-it.html">İspanyolca</A><BR> <a href="./index-de.html">Almanca</A><BR> <TD align=left> <!-- Başlığın sonu --> <P>Lynx için hazır kaynaklar ve destek malzemesi için bağlantılar, <A HREF="http://www.crl.com/~subir/lynx.html">Lynx bağlantıları</A></P> <P> ve Lynx anasayfasında <A HREF="http://lynx.browser.org/">Lynx Hakkında Bilgi.</A></P> <P>Lynx hakkında bilgi ve yeni haberler için bu sayfalara bakınız.</P> <P>Lynx, kullanım sınırlaması ya da tekrar-sürüm olmaksızın GNU Genel Açık Lisans (GAL) altında dağıtılmaktadır. Lynx copyright ifadeleri "COPYHEADER", ve GNU GAL, "COPYING", dağıtımın birinci seviye dizininde bulunmaktadır. Lynx, Lynx kullanıcı grubu - bütünüyle gönüllü (ve resmi olmayan) organizasyon - tarafından desteklenmektedir.</P> <!-- Bitişin başı --> </TBODY> </TABLE> <HR size="0" noshadow> <FONT SIZE=-2> <EM>John Perr tarafından hazırlanmıştır.<BR> 25/07/99 tarihinde güncellenmiştir. - © <A HREF="mailto:[email protected]">lynx.browser.org</A>1999 </EM></FONT> </BODY> </HTML> <!-- Bitişin sonu -->
Sonuç:
lynx ile | netscape ile |
Tüm sayfalar aynı başlangıç ve bitişe sahip olacaklar, sadece dil ve gövde kısımları farklı olacak. Şimdi, tüm tekrarlayan içeriği değiştirmek için gereken ve sayfaların HTML kodlarına gömülecek olan m4 makrolarını tasarlayacağız.
Makroların ayrıntılarına girmeden önce, onlarla yazılmış yukarıdaki örneğe bir göz atalım:
LYNX_TITRE(Lynx, karakter-hücresel ekranlar için tam nitelikli bir World Wide Web istemcisi.) LYNX_ENTETE(Lynx anasayfa) <P>Lynx için hazır kaynaklar ve destek malzemesi için bağlantılar, <A HREF="http://www.crl.com/~subir/lynx.html">Lynx bağlantıları</A></P> <P> ve Lynx anasayfasında <A HREF="http://lynx.browser.org/">Lynx Hakkında Bilgi.</A></P> <P>Lynx hakkında bilgi ve yeni haberler için bu sayfalara bakınız.</P> <P>Lynx, kullanım sınırlaması ya da tekrar-sürüm olmaksızın GNU Genel Açık Lisans (GAL) altında dağıtılmaktadır. Lynx copyright ifadeleri "COPYHEADER", ve GNU GAL, "COPYING", dağıtımın birinci seviye dizininde bulunmaktadır. Lynx, Lynx kullanıcı grubu - bütünüyle gönüllü (ve resmi olmayan) organizasyon - tarafından desteklenmektedir.</P> LYNX_PIED
Görüldüğü gibi, HTML sayfaları yazmak daha basittir ve metin, HTML etiketlerinin içinde kaybolmaz. Diğer dillerde başka sayfalar yazmak için bu dosyanın çevirilerinin oluşturulması gereklidir. Fransızca hali şu şekilde olacaktır:
LYNX_TITRE(Lynx un navigateur en mode console) LYNX_ENTETE(Un site pour les utilisateurs de lynx) <P>Visitez le <A HREF="http://lynx.browser.org/"> site officiel de lynx</A> pour plus d'informations sur Lynx, y compris les nouvelles mises à jour.</P> <P>Les liens vers les sources de la version courante et divers supports pour Lynx sont tenus à jour sur le site <A HREF="http://www.crl.com/~subir/lynx.html"> liens Lynx</A>.</P> <P>Lynx est distribue dans le cadre de la lisence GNU (General Public License - GPL) sans restriction sur son utilisation ni sa distribution. Les mentions des droits de reproduction de Lynx, "COPYHEADER", et GNU GPL, "COPYING", sont inclus dans la racine de l'arborescence de la distribution. Lynx est supporte par la communaute des utilisateurs de Lynx, une communaute entièrement benevole (et non-officielle).</P> LYNX_PIED
Her dil için aynı makrolar LYNX_TITRE, LYNX_ENTETE ve LYNX_PIED, farklı argümanlarla kullanılmıştır. Bu üç makro, başlık ve bitişin HTML kodları için yeterli bir değiştirme sağlar. Bu sistemin asıl avantajı budur: başlığın ve bitişin tanımlamaları tüm yöre için tutarlıdır. Eğer başlık ve bitişin tasarımının değişmesi gerekirse, tüm sayfaların elle değiştirilmesi yerine sadece makro tanımlamasının değiştirilmesi yeterli olacaktır.
Yukarıda, biçimin hemen hemen tümünü elde etmek için üç makro kullanılmıştır. Bu makroların tanımlamalarını içeren dosya aşağıdaki gibidir. Komutlar:
divert(-1) # Dosya mac.css # Sürüm 1.0 Lynx için M4 makroları # # Fransızca dili taban alınarak her dil # için bir trans-LANG.m4 dosyası hazırlanmıştır. # Eğer bir çeviri dosyası bulunmuyorsa, Fransızca # varsayılan dildir. # divert(0) changequote({,})dnl # tırnak işaretlerini küme parantezine dönüştür ifdef({LANG},,{define({LANG},{fr})})dnl # Varsayılan = fransızca include({trans-}LANG{.m4})dnl # çeviri dosyasını çağır undefine({format})dnl # Biçim tanımlamasını gizli tut define({_ANNEE_},esyscmd(date +%Y))dnl #Şimdiki yıl define({LYNX_TITRE},{define(_TITLE_,$1)})dnl # Birinci makro dnl # İkinci makro define({LYNX_ENTETE},{<!-- Başlığın başı --> <HTML> <HEAD> <TITLE>$1</TITLE> <META name="description" content="m4 ve Lynx Yöresi"> <META name="keywords" content="m4, lynx, GPL"> </HEAD> <BODY BGCOLOR="#FFFFFF" LINK="#008000" VLINK="#808080" ALINK="#8080FF"> <TABLE> <TBODY> <TR><TD align=middle colspan="2"> <H1>_TITLE_</H1> <TR><TD align="left" valign="top" width="15%"> <a href="./index-en.html">_ANGLAIS_</A><BR> <a href="./index-fr.html">_FRANCAIS_</A><BR> <a href="./index-es.html">_ESPAGNOL_</A><BR> <a href="./index-it.html">_ITALIEN_</A><BR> <a href="./index-de.html">_ALLEMAND_</A><BR> <TD align=left> <!-- başlığın sonu -->})dnl dnl # Üçüncü makro define({LYNX_PIED},{<!-- Bitişin başı --> </TBODY> </TABLE> <HR size="0" noshadow> <FONT SIZE=-2> <EM>_MAINTENEUR_.<BR> _MAJ_ esyscmd(date +%d/%m/%y) - © <A HREF="mailto:[email protected]"> lynx.browser.org</A> _ANNEE_</EM></FONT> </BODY> </HTML> <!-- Bitişin sonu -->})dnl
"divert(-1)" ve "divert(0)"in arasındaki satırlar, komutlardır. "Divert", m4 makro işlemcisinin bileşik makrolarından biridir ve işlemcinin çıktısını yönlendirmek için hazırlanmıştır. -1 kullanımı, işlemciye son HTML dosyasının içinde yer alan bir sonraki satırları yazmamasını söyler. Bu da bizim istediğimiz şeydir.
"changequote" makrosu, normalde makro argümanlarından alıntı yapmak için kullanılan tırnak işaretlerini yeniden tanımlar. Bunlar, metin dosyasının içinde, özellikle de fransızca olanlarda, sıkça kullanıldıkları için ve makroların yanlış yorumlanmalarına neden olabildikleri için küme parantezleriyle değiştirilirler. Küme parantezlerinin seçilme nedeni; metin veya HTML için daha az kullanılmalarıdır.
"ifdef" makrosu, LANG makrosunun tanımlanıp tanımlanmadığını ve varsayılan olarak "fr"nin atanıp atanmadığını kontrol eder. LANG makrosu ise dili ayarlamaya yarar. Aşağıdaki satırlarda, m4'ü çağırırken HTML sayfasının dilini belirtmek için bunu nasıl tanımlayacağımızı göreceğiz.
"include" satırı, C'dekiyle aynı anlamı taşır ve harici bir dosyayı çağırmayı sağlar. Bunu, başlık ve bitişteki dile özgü makro tanımlamalarını yüklemek için kullanırız. Aşağıda bunun dile göre içeriği verilmiştir:
divert(-1) # Dosya trans-fr.m4 # Fransızca için tanımlamalar divert(0) define({_ANGLAIS_},{Anglais})dnl define({_FRANCAIS_},{Français})dnl define({_ITALIEN_},{Espagnol})dnl define({_ESPAGNOL_},{Italien})dnl define({_ALLEMAND_},{Allemand})dnl define({_WEBMASTER_},{John Perr})dnl define({_MAINTENEUR_},{Page maintenue par _WEBMASTER_})dnl define({_MAJ_},{Date de mise à jour:})dnl
divert(-1) # Dosya trans-en.m4 # İngilizce için tanımlamalar divert(0) define({_ANGLAIS_},{English})dnl define({_FRANCAIS_},{French})dnl define({_ITALIEN_},{Spanish})dnl define({_ESPAGNOL_},{Italian})dnl define({_ALLEMAND_},{German})dnl define({_WEBMASTER_},{John Perr})dnl define({_MAINTENEUR_},{Page maintained by _WEBMASTER_})dnl define({_MAJ_},{Page updated on })dnl
Eğer İspanyolca, İtalyanca ya da Almanca konuşuyorsanız, bu diller için benzer dosyalar yazabilirsiniz.
"undefine" satırı, "format" adlı bileşiğin varsayılan tanımlamasını gizler, çünkü bu bileşik burada kullanılmamaktadır. Eğer bu satır çıkarılırsa, "format" kelimesi metnin içinde her geçişinde tırnak işaretleri içine alınmadıkça kaybolacaktır. Örnek olarak; küme parantezine alındığında. Basit bir sanaldoku sayfasını değiştirirken böyle bir uygulama tavsiye edilmez.
Bir sonraki aşamada o anki yıla geliyoruz. Bu, bir unix komutu olan "date"i çağıran "easyscmd" makrosu sayesinde elde edilir. Bu komut ayrıca, sayfanın son güncellenme tarihini yazdırmak için bitişin tanımlanmasında da kullanılır.
İzleyen satır, üç ana makromuzun ilkini - LYNX_TITRE - tanımlar. Bu makro ayrıca _TITRE_ isimli başka bir makroyu da tanımlar. Bu çift tanımlama, sayfanın başlangıcında ve bitişinde başlığı (title) birçok kez kullanabilmek için gereklidir. Makronun ilk argümanına gönderme yapmak için $1'in nasıl kullanıldığına dikkat edin.
Kalan satırlar diğer iki ana makroyu - LYNX_ENTETE ve LYNX PIED - tanımlar. Bu iki makro, HTML sayfasındaki başlangıcın ve bitişin içeriğine karşılık gelir. Sayfanın değişken elemanları buna dahil değildir. Bunlar:
Her satırın sonunda yer alan "dnl", m4'ün bileşik makrolarından biridir ve "Delete to New Line - Yeni Satıra Sil" anlamını taşır. "dnl" ile, m4 bir makroyu yorumlarken boş bir satır yaratmaz.
Şimdi sistemimiz hazır olduğuna göre, dosyalardan bir sanaldoku sayfasının oluşturulması aşağıdaki komutla yapılır:
ki "XX", her dil için kullanılan koddur. -D parametresinin de kullanıldığına dikkat edin. Bu, gcc'de olduğu gibi komut satırından bir makro tanımlamak içindir.
Aşağıdaki tablo, dosyaları ve bu uygulamadaki kullanımlarını göstermektedir.
İzleyen dosyalar HTML sayfaları oluşturmak için kullanılmışlardır:
index-XX.html | Sayfanın gövdesi, yazar ya da çevirmen tarafından metin halinde yazılır. Her sayfa ve her dil için ayrıdır. (kod, İngilizce için XX=en, İspanyolca için es, vb. şeklindedir.) |
mac.css | Standart tanımlamalar. Bu dosya tüm sayfalar ve tüm diller için ortaktır. Bir çeşit biçim sayfası (style sheet) olarak düşünülebilir. |
trans-XX.m4 | Bir dil için standart tanımlamalar. Bu dosya, bir dil için olan tüm sayfalarda ortaktır. (kod, İngilizce için XX=en, İspanyolca için es, vb. şeklindedir.) |
Tüm gücüne rağmen m4 makro işlemcisi, Perl ya da Tcl gibi bir skript diliyle kıyaslanamaz. Kendine özgü nitelikleri bir kere kavrandığında, metin dosyalarını işlemek için çabuk ve kolay kullanılan bir yöntemdir. Daha fazla bilgi için, kendi sürümünüzle birlikte gelen dökümantasyona başvurunuz. Yaklaşık 30 sayfalık ve GNU/m4 makro işlemcisinin tüm özelliklerini içeren bir ders bulacaksınız. Ayrıca Bordeaux Linux Kullanıcıları Grubu'nun (ABUL) sayfasına bir göz atabilirsiniz. Bu sayfada, buradakine benzer m4 makrolarından oluşan bir kit bulunmaktadır.
GNU/m4,
ftp://prep.ai.mit.edu/pub/gnu/m4-1.4.tar.gz'de bulunabilir.
Burada anlatılan dosyaları, The Lynx m4 macro kit'ten indirebilirsiniz.
Eleştirileriyle bu makaleye katkıda bulunduğu için Paul Kienzle'ye teşekkürler.
Sanaldoku sayfaları, LinuxFocus editör takımı tarafından desteklenmektedir.
© John Perr LinuxFocus 1999 |
Çeviri bilgisi:
|
1999-09-08, lfparser sürüm 0.7 tarafından oluşturulmuştur.