{HEADER END}
{COMPARE START}

MLAB

Porovnej cestu:  Revize
S umístěním:  Revize

Toto porovnání ukazuje změny pro převedení /Server (Revize 909) na /Server (Revize 944)

Reverzní porovnání

GenIndex/DirMetadata.php
Nový soubor

@@ -0,0 +1,141 @@

<?php
// DirMetadata
// -----------
//
// Modul zpracování popisného souboru pro popis obsahu adresáře/projektu
//
// (c)miho www.mlab.cz 2007, free software
//
// Formát souboru DIRINFO viz komentáře v souboru DIRINFO
//
//require_once('Common.php'); // Společné funkce
// Objekt pro zpracování informace o adresáři
class DirMetadata
{
public $DirData; // Sem se načtou data o adresáři v podobě klíč=>hodnota
private $Valid; // Zde je příznak platnosti
function LoadDirInfo($FileName, $Lang)
// Funkce načte informacime ze souboru $FileName do vlastní paměti
// Cesta je od DOCUMENT_ROOT.
// Funkce bere v potaz zadaný jazyk, pokud není pro daný jazyk
// informace dostupná, použije se infromace bez udaného jazyka.
// Pokud není k dispozici soubor, vrací false.
// Soubor může být prázdný a není to chyba.
{
// Zruš předchozí informaci
$this->Valid = FALSE;
$this->DirData = array();
// Jméno popisného souboru na cestě
$FileName = $_SERVER['DOCUMENT_ROOT'].$FileName;
// Ověř existenci popisného souboru
if (!is_file($FileName))
return FALSE;
// Načti popisný soubor
$File = @file($FileName);
if ($File===FALSE)
return FALSE;
// Vyhoď komentáře (po řádcích)
foreach($File as $Key => $Line)
if (substr(ltrim($Line), 0, 2) == '//')
unset($File[$Key]);
// Sestav z pole jeden retězec
$File = implode($File);
// Vyhledej v souboru informace
$PatternKey = '\[(?P<Key>[a-z,A-Z,0-9,\-\_\.]+)\]';
$PatternKeyNext = '(?=\[(?:[a-z,A-Z,0-9,\-\_\.]+)\])';
$PatternValue = '(?P<Value>.*?)';
$Pattern = '/'.$PatternKey.'\s*'.$PatternValue.'\s*'.$PatternKeyNext.'/su';
preg_match_all($Pattern, $File, $Temp);
// Sestav pole dat
$Data = array();
foreach($Temp['Key'] as $Key => $KeyName)
{
$Data[$KeyName] = trim(htmlspecialchars($Temp['Value'][$Key], ENT_NOQUOTES));
//echo '{'.$KeyName.'->'.$Data[$KeyName].'<-}'."\n";
}
unset($Temp);
// Aplikuj jazyk
// Priorita je "uvedený jazyk"/"bez jazyka"
foreach($Data as $Key => $Value) // projdi vše
{
$Temp = explode('.', $Key, 2); // základní část klíče
if (isset($Temp[1])) // existuje přípona
{
if ($Temp[1] == $Lang) // přípona
$Data[$Temp[0]] = $Value; // zkopíruj jazykovou hodnotu
unset($Data[$Key]); // klíč s příponou vyhoď
}
}
// Uschovej si získaná data
$this->Valid = TRUE;
$this->DirData = $Data;
// Soubor byl nalezen a načten
return TRUE;
}
function GetVariable($Key)
// Vrací řetězec s informaci podle klíče
// Když data nejsou, vrací prázdný řetězec
// Klíčem je jméno informace ze souboru DIRINFO bez jazykové přípony
{
// Test na přítomnost informace
if (isset($this->DirData[$Key]))
return $this->DirData[$Key];
else
return '';
}
function GetString($VarName, $Wrap=0)
// Vrátí parametr jako jeden řetězec s redukovanými bílými znaky
// Volitelně vloží odřádkování do delších řetězců
{
$Temp = $this->GetVariable($VarName);
$Temp = preg_replace('/\s+/su', ' ', $Temp);
if ($Wrap!=0)
wordwrap($Temp, $Wrap);
return $Temp;
}
// function GetList
function GetValid()
// Vrátí TRUE pokud je načtená informace o adresáři
{
return $this->Valid;
}
}
/*
function WrapString($String, $Wrap=0)
// Volitleně (pokud je $Wrap nenulové) provede zálámání na zadaný počet
// znaků a odstranění nadbytečných mezer
{
if ($Wrap!=0)
{
// Proveď zalámání hodnoty
preg_replace('/\s+/su', ' ', $Temp);
$String = wordwrap($String, $Wrap);
}
return $String;
}
*/
?>


GenIndex/GenIndex.php
Nový soubor

@@ -0,0 +1,264 @@

