JavaScript: String.replace()

რამდენიმე წლის წინ დავწერე პოსტი JavaScript – ით DOM ელემენტის სტილებთან მუშაობის შესახებ. ბრაუზერებს შორის სხვაობიდან გამომდინარე(კერძოდ კი IE – ს განსხვავებული მიდგომის გამო) პრობლემის გვერდის ასავლელად დავწერე ქვემოთ ნაჩვენები კოდი:

1
2
3
4
5
6
7
8
9
10
function getCamelCase(string) {
    var tokens = string.split('-');
    if (tokens.length > 1) {
        for (var i = 1; i < tokens.length; i++) {
            tokens[i] = tokens[i].substring(0, 1).toUpperCase() + tokens[i].substring(1).toLowerCase();
        }
        string = tokens.join('');
    }
    return string;
}

კოდის ერთადერთი დანიშნულებაა ტირეებიანი CSS ატრიბუტების მაგ. border-left-color, background-color გადაყვანა ე.წ. Camel Case ფორმატში ანუ borderLeftColor, backgroundColor და ა.შ.

დღეს კოდის წერისას იგივე პრობლემა მექანიკურად გადავჭერი სხვა უფრო მოხდენილი და რაც მთავარია გაცილებით მცირე ზომის კოდის მეშვეობით:

1
2
3
4
5
6
7
8
var str = "some-test-string";
str.replace(/-([\w])/gi, function(a1, a2) {
    return a2.toUpperCase();
});

//კოდის შესრულების შემდეგ
//სტრიქონი "some-test-string"
//გარდაიქმნება შემდეგნაირად: "someTestString"

დამეთანხმებით რომ თვალსაჩინო სხვაობაა :D როგორ მუშაობს ეს კოდი? პირველ რიგში შეგახსენებთ თავად String ობიექტის replace() მეთოდის სიგნატურას:

str.replace(regexp|substr, newSubStr|function[, Non-standard flags]);

ანუ replace() მეთოდს მეორე პარამეტრად ახალი, ჩასანაცვლებელი სტრიქონის ნაცვლად შეგვიძლია გადავცეთ ქოლბექ ფუნქცია რომელიც დააბრუნებს დამუშავებულ სტრიქონს, ხოლო ეს დაბრუნებული სტრიქონი თავის მხრივ გამოყენებული იქნება რეგულარული გამოსახულების მიერ ნაპოვნი შესატყვისის ჩასანაცვლებლად.

საინტერესოა ასევე თუ რა პარამეტრებს გადასცემს replace() მეთოდი ქოლბექ ფუნქციას. გადასაცემი პარამეტრების რაოდენობა ცვალებადია და დამოკიდებულია მთელ რიგ ფაქტორებზე. მაგალითად ჩემს მიერ ნაჩვენებ მაგალითში ფუნქციას გადაეცემა ოთხი პარამეტრი, კერძოდ კი ფუნქცია გამოიძახება ორჯერ შემდეგი პარამეტრებით:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//პიველი დამთხვევისათვის ანუ "-t"
function(
  "-t",  //რეგულარული გამოსახულების მიერ ნაპოვნი სტრიქონი სრულად
  "t",    //დამაჯგუფებელ ფრჩხილებში მოთავსებული შედეგი
  4,     //პოზიცია რომელზეც მოხდა პირველი დამთხვევა
  "some-test-string" //სრული სტრიქონი
);

//მეორე დამთხვევისათვის ანუ "-s"
function(
  "-s",  //რეგულარული გამოსახულების მიერ ნაპოვნი სტრიქონი სრულად
  "s",    //დამაჯგუფებელ ფრჩხილებში მოთავსებული შედეგი
  9,     //პოზიცია რომელზეც მოხდა პირველი დამთხვევა
  "some-test-string" //სრული სტრიქონი
);

