Spis treści 

Konwersja zdjęć do formatu mediawiki

Mając odpowiednio spreparowaną strukturę katalogów i plików zdjęć (pisałem o tym wcześniej) można wygenerować galerię w formacie mediawiki. Konwersja jest kolejnym etapem więc lektura wcześniejszego opisu jest niezbędna.

Mówiąc w skrócie dodatkowy etap jest potrzebny ze względu na inny sposób obsługi zdjęć przez medialiwi. Tutaj, w odróżnieniu od dokuwiki, pliki są trzymane w automatycznie tworzonych podkatalogach a dodatkowe dane o zdjęciu wędrują do bazy danych (mysql). Sprawa wygląda na skomplikowaną ale to tylko pozory ;-)

Warsztat pracy

Do zabawy będziemy potrzebowali dodatkowych skryptów:

  1. zmiany nazwy plików do odpowiedniego szablonu (rfr.sh)
  2. budowania struktur katalogów dla mediawiki (rmw.sh)

Tak jak poprzednio skrypty są przeznaczone dla systemu Linux. Nie będą potrzebne żadne dodatkowe rekwizyty czy uprawnienia w systemie - wystarczy dostęp do shell (linii poleceń).

Wcześniej napisałem, że pliki zdjęć są nieco inaczej traktowane w mediawiki niż w dokuwiki. Na czym konkretnie polegają różnice?

Dokuwiki:

Mediawiki:

Na pierwszy rzut oka problemem będzie unikalność nazw plików. Wyjściem jest zastosowanie szablonu dzięki któremu będziemy mieli porządek w danych a odpowiednie pliki będą mogły być łatwo dostępne z poziomu wyszukiwarki mediawiki.

obiekt_miejsce_data_numer.rozszerzenie

obiekt i miejsce są zapisane bez polskich znaków, w mianowniku liczby pojedynczej;
data wykonania zdjęcia zapisana w formacie YYYYMMDD;
numer to 3-cyfrowa liczba losowa zapewniająca unikalność nazwy pliku;
na przykład:

kosciol_olsztyn_20020921_202.jpg
zamek_golub-dobrzyn_20050709_120.jpg
zamek_lidzbark_warminski_20030607_090.jpg

WAŻNE!
Wszystkie skrypty działają bezpośrednio na plikach, nie wykonując wcześniej żadnych kopii roboczych! Pamiętaj o zabezpieczeniu oryginałów zdjęć.
Opis poniżej dotyczy konwersji do struktur danych mediawiki 1.4.x (skrypty nie zadziałają z wersją 1.5.x!)

Zmiana nazw plików

Skrypt przenosi zdjęcia ze struktury

autor/obiekt/województwo/miejscowość/data/plik.jpg

do struktury

obiekt_miejscowość_data_numer.jpg

Skrypt tworzy także plik zawierający instrukcje SQL aktualizujące bazę danych mediawiki.

Parametry wywołania to:

  1. DIR katalog w którym znajdują się zdjęcia do konwersji (domyślnie bieżący katalog)
  2. ID użytkownika mediawiki, który jest autorem zdjęć (domyślnie 1)
  3. USER nazwa użytkownika o danym ID (domyślnie Admin)

Plik: rfr.sh

#! /bin/bash
 
# Skrypt zmieniajacy nazwy plikow dla mediawiki
# Utworzony na licencji GNU GPL
# (C) 2005 Olsztynska Strona Rowerowa
#
# konwencja wywolania:
#   DIR  nazwa katalogu w ktorym beda konwertowane zdjecia
#   ID   id uzytkownika w systemie mediawiki
#   USER nazwa uzytkownika o danym ID
 
DIR=$1
if [ -z "$DIR" -o ! -d "$DIR" ]; then DIR="."; fi
ID=$2
if [ -z "$ID" ]; then ID=1; fi
USER=$3
if [ -z "$USER" ]; then USER="Admin"; fi
 
find $DIR -type f| grep -v out| egrep "(jpg|png|jpeg|gif)" | awk -v user=$USER -v id=$ID -F/ '
	function toword(s) { return toupper(substr(s,1,1)) substr(s,2) }
{
	OUT="out";
	sprintf("rm -fr %s && mkdir %s", OUT, OUT)| getline rc;
 
	source=$0
	split($(NF-1), d, "-")
	date=d[1]d[2]d[3]
 
	object=toword($(NF-4)) # nazwa pliku musi byc z duzej litery
	location=toword($(NF-2))
	number=sprintf("%03d", int(rand()*1000))
	split($NF, p, ".")
	suffix=tolower(p[2])
	file=object"_"location"_"date"_"number"."suffix
	destination=OUT"/"file
 
	sprintf("cp -Rp %s %s", source, destination)| getline rc
 
	stamp=strftime("%Y-%m-%d %H:%M:%S")
	desc=object"_"location"_"date
	sprintf("find %s -printf %%s", source)| getline size
	printf "insert into wiki_image values (\"%s\", %d, \"%s\", %d, \"%s\", \"%s\");\n", 
          file, size, desc, id, user, stamp >> OUT"/sql.txt"
}
'

Tworzenie struktur katalogów mediawiki

Mediawiki samodzielnie tworzy podkatalogi na pliki zdjęć bazując na funkcji sktótu MD5. Skrypt przenosi zdjęcia ze struktury

obiekt_miejsce_data_numer.jpg

do struktury

x/xy/obiekt_miejsce_data_numer.jpg

x jest pierwszym a y drugim znakiem skrótu MD5

Plik: rmw.sh

#! /bin/bash
 
# Skrypt tworzacy strukture plikow mediawiki
# Utworzony na licencji GNU GPL
# (C) 2005 Olsztynska Strona Rowerowa
 
ls -1 out | egrep "(jpg|png|jpeg|gif)" | awk -F/ '
	function toword(s) { return toupper(substr(s,1,1)) substr(s,2) }
{
	OUT="out";
	source=OUT"/"$0
	file=toword($NF)
 
	"echo "source" | md5sum | cut -c 0-32" | getline md
	md=tolower(md)
	destination=OUT"/"substr(md,0,1)"/"substr(md,1,2)
	"mkdir -p "destination| getline rc
	sprintf("mv -f %s %s/%s", source, destination, file)| getline rc
}
'

Konwersja

Na początek musimy mieć utwtworzoną odpowiednią strukturę podkatalogów dla plików zdjęć galerii. Zdjęcia powinny być już przygotowane do konwersji (odpowiednio pogrupowane, przeskalowane, oznaczone odpowiednim napisem).

Powiedzmy, że mamy gotową kolekcję zdjęć kościołów w katalogu "wiki". Katalog ten będzie więc zawierał skrypty (dla uproszczenia pominąłem skrypty konwerujące do formatu dokuwiki) i katalog ze zdjęciami:

$cd $HOME
$ls -l wiki
drwxr-xr-x 2 narg narg   16 2006-01-11 22:21 autor/
-rwxr-xr-x 1 narg narg  523 2006-03-02 21:04 rfr.sh
-rwxr-xr-x 1 narg narg 1262 2006-03-02 21:04 rmw.sh

Teraz możemy wywołać skrypty konwersji do mediawiki. Nie trzeba robić kopii bezpieczeństwa katalogu ponieważ zdjęcia są kopiowane a nie przenoszone do nowej struktury.

$cd $HOME/wiki
$./rfr.sh autor/ 2 narg  # moje konto w mediawiki ma ID 2 oraz login "narg"
$./rmw.sh

Po zakończeniu działania skryptu:

Proste ;-)

C.D.N.