04.Ocak.2021 | #1 |
Çevrimiçi
Www.ircforumda.net |
Regex ile Yazı Tipleri
Bu Ders Bir mIRCScripting.NET Dökümanıdır.
Yazan: L4roXyL - (Hasan AYDENİZ) Emeğe Saygı! - son zamanlarda özellikle yazı tipleri ile ilgili birçok kez sorular gelmekte ve birbirinden farklı yazı seçenekleri istenilmektedir.. bu istenilen özellikleri yazabilmek için nerden bakılırsa loop döngüsü ile en az 25 satır kod yazılacaktır. Ki buda az bir satır olmamakla birlikte zaman kaybına da neden olacaktır. Regex ile ince kalın yazı tipi yapmak pek zor bir durum değil lakin başka durumlar için mesela kırmızı-siyah yazı tipi için biraz mantık ve çıkış yolu gerekmektedir ki bu loop döngüsü ile dediğim gibi 20-25 satır kod bulacaktır. bu yüzden Hasan Aydeniz (L4roXyL) arkadaşımla bu konuyu konuşup regex ile farklı bir mantık yürütülüp yapılabilir mi, yapılırsa loop döngüsünden daha pratik ve kısa olabilir mi diye konuşurken kollar sıvandı ve şu ders yazıldı. Bildiğiniz üzere bir çoğu script-de, kalın/ince yazı, renkli yazı(bir harf belirtilen renk, diğer harf diğer belirttiğiniz renk) ve büyük/küçük yazım şekli şeklinde kod-lar mevcut. Bu tarz kodlar/işlevler genellike uzun, bol loop-lu kodlar ile yazılmaktadır ve olduğunca uzun olmaktadır(bunu en yeni çıkan scriptleri dahi gözlemleyerek söylüyorum) - Erdem arkadaşımız "bunu regex(regular expression) ile yapabilirmiyiz?" dediğinde, kalın/ince yazı için aklımda hemen bir mantık oluştu. Çünki daha önceden-de yazdığımı hatırlıyorum. Lâkin renkli ve büyük/küçük yazı şekli için duraksadım. Çünki kalın/ince yazının mantığı basittir; her harf arasına CTRL+B[old]($chr(2)) koymanız yeterli olur. Ama renkli yazı ve büyük/küçük yazı şekli için aynı şey geçerli değil tabiki. Farklı kullanımlar mevcut olduğu için farklı bir mantık geliştirmeniz gerekiyor. Her zaman dediğim gibi mIRC Scripting-de en iyi, en işlevsel, en hızlı ve en kısa kodu yazabilmek mantığınıza bağlıdır. Bilginizde önemlidir tabiki. Fazla uzatmadan mantıkları açıklayayım size. - Kalın/ince yazı mantığı yukarıdada dediğim gibi basittir. Ben regex kullandığım için, regex-daki mantığını açıklayacağım. Zaten diğer yollarla yine yukarıda dediğim gibi bir ton gereksiz external loop kullanmanız lazım. Buna gerek duymuyorum gerek olduğunuda bu saatten sonra zannetmiyorum. Regex-da aranılan verideki eşleşmeleri yakalamak için "(veri)" kullandığımızı biliyorsunuz. - Örnekler: Ö1: //echo -: $regex(r,deneme,e) => 1 Yakalama: //echo -: $regml(r,0) => 0 Açıklaması: Eşleşme var, yakalama işlevi yok. () kullanmadık. - Ö2: //echo -: $regex(r,deneme,(e)) => 1 Yakalama: //echo -: $regml(r,0) => 1 Açıklaması: Eşleşme ve yakalama işlevi var. Lâkin sadece d harfinden sonra gelen "e" harfini yakalar. Bu yüzden sonuç 1 olarak döner ve $regml(r,1) "e" olarak döner. Bunun sebebi /g/ anahtarını kullanmadık. - Ö3: //echo -: $regex(r,deneme,/(e)/g) => 3 Yakalama: //echo -: $regml(r,0) => 3 Açıklaması: Eşleşme ve yakalama işlevi var. Deneme text-i içerisindeki tüm "e" harfleri başarıyla yakalandı. Eşleşmeleri görmek için: //var %1 = 1 | while ($regml(r,%1)) { echo -: %1 - $v1 | inc %1 } Sanırım buraya kadar anlaşılmayan birşey yok. Şimdi gelelim, kalın/ince yazı şeklini nasıl yazacağız? Söyleki; mIRC Scripting-de $regsubex([name], text, re, subtext) tanımını bilirsiniz. Yani regex-i bilen herkez bu tanımında ne işe yaradığını az/çok bilir. Kısaca text içerisindeki belirtilen veriyi, yine belirtilen şekilde değiştirmenizi sağlıyor. Aklınıza $replace(x) vs. gelmesin bu çok daha fazla gelişmiş şeklidir. Neyse daha fazla uzatmadan açıklamak istiyorum. - Kalın/ince yazmamanın yolu regsubex ile sadece bu kadar. .) Kod: $regsubex(deneme,$1-,/(.)/g,$+($chr(2),\1)) - Açıklaması: /(.)/g bu kısımda "." herhangi bir karakter demektir. Burada yaptığımız işlev veri içerisindeki her karakteri yakalıyoruz. Yani text içerisindeki tüm karakterler $regml(deneme,[N]) şeklinde görülebilir. Buradaki "deneme" regex-e verdiğimz isimdir, karışma olmasın diye belirttim. "\1" kısmı ise yakalan veri olarak döner. Yani kısacası text içerisindeki tüm verileri yakalıyor ve onları $chr(2)(bold karakteri) ile re-text ediyoruz. Görmek için: //var %1 = 1 | while ($regml(deneme,%1)) { echo -: $v1 | inc %1 } Sanırım buraya kadarda anlaşılmayan birşey yok. - Şimdi gelelim; büyük/küçük ve renkli/renksiz yazma olayına. - Bu olayda yukarıdaki gibi, lâkin kullanacağımız mantık biraz daha farklı olacak. Yukarıyı okuduysanız bu bölümden sonra ne dediğimi gayet iyi anlayacaksınızdır diyerek konuya giriyorum. - Bildiğiniz gibi IF sorgusunda; "//" operatörü mevcut. Bu operatör, belirtilen saysının; diğer belirtilen sayının katları olduğunda eşleşme gerçekleştirir. Örneğin: //if (2 // 4) echo -: $v1 Gibi. Burada belirtilen "4" rakamı belirtilen "2" sayısının kat sayılarından birisidir. //if (2 // 3) echo -: $v1 yaptığınızda pozitif sonuç dönmez. Çünki "3" rakamı "2" rakamının kat sayısı değildir. Aynı şekilde bir diğer operatör olan "\\" ise aynı işlevin tam tersini yapar. Yani yazılan ilk sayı, yazılan ikinci sayının kat sayısı ise sonuç pozitif dönecektir. Örneğin: //if (4 \\ 2) echo -: $v1 Gibi. - Yani şimdi diyebilirsiniz; "bu adam neden bunları anlatıyor bize?" bende size cevap olarak; mIRC Scripting bir mantık işidir. Yapabilecekleriniz mantık + bilgi ile sınırlıdır ve her ikisinin seviyesine göre kodlar yazabilirsiniz. Mantık + bilgi ne kadar iyi ise, sizde o kadar iyi bir coder-sınız demektir. - Diyelimki şöyle bir istek yapılıyor(ki yukarıda dediğim gibi script-lerin çoğunda bu vazgeçilmez bir özelliktir); yazdığım yazının harflerinin birisi kırmızı, diğeri siyah olsun? Mantık olarak ne yapacağız? Yukarıdaki örneklerde yaptığımız gibi yine text içerisindeki tüm karakterleri (yakalayacağız) ve son olarak re-text edeceğiz. AMA; bu işlevi tam olarak yukarıdaki gibi yaparsak, text-in tamamı ilk belirlediğimiz renk ile görülecektir. Peki biz bu konumda ne yapabiliriz? Nasıl yapacağız? Şu konumda loop(while vs.)lara girmeden işin içinden çıkılamaz gibi geliyor. Şöyle birşey yapsak? Regex-da "\n" yakalanan verinin numarasını veriyordu biliyorsunuz. "\1" veya "\t" ise yakalanan verinin kendisini veriyordu. - Daha iyi anlamak için verdiğim iki küçük örneğe bakınız: Ö1: //echo -: $regsubex(deneme,/(e)/g,\n) Sonuç: d1n2m3 (yakalanan veriler yakalam sırasına göre numaralandırıldı) - Ö2: //echo -: $regsubex(deneme,/(e)/g,\1) Sonuç: deneme (yakalanan veriler(tüm e harfleri oluyor bunlar) aynı biçimde gösterildi. Buraya kadar anlaşılmayan birşey yok sanırım. En son yapmamız gereken küçük bir IF sorgusu. Diyeceğizki; yakalanan veri numarası "2" sayısının katları ise, belirtilen rengi re-text edeceğiz. Eğer değilse, normal bir şekilde re-text edeceğiz. Yani kısacası şu şekilde olacak; "d1n2[burayı re-text et]m3" şeklinde. Ben artık daha fazla uzatmadan size yazdığım kodu veriyorum. - Kod: $regsubex($1-,/(.)/g,$iif(2 \\ \n,$+($chr(3),4,\1,$chr(3),1),\1)) - Demekki neymiş? Bu veya buna benzer(büyük/küçük harf mesela) bir kod için 3/5 tane loop kullanmaya ve en az 25 satır kod yazmaya gerek yokmuş. Ve bir süpriz daha, aynı mantığı kullanarak harflerin büyük/küçük olmasınıda sağlayabiliyoruz. - Kod: $regsubex($1-,/(.)/g,$iif(2 \\ \n,$upper(\1),$lower(\1))) - Son olarak hepsini bir arada toparla*****, bir kod yazıyorum ve ders niteliğinde olan makalemizi sonlandırıyorum. Kod: Kodu kopyalamak için üzerine çift tıklayın!
Kullanım: $_t(bold|caps|color,text) Kullanım(color hakkında): 2 renk belirlemelisiniz. Bu belirlediğiniz 2 renk sayesinde re-text olacaktır. Örneğin: $_t(color,4,2,deneme) Açıklama: 4 ilk rengin, 2 ise ikinci rengin kodudur. Tabiki siz bunları değiştirip istediğiniz renk yapabilirsiniz. Bu sadece bir örnektir. Renk kodlarını görmek/öğrenmek için; CTRL+K yapınız. - Örnek kullanımlar: - Büyük/küçük yazı: //echo -: $_t(caps,Deneme yapıyoruz.) Sonuç: DeNeMe yApıyOrUz. - Kalın/ince yazı: //echo -: $_t(bold,Deneme yapıyoruz.) Sonuç: Deneme yapıyoruz. - Renkli yazı: //echo -: $_t(color,4,2,Deneme yapıyoruz.) Sonuç: Deneme yapıyoruz. - Makalemiz sona ermiştir. NOT: hiçbir platformu düşünmeden sadece kişinin birşey öğrenmesini istediğim(iz) için paylaşıma sunuldu. dilerimki amacımıza ulaşırız. |
|
|