Mercurial > hg > mgallery
view mgallery.php @ 181:86e9931e8e03
Cosmetics.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Wed, 14 Mar 2018 13:22:37 +0200 |
parents | a51b59b552ef |
children | cb7019690a73 |
line wrap: on
line source
<?php // // Yet Another Image Gallery // -- Main PHP file // Programmed and designed by Matti 'ccr' Hamalainen <ccr@tnsp.org> // (C) Copyright 2015-2018 Tecnic Software productions (TNSP) // require "mgallery.inc.php"; $pageLang = "fi"; $pageLanguages = [ "fi" => "FIN", "en" => "ENG", ]; $pageTranslations = [ "gallery_error" => [ "fi" => "Tapahtui virhe", "en" => "An error occured", ], "invalid_gallery_path" => [ "fi" => "Gallerian tiedostopolkua <b>%1</b> ei ole olemassa.", "en" => "Gallery path <b>%1</b> does not exist or is invalid.", ], "view_best_quality" => [ "fi" => "Näytä paremmalla laadulla", "en" => "View better quality version", ], "gallery_nimages" => [ "fi" => "kuvaa", "en" => "images", ], "gallery_nsubalbums" => [ "fi" => "albumia", "en" => "albums", ], ]; // // Various utility functions // function mgSetCookie($name, $value) { global $galBaseURL; setcookie($name, $value, time() + 365*24*60*60, $galBaseURL); // expire in a year } function mgQM($msg) { global $pageTranslations, $pageLang; if (isset($pageTranslations[$msg]) && isset($pageTranslations[$msg][$pageLang])) $str = $pageTranslations[$msg][$pageLang]; else $str = $msg; foreach (func_get_args() as $argn => $argv) $str = preg_replace("/\%".$argn."/", $argv, $str); return $str; } function mgTrimIfString($val) { if (is_string($val)) return trim($val); else return $val; } function mgGetRequestItem($name, $default = "", $allowGet = FALSE) { if ($allowGet) return isset($_REQUEST[$name]) ? mgTrimIfString($_REQUEST[$name]) : $default; else return isset($_POST[$name]) ? mgTrimIfString($_POST[$name]) : $default; } function chentities($str) { return htmlentities($str, ENT_NOQUOTES, "UTF-8"); } function mgGetCSSLine($filename, $media = FALSE) { return " <link rel=\"stylesheet\" href=\"".$filename. "\" type=\"text/css\" ".($media !== FALSE ? "media=\"".$media."\"": "")." />\n"; } function mgPrintPageHeader($pageTitle, $pageExtra = "") { global $pageCSS, $pageCharset, $pageUrchin, $pageJSFile; echo "<!DOCTYPE html>\n". "<html>\n". "<head>\n". " <meta charset=\"".$pageCharset."\">\n". " <meta http-equiv=\"Content-type\" content=\"text/html;charset=".$pageCharset."\">\n". " <script type=\"text/javascript\" src=\"".$pageJSFile."\"></script>\n". " <title>".strip_tags($pageTitle)."</title>\n". mgGetCSSLine($pageCSS, FALSE). $pageExtra. "</head>\n". "<body>\n"; if ($pageUrchin !== FALSE && file_exists($pageUrchin)) require_once $pageUrchin; echo "<div id=\"pageContents\">\n"; } function mgPrintPageFooter() { echo mgGetPageInfoFooter(). "</div>\n</body>\n</html>\n"; } function mgGetImageTitleStr($filename, &$data) { return chentities($filename). mgGetArr($data, "datetime", " - %1", "", "mgTimeStr"); } function mgGetImageURL() { global $galImageURL, $galPath; return str_replace("//", "/", $galImageURL.$galPath."/".implode("", func_get_args())); } function mgGetURL($path, $image, $entities = TRUE) { global $galBaseURL, $galCleanURLS; $amp = $entities ? "&" : "&"; if ($galCleanURLS) { $url = $galBaseURL.$path."/".($image !== FALSE ? $image : ""); } else { $url = $galBaseURL.mgGetSetting("mgallery_php")."?path=". $path.($image !== FALSE ? $amp."image=".$image : ""); } return str_replace("//", "/", $url); } function mgGetNaviActive(&$galIndex, $index, $delta, &$res, &$url, $entities) { global $galPath; $res = $index + $delta; if ($res >= 0 && $res <= sizeof($galIndex) - 1) { $url = mgGetURL($galPath, $galIndex[$res], $entities); return TRUE; } else return FALSE; } function mgGetNaviControlImage(&$galIndex, $index, $class, $url) { global $galTNPath; if ($url !== FALSE) { return "<div class=\"imageCtrl ".$class."\">". "<a href=\"".$url."\"><img src=\"". mgGetImageURL($galTNPath, $galIndex[$index]). "\" alt=\"".$galIndex[$index]."\" /></a></div>"; } else return ""; } function mgGetNaviControlImageBox(&$galIndex, $index, $class, $delta) { if (!mgGetNaviActive($galIndex, $index, $delta, $res, $url, TRUE)) $url = FALSE; return mgGetNaviControlImage($galIndex, $res, $class, $url); } function mgGetNaviControlImageBoxJS(&$galIndex, $index, $class, $delta) { $str = mgGetNaviControlImageBox($galIndex, $index, $class, $delta); if ($str != "") return "<script type=\"text/javascript\">". "document.write(\"".str_replace("\"", "\\\"", $str)."\");". "</script>"; else return ""; } function mgPrintTable($class, &$galEntries, &$galIndex, $start, $limit) { global $galAlbumIcon, $galPath, $galTNPath, $galImageURL, $galUseCoverImages, $galUseTables; $galCount = count($galIndex); if ($start >= $galCount) return $start; $end = ($limit === FALSE) ? $galCount : $start + $limit; if ($end > $galCount) $end = $galCount; $rowLimit = mgGetSetting("album_row_limit"); $n = 0; echo "<".($galUseTables ? "table" : "div")." class=\"galleryTable ".$class."\">\n"; for ($index = $start; $index < $end; $index++) { $filename = &$galIndex[$index]; $data = &$galEntries[$filename]; if ($galUseTables && $n == 0) echo " <tr>\n"; if ($galUseTables) echo " <td class=\"galleryEntry\" id=\"cd".$data["base"]."\">\n"; else echo " <div class=\"galleryEntry\">\n"; if ($data["type"] == 0) { echo " <div class=\"imageBox\" title=\"".mgGetImageTitleStr($filename, $data). "\"><a href=\"".mgGetURL($galPath, $filename)."\">". "<img src=\"".mgGetImageURL($galTNPath, $filename)."\" alt=\"". chentities($filename)."\"></a></div>\n". mgGetArr($data, "caption", " <div class=\"imageCaption\">%1</div>\n", "", "chentities"); /* if ($mode == "") { echo " <select class=\"dropdown\" id=\"dd".$data["base"]."\" name=\"dd".$data["base"]. "\" onchange=\"galPhotoDataChanged('".$data["base"]."');\">\n"; foreach ($picChoices as $name => $value) { echo " <option value=\"$value\"".($value == $data["id"] ? " selected=\"selected\"" : "").">".chentities($name)."</option>\n"; } echo " </select>\n"; } */ } else { if ($galUseCoverImages && isset($data["image"])) { // Recursively determine the album cover image $ptmp = [$galPath, $filename]; $curr = &$data; while (is_array($curr["image"])) { $curr = &$curr["image"]; $ptmp[] = $curr["base"]; } $ptmp[] = $galTNPath; $ptmp[] = $curr["image"]; $atmp = $galImageURL.implode("/", mgCleanPathArray(TRUE, 0, count($ptmp), $ptmp)); } else // No album cover, use default $atmp = $galAlbumIcon; echo " <a href=\"".mgGetURL(mgCleanPath(TRUE, $galPath, $filename), FALSE)."\">". "<img class=\"albumIcon\" src=\"".$atmp."\" alt=\"". mgGetTrans($data["caption"], TRUE). "\" />\n". " <div class=\"albumTitle\">".mgGetTrans($data["caption"], TRUE)."</div></a>\n"; } if ($galUseTables) { echo " </td>\n"; if (++$n >= $rowLimit) { echo " </tr>\n"; $n = 0; } } else echo " </div>\n"; } if ($galUseTables) { if ($n > 0) { while ($n++ < $rowLimit) echo " <td></td>\n"; echo " </tr>\n"; } echo "</table>\n"; } else { echo "</div>\n"; } return $index; } function mgTimeStr($stamp) { return date("d M Y (H:i:s)", $stamp); } function mgFileSize($size) { foreach ([1024*1024 => "MiB", 1024 => "kiB"] as $mdiv => $mpost) { if ($size > $mdiv) return sprintf("%1.2f %s", $size / $mdiv, $mpost); } return sprintf("%d bytes", $size); } function mgGetPageInfoHeaderStart($class = NULL) { return "<div id=\"pageInfoHeader\"".($class != NULL ? " class=\"".$class."\"" : "").">\n"; } function mgGetPageInfoHeaderEnd() { global $pageLang, $pageLanguages; $str = "<div id=\"languages\">"; if (isset($pageLanguages) && is_array($pageLanguages)) { foreach ($pageLanguages as $id => $lang) $str .= "<a class=\"lang_".$id."\" href=\"?lang=".$id."\">".$lang."</a>"; } return $str. "</div>\n". "</div>\n"; } function mgGetPageInfoFooter() { if (($str = mgGetSetting("page_info")) !== FALSE) return "<div id=\"pageInfoFooter\"><div>".$str."</div></div>"; else return ""; } function mgGetBreadCrump($class, &$pdata) { return "<a class=\"".$class."\" href=\"".mgGetURL($pdata["path"], FALSE)."\">". mgGetTrans($pdata["caption"], TRUE). "</a>"; } function mgPrintBreadCrumbs($galData) { $res = []; if ($galData["caption"]) $res[] = mgGetBreadCrump("naviBreadCrumbCurr", $galData); $tmp = $galData; while (isset($tmp["parent"])) { $pdata = $tmp["parent"]; $res[] = mgGetBreadCrump("naviBreadCrumbItem", $pdata); $tmp = $tmp["parent"]; } if (count($res) > 1) { echo "<div id=\"naviBreadCrumbs\">". implode("<span class=\"naviBreadCrumbSep\"></span>", array_reverse($res)). "</div>\n"; } } // // Global locale initialization // if (!isset($localeInited) || !$localeInited) { $localeInited = TRUE; $pageCharset = "UTF-8"; mb_internal_encoding($pageCharset); $tmp = "en_US.".strtolower(str_replace("-", "", $pageCharset)); setlocale(LC_ALL, $tmp); } // // Read and process gallery settings // mgReadSettings(); $pageCSS = mgGetSetting("css"); $pageJSFile = mgGetSetting("js_file"); $pageUrchin = mgGetSetting("urchin_file"); $galBasePath = mgGetSetting("base_path"); $galBaseURL = mgGetSetting("base_url"); $galImageURL = mgGetSetting("image_url", mgGetSetting("base_url")); $galUseCoverImages = mgGetSetting("cover_images"); $galUseTables = mgGetSetting("use_tables"); $galAlbumIcon = mgGetSetting("album_icon"); $galCleanURLS = mgGetSetting("clean_urls"); $galTNPath = mgGetSetting("tn_path"); $galMedSuffix = mgGetSetting("med_suffix"); $galTitlePrefix = mgGetSetting("title_prefix"); $galTitleSep = mgGetSetting("title_sep"); $galMode = mgGetRequestItem("mode", "view", TRUE); $galPath = mgGetRequestItem("path", ".", TRUE); $galPageIndex = intval(mgGetRequestItem("index", 0, TRUE)); $galImage = mgGetRequestItem("image", FALSE, TRUE); if (is_string($galImage)) $galImage = basename($galImage); if (($pageTimeZone = mgGetSetting("timezone")) !== NULL) date_default_timezone_set($pageTimeZone); // Check language setting if (($tmp = mgGetRequestItem("lang", FALSE, TRUE)) !== FALSE) { $tmp = strtolower($tmp); if (array_key_exists($tmp, $pageLanguages)) { $pageLang = $tmp; mgSetCookie("mglang", $tmp); } } else if (isset($_COOKIE["mglang"])) { $tmp = strtolower($_COOKIE["mglang"]); if (array_key_exists($tmp, $pageLanguages)) $pageLang = $tmp; } // Check "tables" setting if (isset($_REQUEST["tables"])) { $galUseTables = mgGetRequestItem("tables", FALSE, TRUE); mgSetCookie("mgtables", $galUseTables ? 1 : 0); } else if (isset($_COOKIE["mgtables"])) $galUseTables = intval($_COOKIE["mgtables"]); // // Attempt to read the data cache file // $filename = mgGetPath(mgCleanPath(TRUE, $galBasePath, $galPath), "cache_file"); $filename2 = mgGetPath(mgCleanPath(FALSE, $galBasePath, $galPath), "cache_file"); if ($filename == $filename2 && file_exists($filename) && ($fp = @fopen($filename, "rb")) !== FALSE) { if (flock($fp, LOCK_SH)) { require($filename); flock($fp, LOCK_UN); } fclose($fp); } // If no data available, show an error page if (!isset($galData) || !isset($galEntries) || !isset($galAlbumsIndex) || !isset($galImagesIndex)) { mgPrintPageHeader($galTitlePrefix.$galTitleSep."ERROR!"); echo "<h1>".mgQM("gallery_error")."</h1>\n". "<p>".mgQM("invalid_gallery_path", chentities($galPath))."</p>"; //echo "<p>filename=: '".$filename."', X: galData=".intval(isset($galData)).", galEntries=".intval(isset($galEntries))."\n"; mgPrintPageFooter(); exit; } function mgGetArrStr($data, $skeys, $sfmt1, $func = NULL) { return mgGetArr($data, $skeys, $sfmt1, NULL, ($func == NULL) ? "chentities" : $func); } // // Print page header, etc. // if (($index = array_search($galImage, $galImagesIndex)) !== FALSE) { // // Single image mode // $ctrlFlags = mgGetSetting("image_flags"); $data = $galEntries[$galImage]; $list = [ mgGetArrStr($data, ["width", "height"], "<span class=\"infoDimensions\"><b>%1</b> x <b>%2</b> px</span>"), mgGetArrStr($data, "model", "<span class=\"infoModel\"><b>%1</b></span>"), mgGetArrStr($data, "fnumber", "<span class=\"infoFNumber\"><b>f/%1</b></span>"), mgGetArrStr($data, "exposure", "<span class=\"infoExposure\"><b>%1</b> sec</span>"), mgGetArrStr($data, "iso", "<span class=\"infoISO\">ISO <b>%1</b></span>"), mgGetArrStr($data, "focallength", "<span class=\"infoFocalLength\">F-L <b>%1</b>mm</span>"), mgGetArrStr($data, "lensmodel", "<span class=\"infoLensModel\"><i>%1</i></span>"), mgGetArrStr($data, "filesize", "<span class=\"infoFileSize\">%1</span>", "mgFileSize"), ]; $pageTitle = $galTitlePrefix.$galTitleSep.mgGetTrans($galData["caption"])." - ".$galImage; mgPrintPageHeader($pageTitle); echo mgGetPageInfoHeaderStart("imagePageHeader"). "<h1>".chentities($pageTitle)."</h1>\n"; if ($ctrlFlags & MGF_BREADCRUMBS) mgPrintBreadCrumbs($galData); echo mgGetPageInfoHeaderEnd()."\n". "<div id=\"pageInfoButton\">_</div>\n". "<a id=\"pageUpNaviButton\" href=\"".mgGetURL($galData["path"], FALSE)."\">^</a>\n". "<div id=\"imageCBox\">\n". mgGetNaviControlImageBoxJS($galImagesIndex, $index, "prevBtm", -1)."\n". mgGetNaviControlImageBox($galImagesIndex, $index, "prev", -1)."\n". "<div id=\"imageImageBox\" class=\"imageBox\">". "<img id=\"imageImage\" src=\"". mgGetImageURL($galTNPath, $data["base"].$galMedSuffix.$data["ext"]). "\" alt=\"".chentities($data["base"].$data["ext"])."\">". "</div>\n". mgGetNaviControlImageBoxJS($galImagesIndex, $index, "nextBtm", 1)."\n". mgGetNaviControlImageBox($galImagesIndex, $index, "next", 1)."\n". (isset($data["caption"]) ? "<div class=\"imageCaption\">".mgGetArrStr($data, "caption", "%1")."</div>\n" : ""). "<div class=\"infoBox\">\n". mgGetArr($data, "datetime", "<span class=\"infoDateTime\">%1</span>\n", "", "mgTimeStr"). implode(",\n", array_filter($list, function($a) { return $a !== NULL; }))."\n". "<a id=\"imageLink\" href=\"".$galImageURL.$galPath."/".$galImage."\">". mgQM("view_best_quality")."</a>\n". "</div>\n". // infoBox "</div>\n"; // imageCBox // Javascript navigation if ($ctrlFlags & MGF_JAVASCRIPT) { $prevActive = mgGetNaviActive($galImagesIndex, $index, -1, $res, $prevURL, FALSE); $nextActive = mgGetNaviActive($galImagesIndex, $index, 1, $res, $nextURL, FALSE); echo "<script type=\"text/javascript\">\n". "var mgalPrevURL = \"".($prevActive ? $prevURL : "")."\";\n". "var mgalNextURL = \"".($nextActive ? $nextURL : "")."\";\n". "var mgalUpURL = \"".mgGetURL($galData["path"], FALSE)."\";\n". "\n"; ?> mgalDisplayInfo(false); mgalAddEvent("pageInfoButton", "click", mgalOpenInfo); mgalAddEvent("imageCBox", "click", mgalCloseInfo); mgalAddEvent("imageImage", "load", mgalAdjustImageDo); mgalAddEventOb("window", window, "resize", mgalAdjustImage); mgalAddEventOb("document", document, "keypress", mgalProcessKeyPress); adjustPID = -1; </script> <? } } else { // // Gallery mode // // - needs sub-modes / handling of order shit // - Javascript stuff for picture data updates // $pageTitle = $galTitlePrefix.mgGetArr($galData, "caption", " - %1", "", "chentities"); mgPrintPageHeader($pageTitle); $ptmp = []; if (count($galImagesIndex) > 0) $ptmp[] = count($galImagesIndex)." ".mgQM("gallery_nimages"); if (count($galAlbumsIndex) > 0) $ptmp[] = count($galAlbumsIndex)." ".mgQM("gallery_nsubalbums"); if (count($ptmp)) $pageTitle .= " (".implode($ptmp, ", ").")"; echo mgGetPageInfoHeaderStart("galleryPageHeader"). "<h1>".$pageTitle."</h1>\n"; $ctrlFlags = mgGetSetting("album_flags"); if ($ctrlFlags & MGF_BREADCRUMBS) mgPrintBreadCrumbs($galData); if (isset($galData["header"]) && strlen($gheader = mgGetTrans($galData["header"])) > 0) { // Translate relative URLs in header, if needed $baseURL = mgGetSetting("image_url"); $headerText = preg_replace_callback( "@href\s*=\s*\"([^\"]+)\"@i", function ($matches) use($galPath, $baseURL) { $mstmp = $matches[1]; if (preg_match("@^[a-z]+://@i", $mstmp) === 0) { if ($mstmp[0] != "/") $mstmp = $baseURL."/".$galPath."/".str_replace("//", "/", $mstmp); } return "href=\"".$mstmp."\""; }, $gheader); echo "<div class=\"albumHeaderText\">".$headerText."</div>\n"; } echo mgGetPageInfoHeaderEnd(); mgPrintTable("albumTable", $galEntries, $galAlbumsIndex, 0, FALSE); mgPrintTable("imageTable", $galEntries, $galImagesIndex, 0, FALSE); } mgPrintPageFooter(); ?>