IRCForumları - IRC ve mIRC Kullanıcılarının Buluşma Noktası

IRCForumları - IRC ve mIRC Kullanıcılarının Buluşma Noktası (https://www.ircforumlari.net/)
-   mIRC Scripting Dersleri (https://www.ircforumlari.net/mirc-scripting-dersleri/)
-   -   Regex ile Yazı Tipleri (https://www.ircforumlari.net/mirc-scripting-dersleri/261249-regex-ile-yazi-tipleri.html)

CesuryureK 23 Eylül 2009 13:26

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:

alias _t {
  if ($isid && $regex(+t,$1,^(caps|color|bold)$)) {
    var %_t = $regml(+t,1),%_r = return,%_2 = $iif($2,$v1),%_3 = $iif($3,$v1)
    if ($(,%_t) = caps) %_r $regsubex($$2-,/(.)/g,$iif(2 \\ \n,$upper(\1),$lower(\1)))
    if ($(,%_t) = bold) %_r $regsubex($$2-,/(.)/g,$+($chr(2),\1))
    if ($(,%_t) = color) %_r $regsubex($$4-,/(.)/g,$iif(2 \\ \n,$+($chr(3),%_2,\1,$chr(3),%_3),\1))
  }
}

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.

Mert 23 Eylül 2009 13:52

Cevap: Regex ile Yazı Tipleri
 
bu input'ların çakışmasınıda ortadan kaldırıcaktır.muhteşemsiniz.

Minstrel 06 Kasım 2011 20:26

Cevap: Regex ile Yazı Tipleri
 
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.


Ben bunları deniyorum ama olmuyor.

* /echo: Yetersiz veya eksik parametre

Böyle hata veriyor.

Entrance 06 Kasım 2011 22:08

Cevap: Regex ile Yazı Tipleri
 
Alıntı:

Minstrel Nickli Üyeden Alıntı (Mesaj 1040902738)
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.


Ben bunları deniyorum ama olmuyor.

* /echo: Yetersiz veya eksik parametre

Böyle hata veriyor.

Denemiş olduğun komutların, aktif olması için anladığım kadarıyla makale bitimin de, yazılan kod'un script'inin remote bölümün de, ekli olması gerekiyor.

Minstrel 06 Kasım 2011 22:36

Cevap: Regex ile Yazı Tipleri
 
Regex normalde oluyordu, sadece komutla. Tam anlamadım konuyu birşeyleri eksik yapıyor olabilirim.

CesuryureK 07 Kasım 2011 07:08

Cevap: Regex ile Yazı Tipleri
 
Alıntı:

Minstrel Nickli Üyeden Alıntı (Mesaj 1040902910)
Regex normalde oluyordu, sadece komutla. Tam anlamadım konuyu birşeyleri eksik yapıyor olabilirim.


_t ile oluşturulan aliasın mirce ekli olması dahilinde çalışabilecek bir kod. Evet regex vb identifierlar echo ile döndürebiliriz ancak ve ancak yukarıdaki gibi bir alias ile oluşturulan kod mevcutsa o alias kodu mirce ekli değilse netice alamazsınız.

alias _t {
if ($isid && $regex(+t,$1,^(caps|color|bold)$)) {
var %_t = $regml(+t,1),%_r = return,%_2 = $iif($2,$v1),%_3 = $iif($3,$v1)
if ($(,%_t) = caps) %_r $regsubex($$2-,/(.)/g,$iif(2 \\ \n,$upper(\1),$lower(\1)))
if ($(,%_t) = bold) %_r $regsubex($$2-,/(.)/g,$+($chr(2),\1))
if ($(,%_t) = color) %_r $regsubex($$4-,/(.)/g,$iif(2 \\ \n,$+($chr(3),%_2,\1,$chr(3),%_3),\1))
}
}


bu kodu remoteye ekleyip yeniden echo komutunu deneyin.

fasafiso 16 Nisan 2020 23:03

Cevap: Regex ile Yazı Tipleri
 
sadece kalın yazmak istiyorum nasıl bir kod gerekiyor ?

DeLiKanLl 16 Haziran 2021 10:04

Cevap: Regex ile Yazı Tipleri
 
Alıntı:

CesuryureK Nickli Üyeden Alıntı (Mesaj 1040903292)
_t ile oluşturulan aliasın mirce ekli olması dahilinde çalışabilecek bir kod. Evet regex vb identifierlar echo ile döndürebiliriz ancak ve ancak yukarıdaki gibi bir alias ile oluşturulan kod mevcutsa o alias kodu mirce ekli değilse netice alamazsınız.

alias _t {
if ($isid && $regex(+t,$1,^(caps|color|bold)$)) {
var %_t = $regml(+t,1),%_r = return,%_2 = $iif($2,$v1),%_3 = $iif($3,$v1)
if ($(,%_t) = caps) %_r $regsubex($$2-,/(.)/g,$iif(2 \\ \n,$upper(\1),$lower(\1)))
if ($(,%_t) = bold) %_r $regsubex($$2-,/(.)/g,$+($chr(2),\1))
if ($(,%_t) = color) %_r $regsubex($$4-,/(.)/g,$iif(2 \\ \n,$+($chr(3),%_2,\1,$chr(3),%_3),\1))
}
}


bu kodu remoteye ekleyip yeniden echo komutunu deneyin.


Selamün Aleyküm..

üstad benim istediğin ise farklı. Nicki normal yazacak, devamında yazılar ince olacak. Nick yazmadığımda da ince yazmasını istiyorum. Yapabilir miyiz?
Örnek:
StyLe Merhaba hoşgeldin

CesuryureK 17 Haziran 2021 17:48

Cevap: Regex ile Yazı Tipleri
 
Alıntı:

DeLiKanLl Nickli Üyeden Alıntı (Mesaj 1042498942)
Selamün Aleyküm..

üstad benim istediğin ise farklı. Nicki normal yazacak, devamında yazılar ince olacak. Nick yazmadığımda da ince yazmasını istiyorum. Yapabilir miyiz?
Örnek:
StyLe Merhaba hoşgeldin

İstediğiniz ile yazılan makale arasında bir ilişki bulunmamakla birlikte bu tarz isteklerinizi "mIRC Scripting Sorunları" bölümünde konu açarak talepte bulunabilirsiniz.

Lakin buna rağmen vaktiğim olduğundan istediğini yazdım. Aşağıdaki kodu remote bölümüne kopyalıyorsunuz. Başka input eventi ile çakışmadığından emin olunuz.

NOT: Kod hem özelde hem de kanalda çalışmaktadır. (Bu arada aradan 12 yıl geçmiş..)


Kod:

on *:input:*: {
  if (!$inpaste && !$ctrlenter && !$regex($1,/^\//)) {
    if ($target == $chan) { msg $chan $+($chr(2),$regsubex($1-,/(\S+)/gi,$iif(\1 ison #,$+($chr(2),\1,$chr(2)),\1))) | halt }
    else { if ($active != Status Window) { msg $target $+($chr(2),$regsubex($1-,/(\S+)/gi,$iif(\1 == $active,$+($chr(2),\1,$chr(2)),\1))) | halt } }
  }
}



Tüm Zamanlar GMT +3 Olarak Ayarlanmış. Şuanki Zaman: 19:21.

Powered by vBulletin® Version 3.8.8 Beta 3
Copyright ©2000 - 2024, vBulletin Solutions, Inc.
Search Engine Friendly URLs by vBSEO
Copyright ©2004 - 2024 IRCForumlari.Net