<?php// *********************************// Konfigurace// *********************************define('DIRINFO', 'DirInfo.txt', true); // Jméno souboru s informacemi o adresářidefine('PRJINFO', 'PrjInfo.txt', true); // Jméno souboru s informacemi o projektudefine('PERMALINK', '/PermaLink', true); // Začátek cesty s permalinkem (zpracovává mod_rewrite)define('LISTSCRIPT', 'List', true); // Jméno skriptu v rootu pro výpisdefine('WEBSVNSCRIPT', '/WebSVN/listing.php', true); // Cesta k WebSVN skriptudefine('WIKISERVER', 'wiki', true); // Jméno Wiki serveru (co se strčí místo jména stávajícího serveru)// Cesta k templejtůmdefine('TEMPLATE_PATH', 'Server/PrjInfo/Templates', true); // Cesta do adresáře s templejtydefine('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ázvemfunction 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é souboryfunction 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ář/skriptfunction 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ě Smallif( (strtolower($Extension)=='jpg' or strtolower($Extension)=='png')and strpos($BaseName, 'Small')>0 ){$Files[] = $Path.'/'.$File;}}}// V adresáři nejsou žádné vhodné obrázkyif (count($Files) == 0){// Není na co udělat odkazif ($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 odkazemfunction 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ě jazykfunction 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 jeif (is_file($FileName))return $FileName;// Nic nevyšloreturn '';}// 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 odkazyfunction 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 odkazif (is_file($DirName))$Line .= $Glue.CreateFileLink(substr($DirName, $Ofset), $Title);}// Vrať výsledek ale bez lepidla na začátkureturn 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 projektuif(is_file($_SERVER['DOCUMENT_ROOT'].$Path.'/'.PRJINFO))return true;// Není popis projektu, nastupuje heuristikaif(is_dir($_SERVER['DOCUMENT_ROOT'].$Path.'/DOC'))return true;if(is_dir($_SERVER['DOCUMENT_ROOT'].$Path.'/SCH'))return true;// Nic nezabralo, není platný projektreturn false;}// Funkce vrací pole obsahující pole Projects a pole Sectionsfunction 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 Sectionssort($Sections, SORT_STRING);// Sort Projectssort($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);// Hotovoreturn $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>";elsereturn 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šitfunction 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 sekcemifunction 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;}}?>