Home Map Index Search News Archives Links About LF
[Top bar]
[Bottom bar]
[Photo de l'auteur]
John Perr tarafından.

Yazar Hakkında:

1994'ten beri Linux kullanıcısı; LinuxFocus'un Fransız editörlerinden biridir.


İçindekiler:

m4 makrolarıyla metin dosyaları oluşturma.

Çeviri : Serdar Yanıkoğlu

[Illustration]

Ö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.



 

Giriş

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.

 

Tanım

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.

 

Bir Örnek

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:

 

HTML Hali

  
<!-- 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ç:

[Resmi büyütmek için buraya tıklayınız.] [Resmi büyütmek için buraya tıklayınız.]
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:

 

Makro Hali

  
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.

 

Makro Tanımlamaları

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)
- &copy <A HREF="mailto:[email protected]">
lynx.browser.org</A>
_ANNEE_</EM></FONT>
</BODY>
</HTML>
<!-- Bitişin sonu -->})dnl
 

Açıklama

"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.

 

Sayfa Oluşturma

Ş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.

 

Özet

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.)
 

Sonuç

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.  

Bağlantılar

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:
fr -> -- John Perr
fr -> en John Perr
en -> tr Serdar Yanıkoğlu

1999-09-08, lfparser sürüm 0.7 tarafından oluşturulmuştur.