<?php
error_reporting(E_ALL); // nastavení varování při ladění
require_once('Common.php'); // Společné funkce
require_once('TemplateEngine.php'); // Stroj pro práci s templejty
require_once('DirMetadata.php'); // Modul pro načítání informace o adresářích
define('DIRINFO', 'DirInfo.txt', true); // Jméno souboru s informacemi o adresáři
define('PRJINFO', 'PrjInfo.txt', true); // Jméno souboru s informacemi o projektu
define('WRAP', 70, true); // Lámání řetězcových hodnot
define('TEMPLATEPATH', 'Templates', true); // relativní cesta k templejtům
$TemplateFile = 'Modules.ihtml'; // přípona jazyka se doplní sama
// Stavová informace
// -----------------
//
// Tento skript používá pro přenesení stavu ke kliemtovi a zpět dvě stavové
// proměnné prostřednictvím odkazu. Jsou to:
//
// lang - zde je kód jazyka, neplatný či chybějící kód se mapuje na angličtinu
//
// path - zde se uvádí cesta vůči DOCUMENT_ROOT webu, neplatná cesta se mapuje
// na cestu k root adresáři webu
//
// Vyzvedni si parametry z URL
// ---------------------------
// Parametr cesty z položky path
// Načteme, ověříme a pokud je něco špatně vracíme root
$Path = '';
if (isset($_GET['path']))
$Path = CheckWebPath($_GET['path']);
if ($Path == '')
$Path = '/';
$Params['path'] = $Path;
// Parametr jazyka z položky lang
// Pozor, tento parametr se nekontroluje a musí se ošetřit až při použití
// Předpokládá se, že neplatný jazyk se bude chovat jako angličtina
$Lang = 'en';
if (isset($_GET['lang']))
$Lang = substr($_GET['lang'], 0, 2);
$Params['lang'] = $Lang;
// Proveď zpracování templejtu nahrazovacím strojem
// ------------------------------------------------
// Založ objekt templejtu
$Template = new TemplateEngine();
// Načti templejt do objektu
$error = $Template->LoadTemplate(TEMPLATEPATH.'/'.$TemplateFile, $Params['lang']);
if ($error!='')
Error($error);
// Generuj dynamický obsah do proměnných
PowerFunction($Template, $Params);
// Odešli výsledek klientovi
echo $Template->GetPage();
function PowerFunction($Template, $Params)
// Tato funkce vykonává maso (generuje dynamický obsah stránky do podoby pole
// proměnných. Toto pole se následně použije na modifikaci templejtu .
{
// Lokálně používané prametry pěkně při ruce
$Path = $Params['path'];
$Lang = $Params['lang'];
// Zjisti informace o sekci (z prvního adresáře cesty)
$SectionDirInfo = new DirMetadata();
$SectionDirInfo->LoadDirInfo('/'.GetSection($Path).'/'.DIRINFO, $Lang);
// Pokud cesta sahá do sekce, která nemá popis spadneme do rootu
if(!$SectionDirInfo->GetValid())
{
$Params['path'] = '/';
$Path = $Params['path'];
}
// Zjisti informace o aktuálním adresáři
$ThisDirInfo = new DirMetadata();
$ThisDirInfo->LoadDirInfo($Path.'/'.DIRINFO, $Lang);
// HTML hlavička - doplň sekci
$Template->SetVariable('InfoSection', GetSection($Path));
// Zkopíruj informace z DIRINFO (z adresáře sekce a pak z aktuálního adresáře)
// do proměnných templejtu
foreach($SectionDirInfo->DirData as $Key => $Value)
{
$Template->SetVariable($Key, $Value, WRAP);
}
foreach($ThisDirInfo->DirData as $Key => $Value)
{
$Template->SetVariable($Key, $Value, WRAP);
}
// Klikací řádka s cestou
$Template->SetVariable('InfoPath',
CreateScriptLinkPath($Params, $Template->GetString('InfoPathTitle')));
// Procházej adresář
// -----------------
// Odstraň lomítko u prázdné cesty aby se nezdvojovalo
if ($Params['path']=='/')
$Params['path'] = '';
// Objekt pro načítání informací o adresářích a projektech
$DirInfo = new DirMetadata();
// Abych nešahal pořád do objektu, použiju proměnnou
$Glue = $Template->GetVariable('InfoGlue');
// Sem se střádá mezivýsledek
// Zvlášť adresáře a projekty aby byly oddělené ve výsledku
$LinesDir = ''; // Adresáře
$LinesPrj = ''; // Projekty
// Procházení adresářem
$Dir = glob($_SERVER['DOCUMENT_ROOT'].$Path.'/*', GLOB_ONLYDIR);
// Vezmi jen jméno adresáře a vytvoř asociativní pole s klíči
foreach ($Dir as $Key => $DirName)
{
$DirName = basename($DirName);
$NewDir[$DirName] = $DirName;
}
$Dir = $NewDir;
unset($NewDir);
// Setřídění adresářů podle preferovaného třídění ze [SortPreferences]
$NewDir = array();
$Sort = $ThisDirInfo->GetVariable('SortPreferences'); // vzorové třídění
if ($Sort!='')
{
$Sort = explode("\n", $Sort);
// Najdi a přendej nalezené položky
foreach ($Sort as $Value)
{
$Value = trim($Value);
if (isset($Dir[$Value]))
{
// Zařaď do nového pole
$NewDir[] = $Value;
// Vyhoď ze starého
unset($Dir[$Value]);
}
}
// Přendej zbylé položky
foreach ($Dir as $Value)
{
$NewDir[] = $Value;
}
$Dir = $NewDir;
unset($NewDir);
}
// Zpracování položek
foreach ($Dir as $DirName)
{
// Načti informace o (každém) adresáři
$DirInfoValid = $DirInfo->LoadDirInfo($Path.'/'.$DirName.'/'.DIRINFO, $Lang);
// Pokud to není adresář, tak načti informace o projektu
if (!$DirInfoValid)
{
$ProjectInfoValid = $DirInfo->LoadDirInfo($Path.'/'.$DirName.'/'.PRJINFO, $Lang)
or
// Heuristika pro projekty, které ještě nemají popis
$ProjectInfoValid = is_dir($_SERVER['DOCUMENT_ROOT'].$Path.'/'.$DirName.'/DOC')
or
$ProjectInfoValid = is_dir($_SERVER['DOCUMENT_ROOT'].$Path.'/'.$DirName.'/SCH');
}
// Zkontroluj, zda jsme v platné sekci
// if ($Path!='' || $Valid)
if ($DirInfoValid || $ProjectInfoValid)
{
// Připrav si proměnné
unset($Variables);
foreach($DirInfo->DirData as $Key => $Value)
{
$Variables[$Key] = $DirInfo->GetString($Key, WRAP);
}
$Variables['InfoName'] =
$DirInfoValid ? CreateScriptLink($Params, $DirName, $DirInfo->GetString('InfoLongDescription'))
: $DirName;
$Variables['InfoPicture'] = CreatePicturesLink($Params['path'].'/'.$DirName, $Glue, 'Žluťoučký kůň', TEMPLATEPATH.'/'.$Template->GetVariable('InfoNoPicture'));
$Variables['InfoDescripion'] = $DirInfo->GetString('InfoShortDescription', WRAP);
$Variables['InfoWebSVN'] = CreateSVNLink($Params['path'].'/'.$DirName, $Params['lang'], $Template->GetString('InfoSVNTitle'));
$Variables['InfoHTML'] = CreateFilesLink($Params['path'].'/'.$DirName.'/DOC/HTML/*.[hH][tT][mM][lL]', $Glue);
$Variables['InfoPDF'] = CreateFilesLink($Params['path'].'/'.$DirName.'/DOC/*.[pP][dD][fF]', $Glue);
$Variables['InfoSCH'] = CreateFilesLink($Params['path'].'/'.$DirName.'/SCH/*.[pP][dD][fF]', $Glue);
// Poukni proměnné do vzoru a střádej si výsledek
if ($DirInfoValid)
$LinesDir .= $Template->Substitute($Variables, $Template->GetVariable('InfoLine'));
else
$LinesPrj .= $Template->Substitute($Variables, $Template->GetVariable('InfoLine'));
}
}
// Slož k sobě obě části (adresář / separátor / projekt)
if ($LinesDir!='' and $LinesPrj!='')
$Lines = $LinesDir.$Template->GetString('InfoSeparator').$LinesPrj;
else
$Lines = $LinesDir.$LinesPrj;
// Teď sestavené položky ulož do proměnné "InfoLine" objektu
$Template->SetVariable('InfoLine', $Lines);
}
/*
//Načtení adresáře
if ((Is_Dir($path.$folder."/".$HTTP_GET_VARS["file"]."/".$soubor1)) && (substr($soubor1,0,1) <> ".") && (substr($soubor1,0,1) <> "!")) {
//Nastavení suffixu u obrázků
$img = $soubor1."_Small.jpg";
//Pokud existuje náhled obrázku, zobraz ho
if (file_exists($path.$folder.'/'.$HTTP_GET_VARS["file"]."/".$soubor1."/".$img)) {
echo "<td><A HREF=\"image.php?pth=".$HTTP_GET_VARS["file"]."/".$soubor1."&fname=".$soubor1."\" TARGET=\"_blank\"><img src=\"thumb.php?pth=".$HTTP_GET_VARS["file"]."/".$soubor1."&fname=".$soubor1."\" border=\"0\"></a></td>\n";
} else { echo "<td><img src=\"thumb.php?pth=".$HTTP_GET_VARS["file"]."/".$soubor1."&fname=".$soubor1."\"></td>\n"; }
//Pokud existuje HTML dokumentace k modulu vytvoř na ni odkaz
if (file_exists($path.$folder."/".$HTTP_GET_VARS["file"]."/".$soubor1."/DOC/HTML/".$soubor1.".".$lang.".html")) {
echo "<td><a href=\"".$www.$folder."/".$HTTP_GET_VARS["file"]."/".$soubor1."/DOC/HTML/".$soubor1.".".$lang.".html\">".$soubor1."</a></td>\n";
} else { echo "<td>".$soubor."<b>".$soubor1."</b></td>\n"; }
//Pokud existuje PDF dokumentace k modulu zobraz odkaz
if (file_exists($path.$folder."/".$HTTP_GET_VARS["file"]."/".$soubor1."/DOC/".$soubor1.".".$lang.".pdf")) {
echo "<td><a href=\"".$www.$folder."/".$HTTP_GET_VARS["file"]."/".$soubor1."/DOC/".$soubor1.".".$lang.".pdf\">PDF</a></td>\n";
} else { echo "\n<td>-</td>\n"; }
//WebSVN odkaz
echo "<td><a href=\"http://www.mlab.cz/WebSVN/listing.php?repname=MLAB&amp;path=/Modules/".$HTTP_GET_VARS["file"]."/".$soubor1."/\">WebSVN</a></td>\n";
//Pokud existuje stručné info, zobraz ho
if (file_exists($path.$folder.'/'.$HTTP_GET_VARS["file"]."/".$soubor1."/".$info1)) {
$fp = FOpen ($path.$folder.'/'.$HTTP_GET_VARS["file"]."/".$soubor1."/".$info1, "r");
$data = FRead ($fp, FileSize ($path.$folder.'/'.$HTTP_GET_VARS["file"]."/".$soubor1."/".$info1));
FClose ($fp);
echo "<td>".wordwrap($data, 50, "<br>")."</td>\n";
} else { echo "\n<td><i>No description available</i></td>\n"; }
echo "</tr>\n\n";
}
$PathEncoded = URLEncode($Path.'/'.$FileName);
$htmllink = "<a href='".$_SERVER['SCRIPT_NAME']."?lang=$Lang&amp;path=$PathEncoded'>$FileName</a>";
*/
?>