ნაჩვენები კოდიდან თვალსაჩინოა სავარაუდო პარამეტრების რაოდენობა, თუმცა მნიშვნელოვანია შემდეგი დეტალების გათვალისწინება, ქოლბექ ფუნქციას:

  • პირველ პარამეტრად ყოველთვის გადაეცემა რეგულარული გამოსახულების მიერ ნაპოვნი სრული შესატყვისი;
  • ბოლო პარამეტრად ყოველთვის გადაეცემა სრული სტრიქონი რომლშიც განხორციელდა გარკვეული შესატყვისის ძიება;
  • ბოლოდან მეორე(ბოლოს წინა) პარამეტრად ყოველთვის გადაეცემა ნაპოვნი შესატყვისის პოზიცია.
  • თუ რამდენი პარამეტრის გადაცემა მოხდება პირველსა და ბოლო ორ პარამეტრს შორის დამოკიდებულია რეგულარულ გამოსახულებაში გამოყენებული დამაჯგუფებელი ფრჩხილების რაოდენობაზე(ჩემს მიერ ნაჩვენებ მაგალითში ასეთი პარამეტრი ერთია რადგან მხოლოდ ერთი დამაჯგუფება მაქვს გამოყენებული);
  • replace() მეთოდი გამოიძახებს ერთხელ თუ რეგულარული გამოსახულების ბოლოს არ გვაქვს მითითებული “g” ანუ გლობალური მოდიფიკატორი, ან გამოიძახებს იმდენჯერ რამდენი დამთხვევაც მოხდება კონკრეტული შესატყვისისათვის(ნაჩვენებ მაგალითში გამოძახება მოხდება ორჯერ).

enjoy B-)

ტეგები: ,

jQuery საკუთარი ხელით – ნაწილი 2

მაშ ასე, განვაგრძობ პოსტების სერიას “jQuery საკუთარი ხელით” და გთავაზობთ მეორე ნაწილს. პირველ ნაწილში ლაპარაკი გვქონდა ამ ბიბლიოთეკის ძირითად შემადგენელ ნაწილებსა და მისი მუშაობის ზოგად პრინციპებზე. ასევე პირველ ნაწილში შევქმენით ბიბლიოთეკის კარკასი კოდური სახელწოდებით myQuery და სადემონსტრაციოდ დავამატეთ ერთი მეთოდი.

დასაწყისისთვის უკვე გაგვაჩნია საკმარისი ინფორმაცია და მოდულის მკაფიო მონახაზი რომელზე დაყრდონბითაც შეგვიძლია გადავიდეთ რეალიზაციის შემდეგ ნაწილზე. ამ ნაწილში ლაპარაკი მექნება DOM ელემენტის class ატრიბუტსა და მასთან სამუშაო მეთოდებზე. სრულად »

ტეგები: , , ,

jQuery საკუთარი ხელით – ნაწილი 1

jQuery განეკუთვნება იმ ბიბლიოთეკათა ნაწილს რომელმაც მოახერხა და გულგრილად არ დატოვა მთელი მსოფლიოს ვებ დეველოპერები. ძალიან ბევრი ამ სფეროში მომუშავე პროფესიონალი თუ მოყვარული დამეთანხმება რომ ამ ბიბლიოთეკის ავტორმა ჭეშმარიტად ეფექტურ და უნიკალურ მიდგომას მიაგნო რამაც უთვალავ ვებ პროგრამისტს არათუ უბრალოდ გაუადვილა არამედ მეტი ხალისი და აზარტი შესძინა მათ ყოველდღიურ საქმიანობას.

ამ პოსტით მინდა გავხსნა დაგეგმილი სერია პოსტებისა რომლის მეშვეობითაც შევეცდები გაგაცნოთ jQuery – ს შიდა სამზარეულო და გადმოგცეთ მასში გამოყენებული ძირითადი მიდგომები რომლებიც დაგეხმარებად მსგავსი ტიპის საკუთარი ბიბლიოთეკების შექმნაში.

პოსტის დანარჩენი ნაწილის წაკითხვამდე მინდა გაგაფრთხილოთ რომ ეს არ არის ტუტორიალი jQuery – ს შესწავლის მსურველთათვის, და იგულისხმება რომ თქვენ უკვე გაქვთ ამ ბიბლიოთეკასთან მუშაობის გარკვეული გამოცდილება.
სრულად »

ტეგები: , , ,

Code.ge redesign… And I’m back B-)

