<?php
// *********************************
// Konfigurace
// *********************************
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('PERMALINK', '/PermaLink', true); // Začátek cesty s permalinkem (zpracovává mod_rewrite)
define('LISTSCRIPT', 'List', true); // Jméno skriptu v rootu pro výpis
define('WEBSVNSCRIPT', '/WebSVN/listing.php', true); // Cesta k WebSVN skriptu
define('WIKISERVER', 'wiki', true); // Jméno Wiki serveru (co se strčí místo jména stávajícího serveru)
// Cesta k templejtům
define('TEMPLATE_PATH', 'Server/PrjInfo/Templates', true); // Cesta do adresáře s templejty
define('TEMPLATE_PERMALINK', TEMPLATE_PATH . '/PermaLink.ihtml', true); // Zobrazení PermaLinku (přípona jazyka se doplní sama)
define('TEMPLATE_PERMALINK_PATH', TEMPLATE_PATH . '/PermaLinkPath.ihtml', true); // Zobrazení PermaLinku s cestou (přípona jazyka se doplní sama)
define('TEMPLATE_LISTDIR', TEMPLATE_PATH . '/ListDir.ihtml', true); // Zobrazení sekce (přípona jazyka se doplní sama)
define('TEMPLATE_LISTPRJ', TEMPLATE_PATH . '/ListPrj.ihtml', true); // Zobrazení projektu (přípona jazyka se doplní sama)
// *********************************
// Obecné funkce
// *********************************
// Ukončení běhu při chybě
function Error($str)
{
echo '<b>Ups...<b><br>'.PHP_EOL.$str.PHP_EOL;
exit;
}
// Vytiskni strukturu s názvem
function print_rx($Nadpis, $Struktura)
{
print $Nadpis.PHP_EOL;
print str_pad('', strpos($Nadpis.PHP_EOL, PHP_EOL), '-').PHP_EOL;
$str=print_r($Struktura, true);
$str = ' '.str_replace(PHP_EOL, PHP_EOL.' ', $str);
print $str.PHP_EOL;
}
// *********************************
// Výroba odkazů
// *********************************
// Ze zadané cesty a pole s názvy souborů slepí HTML odkazy
// na jednotlivé soubory
function CreateFilesLink2($Path, $FileNames, $Glue)
{
$Path = htmlspecialchars($Path);
$Glue = " $Glue\n";
$Result = '';
foreach($FileNames as $Name)
{
$Name = htmlspecialchars($Name);
$Result .= "<a href=\"$Path/$Name \">$Name</a>" . $Glue;
}
$Result=substr($Result, 0, -strlen($Glue));
return $Result;
}
/*
// Vyrobí HTML odkaz na soubor/adresář/skript
function CreateLinkHTML($Path, $Text, $Title='')
{
$Path = htmlspecialchars($Path);
$Title = htmlspecialchars($Title);
$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 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 CreateWikiLink($Name, $Lang, $Title)
// Vytvoří odkaz do Wiki podle jména modulu a jazyka
{
// Ukousni verzi a revizi modulu (například 01A)
$Name = preg_replace('/[0-9][0-9][a-z]$/i', '', $Name);
$Name = htmlspecialchars($Name);
// Sestav odkaz
$Link = '<a href="http://';
$Link .= preg_replace('/^.+?\./', WIKISERVER.'.', $_SERVER['SERVER_NAME']);
$Link .= '/doku.php?id='.$Lang.':'.$Name;
$Link .= '"';
if ($Title!='')
$Link .= "\n".' title="'.htmlspecialchars($Title).'"';
$Link .= '>Wiki</a>';
return $Link;
}
function CreatePicturesLink($Path, $Glue, $Alt='', $NoPicture, $Width='')
// 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";
if($Width!='')
$Line .= ' width="' . $Width . '"'."\n";
$Line .= ' alt="'.$Alt.'">'."\n";
$Line .= '</a>'."\n";
}
return $Line;
}
// 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
function CreateFileLink($FileName, $Title='')
{
$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;
}
// Vyrobí odkaz na projekt
// vstupem je cesta k projektu (začíná lomítkem) a volitelně jazyk
function CreateProjectLink($Path, $Lang='')
{
if($Lang!='')
$Lang .= '.';
return 'http://' . $_SERVER["HTTP_HOST"] . $Path . '/' . LISTSCRIPT . '.' .$Lang . 'html';
}
// Provede přesměrování na projekt na zadané cestě (volitelně i s jazykem)
function Redirect($Path, $Lang='')
{
$NewUrl = CreateProjectLink($Path, $Lang);
// print "Redirect: $NewUrl<br>";
header("HTTP/1.1 301 Moved Permanently");
header("Location: $NewUrl");
header("Connection: close");
die();
}
// Provede přesměrování na projekt na zadané cestě (volitelně i s jazykem)
function RedirectToFile($Path)
{
// print "Redirect: $NewUrl<br>";
header("HTTP/1.1 301 Moved Permanently");
header("Location: $Path");
header("Connection: close");
die();
}
// 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.
function LangFile($FileName, $Lang)
{
// 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 '';
}
// 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
function CreateFilesLink($Path, $Glue, $Title='')
{
// 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) // GLOB_BRACE???????????
{
// 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));
}
// *********************************
// Zpracování stromu sekcí a projektů
// *********************************
// Vrací true/false na základě validní struktury sekce (adresáře)
// (testuje přítomnost DIRINFO souboru)
function IsDir($Path)
{
return is_file($_SERVER['DOCUMENT_ROOT'].$Path.'/'.DIRINFO);
}
// Vrací true/false na základě validní struktury projektu
// (testuje přítomnost PRJINFO a pokud není tak heuristiku)
function IsPrj($Path)
{
// Existuje popisný soubor projektu
if(is_file($_SERVER['DOCUMENT_ROOT'].$Path.'/'.PRJINFO))
return true;
// Není popis projektu, nastupuje heuristika
if(is_dir($_SERVER['DOCUMENT_ROOT'].$Path.'/DOC'))
return true;
if(is_dir($_SERVER['DOCUMENT_ROOT'].$Path.'/SCH'))
return true;
// Nic nezabralo, není platný projekt
return false;
}
// Funkce vrací pole obsahující pole Projects a pole Sections
function RecurseDirs($Path)
{
$Dirs = array();
$Path = rtrim($Path, '/');
$Items = glob($_SERVER['DOCUMENT_ROOT'].$Path.'/*', GLOB_ONLYDIR);
// If not valid directory (vracím prázdný výsledek)
if(!is_array($Items))
return $Dirs;
// Recourse the directory tree (přidávám nalezené adresáře ke konci pole)
for($i=0; $i<count($Items); $i++)
{
if (is_file($Items[$i].'/'.DIRINFO))
{
$SubDirs = glob($Items[$i] . '/*', GLOB_ONLYDIR);
$Items = array_merge($Items, $SubDirs);
}
}
// Remove invalid items (with no DIRINFO/PRJINFO) and Local Path
$Sections=array();
$Projects=array();
$EatLeftChars = strlen($_SERVER['DOCUMENT_ROOT']);
foreach($Items as $Key => $Data)
{
// Remove web path
$Data = substr($Data, $EatLeftChars);
if(IsDir($Data))
$Sections[]=$Data;
elseif (IsPrj($Data))
$Projects[]=$Data;
}
// Sort Sections
sort($Sections, SORT_STRING);
// Sort Projects
sort($Projects, SORT_STRING);
// Return combined result
$All["Projects"] = $Projects;
$All["Sections"] = $Sections;
return $All;
}
// *********************************
// Permalinky
// *********************************
// Filtr pro náhradu nepohodlných znaků v permalinku
// Nahrazuje všechny znaky kromě písmen a čísel, odstraní diakritiku
// u českých znaků
function PermaLinkFilter($String)
{
// Odstraň diakritiku
$SubstTable = array (
"ě" => "e", "š" => "s", "č" => "c", "ř" => "r", "ž" => "z", "ý" => "y", "á" => "a",
"í" => "i", "é" => "e", "ď" => "d", "ť" => "t", "ň" => "n", "ů" => "u", "ú" => "u",
"Ě" => "E", "Š" => "S", "Č" => "C", "Ř" => "R", "Ž" => "Z", "Ý" => "Y", "Á" => "A",
"Í" => "I", "É" => "E", "Ď" => "D", "Ť" => "T", "Ň" => "N", "Ů" => "U", "Ú" => "U"
);
$String = strtr($String, $SubstTable);
// Nahraď nepohodlné znaky mínusem
$String = preg_replace("~[^A-Z0-9]+~ui", "-", $String);
// Odtsraň duplicity mínusů
$String = preg_replace("~-+~u", "-", $String);
// Odstraň počáteční a koncové mínusy
$String = ltrim(rtrim($String,'-'),'-');
return $String;
}
// Vrací z cesty platný permalink
// Vstupem je cesta k projektu nebo k sekci, z ní se vrací jen název (poslední část cesty)
function PermaLinkCreateKey($ProjectPath)
{
// Odstraň cestu
$PermaLinkKey = basename($ProjectPath);
// Odstraň nepohodlné znaky
$PermaLinkKey = PermaLinkFilter($PermaLinkKey);
// Hotovo
return $PermaLinkKey;
}
// Zvýrazní jméno projektu (poslední část zadané cesty dá do značky span)
function MarkPath($Path)
{
$Pos = strrpos($Path, '/');
if($Pos===false)
return "<span class='Marked'>".$Path."</span>";
else
return substr($Path, 0, $Pos+1)."<span class='Marked'>".substr($Path, $Pos+1)."</span>";
}
// Vytvoří z klíče (upravený název projektu či sekce) celý klikací permalinkový odkaz
// Je-li zadána přídavná cesta tak ji přidá na konec
// ??????????????????????????? k čemu se použije $AditionalPath ?????????????? možná zrušit
function PermaLinkCreateLink($PermaLinkKey, $AditionalPath='')
{
$AditionalPath = ltrim($AditionalPath, '/');
$AditionalPath = rtrim($AditionalPath, '/');
if($AditionalPath!=='')
$AditionalPath = '/'.$AditionalPath;
$PermaLinkKey = PermaLinkCreateKey($PermaLinkKey);
return 'http://'.$_SERVER['HTTP_HOST'].PERMALINK.'/'.$PermaLinkKey.$AditionalPath;
}
// Na základě pole se všemi projekty a sekcemi vytvoří pole permalinků se všemi projekty a sekcemi
function PermaLinkCreateArray($ProjectsArray)
{
$PermaLinkArray = array();
foreach($ProjectsArray['Projects'] as $Data)
{
$PermaLink = PermaLinkCreateKey($Data);
$PermaLinkArray[] = array('SortKey' => mb_strtolower($PermaLink), 'PermaLink' => $PermaLink, 'Path' => $Data, 'Type' => 'Project');
}
foreach($ProjectsArray['Sections'] as $Data)
{
$PermaLink = PermaLinkCreateKey($Data);
$PermaLinkArray[] = array('SortKey' => mb_strtolower($PermaLink), 'PermaLink' => $PermaLink, 'Path' => $Data, 'Type' => 'Section');
}
return $PermaLinkArray;
}
// V zadaném poli odkazů najde klíč a vrátí pole s nalezenými shodami
// (v případě neshody vrací prázdné pole, ignoruje velikost písmen)
function PermaLinkFind($AllPermas, $Key)
{
$Key = mb_strtolower($Key);
$Key = PermaLinkFilter($Key);
$KeyLen = strlen($Key);
$Result = array();
if($KeyLen!==0)
{
foreach($AllPermas as $Data)
{
/*
// Hledej permalinky, které začínají jako zadaný klíč
if(mb_strtolower(substr($Data['PermaLink'], 0, $KeyLen))===$Key)
$Result[] = $Data;
*/
// Hledej permalinky, které obsahují zadaný klíč
if(strpos(mb_strtolower($Data['PermaLink']), $Key)!==false)
$Result[] = $Data;
}
return $Result;
}
}
?>