view mgallery.inc.php @ 224:77e72455c99f

"Powered by MGallery" ..
author Matti Hamalainen <ccr@tnsp.org>
date Fri, 23 Mar 2018 00:38:01 +0200
parents 0073439eff6d
children e618280253ca
line wrap: on
line source

<?php
//
// Yet Another Image Gallery
// -- Common functions and data include
// Programmed and designed by Matti 'ccr' Hamalainen <ccr@tnsp.org>
// (C) Copyright 2015-2018 Tecnic Software productions (TNSP)
//

$mgProgVersion = "v0.9.3";
$mgProgInfo = "Programmed by Matti 'ccr' Hamalainen";
$mgProgEmail = "<ccr@tnsp.org>";
$mgProgCopyright = "2015-2018 Tecnic Software productions (TNSP)";


//
// Navigation control defines
//
define("MGF_JAVASCRIPT"      , 0x01);
define("MGF_BREADCRUMBS"     , 0x10);
define("MGF_CAPTIONS"        , 0x20);

//
// Constants for different value types
//
define("MG_STR"              , 1);
define("MG_INT"              , 2);
define("MG_DVA"              , 3);
define("MG_BOOL"             , 4);
define("MG_FLAGS"            , 5);
define("MG_DATE"             , 6);


define("yes"                 , 1);
define("no"                  , 0);


$mgGFlags = [
  "javascript"               => MGF_JAVASCRIPT,
  "breadcrumbs"              => MGF_BREADCRUMBS,
  "captions"                 => MGF_CAPTIONS,
];


function mgPathName($path)
{
  $tmp = mgCleanPathArray(TRUE, 0, func_num_args(), func_get_args());
  if (count($tmp) > 0)
    return implode("/", array_splice($tmp, 0, -1))."/";
  else
    return $path;
}

//
// Configuration settings and their default values
//
$mgDefaults = [
  "timezone"         => [MG_STR, NULL],

  "clean_urls"       => [MG_BOOL, FALSE],
  "base_path"        => [MG_STR, mgPathName(mgRealPath($_SERVER["SCRIPT_FILENAME"]))],
  "base_url"         => [MG_STR, mgPathName($_SERVER["PHP_SELF"])],
  "image_url"        => [MG_STR, mgPathName($_SERVER["PHP_SELF"])],
  "mgallery_php"     => [MG_STR, "mgallery.php"],
  "format_exts"      => [MG_STR, "\.jpg|\.png|\.gif|\.jpeg"],
  "captions_file"    => [MG_STR, "captions.txt"],
  "header_file"      => [MG_STR, "header.txt"],
  "info_file"        => [MG_STR, "gallery.info"],
  "cache_file"       => [MG_STR, ".mgallery.cache"],

  "cover_images"     => [MG_BOOL, TRUE],
  "album_icon"       => [MG_STR, "album_sm.png"],

  "use_tables"       => [MG_BOOL, FALSE],
  "album_row_limit"  => [MG_INT, 5],

  "title_prefix"     => [MG_STR, ""],
  "title_sep"        => [MG_STR, " - "],
  "page_info"        => [MG_STR, "Powered by <b>MGallery ".$mgProgVersion."</b> &copy; Copyright ".$mgProgCopyright],

  "css"              => [MG_STR, NULL],
  "js_file"          => [MG_STR, NULL],
  "urchin_file"      => [MG_STR, FALSE],

  "global_flags"     => [MG_FLAGS, MGF_JAVASCRIPT | MGF_BREADCRUMBS | MGF_CAPTIONS, &$mgGFlags],
  "image_flags"      => [MG_FLAGS, MGF_JAVASCRIPT | MGF_BREADCRUMBS, &$mgGFlags],
  "album_flags"      => [MG_FLAGS, MGF_JAVASCRIPT | MGF_BREADCRUMBS, &$mgGFlags],

  "tn_path"          => [MG_STR, "tn/"],
  "med_path"         => [MG_STR, "med/"],

  "tn_width"         => [MG_INT, 140],  // In pixels, applies as bounding box for w/h
  "tn_height"        => [MG_INT, 100],
  "tn_quality"       => [MG_INT, 85],   // JPEG quality percent

  "med_width"        => [MG_INT, 960],
  "med_height"       => [MG_INT, 640],
  "med_quality"      => [MG_INT, 90],

  "debug"            => [MG_BOOL, FALSE],
];


function mgDebug($msg)
{
//  echo "MGAL[debug]: ".$msg;
}


function mgFatal($msg)
{
  die("MGAL[fatal]: ".$msg);
}


function mgError($msg)
{
  echo "MGAL[error]: ".$msg;
  return FALSE;
}


function mgCArg($index, $clip = FALSE)
{
  global $argc, $argv;
  if ($index < $argc)
  {
    $str = $argv[$index];
    return ($clip !== FALSE) ? substr($str, 0, $clip) : $str;
  }
  else
    return FALSE;
}


function mgCArgLC($index, $clip = FALSE)
{
  global $argc, $argv;
  if ($index < $argc)
  {
    $str = strtolower($argv[$index]);
    return ($clip !== FALSE) ? substr($str, 0, $clip) : $str;
  }
  else
    return FALSE;
}


function mgGetSetting($key, $default = NULL)
{
  global $mgSettings, $mgDefaults;

  if (!array_key_exists($key, $mgDefaults))
    mgFatal("Setting '".$key."' does not exist.\n");

  if (array_key_exists($key, $mgSettings))
    $val = $mgSettings[$key];
  else
    $val = $mgDefaults[$key][1];

  if (!isset($val) || $val === NULL)
  {
    if ($default !== NULL)
      $val = $default;
    else
      mgFatal("Setting '".$key."' is not set, but is required to be configured.\n");
  }

  switch ($mgDefaults[$key][0])
  {
    case MG_FLAGS:
      if (is_string($val))
      {
        $flags = $mgDefaults[$key][2];
        $cval = preg_split("/\s*[,|]\s*/", strtolower($val), -1, PREG_SPLIT_NO_EMPTY);
        $nval = 0;
        foreach ($cval as $qval)
        {
          if (array_key_exists($qval, $flags))
            $nval |= $flags[$qval];
          else
            mgFatal("Invalid flag value for '".$key."': '".$qval."'.");
        }
      }
      break;
  }

  return $val;
}


function mgGetPath($path, $key)
{
  $val = mgGetSetting($key);
  return ($val !== FALSE) ? $path."/".$val : FALSE;
}


function mgReadSettings($filename = "mgallery.cfg")
{
  global $mgSettings, $mgDefaults;

  $spaths = [];
  $spaths[] = getcwd()."/";
  if (($tmp = getenv("HOME")) !== FALSE && strlen($tmp) > 0)
  {
    $spaths[] = $tmp."/.config/mgallery/";
    $spaths[] = $tmp."/.";
  }
  else
  {
    $data = posix_getpwuid(posix_getuid());
    if ($data !== FALSE && isset($data["dir"]))
    {
      $tmp = $data["dir"];
      $spaths[] = $tmp."/.config/mgallery/";
      $spaths[] = $tmp."/.";
    }
  }
  $spaths[] = dirname(__FILE__)."/";

  foreach (array_unique($spaths) as $path)
  {
    $file = $path.$filename;
    mgDebug("Checking '".$file."' for configuration ..\n");
    if (file_exists($file) &&
      ($mgSettings = parse_ini_file($file, FALSE)) !== FALSE)
    {
      mgDebug("Found '".$file."' config.\n");

      // Validate settings
      $ok = TRUE;
      foreach ($mgSettings as $setting => $val)
      {
        if (!array_key_exists($setting, $mgDefaults))
        {
          mgError("Setting '".$setting."' does not exist.\n");
          $ok = FALSE;
        }
      }
      return $ok;
    }
  }

  $mgSettings = [];
  return FALSE;
}


function mgRealPath($path)
{
  return realpath($path);
}


function mgCleanPathArray($refs, $start, $argc, $argv)
{
  $path = [];
  $first = TRUE;
  for ($n = $start; $n < $argc; $n++)
  {
    foreach (explode("/", $argv[$n]) as $piece)
    {
      switch ($piece)
      {
        case ".":
        case "":
          if ($first)
            $path[] = $piece;
          break;

        case "..":
          if ($refs && count($path) > 0)
            array_pop($path);
          break;

        default:
          $path[] = $piece;
          break;
      }
      $first = FALSE;
    }
  }
  return $path;
}


function mgCleanPath($refs)
{
  return implode("/", mgCleanPathArray($refs, 1, func_num_args(), func_get_args()));
}


function mgGetTrans($val, $useEntities = FALSE)
{
  global $pageLang;

  if (is_array($val))
    $str = array_key_exists($pageLang, $val) ? $val[$pageLang] : reset($val);
  else
    $str = $val;

  return $useEntities ? chentities($str) : $str;
}


function mgGetArr($data, $skeys, $sfmt1 = "%1", $sfmt2 = "", $func = NULL)
{
  global $pageLang;

  if (!is_array($skeys))
    $skeys = array($skeys);

  foreach ($skeys as $skey)
  if (!array_key_exists($skey, $data))
    return $sfmt2;

  $str = $sfmt1;
  for ($i = 1; $i <= sizeof($skeys); $i++)
  {
    $val = $data[$skeys[$i - 1]];
    if (is_array($val))
      $vtmp = array_key_exists($pageLang, $val) ? $val[$pageLang] : reset($val);
    else
      $vtmp = $val;

    if (is_callable($func))
      $vtmp = call_user_func($func, $vtmp);

    $str = str_replace("%".$i, $vtmp, $str);
  }

  return $str;
}


function mgGetDValStr($mdef, $val)
{
  switch ($mdef[0])
  {
    case MG_STR  : return "\"".$val."\"";
    case MG_BOOL : return $val ? "yes" : "no";
    case MG_FLAGS:
      {
        $mstr = [];
        foreach ($mdef[2] as $vkey => $vval)
        {
          if ($val & $vval)
            $mstr[] = $vkey;
        }
        return implode($mstr, " | ");
      }
    case MG_INT  :
    default      : return (string) $val;
  }
}

?>