მოკლედ მოგესალმებით ყველას! ძალიან დიდი ხანია მინდოდა ამ პოსტის დაწერა თუმცა გარკვეულ მიზეზთა გამო შინაგანმა წინააღმდეგობის გრძნობამ ეს სურვილი ჩაკლა.

ჯერ კიდევ ორიოდე კვირის წინ ბლოგის დახურვასა და მის გაუქმებას ვაპირებდი, თუმცა ეს უაზრო სურვილი დავძლიე და შევეცდები განახლებული ენერგიით განვაგრძო წერა! ამისათვის განსაკუთრებული მადლობა მინდა გადავუხადო რამდენიმე ადამიანს(არ ჩამოვთვლი მათ სახელებს თვითონ მიხვდებით ვისაც გგულისხმობთ). ასევე დიდი მადლობა მინდა გადავუხადო იმ ადამიანებს რომლებიც ამ ბლოგით ჯერ კიდევ სარგებლობენ და აქ თავმოყრილი ინფორმაციითა და ჩემი პატარა ნამუშევრებით სარგებლობენ. ასევე დიდი ბოდიში მინდა მოვუხადო ყველა ჩემი მხირდან უპასუხოდ დატოვებული კომენტარის ავტორს.

პირველი ეტაპისთვის გამოვნახე დრო და გავაკეთე ბლოგის გარეგანი იერსახის სრული ცვლილება რომელიც ალბათ უკვე თვალში მოგხვდათ :D

გარდა ამისა მომზადებული მაქვს მთელი რიგი განახლებები ქართული კლავიატურის სკრიპტისთვის და სხვა თაროზე შემოდებული პროექტებისთვის რომლებსაც მალე გამოვფენ.

პირველ რიგში დღეს გავაოფენსორსე(როგორი ქართულია? :D ) LinGO ინგლისურ ქართული ლექსიკონი iPhone – სთვის რომელიც ხელმისაწვდომია GitHUB – ზე. ეს მინი პროექტი აუცილებლად მიიღებს დასრულებულ სახეს რადგან დღეიდან მასში მონაწილეობას მიიღებს ორი გამოცდილი Mac (და არა მარტო) დეველოპერი – ლაშა დოლიძე და ირაკლი ნადარეიშვილი! დიდი მადლობა ორივეს მხარდაჭერისა და ამ პროექტში მონაწილეობის სურვილისათვის.

სხვა სიახლეებსა და შეძლებისდაგვარად სასარგებლო ნამუშევრების შესახებ სულ მალე შეიტყობთ ამ ბლოგის მეშვეობით.

მაშ ასე I’m Back B-)

ტეგები: , , , ,

ქართული ტერმინოლოგია – დილემა

მინდა გაგიზიაროთ ჩემი გულისტკივიული ინფორმაციული ტექნოლოგიების სფეროში არსებული ქართული ტექნიკური ტერმინოლოგიის შესახებ რომელმაც ბოლო კვირების მანძილზე არცთუ ცოტა დრო წამართვა და შეიძლება ითქვას ჩემი მცდელობები მთელი რიგი ტერმინებისა თუ ფრაზების ქართულად თარგმნასთან დაკავშირებით სრული კრახით დასრულდა.

პრობლემა თავისთავად რთულია და ერთის მხრივ შესაძლებელია რომ ამ პრობლემას ჩემი მხრიდან ქართულის არასათანადო ცოდნაც ამძაფრებს… მაგრამ… ეგება ვინმემ მიმითითოს ავტორიტეტულ წყაროზე ან ჯგუფზე ვინც ამ ტერმინების თარგმნით არის დაკავებული? კი ვიცი რომ ითარგმნება მთელი რიგი პროგრამული პაკეტები არსებობს გაქართულების ჯგუფები და ა.შ. მაგრამ მოდით რეალურად შევხედოთ პრობლემას. ერთია როდესაც თარგმნი “checkbox” – ს და მას არქმევ თოლიას(ჩემთვის სრულიად წარმოუდგენელი თარგმანია და ალბათ შინაგანად ვერასოდეს დავძლევ ბარიერს და ვერ გამოვიყენებ ამ ტერმინს), მაგრამ, მეორეა როდესაც უნდა თარგმნო ამ სფეროში დამკვიდრებული ისეთი სიტყვები და ფრაზები რომლებსაც განსაკუთრებული მნიშნველობა აქვთ შეძენილი კონტექსტიდან გამომდინარე.

