Keyboard Maestro i wstawianie linków zamiast znaczników
W tytule mógłbym zawrzeć słowo #nerdalert, bo niniejszy wpis będzie zapewne bardzo niszowy, bo dotyczy osobistego problemu – jeszcze szybszego publikowania tekstów. Ale mam nadzieję, że przynajmniej paru osobom podane rozwiązania kiedyś się przydadzą, a być może ktoś z Was podpowie jeszcze, jak to wszystko można bardziej usprawnić.
Problem
Swoje wpisy przygotowuję w sposób oddany na poniższym przykładowym zrzucie:
Są tu teksty oraz znaczniki <!--photo-->
przeznaczone do wstawienia w ich miejsce linków do zdjęć. Linki będą w postaci kodu HTML, a całość opublikowana bezpośrednio z Byword na iMagazine.
Do tej pory ręcznie wstawiałem linki za każdy ze znaczników. Postanowiłem jednak, że sobie to ułatwię i zaprzęgnę jakąś aplikację, która mogłaby jak najbardziej zautomatyzować ten proces.
Rozwiązanie
Problem udało się rozwiązać przy pomocy Keyboard Maestro, skryptu Bash oraz Pythona, a całe makro (jego najważniejsza część) przedstawia się następująco:
Po kolei objaśnię:
Tu odbywa się cała „magia”, która jednak nie jest przedmiotem tego wpisu – tworzony jest link do każdego z plików graficznych. Żeby jednak rzucić trochę światła na sprawę, każdy link przedstawia się w postaci:
<a href="http://AdresSerweraNaKtorymUmieszczonyJest/oryginalnyPlik.roz"><img src="http://AdresSerweraNaKtorymUmieszczonyJest/MiniaturaOryginalnegoPliku-Szerokosc-x-Wysokosc.roz" alt="" width="Wysokosc" height="Szerokosc" /></a>
Skrypt przy pomocy narzędzia sips
wydobywa, a potem składa do „kupy” wszystkie niezbędne informacje, na podstawie których powstaje link według powyższego schematu. Tak dzieje się z każdym plikiem, który był zaznaczony w chwili wywołania makra. Linki są zapisywane do pliku links
, który tworzony jest w katalogu /tmp
, na zasadzie dopisywania. Tyle ile było zaznaczonych plików, tyle będzie linków. Dlatego też na początku makra znajduje się akcja, która kasuje ten plik, żeby móc zacząć „na czysto”.
Ostatni element odpowiedzialny jest za właściwe podstawianie linków w miejsce znaczników <!--photo-->
.
Objaśnienie kodu:
DOCS="/Users/$USER/Desktop/"
– wskazanie folderu z tworzonymi dokumentami (testowo jest to Biurko).
LAST=$(ls -t $DOCS | awk '{printf("%s",$0);exit}')
1 – odnalezienie w katalogu ostatnio modyfikowanego pliku. Nie stanowi to dużego problemu, bo w folderze, w którym tworzę tylko dokumenty do wpisów ten ostatni w 99% przypadków jest właśnie tym, nad którym pracuję. A zawsze mogę go jeszcze zmodyfikować i zapisać, gdybym pracował jednak nad dwoma.
PLIK="$DOCS$LAST"
– połączenie ścieżki do katalogu i nazwy pliku w celu otrzymania pełnych „namiarów” na dokument.
LINKI="/tmp/links"
– zmienna określająca miejsce zapisanych linków.
python << EOF …
– właściwe podmienianie. Plik dokumentu otwierany jest dwukrotnie jako input
i output
, ponieważ w nim będziemy szukać i do niego zapisywać zmiany. Z kolei plik z linkami dzięki zastosowaniu pętli idzie linia po linii wypełniając polecenie podmiany: input = input.replace('<!--photo-->', line, 1)
. Jedynka na samym końcu wymusza podmianę tylko na pierwszym rezultacie (odnalezionym znaczniku <!--photo-->
). Następnie przechodzimy do drugiej linii pliku z linkami i sytuacja się powtarza. Pętla kończy się w momencie braku linków bądź znaczników <!--photo-->
.2
Początkowo chciałem trzymać się tylko Bash’a i skorzystać z narzędzia sed
. O ile jednak działało prawidłowo z pojedynczymi słowami w czasie testów, o tyle z utworzonymi linkami nie radziło sobie w ogóle.3
Wynik
Wynikiem jest tekst uzupełniony o linki. :)
Zapewne wprawne oko osoby obytej z Bash’em i Pythonem (a może nawet z Keyboard Maestro) wychwyci tu parę błędów, czy rzeczy, które można lub nawet trzeba poprawić. Nieźle się namęczyłem zanim w końcu osiągnąłem pożądany rezultat, ale jak się pewnie domyślacie, rozwiązanie dało ogromną satysfakcję tym bardziej, że nie zajmuję się „programowaniem” na codzień, a tylko hobbystycznie.
P.S.: Stack Overflow i inne jemu podobne strony to taka ściąga.pl dla geeków. ;)
P.P.S.: Niniejszy wpis jest „żywym” przykładem prawidłowego działania całego makra. Z jednym wyjątkiem, w skrypcie z kawałkiem Pythona, zaraz za jego wywołaniem python << EOF
w następnej linijce zabrakło zapisu kodowania # coding=utf-8
. :)
-
Źródło: How do I get the name of the newest file via the Terminal? – Stack Overflow ↩
-
Źródła: Replacing text in a file with Python – Stack Overflow, How to read large file, line by line in python – Stack Overflow, Replace first occurence of string – Stack Overflow ↩
-
Źródła: Replacing first occurance of a match with sed – Stack Overflow, How to use sed to replace only the first occurrence in a file? – Stack Overflow, Sed save changes to same file in loop – Unix Linux Forums ↩