Bu makalede uygulama ile gösterimin ayrılmasına örnek olarak ilk kez 1990 yılında SABAH gazetesi için QuarkXPress eklentisi olarak C dili ile kodladığımız Türkçe heceleme algoritmasının XSLT şablonu şeklinde kodlanmasını anlatacağız.
Herhangi bir metinin veritabanından çekilerek kullanıcıya sunulmak üzere hazır hale getirilmesi yazılımcının görevi iken, bu metnin sayfanın hangi kısmında, ne renkte kaç puntoda ve hecelere ayrılıp ayrılmadan gösterileceği gibi kulanıcıya sunumuna yönelik hazırlanması ise grafiker tarafından ve yazılımcıya hiçbir şekilde bağımlı kalmaksızın yapılabilmelidir.
Bu makalede bir Türkçe metnin hecelenerek kullanıcıya sunulması için herhangi bir uyglama geliştirme dili kullanımını gerektirmeyecek şekilde salt XSLT ile nasıl hecelere ayrılabileceğini göreceğiz.
XSLT'nin anlaşılır olması için aşağıdaki varsayımları yapıyoruz:
Öncelikle gelen metnin gösterilmeden önce sözcüklere ayrırarak her bir sözcüğü ayrı ayrı hecelememiz gerekiyor. Bu amaçla aşağıdaki metin-hecele XSLT şablonunu hecelenecek metni $metin parametresi içerisinde geçirerek kullanıyoruz.:
<xsl:template name="metin-hecele"> <xsl:param name="metin"/> <xsl:choose> <xsl:when test="contains($metin,' ')"> <xsl:call-template name="he-ce-le"> <xsl:with-param name="sozcuk" select="substring-before($metin,' ')"/> </xsl:call-template> <xsl:text> </xsl:text> <xsl:call-template name="metin-hecele"> <xsl:with-param name="metin" select="substring-after($metin,' ')"/> </xsl:call-template> </xsl:when> <xsl:otherwise> <xsl:call-template name="he-ce-le"> <xsl:with-param name="sozcuk" select="$metin"/> </xsl:call-template> </xsl:otherwise> </xsl:choose> </xsl:template>
Yukarıdaki şablon, metni sözcüklere ayırarak her bir sözcüğün he-ce-le adlı şablon aracılığıyla hecelenmesini sağlar.
Türkçe heceleme için kullandığımız algoritma temel olarak sessiz harfler arasındaki sesli harf sayısını ve sözcük içerisindeki r harfinin konumunu kullanarak sözcüğü heceleyeceği yeri belirliyor.
Bu harfleri kolaylıkla bulabilmek için gelen sözcük içerisindeki tüm sessiz harfleri a harfine ve büyük r harfini küçük r harfine çevirerek yeni bir değişken içerisine ($ozel) yazıyoruz. Ayrıca heceleri ayırmak için tire ("soft hyphen") damgası olarak ­ karakterini kullanıyoruz.
Sessiz harfler arasındaki sesli harf sayısı için $say değişkenini kullanıyoruz.
Algoritma şöyle çalışıyor:
Yukarıdaki algoritmayı uyguladığımız he-ce-le adlı şablon aşağıdadır:
<xsl:template name="he-ce-le"> <xsl:param name="sozcuk"/> <xsl:param name="tire" select="'­'"/> <xsl:variable name="ozel" select="translate($sozcuk, 'aeıioöuüAEIİOÖUÜR','aaaaaaaaaaaaaaaar')"/> <xsl:variable name="a" select="substring($sozcuk, 1 ,string-length(substring-before($ozel,'a'))+1)"/> <xsl:variable name="bo" select="substring($ozel,string-length($a)+1)"/> <xsl:variable name="b" select="substring($sozcuk,string-length($a)+1)"/> <xsl:variable name="c" select="substring-before($bo,'a')"/> <xsl:variable name="say" select="string-length($c)"/> <xsl:choose> <xsl:when test="not(contains($bo,'a'))"> <xsl:value-of select="$sozcuk"/> </xsl:when> <xsl:when test="$say=0 or $say=1"> <xsl:value-of select="concat($a,$tire)" disable-output-escaping="yes"/> <xsl:call-template name="sonrasi"> <xsl:with-param name="sozcuk" select="$b"/> </xsl:call-template> </xsl:when> <xsl:when test="$say=3 and substring($bo,3,1)='r'"> <xsl:value-of select="concat($a,substring($c,1,1),$tire)" disable-output-escaping="yes"/> <xsl:call-template name="sonrasi"> <xsl:with-param name="sozcuk" select="substring($b,2)"/> </xsl:call-template> </xsl:when> <xsl:otherwise> <xsl:variable name="yer" select="ceiling( $say div 2)"/> <xsl:value-of select="concat($a,substring($c,1,$yer),$tire)" disable-output-escaping="yes"/> <xsl:call-template name="sonrasi"> <xsl:with-param name="sozcuk" select="substring($b,$yer + 1)"/> </xsl:call-template> </xsl:otherwise> </xsl:choose> </xsl:template> <xsl:template name="sonrasi"> <xsl:param name="sozcuk"/> <xsl:variable name="ozel" select="translate($sozcuk, 'aeıioöuüAEIİOÖUÜ','aaaaaaaaaaaaaaaa')"/> <xsl:choose> <xsl:when test="contains($ozel,'a')"> <xsl:call-template name="he-ce-le"> <xsl:with-param name="sozcuk" select="$sozcuk"/> </xsl:call-template> </xsl:when> <xsl:otherwise> <xsl:value-of select="$sozcuk"/> </xsl:otherwise> </xsl:choose> </xsl:template>
Yorum Ekle (giriş yapın) |