GenIndex/TemplateEngine.php
Nový soubor

@@ -0,0 +1,277 @@

<?php
// Template Engine
// ---------------
//
// Tento modul zpracovává tmplejty a strká do nich dynamicky geenrované
// informace a vytváří tak dynamické HTML stránky s oddělenou logikou
// programu a vzhledu.
//
// Více viz popis činnosti v konentáři na začátku templejtu
//
// (c)miho www.mlab.cz 2007, free software
//
// Typické použití objektu je toto:
//
// - Založ objekt templejtu (new)
// - $Template = new TemplateEngine();
//
// - Načti templejt ze souboru do objektu (ošetři chybu!)
// - $error = $Template->LoadTemplate($TemplateFile);
//
// - Tady se provádí generování masa, je možné použít proměnné,
// - modifikovat proměnné a nechat provéstsubstituce v proměnných
// - do řetězců.
//
// $Template->SetVariable('InfoTitle','Generovaný seznam');
// - první parametr je jméno proměnné, druhý je jeho nový obsah
//
// $Line = $Template->SetVariable('InfoLine')
// - vrací obsah proměnné nebo prázdný řetězec
//
// - Připrav si proměnné, které se budou strkat do vzorového řetězce
// $Variables[InfoName] = 'nějaká informace pro proměnnou InfoName';
// $Variables[InfoPicture] = 'jiná informace pro proměnnou InfoPicture';
// - aplikuj (nahraď) proměnné na vzorový řetězec z propměnné 'InfoLine'
// $Line = $Template->Substitute($Variables, $Template->GetVariable('InfoLine'));
//
// - Nakonec se naaplikují proměnné do nataženého templejtu a výsledek
// - se pošle klientovi
// echo $Template->GetPage();
//
// Objekt pro zpracování templejtu
class TemplateEngine
{
private $Page; // Sem se načte templejt a zde se provádí substituce
private $Info; // Sem se načtou z templejtu proměnné
function ListInfo()
// Vypíše nalezené proměnné a jejich hodnoty
// Pouze pro ladění
{
echo "[ ListInfo:\n";
print_r($this->Info);
echo ']';
}
function LoadTemplate($TemplateFileName, $Lang)
// Načte templejt ze souboru, při chybě vrací chybový řetězec
// Snaží se rozumně využít informaci o jazyku k otevření správné verze
// templejtu. Cesta se zadává bez jazykové části ale s příponou.
{
// Vlož zadaný jazyk do názvu souboru
$TemplateFileName = LangFile($TemplateFileName, $Lang);
// Načti template ze souboru (po řádcích do pole)
$this->Page = @file($TemplateFileName);
if ($this->Page=='')
return 'Unable Open Template File';
// Sestav z pole jeden retězec
$this->Page = implode($this->Page);
// Definice regulárních výrazů pro hledání
// ---------------------------------------
// Definice vzoru pro hledání komentáře ve tvaru <!-- -->
// Komentář je nepojmenované pole
// Před a za koentářem mohou být bílé znaky
// Uvnitř komentáře nesmí být znak >
$PatternComment = '(?:\s*<!--[^>]*--\s*>\s*)';
// (?: nepojemnované pole
// \s* volitelné bílé znaky před
// <!-- začátek komentáře
// [^>]* vniřek komentáře (neobsahuje >)
// --\s*> konec komentáře
// \s* volitelné bílé znaky za komentářem
// ) tady končí komentář
// Definice vzoru pro hledání proměnných ve tvaru $InfoXXX
$PatternVar ='\$(?P<VarName>Info[a-z,A-Z,0-9,\-\_]+)';
// \$ na začátku $
// (?P<VarName> pojmenované pole VarName je (jméno proměnné bez dolaru)
// Info[a-z,A-Z,0-9,\-\_]+ proměnná začíná Info a pak jsou písmena,
// ) číslice, mínus a podtržítko
// Definice vzoru pro hledání hodnot proměnných ve tvaru = " Hodnota "
// Definice hodnot je ve tvaru $InfoXXX="YYY" a mohou být víceřádkové
// ( a mohou obsahovat uvnitř další substituce uvozené $, které program
// zpracovává ale ne tady)
$PatternValue = '\s*=\s*"(?P<VarValue>[^"]*)"';
// \s*=\s* rovná se volitelnými bílými znaky okolo
// " hodnota v uvozovkách
// (?P<VarValue> parametr s názvem VarValue
// [^"]* hodnota nesmí obsahovat uvozovky
// ) vracíme hodnotu bez uvozovek
// " konec uvozovek
// Zparacování vzoru
// -----------------
// Najdi na začátku stránky komentář a vykousni ho
$pattern = '/^' .$PatternComment. '+/su';
$this->Page = preg_replace($pattern, '', $this->Page);
// / oddělovač
// ^ od začátku řetězce (jen komentáře na začátku souboru)
// $PatternComment komentář (<!-- -->) s bílými znaky okolo
// + alespoň jeden komentář
// /su modifikátor, . zastupuje i odřádkování, utf8
// Najdi v templejtu substutuční proměnné a vytvoř v poli $Info
// prázdné položky pro každou použitou proměnnou. Dělá se to proto,
// aby se na konci nepoužité proměnné nahradily prázdným řetězcem.
$pattern = '/' .$PatternVar. '/su';
preg_match_all($pattern, $this->Page, $temp);
// / oddělovač
// .$PatternVar. proměnná ( $InfoXXX ) - parametr VarName
// /su modifikátor zajistí, že . zastupuje i odřádkování, utf8
foreach($temp['VarName'] as $key => $value)
$this->Info[$value] = '';
unset($temp);
// Vytáhni proměnné a jejich hodnoty do pole $Info
$pattern = '/' .$PatternVar.$PatternValue. '/su';
// / oddělovač
// .$PatternVar. proměnná ( $InfoXXX ) - parametr VarName
// .$PatternValue. přiřazení ( = " Hodnota " ) - parametr VarValue
// /su modifikátor, . zastupuje i odřádkování, UTF8
preg_match_all($pattern, $this->Page, $temp);
foreach($temp['VarName'] as $key => $value)
$this->Info[$value] = $temp['VarValue'][$key];
unset($temp);
// Vykousej zpracované definice proměnných (a komentáře před nimi)
$pattern = '/' .$PatternComment.'?'.$PatternVar.$PatternValue. '/su';
// / oddělovač
// .$PatternComment.'?' volitelný komentář před definicí
// .$PatternVar. proměnná ( $InfoXXX )
// .$PatternValue. přiřazení ( = " Hodnota " )
// /su modifikátor, . zastupuje i odřádkování, UTF8
$this->Page = preg_replace($pattern, '', $this->Page);
}
function Indent($StringData, $Indent)
// Všechna odřádkování v řetězci $StringData odsadí o hodnotu $Indent pokud je
// $Indent číslo nebo o déllku řetězce $Indent pokud je to řetězec
{
// Velikost odsazení (vyrob číslo)
if (is_string($Indent))
$Num = mb_strlen($Indent,'utf-8');
else
$Num = 0+$Indent;
// Odsazení
return $StringData = $Indent.str_replace("\n", "\n".str_repeat(' ', $Num), $StringData);
}
/*
function Substitute($Variables, $String)
// Nahradí proměnné v řetězci $String obsahem proměnných z pole $Variables
// a vrátí výsledný řetězec
{
if (is_array($Variables))
{
foreach($Variables as $Key => $Value)
{
// Hledací vzor (hledáme proměnnou s názvem v $Key)
$Pattern = '\$'.$Key.'(?=[^a-z,A-Z,0-9,\-\_])';
// \$$Key hledáme $JmenoProměnné
// (?= následuje něco, co nemůže být jménem
// [^a-z,A-Z,0-9,\-\_] a nezajímá nás
// )
// Vkládáme více řádek?
$IsMultiline = !(strpos($Value, "\n") === FALSE);
if (!$IsMultiline)
{
// Vkládáme jednoduchý řetězec
$String = preg_replace('/'.$Pattern.'/su', $Value, $String);
// /su víceřádkové v UTF8
}
else
{
// Vkládáme řetezec s odřádkováním - je třeba odsazovat
$String = preg_replace('/(.*)'.$Pattern.'/ue',
"\$this->Indent(\$Value, '\\1')",
$String);
// (.*) hledáme cokoli před vzorem -> první parametr
// .$Pattern. proměnná
// /ue UTF8, náhrada je php skriptem
}
}
}
return $String;
}
*/
function Substitute($Variables, $String)
// Nahradí proměnné v řetězci $String obsahem proměnných z pole $Variables
// a vrátí výsledný řetězec
{
// Hledací vzor
$Pattern = '/(.*?)\$(Info[a-z,A-Z,0-9,\-\_]+)(?=[^a-z,A-Z,0-9,\-\_])/ue';
// Náhrada s kusem php kódu (nezapomeň, že preg_replace s přepínačem /e vrací oescapované řetězce)
$String = preg_replace($Pattern,
'isset($Variables[\'\2\'])
? $this->Indent($Variables[\'\2\'], stripslashes(\'\1\'))
: stripslashes(\'\1\')
',
$String);
return $String;
}
function SetVariable($VarName, $VarValue, $Wrap=0)
// Nastaví hodnotu proměnné
// Volitelně provede zálámání na zadaný počet znaků a odstranění nadbytečných mezer
{
// Volitelné zalámání a odstranění bílých znaků
if ($Wrap!=0)
$VarValue = WrapString($VarValue, $Wrap);
// Uložení do proměnných
$this->Info[$VarName] = $VarValue;
}
function GetVariable($VarName)
// Vrátí hodnotu proměnné tak, jak je, včetně mezer a odřádkování
{
if (isset($this->Info[$VarName]))
return $this->Info[$VarName];
else
return '';
}
function GetString($VarName)
// Vrátí parametr jako jeden řetězec s redukovanými bílými znaky
// Tedy bez odřádkování a nadbytečných mezer
{
return WrapString($this->GetVariable($VarName), 0);
}
function GetPage()
// Provede substituce ve stránce a vrátí ji jako řetězec
// Substituce bere z proměnné $Info
{
// Proveď ve stránce substituce proměnných a vrať výsledek
return $this->Substitute($this->Info, $this->Page);
}
}
?>


GenIndex/Common.php
Nový soubor

@@ -0,0 +1,313 @@

<?php
define('WEBSVNSCRIPT', '/WebSVN/listing.php', true); // Cesta k WebSVN skriptu
function Error($str)
// Ukončení běhu při chybhě
{
echo '<b>Ups...<b>'.$str;
exit;
}
function WrapString($String, $Wrap=0)
// Provede odstranění nadbytečných bílých znaků
// a volitleně (pokud je $Wrap nenulové) provede zálámání na zadaný počet znaků
{
// Odstaň bílé znaky
$String = preg_replace('/\s+/su', ' ', $String);
// Volitelné nalámání
if ($Wrap!=0)
$String = wordwrap($String, $Wrap);
return $String;
}
function CheckWebPath($Path)
// Zadaná cesta se chápe jako cesta uvnitř webu (vzhledem k document root).
// Případné relativní části (/../..) převede na absolutní a zkontroluje
// výsledek, zda nevybočuje mimo web.
// Na začátku nechá lomítko, na konci ho odstraní.
// Pokud je výsledná cesta neplatná, vrátí prázdný řetězec. Kontroluje, zda
// zadaný adresář existuje.
{
// Převeď cestu na opravdovou, odstraň relativní odkazy
$Path = realpath($_SERVER['DOCUMENT_ROOT'].$Path);
// Zkontroluj, zda jsme nevybočili z webu
if ( 0 == strncmp($Path, $_SERVER['DOCUMENT_ROOT'], strlen($_SERVER['DOCUMENT_ROOT']) ) )
{
// Shoda - odstraň DOCUMENT_ROOT část cesty
return substr( $Path, strlen($_SERVER['DOCUMENT_ROOT']) );
}
else
{
// Vybočili jsme z webu
return '';
}
}
function GetSection($Path)
// Vrátí první část cesty (to je to, co nazýváme sekce)
{
// Ignoruj lomítko na začátku
$Path = ltrim($Path, '/');
// Vykousni první slovo až po lomítko
$Section = substr($Path, 0, strpos($Path.'/', '/'));
// Ošetři root
if ($Section=='')
$Section = "(root)";
// Vrať výsledek
return $Section;
}
function LangFile($FileName, $Lang)
// Dostává cestu k souboru a jazyk. Zkusí ověřit existenci souboru s doplněným
// zadaným jazykem, dále zkusí angličtinu a nakonec zkusí nemodifikovaný název.
// Vrací jméno souboru s tou variantou, kterou našel.
{
// Najdi příponu (poslední tečka)
$Pos = strrpos($FileName, '.');
if ($Pos === false)
return '';
if ($Pos < strrchr($FileName, '/'))
return '';
// Zkus doplnit zadaný jazyk
$File = substr($FileName, 0, $Pos+1).$Lang.substr($FileName, $Pos);
if (is_file($File))
return $File;
// Zkus doplnit en
$File = substr($FileName, 0, $Pos+1).'en'.substr($FileName, $Pos);
if (is_file($File))
return $File;
// Zkus soubor tak jak je
if (is_file($FileName))
return $FileName;
// Nic nevyšlo
return '';
}
function CreateFileLink($FileName, $Title='')
// Vstupem je cesta k souboru v rámci webu (od DOCUMENT_ROOT)
// a volitelně title (zobrazí se při najetí myši na odkaz).
// Vrací řetězec s odkazem
{
$FileName = htmlspecialchars($FileName);
$Link = '<a href="http://'.$_SERVER['SERVER_NAME'].$FileName.'"';
if ($Title != '')
$Link .= "\n".' title="'.$Title.'"';
$Link .= '>';
if (basename($FileName)=='')
$Link .= '(root)';
else
$Link .= basename($FileName);
$Link .= '</a>';
return $Link;
}
function CreateFilesLink($Path, $Glue, $Title='')
// Sestaví odkazy na všechny soubory zadaného jména slepené lepidlem
// Volitelně lze zadat title (zobrazí se při najetí myši na odkaz).
// Cesta se chápe v rámci webu (od DOCUMENT_ROOT).
// Vrací řetězec s odkazy
{
// Při lepení odřádkujeme aby byl generovaný kód strukturovaný
$Glue = ' '.$Glue."\n";
// Pro každou položku
$Line = '';
$Ofset = strlen($_SERVER['DOCUMENT_ROOT']);
foreach (glob($_SERVER['DOCUMENT_ROOT'].$Path, 0) as $DirName)
{
// Sestav odkaz
if (is_file($DirName))
$Line .= $Glue.CreateFileLink(substr($DirName, $Ofset), $Title);
}
// Vrať výsledek ale bez lepidla na začátku
return substr($Line, strlen($Glue));
}
function CreateScriptLink($Params, $DirName='', $Title='')
// Vytvoř odkaz na skript s parametry skriptu. Parametry jsou předány jako
// pole s jmény položek a hodnotami. Volitelná položka $DirName se přidá k cestě
// v položce $Params. Pokud je zadaná cesta prázdná nebo / zobrazí se slovo root
{
// Připoj volitelné jméno adresáře
if ($DirName!='')
$Params['path'] = $Params['path'].'/'.$DirName;
// Odvoď jméno z názvu adresáře
$DirName = basename($Params['path']);
if ($DirName == '')
{
$DirName = '(root)';
$Params['path'] = '/';
}
// Zpracuj pole parametrů
$ParamsLine = '';
$LocalGlue = '';
foreach($Params as $Key => $Value)
{
$ParamsLine .= $LocalGlue.$Key.'='.urlencode($Value);
$LocalGlue = '&amp;';
}
unset($LocalGlue);
// Sestav odkaz
$Link = '<a href="'.$_SERVER['SCRIPT_NAME'].'?'.$ParamsLine.'"';
if ($Title!='')
$Link .= "\n".' title="'.htmlspecialchars($Title).'"';
$Link .= ">$DirName</a>";
return $Link;
}
function CreateScriptLinkPath($Params, $Title)
// Vstupem je cesta (začínající /) od DOCUMENT_ROOT
// Výsledkem je řádka odkazů na jednotlivé adresáře cesty
// Odkazy jsou odkazy na skript s parametrem cesty a jazyka
// Vstupem je pole parametrů ze kterých použijeme parametr 'path',
// ostatní jen umístíme do odkazů.
{
// Rozděl cestu na kousky
$Parts = explode('/', $Params['path']);
if ($Parts[0]=='')
array_shift($Parts); // vyhoď případnou prázdnou položku
// Začínáme od rootu
$TempPath = '';
// Odkaz na root (je vždy)
$Params['path'] = $TempPath;
$Link = CreateScriptLink($Params, '', $Title);
// Je něco víc než root?
if (isset($Parts[0]) && $Parts[0]!='')
{
// Odkaz na všechny další adresáře cesty
foreach($Parts as $Key => $Value)
{
// Přidej adresář
$TempPath .= '/'.$Value;
// Vyrob odkaz
$Link .= " /\n";
$Params['path'] = $TempPath;
$Link .= CreateScriptLink($Params, '', $Title);
}
}
// Vrať výsledek
return $Link;
}
function CreateSVNLink($Path, $Lang, $Title)
// Vytvoří odkaz do WebSVN podle cesty a jazyka
{
$Path = htmlspecialchars($Path);
$Link = '<a href="http://';
$Link .= $_SERVER['SERVER_NAME'];
$Link .= WEBSVNSCRIPT;
$Link .= '?repname=MLAB&amp;path=';
$Link .= $Path;
$Link .= '/';
if ($Lang=='cs')
$Link .= '&amp;langchoice=Česky';
else
$Link .= '&amp;langchoice=English';
$Link .= '"';
if ($Title!='')
$Link .= "\n".' title="'.htmlspecialchars($Title).'"';
$Link .= '>WebSVN</a>';
return $Link;
}
function CreatePicturesLink($Path, $Glue, $Alt='', $NoPicture)
// Najde na uvedené cestě obrázky, které mají v názvu Small
// a sestaví na ně odkaz. Pokud není žádný obrázek, vytvoří odkaz na obrázek
// v parametru $NoPicture.
{
// Najdi všechny soubory
$Files = array();
foreach (glob($_SERVER['DOCUMENT_ROOT'].$Path.'/*') as $File)
{
if (is_file($File))
{
// Jen jméno souboru
$File = substr($File, 1+strlen($_SERVER['DOCUMENT_ROOT'].$Path));
// TOHLE ASI RADĚJI PŘEZ REGEX
// Odděl příponu
$DotPos = strrpos($File, '.');
$Extension = substr($File, $DotPos+1);
$BaseName = substr($File, 0, $DotPos);
// Vezmi obrázky, které mají ve jméně Small
if( (strtolower($Extension)=='jpg' or strtolower($Extension)=='png')
and strpos($BaseName, 'Small')>0 )
{
$Files[] = $Path.'/'.$File;
}
}
}
// V adresáři nejsou žádné vhodné obrázky
if (count($Files) == 0)
{
// Není na co udělat odkaz
if ($NoPicture=='')
return '';
// Přidej odkaz nikam
$Files[] = $NoPicture;
}
// Udělej odkazy na pole souborů
$Alt = htmlspecialchars($Alt);
$Line = '';
$FirstGlue = TRUE;
foreach($Files as $File)
{
$File = htmlspecialchars($File);
if(!$FirstGlue)
$Line .= ' '.$Glue."\n";
$FirstGlue = FALSE;
$Line .= '<a href="'.$File.'">'."\n";
$Line .= '<img src="'.$File.'"'."\n";
$Line .= ' width="150"'."\n";
$Line .= ' alt="'.$Alt.'">'."\n";
$Line .= '</a>'."\n";
}
return $Line;
}
?>


GenIndex/Templates/DirInfo.txt
Nový soubor

@@ -0,0 +1,57 @@

//
// Toto je popisný soubor pro popis obsahu adresáře (příklad)
//
// Syntaxe je tato:
//
// - Všechny řádky začínající znaky // jsou komentáře
//
// - Soubor je v kódování UTF8
//
// - Informace je uvozena značkou [Key]
// [Key] je klíč, který říká co je to za informaci
// [Key.en] je klíč s informací pro jazyk en
// Informace v jazyce má přednost před informací bez jazyka
//
// - Pokud klíč začíná Info (například [InfoShortDescription] ) tak se tato
// informace vloží do místa v templejtu označeném jako $InfoShortDescription
//
// - Konec souboru je uvozen značkou [End]
//
// - Informace je prostý text (nepoužívejte HTML značky)
//
// - Na pořadí položek v souboru nezáleží
//
// Zavedené klíče, příklad:
//
// [InfoShortDescription.cs]
// Krátký popis (nadpis) v češtině
//
// [InfoShortDescription.en]
// Short description (title) in English
//
// [InfoShortDescription]
// Short descriptpion for other languages
//
// [InfoLongDescription.en]
// A longer description (one paragraph, 2-4 lines max). The whole sentences
// with period et the end.
//
// [InfoLongDescription.cs]
// Delší popis na jeden odstavec, tak do 2-4 řádek. V celých větách a tečkou
// na konci
//
// [SortPreferences]
// Seznam adresářů pro třídění
//
[InfoShortDescription.en]
[InfoShortDescription.cs]
[InfoLongDescription.en]
[InfoLongDescription.cs]
[SortPreferences]
[End]


GenIndex/Templates/Modules.cs.ihtml
Nový soubor

@@ -0,0 +1,178 @@

<!-- Templejt pro tvorbu indexu -->
<!--
Templejt
========
Tento templejt je zpracováván substitučním strojem, který funguje tak, že
provede tyto úkony:
- načte templejt (do své paměti)
- vyhodí tento komentář (všechny komentáře před první platnou řádkou)
- najde v něm všechny proměnné ve tvaru $InfoXXX a zapamatuje si je
- najde v něm všechna nastavení proměnných ve tvaru $InfoXXX = "YYY" a zapamatuje si je
- vyhodí z templejtu definice proměnných a případný komentář bezprostředně před definicí
Poté je možné programem upravit obsah proměnných (typicky se generují
data na základě jiných proměnných a dat z disku na webu). Všechny proměnné
jsou programu dostupné v podobě pole, kde klíčem je jméno proměnné (bez
dolaru) a hodnotou je řetězec (i prázdý). Program může proměnné modifikovat
a definovat další (které se nepoužijí nejsou-li v právě použitém templejtu
použity).
- provede substituci proměnných jejich obsahem
- výsledný řetězec - html stránku - předá klientovi
Proměnné
========
Proměnné jsou definovány pouze v templejtu. Co není v templejtu
označeno jako proměnná nenahradí se skutečným obsahem. Aby mohl být
templejt přehledný je dovoleno používat víceřádkové obsahy proměnných.
Definice hodnot je ve tvaru $InfoXXX = "YYY", kde
$InfoXXX je jméno proměnné (XXX jsou písmena, číslice, - a _ )
YYY je hodnota proměnné (je v uvozovkách, uvnitř použijte apostrofy)
Hodnota proměnné může být na více řádků a může obsahovat odakazy na proměnné,
které se nahradí hodnotou těchto proměnných.
Definice hodnot proměnných bez jejich použití v templejtu se používá například
při definici jazykově závislých řetězců pro program (program je jazykově
nezávislý).
Substituce
==========
Úvodní komentáře na začátku templejtu budou odstraněny.
Všechny výskyty proměnných v templejtu budou nahrazeny hodnotou proměnných.
Hodnota proměnné může být prázdná, definovaná v templejtu nebo vypočítaná
programem. Proměnné mouhou být v templejtu i vícekrát (nahradí se všude).
Všechny definice hodnot proměnných se z templejtu odstraní. Nezáleží na místě
definice v templejtu. Vícenásobné uvedení hodnoty si (asi) zapamatuje poslední
uvedenou hodnotu.
-->
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title> $InfoHeadTitle $InfoSection </title>
<meta name="keywords" content="$InfoKeyWords">
<meta name="description" content="$InfoDescription">
<!-- AUTOINCLUDE START "Page/Head.cs.ihtml" DO NOT REMOVE -->
<link rel="StyleSheet" href="../../Web/CSS/MLAB.css" type="text/css" title="MLAB základní styl">
<link rel="StyleSheet" href="../../Web/CSS/MLAB_Print.css" type="text/css" media="print">
<link rel="shortcut icon" type="image/x-icon" href="../../Web/PIC/MLAB.ico">
<script type="text/javascript" src="../../Web/JS/MLAB_Menu.js"></script>
<!-- AUTOINCLUDE END -->
</head>
<body lang="cs">
<!-- AUTOINCLUDE START "Page/Header.cs.ihtml" DO NOT REMOVE -->
<!-- ============== HLAVICKA ============== -->
<div class="Header">
<script type="text/javascript">
<!--
SetRelativePath("../../");
DrawHeader();
// -->
</script>
<noscript>
<p><b> Pro zobrazení (vložení) hlavičky je potřeba JavaScript </b></p>
</noscript>
</div>
<!-- AUTOINCLUDE END -->
<!-- AUTOINCLUDE START "Page/Menu.cs.ihtml" DO NOT REMOVE -->
<!-- ============== MENU ============== -->
<div class="Menu">
<script type="text/javascript">
<!--
SetRelativePath("../../");
DrawMenu();
// -->
</script>
<noscript>
<p><b> Pro zobrazení (vložení) menu je potřeba JavaScript </b></p>
</noscript>
</div>
<!-- AUTOINCLUDE END -->
<!-- ============== TEXT ============== -->
<div class="Text">
$InfoNoText = "Popis není k dispozici"
<p class="Title">
$InfoShortDescription
</p>
<p class="Subtitle">
$InfoLongDescription
</p>
<!-- Klikací řádka s cestou -->
<h1 class="Small"> $InfoPath </h1>
$InfoPathTitle = "Klikací cesta zpět"
<table>
<tr>
<th>Název</th>
<th>Náhled</th>
<th>Popis</th>
<th>WebSVN</th>
<th>HTML</th>
<th>PDF</th>
</tr>
<!-- Řádky indexu se vkládají sem -->
$InfoLine
<!-- Formát vkládané řádky -->
$InfoLine =
"
<tr>
<td> $InfoName</td>
<td> $InfoPicture</td>
<td> <p><i> $InfoDescripion</i></p>
<p class='Small'> $InfoLongDescription</p></td>
<td> $InfoWebSVN</td>
<td> $InfoHTML</td>
<td> $InfoPDF</td>
</tr>
"
<!-- Formát elementu pro oddělení adresářů a projektů -->
$InfoSeparator =
"
<tr>
<td colspan='6'> <hr> </td>
</tr>"
<!-- Lepidlo pro spojování více odkazů najednou v jedné položce -->
$InfoGlue = "<br>"
<!-- Co se dává do položek, které nemají obsah -->
$InfoNoPicture = "NoPicture.jpg"
$InfoNoInfo = "--"
$InfoSVNTitle = "Přístup ke všem souborům"
</table>
</div>
<!-- AUTOINCLUDE START "Page/Footer.cs.ihtml" DO NOT REMOVE -->
<!-- ============== PATIČKA ============== -->
<div class="Footer">
<script type="text/javascript">
<!--
SetRelativePath("../../");
DrawFooter();
// -->
</script>
<noscript>
<p><b> Pro zobrazení (vložení) hlavičky je potřeba JavaScript </b></p>
</noscript>
</div>
<!-- AUTOINCLUDE END -->
</body>
</html>


GenIndex/Templates/Modules.en.ihtml
Nový soubor

@@ -0,0 +1,108 @@

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title> $InfoHeadTitle $InfoSection </title>
<meta name="keywords" content="$InfoKeyWords">
<meta name="description" content="$InfoDescription">
<!-- AUTOINCLUDE START "Page/Head.en.ihtml" DO NOT REMOVE -->
<link rel="StyleSheet" href="../../Web/CSS/MLAB.css" type="text/css" title="MLAB Basic Style">
<link rel="StyleSheet" href="../../Web/CSS/MLAB_Print.css" type="text/css" media="print">
<link rel="shortcut icon" type="image/x-icon" href="../../Web/PIC/MLAB.ico">
<script type="text/javascript" src="../../Web/JS/MLAB_Menu.js"></script>
<!-- AUTOINCLUDE END -->
</head>
<body lang="en">
<!-- AUTOINCLUDE START "Page/Header.en.ihtml" DO NOT REMOVE -->
<!-- ============== HEADER ============== -->
<div class="Header">
<script type="text/javascript">
<!--
SetRelativePath("../../");
DrawHeader();
// -->
</script>
<noscript>
<p><b> JavaScript is required for including of the header </b></p>
</noscript>
</div>
<!-- AUTOINCLUDE END -->
<!-- AUTOINCLUDE START "Page/Menu.en.ihtml" DO NOT REMOVE -->
<!-- ============== MENU ============== -->
<div class="Menu">
<script type="text/javascript">
<!--
SetRelativePath("../../");
DrawMenu();
// -->
</script>
<noscript>
<p><b> JavaScript is required for including of the menu </b></p>
</noscript>
</div>
<!-- AUTOINCLUDE END -->
<!-- ============== TEXT ============== -->
<div class="Text">
$InfoNoText = "No Description Available"
<p class="Title">
$InfoShortDescription
</p>
<p class="Subtitle">
$InfoLongDescription
</p>
<!-- Klikací řádka s cestou -->
<table>
<tr>
<td> <h1 class='Small'>$InfoPath</h1> </td>
</tr>
</table>
$InfoPathTitle = "The Easy Way Back ..."
<!-- Řádky indexu se vkládají sem -->
$InfoLine
<!-- Formát vkládané řádky -->
$InfoLine =
"
<hr>
<h2 class='Small'>$InfoName</h2>
<p>
$InfoPicture&nbsp;
$InfoDescripion<br>
$InfoWebSVN&nbsp;
$InfoHTML&nbsp;
$InfoPDF
</p>
"
<!-- Lepidlo pro spojování více odkazů najednou v jedné položce -->
$InfoGlue = "&nbsp;"
<!-- Co se dává do položek, které nemají obsah -->
$InfoNoInfo = "--"
$InfoSVNTitle = "Accsess to All Files"
</div>
<!-- AUTOINCLUDE START "Page/Footer.en.ihtml" DO NOT REMOVE -->
<!-- ============== FOOTER ============== -->
<div class="Footer">
<script type="text/javascript">
<!--
SetRelativePath("../../");
DrawFooter();
// -->
</script>
<noscript>
<p><b> JavaScript is required for including of the footer </b></p>
</noscript>
</div>
<!-- AUTOINCLUDE END -->
</body>
</html>


GenIndex/Templates/NoPicture.jpg
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream


GenIndex/Templates/NoPicture.jpg

Změněné vlastnosti:

Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property


{COMPARE END}
{FOOTER START}

Poháněno WebSVN v2.1 alpha 1