ქვემოთ ჩამოვწერ ჩემის აზრით პრობლემურ სიტყებსა და ფრაზებს და ძალიან მოხარული ვიქნები თუ მცირედიც მაინც დამეხმარებით მათ თარგმნაში.

ჩემს შემთხვევაში პირველი და ყველაზე მნიშნველოვანი ფრაზა რის თარგმნასაც რამდენიმე წელია ვცდილობ და ვერაფრით ვერ მოვახერხე არის Content Management System(CMS). CMS – ის თარგმნა რამდენჯერმე ვთხოვე ქართულის ჩემზე გაცილებით უკეთ მცოდნე პიროვნებებს… თუმცა რა შედეგი მივიღე? არაფერი! და რატომ? პირველ რიგში Content – ის თარგმანის სავარაუდო ვარიანტებია “შინაარსი, შიგთავსი, არსი და ა.შ.” როგორც არ უნდა ვუტრიალოთ ამ სიტყვის ასეთი თარგმანი აბსოლუტურად არაფერს არ გვაძლევს, და რატომ? იმიტომ რომ კონკრეტულად “Content Management System” – ის კონტექსტში ეს სიტყვა მოიცავს გაცილებით მეტს ვიდრე უბრალოდ შინაარსს, კერძოდ კი კონტენტი ეს არის კომპლექსური მონაცემის ტიპი რომელსაც გააჩნია აზრი(meaning) და კონტექსტი. პირობით მაგალითად რომ განვიხილოთ ამ ბლოგის პოსტები, აღმოვაჩენთ რომ თითეულ ბლოგ პოსტს გარდა თავად პოსტისა გააჩნია სხვადასხვა ატრიბუტები(სათაური, გამოქვეყნების დრო, კატეგორა/კატეგორიები(შეიძლება განვიხილოთ როგორც კონტექსტი), ავტორი და ა.შ. გამომდინარე აქედან ბლოგ პოსტი ზოგადად არის სპეციფიური კონტენტის ტიპი. ახლა ისმის კითხვა შესაძლებელია რომ ცალკეულ ბლოგ პოსტს ვუწოდოთ მარტივად შინაარსი ან შიგთავსი? არ ვიცი მე პირადად ვერანაირ ასოცირებას ვერ ვახერხებ კონტენტთან… თუ ვცდები შემისწორედ ამით ძალიან გამახარებთ…

და რა მოხდება თუ წერისას ან საუბრისას უბრალოდ გამოვიყენებთ ფრაზას “კონტენტის მენეჯმენტის სისტემა”? რა დაშავდება ამითი? ხომ არ ჯობია თარგმნის ნაცვლად თამამად გამოვიყენოთ ასეთი პრობლემური სიტყვები/ფრაზები რომლებმაც ინდუსტრიაში გარკვეული გავრცელება ჰპოვა და სპეციფიური დატვირთავა შეიძინა? თუ ამ საკითხთან დაკავშირებით გაგიჩნდებათ პროტესტის გრძნობა, აბა მითხარით როგორ გადათარგმნით “Enterprise Java Beans(EJB)”? არა მითხრას ვინმემ? ვთარგმნოთ პირდაპირ? და იცით რას მივიღებთ?

Enterprise Java Beans(EJB) – საწარმოო ყავის მარცვლები აი ვინმემ მითხრას ახლა რა შუაშია საწარმოო ყავის მარცვლები?

თუ წინა ორი მაგალითი არ არის საკმარისი აბა სცადეთ თარგმნოთ “widget“, ძალიან მაინტერესებს როგორ უნდა ითარგმნოს ეს სიტყვა რომელიც ვების კონტექსტში შეიძლება განვმარტოთ როგორც – Interactive mini application that delivers content and functionality to the user. თუმცა კონტექსტიდან გამომდინარე ვიჯეტს სხვა განმარტებებიც გააჩნია…

მოკლედ ეს არის ის მცირედი რაც დღეს შემიძლია ვთქვა, თუმცა შეძლებისდაგვარად შევეცდები უფრო მეტი დავწერო ამ საკითხის ირგვლივ. იმედი მაქვს ამ ტკივილს გარკვეული რჩევებით გამიქარწყლებთ :)

