No changes between revisions
/Server/GenIndex/Common.php |
---|
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 = '&'; |
} |
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&path='; |
$Link .= $Path; |
$Link .= '/'; |
if ($Lang=='cs') |
$Link .= '&langchoice=Česky'; |
else |
$Link .= '&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; |
} |
?> |
/Server/GenIndex/DirMetadata.php |
---|
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; |
} |
*/ |
?> |
/Server/GenIndex/GenIndex.php |
---|
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&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&path=$PathEncoded'>$FileName</a>"; |
*/ |
?> |
/Server/GenIndex/TemplateEngine.php |
---|
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); |
} |
} |
?> |
/Server/GenIndex/Templates/DirInfo.txt |
---|
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] |
/Server/GenIndex/Templates/Modules.cs.ihtml |
---|
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> |
/Server/GenIndex/Templates/Modules.en.ihtml |
---|
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 |
$InfoDescripion<br> |
$InfoWebSVN |
$InfoHTML |
$InfoPDF |
</p> |
" |
<!-- Lepidlo pro spojování více odkazů najednou v jedné položce --> |
$InfoGlue = " " |
<!-- 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> |
/Server/GenIndex/Templates/NoPicture.jpg |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |