blob: 47dc3f9b10ebd4adedfdbfccb7e04f42d3cdf23a [file] [log] [blame]
<?php if (!defined('PmWiki')) exit();
/* Copyright 2004 Patrick R. Michaud (pmichaud@pobox.com)
This file is part of PmWiki; 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 2 of the License, or
(at your option) any later version. See pmwiki.php for full details.
This file implements the skin selection code for PmWiki. Skin
selection is controlled by the $Skin variable, which can also
be an array (in which case the first skin found is loaded).
In addition, $ActionSkin[$action] specifies other skins to be
searched based on the current action.
*/
SDV($Skin, 'pmwiki');
SDV($ActionSkin['print'], 'print');
SDV($FarmPubDirUrl, $PubDirUrl);
SDV($PageLogoUrl, "$FarmPubDirUrl/skins/pmwiki/pmwiki-32.gif");
SDVA($TmplDisplay, array('PageEditFmt' => 0));
# $PageTemplateFmt is deprecated
if (isset($PageTemplateFmt)) LoadPageTemplate($pagename,$PageTemplateFmt);
else {
$x = array_merge((array)@$ActionSkin[$action], (array)$Skin);
SetSkin($pagename, $x);
}
SDV($PageCSSListFmt,array(
'pub/css/local.css' => '$PubDirUrl/css/local.css',
'pub/css/$Group.css' => '$PubDirUrl/css/$Group.css',
'pub/css/$FullName.css' => '$PubDirUrl/css/$FullName.css'));
foreach((array)$PageCSSListFmt as $k=>$v)
if (file_exists(FmtPageName($k,$pagename)))
$HTMLHeaderFmt[] = "<link rel='stylesheet' type='text/css' href='$v' />\n";
# SetSkin changes the current skin to the first available skin from
# the $skin array.
function SetSkin($pagename, $skin) {
global $Skin, $SkinDir, $SkinDirUrl, $IsTemplateLoaded, $PubDirUrl,
$FarmPubDirUrl, $FarmD;
unset($Skin);
foreach((array)$skin as $s) {
$sd = FmtPageName("pub/skins/$s", $pagename);
if (is_dir($sd))
{ $Skin=$s; $SkinDirUrl="$PubDirUrl/skins/$Skin"; break; }
$sd = FmtPageName("$FarmD/pub/skins/$s", $pagename);
if (is_dir($sd))
{ $Skin=$s; $SkinDirUrl="$FarmPubDirUrl/skins/$Skin"; break; }
}
if (!is_dir($sd))
Abort("?unable to find skin from list ".implode(' ',(array)$skin));
$SkinDir = $sd;
$IsTemplateLoaded = 0;
if (file_exists("$SkinDir/$Skin.php"))
include_once("$SkinDir/$Skin.php");
else if (file_exists("$SkinDir/skin.php"))
include_once("$SkinDir/skin.php");
if ($IsTemplateLoaded) return;
if (file_exists("$SkinDir/$Skin.tmpl"))
LoadPageTemplate($pagename, "$SkinDir/$Skin.tmpl");
else if (file_exists("$SkinDir/skin.tmpl"))
LoadPageTemplate($pagename, "$SkinDir/skin.tmpl");
else if (($dh = opendir($SkinDir))) {
while (($fname = readdir($dh)) !== false) {
if (substr($fname, -5) != '.tmpl') continue;
if ($IsTemplateLoaded)
Abort("?unable to find unique template in $SkinDir");
LoadPageTemplate($pagename, "$SkinDir/$fname");
}
closedir($dh);
}
if (!$IsTemplateLoaded) Abort("Unable to load $Skin template");
}
# LoadPageTemplate loads a template into $TmplFmt
function LoadPageTemplate($pagename,$tfilefmt) {
global $PageStartFmt, $PageEndFmt, $HTMLHeaderFmt,
$IsTemplateLoaded, $TmplFmt, $TmplDisplay,
$PageTextStartFmt, $PageTextEndFmt;
# $BasicLayoutVars is deprecated
global $BasicLayoutVars;
if (isset($BasicLayoutVars))
foreach($BasicLayoutVars as $sw) $TmplDisplay[$sw] = 1;
SDV($PageTextStartFmt, "\n<div id='wikitext'>\n");
SDV($PageTextEndFmt, "</div>\n");
$sddef = array('PageEditFmt' => 0);
$k = implode('',file(FmtPageName($tfilefmt,$pagename)));
$sect = preg_split('#[[<]!--(/?(?:Page[A-Za-z]+Fmt|PageText|HeaderText)\\s?.*?)--[]>]#',
$k,0,PREG_SPLIT_DELIM_CAPTURE);
$TmplFmt['Start'] = array_merge(array('headers:'),
preg_split('/[[<]!--((?:wiki|file|function|markup):.*?)--[]>]/s',
array_shift($sect),0,PREG_SPLIT_DELIM_CAPTURE));
$TmplFmt['End'] = array($PageTextEndFmt);
$ps = 'Start';
while (count($sect)>0) {
$k = array_shift($sect);
$v = preg_split('/[[<]!--((?:wiki|file|function|markup):.*?)--[]>]/',
array_shift($sect),0,PREG_SPLIT_DELIM_CAPTURE);
$TmplFmt[$ps][] = "<!--$k-->";
if ($k{0} == '/')
{ $TmplFmt[$ps][] = (count($v) > 1) ? $v : $v[0]; continue; }
@list($var, $sd) = explode(' ', $k, 2);
$GLOBALS[$var] = (count($v) > 1) ? $v : $v[0];
if ($sd > '') $sddef[$var] = $sd;
if ($var == 'PageText') { $ps = 'End'; }
if ($var == 'HeaderText') { $TmplFmt[$ps][] = &$HTMLHeaderFmt; }
$TmplFmt[$ps][$var] =& $GLOBALS[$var];
}
array_push($TmplFmt['Start'], $PageTextStartFmt);
$PageStartFmt = 'function:PrintSkin Start';
$PageEndFmt = 'function:PrintSkin End';
$IsTemplateLoaded = 1;
SDVA($TmplDisplay, $sddef);
}
# This function is called to print a portion of the skin template
# according to the settings in $TmplDisplay.
function PrintSkin($pagename, $arg) {
global $TmplFmt, $TmplDisplay;
foreach ($TmplFmt[$arg] as $k => $v)
if (!isset($TmplDisplay[$k]) || $TmplDisplay[$k])
PrintFmt($pagename, $v);
}