ტეგები:

Jetpak – დამატებების ახალი სისტემა Mozilla – სგან

jetpack_logo საერთოდ ცნობილია რომ კონკურენცია ძალიან კარგი რამ არის. ამ მტკიცებულების სისწორის კიდევ ერთი ძალიან კარგი მაგალითი გვაქვს სახეზე კერძოდ კი Google Chrome – სა და Mofilla Firefox – ის ე.წ. extension – ების სისტემების სახით.

მოგეხსენებათ რომ Google Chrome ძალიან ახალი ბრაუზერია რომელიც გასული წლის სექტემბრის დასაწყისში მოევლინა სამყაროს. მიუხედავად მისი ინოვაციურობისა მისი კრიტიკის ერთერთ მთავარ მიზეზად იქცა FF – ის მსგავსი დამატებების სისტემის არ ქონის გამო.

ცხადია ასე პირველივე დღიდან ყველაფერის ჩადებას ვერ მოახერხებდა Google თავის ახალ ბრაუზერში, თუმცა, როგორც მალე გაირკვა შეჩერებასაც არ აპირებდა. სულ რამდენიმე თვეში გამოჩნდა პირველი პროპოზალი რომელიც Chrome – ს დამატებების პლატფორმას შეეხებოდა. თუმცა ამ პროპოზალში ერთმა მეტად საგულისხმო დეტალმა გაიჟღერა – განსხვავებით FF – ის ანალოგიური სისტემისგან Chrome – ს დამატებების შესაქმნელად საკმარისია მხოლოდ HTML/CSS და JavaScript. არავითარი XUL, არავითარი რთული XML კონფიგურაციის ფაილები დამატების ინსტალაციისათვის და ა.შ.

Google – ს ეს გდაწყვეტილება ჩემთვის პირადად გაცილებით მისაღები იყო რადგან XUL – ის ვერანაირ აუცილებლობას ვერც FF – ში ვხედავდი მანამდე და სიმართლე ითქვას ვერც დღეს ვერ ვხედავ… თუმცა არც Mozilla – მ დააყოფნა და დღეს უკვე შემოგვთავაზა FF – ის დამატებების შექმნის ახალი მექანიზმი. კერძოდ კი Jetpak!

ციტატა პროექტის საიტიდან:

In short, Jetpack is an API for allowing you to write Firefox add-ons using the web technologies you already know.

რითია საინტერესო Jetpak? პირველ რიგში ისევე როგორც Crhome – ს შემთხვევაში, Jetpak – ის შემთხვევაშიც დამატების შესაქმნელად საკმარისია მხოლოდ HTML/CSS და JavaScript. ამ შემთხვევაშიც არავითარი XUL და რთული XML კონფიგურაციის ფაილები. ასევე არავიტარი ბრაუზერის გადატვირთვა დამატების ინსტალაციის შემდგომ და რაც ყველაზე ყველაზე ყველაზე მნიშვნელოვანია დეველოპმენტის პროცესში შეგვიძლია გამოვიყენოთ ნებისმიერი არსებული ინსტრუმენტული საშუალებები და Firebug დებაგირებისათვის რაც არსებულ მოდელში პრაქტიკულად შეუძლებელია. ასევე jQuery – ს მოყვარულთათვის ძალიან მნიშვნელოვანი ფაქტია რომ ეს ბიბლიოთეკა ნაგულისხმევად არის ჩადებული Jetpak – ში, რაც კიდევ უფრო გაამარტივებს დამატებების პროგრამირებას.

მართალია დასრულებამდე და საყოველთაო გავრცელებამდე კიდევ დიდი გზა აქვს გასავლელი Jetpak – ს, თუმცა მისი გამოყენება უკვე შესაძლებელია. ასე რომ თუ არ გეზარებათ შეგიძლიათ დააინსტალიროთ და დამატებების წერასაც შეუდგეთ :)

ტეგები: , , , ,