22.03.2009 | 23:13
Možda zaobilazno, ali ovako smo problem riješili na nekoliko različitih načina.
Zapravo... iako je, za konkretan slučaj, Ribino rješenje definitivno najoptimalnije, preskočili smo "domaće", AppleScript rješenje. Ne budi mi teško, evo i njega:
-- PRISTUPAMO POPISU FOLDERA
-- popisRef je pokazatelj na odabranu tekstualnu datoteku koja sadrži popis foldera
-- prikazujemo sistemski izbornik datoteka
set popisRef to (choose file with prompt "Odaberi tekstualnu datoteku koja sadrži popis foldera:" of type {"TEXT"})
-- pristupamo datoteci koja sadrži popis foldera
open for access popisRef
-- učitavamo kompletan sadržaj datoteke u varijablu popisFoldera
-- pritom koristimo UTF8, zbog potencijalnih domaćih karaktera u nazivu foldera
set popisFoldera to (read popisRef as «class utf8»)
-- zatvaramo datoteku koja sadrži popis foldera
close access popisRef
-- LOKACIJA NA KOJOJ KREIRAMO FOLDERE
-- folderi će biti kreirani tamo gdje se nalazi ova skripta
set lokacija to POSIX file ((POSIX path of (path to me)) & "/..") as text
-- KREIRAMO POJEDINE FOLDERE KORISTEĆI FINDER
tell application "Finder"
-- postavljamo brojač koji ćemo koristiti za pristup pojedinoj liniji teksta
set redniBroj to 1
-- ponavljamo petlju onoliko puta koliko ima linija teksta u popisFoldera
repeat (number of paragraphs in popisFoldera) times
-- ako je linija teksta prazna, ignoriramo je
-- u protivnom kreiramo folder i dodjeljujemo mu ime sadržano u liniji teksta
if paragraph redniBroj of popisFoldera is not equal to "" then
make new folder at lokacija with properties {name:paragraph redniBroj of popisFoldera}
end if
-- uvećavamo brojač za 1
set redniBroj to (redniBroj + 1)
-- kraj petlje
end repeat
-- kraj obraćanja Finderu
end tell
Komentirao sam red po red, da se, oni koji vole učiti na primjerima, lakše snađu.
Ovdje vrijedi primjetiti nekoliko zanimljivosti. Kao prvo, kod na prvi pogled ne izgleda bitno jednostavniji od tvog C primjera.
Na drugi pogled bi nelagoda trebala popustiti jer polovicu koda zapravo čine komentari (počinju sa --). AppleScript je generalno razumljiviji od drugih jezika (namjerno sam koristio domaće nazive varijabli, da se lakše razluči što su naredbe, a što varijable), međutim ovaj konkretan primjer ima nekoliko "kvaka". Prva je (skoro pa) nepotreban luksuz - ograničavanje tipa datoteke koju ćemo korisniku dopustiti učitati na tekstualnu (type {"TEXT"}). Samo za sebe nije mudrost, ali vitičaste zagrade (naizgled nepotrebno) kompliciraju sintaksu. Sljedeća kvaka je onaj "«class utf8»" kojeg baš tako treba pisati. Fuj.
I zadnja kvaka je definiranje lokacije u POSIX formatu. Da ne bude nejasnoća, Apple više voli svoj stari dobri "Disk:Users:Ja: Desktop" format od svima razumljivog "/Users/Ja/Desktop" ili, još kraće, "~/Desktop".
U konkretnom primjeru je naveden path do Desktopa (kad se sistemski disk zove "Disk", a korisnik "Ja" ). Posebna perverzija je dodavanje "parent directory" (/..) na kraj patha čime zapravo dođemo do lokacije same skripte pa se vratimo korak nazad.
Postoji i AppleScript native rješenje problema (preko containera), ali dotično je nepoželjno jer se drugačije ponaša na 10.4, a drugačije na 10.5 (dobra vijest: na 10.5 se ponaša "normalno"
).
Čemu uopće ova kobasica od AppleScripta kad i Ribino rješenje odrađuje posao? Osim za ilustraciju alternativnih rješenja
vrijedi spomenuti da je ovo najlakše nadograditi. Ne kažem da ne može postojati problem čije se rješenje svodi samo na otvaranje N foldera zapisanih u tekstualnoj datoteci. Ali obično usput moramo (ili možemo) obaviti još nešto. Tu će AppleScript briljirati i u par dodatnih linija odraditi ono što ni terminal ni C ne bi mogli (uglavnom zato jer nemaju način za elegantno komuniciranje s aplikacijama).
P.S. Zbog specifičnosti parsanja ulazne datoteke (tekst s popisom foldera), a vezano uz AppleScriptove "paragrafe", u slučaju da u datoteku s popisom foldera unesemo N linija teksta i nakon SVAKE (uključno sa zadnjom!) pritisnemo Enter, broj ponavljanja petlje bio bi nepotrebno uvećan za jedan (zadnji Enter). Mogli smo testirati samo njega, ali priloženo rješenje testira SVAKI red u popisu foldera tako da možemo bilo gdje u datoteci imati prazan red - uredno će raditi. U slučaju Ribine skripte, nailazak na prazne redove na popisu (pri čemu Enter na kraju NE igra ulogu!) rezultirao bi porukom "mkdir: .: No such file or directory".
P.P.S. Preporučam kod kopirati u Script Editor i kliknuti Compile da syntax coloring odradi svoje i učini ga preglednijim.