Archived
1
0
Fork 0
This repository has been archived on 2018-09-13. You can view files and clone it, but cannot push or open issues or pull requests.
sjqg/includes/galleryfunctions.php

398 lines
13 KiB
PHP
Raw Permalink Normal View History

<?php
/**
* @file
* Funktionen für den Aufbau der Bildergalerie.
*
* @author Jan Dittberner <jan@dittberner.info>
* @version \$Id$
*
* Copyright (c) 2007, 2008 Jan Dittberner <jan@dittberner.info>
* Jan Dittberner IT-Consulting & -Solutions,
* Cottbuser Str. 1, D-01129 Dresden
*
* This file is part of the ScrollingJQueryGallery component of the
* gnuviech-server.de Websitetools
*
* ScrollingJQueryGallery is free software: you can redistribute it
* and/or modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* ScrollingJQueryGallery is distributed in the hope that it will be
* useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with ScrollingJQueryGallery. If not, see
* <http://www.gnu.org/licenses/>.
*/
define(GALLERYPREFIX, "bilder");
define(INFOFILE, "galleryinfo.ini");
define(IMAGESEC, "images");
define(GALLERYSEC, "gallery");
define(GALLERY_RE, '/^[\w\d _-]+$/');
/**
* Breite der Vorschaubilder.
*/
$previewwidth = 311;
/**
* Höhe der Thumbnailbilder.
*/
$thumbheight = 67;
/**
* Prüft, ob eine Galerie mit dem übergebenen Namen existiert.
*
* @param $galleryname Galeriename
*
* @return @c true, wenn die Galerie existiert und einen erlaubten
* Verzeichnisnamen hat, sonst @c false
*/
function galleryExists($galleryname) {
return preg_match(GALLERY_RE, $galleryname) &&
realpath(GALLERYPREFIX . DIRECTORY_SEPARATOR . $galleryname);
}
/**
* Liefert geparste Konfigurationsinformationen zu einer Galerie oder
* die globale Konfiguration. Die Konfigurationsdaten einer Galerie
* stehen in der Datei @c galleryinfo.ini in dem Verzeichnis der
* Galerie. Die globale Konfiguration liegt in der gleichnamigen Datei
* im Elternverzeichnis der Galerien.
*
* @param $galleryname Galeriename oder @c null, wenn die globale
* Konfiguration geparst werden soll
*
* @return Ergebnis von @c parse_ini_file() oder ein leeres Array,
* wenn keine Konfigurationsdatei vorhanden ist
*/
function getGalleryConfig($galleryname = null) {
if ($galleryname) {
$filepath = realpath(GALLERYPREFIX . DIRECTORY_SEPARATOR .
$galleryname . DIRECTORY_SEPARATOR . INFOFILE);
} else {
$filepath = realpath(GALLERYPREFIX . DIRECTORY_SEPARATOR . INFOFILE);
}
if (is_file($filepath)) {
return parse_ini_file($filepath, true);
}
return array();
}
/**
* Holt die Bildinformationen zu einem Bild.
*
* @param $imagename Bildname
*
* @param $galleryname Galleriename
*
* @return assoziatives Array mit folgenden Feldern
* @li @a name Bildname
* @li @a data Label des Bildes
* @li @a preview relative URL des Vorschaubildes
* @li @a full relative URL des Vollbildes
*/
function getImageInfo($galleryname, $imagename) {
$label = getImageLabel($galleryname, $imagename);
$gallerylabel = getGalleryLabel($galleryname);
return array("name" => $imagename,
"label" => $label,
"preview" => GALLERYPREFIX . DIRECTORY_SEPARATOR .
getScaledImage($galleryname, $imagename,
$GLOBALS["previewwidth"], false),
"full" => GALLERYPREFIX . DIRECTORY_SEPARATOR . $galleryname .
DIRECTORY_SEPARATOR . $imagename,
"title" => sprintf("%s :: %s", $gallerylabel, $label)
);
}
/**
* Liefert das Label zu einem Bild. Wenn es in der @a images-Sektion
* der Datei @c galleryinfo.ini der angegebenen Galerie einen Eintrag
* mit dem übergebenen Bildnamen gibt, wird dieser zurückgegeben,
* ansonsten der Bildname selbst.
*
* @param $galleryname Galeriename
*
* @param $imagename Bildname
*
* @return Label zu dem Bild
*/
function getImageLabel($galleryname, $imagename) {
$gallerypath = realpath(GALLERYPREFIX . DIRECTORY_SEPARATOR . $galleryname);
if (empty($gallerypath) || !is_dir($gallerypath)) {
return false;
}
$filepath = $gallerypath . DIRECTORY_SEPARATOR . $imagename;
if (!is_file($filepath)) {
return false;
}
$inidata = getGalleryConfig($galleryname);
$value = $inidata[IMAGESEC][$imagename];
if ($value) {
return $value;
}
return $imagename;
}
/**
* Liefert das Label der Galerie. Das Label wird aus dem Wert @a title
* der Sektion @a gallery der @c galleryinfo.ini der Galerie
* geholt. Falls dieser Wert nicht definiert ist, wird der Name der
* Galerie zurückgegeben.
*
* @param $galleryname Galeriename
*
* @return Label der Galerie
*/
function getGalleryLabel($galleryname) {
$inidata = getGalleryConfig($galleryname);
if ($inidata[GALLERYSEC]['title']) {
$label = $inidata[GALLERYSEC]['title'];
} else {
$label = $galleryname;
}
return $label;
}
/**
* Liefert die aktuelle Galerie. Die Galerie kann entweder im
* GET-Parameter @c galleryname stehen, als Wert @a default in der
* Sektion @a gallery der zentralen @c galleryinfo.ini angegeben
* werden oder es wird das erste Unterverzeichnis von @c GALLERYPREFIX
* verwendet.
*
* @return Galeriename
*/
function getCurrentGallery() {
if (galleryExists($_GET["galleryname"])) {
return $_GET["galleryname"];
}
$filepath = realpath(GALLERYPREFIX . DIRECTORY_SEPARATOR . INFOFILE);
if (!empty($filepath)) {
$inidata = getGalleryConfig();
if (galleryExists($inidata[GALLERYSEC]["default"])) {
return $inidata[GALLERYSEC]["default"];
}
}
foreach (glob(realpath(GALLERYPREFIX) . DIRECTORY_SEPARATOR . '*',
GLOB_ONLYDIR) as $directory) {
$basename = basename($directory);
if (galleryExists($basename)) {
return $basename;
}
}
return null;
}
/**
* Liefert eine skalierte Version zu dem übergebenen Bild der
* übergebenen Galerie und generiert dieses bei Bedarf.
*
* @param $galleryname Galeriename
*
* @param $basename Bildname
*
* @param $maxdim maximale Breite oder Höhe des skalierten Bildes in
* Pixeln
*
* @param $scaleheight Angabe ob die Höhe oder die Breite für den
* Maximalwert beachtet werden soll, wenn dieser Parameter @c true
* ist, wird die Höhe auf @a $maxdim skaliert, ansonsten die Breite
*
* @return Pfad des skalierten Bildes relativ zu @a GALLERYPREFIX
*/
function getScaledImage($galleryname, $basename, $maxdim, $scaleheight=true) {
if ($maxdim == 0) {
debug_print_backtrace();
}
$gallerydir = realpath(GALLERYPREFIX . DIRECTORY_SEPARATOR . $galleryname);
if ($scaleheight) {
$scaleddir = sprintf("%s%sscaled_x%d", $galleryname,
DIRECTORY_SEPARATOR, $maxdim);
} else {
$scaleddir = sprintf("%s%sscaled%dx_", $galleryname,
DIRECTORY_SEPARATOR, $maxdim);
}
$scaleddirpath = GALLERYPREFIX . DIRECTORY_SEPARATOR . $scaleddir;
if (!is_dir($scaleddirpath)) {
// versuchen das Thumbnail-Verzeichnis anzulegen
$mkdir = @mkdir($scaleddirpath, 0755);
if (!$mkdir) {
return $galleryname . DIRECTORY_SEPARATOR . $basename;
}
}
$scaledimage = $scaleddirpath . DIRECTORY_SEPARATOR . $basename;
if (!is_file($scaledimage)) {
// Datei erzeugen
$originalfile = $gallerydir . DIRECTORY_SEPARATOR . $basename;
$origimage = imagecreatefromjpeg($originalfile);
$origx = imagesx($origimage);
$origy = imagesy($origimage);
if ($scaleheight) {
$scaleratio = $origy / (1.0 * $maxdim);
$newy = $maxdim;
$newx = (int) $origx / $scaleratio;
} else {
$scaleratio = $origx / (1.0 * $maxdim);
$newx = $maxdim;
$newy = (int) $origy / $scaleratio;
}
$newimage = imagecreatetruecolor($newx, $newy);
imagecopyresampled($newimage, $origimage, 0, 0, 0, 0, $newx, $newy,
$origx, $origy);
imagejpeg($newimage, $scaledimage, 90);
}
return $scaleddir . DIRECTORY_SEPARATOR . $basename;
}
/**
* Gibt die Informationen über Vorschaubilder zurück.
*
* @param $galleryname Galeriename
*
* @return Array mit drei Elementen, dessen erstes Element die
* aufsummierte Breite der Einzelbilder, dessen zweites Element der
* Galeriename und dessen drittes Element ein assoziatives Array mit
* den Bildnamen als Keys und Arrays mit dem Pfadnamen das Thumbnails
* und dem Ergebnis von getimagesize() als Werten ist.
*/
function getThumbNailInfo($galleryname) {
$thumbsizes = array();
$thumbwidthsum = 2;
foreach (glob(realpath(GALLERYPREFIX . DIRECTORY_SEPARATOR .
$galleryname) . DIRECTORY_SEPARATOR .
'*.jp{e,}g', GLOB_BRACE) as $filename) {
$basename = basename($filename);
$thumbfile = getScaledImage($galleryname, $basename,
$GLOBALS["thumbheight"]);
if ($thumbsize = getimagesize(realpath(GALLERYPREFIX .
DIRECTORY_SEPARATOR .
$thumbfile))) {
$thumbsizes[$basename] = array($thumbfile, $thumbsize);
$thumbwidthsum = $thumbwidthsum + $thumbsize[0] + 3;
}
}
return array($thumbwidthsum, $galleryname, $thumbsizes);
}
/**
* Gibt die Links zu den existierenden Galerien zurück.
*
* @return Array, welches je Gallerie ein assoziatives Array mit den
* Keys @a gallery, @a label und @a url enthält. Die Labels für die
* Galerien werden aus dem @a title-Feld der @a gallery-Sektion der @c
* galleryinfo.ini ausgelesen. Wenn diese Feld nicht gesetzt ist, wird
* der Galeriename verwendet.
*
* @see galleryExists()
* @see getGalleryConfig()
*/
function getGalleryLinks() {
$retval = array();
foreach (glob(realpath(GALLERYPREFIX) . DIRECTORY_SEPARATOR . '*',
GLOB_ONLYDIR) as $directory) {
$basename = basename($directory);
if (galleryExists($basename)) {
$url = sprintf('index.php?galleryname=%s', urlencode($basename));
$retval[] = array('gallery' => $basename,
'label' => getGalleryLabel($basename),
'url' => $url);
}
}
return $retval;
}
/**
* Gibt für die Ausgabe aufbereitete Informationen über die
* Thumbnail-Bilder die in @a $thumbinfo definiert sind zurück.
*
* @param &$thumbinfo Referenz auf ein Array, wie es von
* getThumbNailInfo() zurückgegeben wird
*
* @return ein Array mit einem assoziativen Array pro Thumbnail-Bild
* mit den Keys @a src, @a sizes und @a alt, die jeweils die relative
* URL des Thumbnail-Bildes, die Größenangaben für ein img-Tag sowie
* die Angaben für das alt-Attribut eines img-Tags enthalten
*
* @see getThumbNailInfo()
*/
function getAllThumbnails(&$thumbinfo) {
$retval = array();
foreach ($thumbinfo[2] as $basename => $data) {
$retval[] = array('src' => GALLERYPREFIX . DIRECTORY_SEPARATOR . $data[0],
'sizes' => $data[1][3],
'alt' => getImageLabel($thumbinfo[1], $basename));
}
return $retval;
}
/**
* Gibt die Daten für das erste Vorschaubild aus @a $thumbinfo zurück.
*
* @param &$thumbinfo Referenz auf ein Array, wie es von
* getThumbNailInfo() zurückgegeben wird
*
* @return ein assoziatives Array mit den Keys @a title, @a full, @a
* src, @a alt und @a sizes jeweils mit den Werten Titel des Bildes,
* relative URL der Vollbildansicht, relative URL des Vorschaubildes,
* Alternativtext für das Bild und Größenangaben des Bildes für ein
* img-Tag
*
* @see getThumbNailInfo()
*/
function getFirstPreview(&$thumbinfo) {
reset($thumbinfo[2]);
$basename = key($thumbinfo[2]);
$data = current($thumbinfo[2]);
$galleryname = $thumbinfo[1];
$fullname = GALLERYPREFIX . DIRECTORY_SEPARATOR . $galleryname .
DIRECTORY_SEPARATOR . $basename;
$scaledimage = getScaledImage($galleryname, $basename,
$GLOBALS["previewwidth"], false);
$scaledimagesize = getimagesize(realpath(GALLERYPREFIX .
DIRECTORY_SEPARATOR .
$scaledimage));
$label = getImageLabel($galleryname, $basename);
return array('title' => $label,
'full' => $fullname,
'src' => GALLERYPREFIX . DIRECTORY_SEPARATOR . $scaledimage,
'alt' => $label,
'sizes' => $scaledimagesize[3]);
}
/**
* Gibt die Beschreibung des ersten Bildes aus @a $thumbinfo zurück.
*
* @param &$thumbinfo Referenz auf ein Array, wie es von
* getThumbNailInfo() zurückgegeben wird
*
* @return HTML-kodierte Beschreibung des Bildes
*
* @see getThumbNailInfo()
*/
function getFirstDescription(&$thumbinfo) {
reset($thumbinfo[2]);
return htmlentities(getImageLabel($thumbinfo[1], key($thumbinfo[2])));
}
/**
* Gibt den Titeltext für die Galerie aus.
*
* @param &$thumbinfo Referenz auf ein Array, wie es von
* getThumbNailInfo() zurückgegeben wird
*
* @return Inhalt für das title-Tag auf der Ausgabeseite
*/
function getGalleryTitle(&$thumbinfo) {
foreach ($thumbinfo[2] as $basename => $data) {
return htmlentities(sprintf("%s :: %s", getGalleryLabel($thumbinfo[1]),
getImageLabel($thumbinfo[1], $basename)));
}
}