Skrypt generujący prosty album zdjęć w formacie HTML-a

Stronę tą wyświetlono już: 261 razy

Kod skryptu

Już w dwóch językach programowania napisałem aplikację, która miała za zadanie wygenerować album ze zdjęciami w formacie html. Tym razem postanowiłem uczynić to samo w BASH-u, co (o dziwo) nawet mi się udało osiągnąć. Skrypt ma następującą postać:

Listing 1
  1. ###############################################################################################
  2. # Ten skrypt w celu poprawnego działania wymaga zainstalowania powłoki systemowej BASH w ######
  3. # wersji co najmniej 4+ #######################################################################
  4. ###############################################################################################
  5. # Przykład uruchomienia skryptu: ##############################################################
  6. ###############################################################################################
  7. # bash html_gen.sh body_color=#ff9955 nav_color=#ffccaa links_color=#c04d00 img_width=250 #####
  8. # files_on_page=50 ############################################################################
  9. ###############################################################################################
  10. # W powyższym przykładzie użyto skryptu z opcjami sterującymi wyglądem strony html: ###########
  11. ###############################################################################################
  12. # body_color=#ff9955 - oznacza kolor tła znacznika body #######################################
  13. # nav_color=#ffccaa - oznacza kolor tła elementu nav strony ###################################
  14. # links_color=#ffccaa - oznacza kolor tekstu linków ###########################################
  15. # img_width=250 - oznacza szerokość obrazka ###################################################
  16. # files_on_page=50 - określa maksymalną liczbę obrazków na stronie ############################
  17. ###############################################################################################
  18. declare -A arguments=() # tablica asocjacyjna
  19. function findSign(){ # funkcja zwraca położenie danego znaku w ciągu znaków
  20. # $1 - przeszukiwany ciąg
  21. # $2 - szukany znak
  22. for i in $(seq 1 $((${#1}-1))) # przeszukiwanie po zakresie od 0 do liczby znaków zawartych w $1 pomniejszonej o 1
  23. do
  24. if [ ${1:i:1} == $2 ] # jeżeli pod danym indeksem znaleziono znak to
  25. then
  26. echo $i; # dziabaj go na ekran
  27. return; # wyjście z funkcji
  28. fi
  29. done
  30. echo -1; # a jak nie znaleziono to zwróć -1
  31. }
  32. function setValue(){ # ustawia wartość w tablicy asocacyjnej arguments
  33. # $1 - parametr w formacie "klucz=wartość"
  34. separator=$(findSign "$1" "="); # znajdowanie separatora w podanym na wejście argumencie
  35. if [ separator != -1 ] # jeżeli znaleziono znak = to
  36. then
  37. arguments[${1:0:separator}]=${1:$((separator+1))}; # wydziabuję klucz i wartość z argumentu funkcji $1 i wrzucam je do tablicy asocjacyjnej arguments
  38. fi
  39. }
  40. # A tutaj ustawiam sobie domyślne parametry
  41. setValue "body_color=black"; # kolor tła znacznika body
  42. setValue "nav_color=#2f2f2f"; # kolor tła znacznika nav
  43. setValue "links_color=red"; # kolor czcionki odnośników
  44. setValue "files_on_page=100"; # liczba zdjęć na stronę
  45. setValue "img_width=300"; # szerokość zdjęcia w px oczywiście
  46. for arg in "$@" # wczytywanie argumentów skryptu do tablicy asocjacyjnej
  47. do
  48. setValue $arg # get arguments and add it to table
  49. done
  50. files_on_page=${arguments["files_on_page"]}; # liczba zdjęć na stronie
  51. img_width=${arguments["img_width"]}; # szerokość zdjęcia w px
  52. #files_list=$(ls *.jpg *.JPG *.gif *.GIF *.png *.PNG); # tworzenie listy plików
  53. files_list=$(ls -R 2>/dev/null *.jpg *.JPG *.gif *.GIF *.png *.PNG); # tworzenie listy plików
  54. links=""; # to będą linki do podstron
  55. val=0; # zmienna, w której będę przechowywał informację o liczbie pozyskanych plików
  56. for i in $files_list; do
  57. val=$((val+1)); # zliczanie plików
  58. done
  59. echo "Liczba plików: $val"; # wyświetlam ile plików znaleziono
  60. nrof=$((val/files_on_page)); # określam liczbę podstron
  61. echo "Liczba podstron: $nrof"; # wyświetlam liczbę podstron
  62. if [ $nrof != 0 ] # jak liczba podstron nie jest równa 0 to tworzę listę linków do podstron
  63. then
  64. links="<nav class=\"links\">"; # pasek nawigacyjny z linkami
  65. for i in $(seq 0 $nrof) # od 0 do $nrof tworzę linków pełen stos!
  66. do
  67. links="$links<a href=\"html_file$((i+1)).html\">$((i+1))</a> "; # dopisuję linki wnet
  68. done
  69. links="$links</nav>" # i zamykam nav też
  70. fi
  71. k=0
  72. j=0
  73. page="" # zmienna pomocnicza, która będzie zawartość strony zawierała
  74. echo "img{width: "${arguments["img_width"]}"px;}body{width:1000px;text-align:center;margin: auto;background-color: ${arguments[body_color]};}a{text-decoration: none;color:${arguments[links_color]};}.links{background-color:${arguments[nav_color]};padding: 10px;}">style.css
  75. begin="<html><header><meta charset=\"UTF-8\"><link rel=\"stylesheet\" href=\"style.css\"></header><body>"; # a to cały początek strony
  76. folder="folder"; # nazwa folderu, w którym utworzone zostaną miniaturki
  77. if [ -d $folder ] # jak folder istnieje to
  78. then
  79. echo "Folder o podanej nazwie już istnieje, chcesz go nadpisać [t]:" # informuj o tym biednego użytkownika i niezwłocznie go o decyzję pytaj
  80. read w;
  81. if [ $w != "t" ] # jak decyzja jego jest by nie nadpisywać
  82. then
  83. echo "Podaj nową nazwę folderu:" # o nową nazwę trza się zapytywać
  84. read folder;
  85. while [ -d $folder ] # dopóki podana nazwa folderu istnieje
  86. do
  87. echo "Folder o podanej nazwie już istnieje, podaj inną nazwę:" # o nową nazwę pytaj by było weselej
  88. read folder;
  89. done
  90. mkdir $folder # a gdy nazwa folderu będzie ci już znana, to utwórz go sobie do miniatur zapisywania
  91. fi
  92. else
  93. mkdir "$folder" # tutaj tworzę folder potrzebny dla wrzucenia tam miniatur
  94. fi
  95. for i in $files_list; # iterowanko po nazwach plików
  96. do
  97. convert $i -resize $img_width +profile '*' "$folder/"$i; # zapis miniaturki zdjęcia do folderu folder
  98. if [ $((k%files_on_page)) = 0 ]; # jak reszta z dzielenia jest licznika plików k jest równa zero to
  99. then
  100. if [ $k != 0 ] # gdy k nie jest równe zero
  101. then
  102. echo "$begin$links$page$links</body></html>">"html_file$j.html"; # to zapisuję dane do pliku o indeksie $j
  103. page=""; # i czyszczę zmienną pomocniczą page
  104. fi
  105. j=$((j+1)) # zwiększam licznik utworzonych stron
  106. page="$page<a href=\"$i\"><img src=\"$folder/$i\" /></a>"; # dodaję pierwszego linka dla $j-tego pliku html
  107. else # w przeciwnym przypadku
  108. page="$page<a href=\"$i\"><img src=\"$folder/$i\" /></a>"; # dodeję kolejne linki dla $j-tego pliku html
  109. fi
  110. echo "Przetwarzanie: $((k+1)) z $val; nazwa pliku: $i";
  111. k=$((k+1)) # zwiększam licznik plików graficznych
  112. done
  113. if [ ${#page} != 0 ] # jak ciąg znaków w zmiennej pomocniczej page nie jest równy 0 to
  114. then
  115. echo "$begin$links$page$links</body></html>">"html_file$j.html"; # trzeba zapisać jeszcze łostatnią podstronę czy też stronę
  116. fi

Licencja, warunki użytkowania i wyłączenie odpowiedzialności

Skrypt ten udostępniam na licencji GPL 3.0

Ostrzeżenie:

Autor programu dołożył wszelkich starań, aby nie sprawiało ono żadnych kłopotów i nie wykonywało żadnych działań mających na celu uszkodzenie, zniszczenie lub utratę danych zawartych na dysku jego użytkownika. Jakkolwiek nie da się wszystkiego przewidzieć a oprogramowanie to w trakcie pracy tworzy i może nadpisywać pliki, w miejscu jego uruchomienia Program tworzy:

  • Folder o nazwie "folder" a w nim miniatury zdjęć i grafik o tej samej nazwie
  • pliki *.html o kolejnych nazwach html_file$j.html - gdzie $j - oznacza wstawienie kolejnych cyfr indeksów zaczynając od 1 -> n, gdzie n z kolei należy do zbioru liczb całkowitych.

W związku z powyższym należy mieć na uwadze fakt, że program ten w trakcie działania nadpisuje bez ostrzeżenia (jeśli te istnieją) wyżej wymienione pliki, znajdujące się w lokalizacji, z której skrypt został uruchomiony.

Wyłączenie odpowiedzialności:

Z wyżej wymienionych względów autor programu nie ponosi odpowiedzialności karnej za niepożądane skutki działania niniejszego skryptu, zaś każda osoba z niego korzystająca robi to na swoją własną odpowiedzialność.

Instrukcje uruchamiania

Skrypt należy umieścić w pliku z rozszerzeniem .sh i zapisać w lokalizacji, w której znajdują się zdjęcia. Nazwa pliku może być dowolna (byleby bez spacji) ja używam html_gen. Uruchamianie skryptu z poziomu konsoli:

bash ./html_gen.sh

Uwaga! Nieco podrasowałem skrypt i teraz do jego prawidłowego działania konieczna jest obecność powłoki BASH w wersji 4+.

Końcowe uwagi

Smutna wiadomość jest taka, że program nie zadziała niestety prawidłowo na plikach z nazwami, w których znajduje się spacja.

Załączniki:

Skrypt generujący album zdjęć na GitHub-ie

Komentarze