Rev Author Line No. Line
4985 kaklik 1 <?php
2  
3 error_reporting(E_ALL); // nastavení varování při ladění
4  
5 require_once('Common.php'); // Společné funkce
6 require_once('TemplateEngine.php'); // Stroj pro práci s templejty
7 require_once('DirMetadata.php'); // Modul pro načítání informace o adresářích
8  
4987 kaklik 9 define('WRAP', 70); // Lámání řetězcových hodnot
4985 kaklik 10  
11 // Stavová informace
12 // -----------------
13 //
14 // Tento skript používá pro přenesení stavu ke kliemtovi a zpět dvě stavové
15 // proměnné prostřednictvím odkazu (zpracová ModRewrite, definováno v konfiguraci webu).
16 // Jsou to:
17 //
18 // lang - zde je kód jazyka, chybějící kód se přesměruje na angličtinu
19 //
20 // path - zde se uvádí cesta vůči DOCUMENT_ROOT webu, neplatná cesta se přesměruje
21 // na root
22 //
23  
24 // Vyzvedni si parametry z URL
25 // ---------------------------
26  
27 // Vyzvedni jazyk z předaného parametru
28 $Lang = (is_string($_GET['lang'])) ? $_GET['lang'] : $Lang = 'en';
29 $Params['lang'] = $Lang;
30 //print "Lang:{$Lang}<br>";
31  
32  
33 // Převezmi cestu, a odstraň lomítko na konci (na začátku lomítko je)
34 $Path = (is_string($_GET['path'])) ? $_GET['path'] : $Path = '';
35 $Path = '/'.ltrim(rtrim($Path, '/'), '/');
36  
37 // Decode entities ?
38 // $LinkFull=htmlspecialchars_decode($LinkFull);
39  
40 // Ulož
41 $Params['path'] = $Path;
42 //print "Path:{$Path}<br>";
43  
44 // Načti metadata pro sekci (první adresář)
45 // Nikdy nevěř tomu, co přijde od klienta
46 $SectionDirInfo = new DirMetadata();
47 $SectionDirInfo->LoadDirInfo('/'.GetSection($Path).'/'.DIRINFO, $Lang);
48 if($Path!='/')
49 {
50 if(!$SectionDirInfo->GetValid())
51 Redirect('', $Lang); // Neexistující sekci přesměruj na root
52 }
53  
54 // Pokus se načíst informace jako by cesta vedla do adresáře
55 $ThisDirInfo = new DirMetadata();
56 $ThisDirInfo->LoadDirInfo($Path.'/'.DIRINFO, $Lang);
57 if($ThisDirInfo->GetValid())
58 {
59 // Založ objekt templejtu a načti jej
60 $Template = new TemplateEngine();
61 $error = $Template->LoadTemplate($_SERVER['DOCUMENT_ROOT'].'/'.TEMPLATE_LISTDIR, $Lang);
62 if ($error!='')
63 Error($error);
64  
65 // Generuj dynamický obsah do proměnných objektu Template
66 ListDir($SectionDirInfo, $ThisDirInfo, $Template, $Params);
67  
68 // Odešli výsledek klientovi
69 echo $Template->GetPage();
70 return;
71 }
72  
73 // Pokus se načíst informace jako by cesta vedla do projektu
74 $ThisDirInfo->LoadDirInfo($Path.'/'.PRJINFO, $Lang);
75 if($ThisDirInfo->GetValid())
76 {
77 // Založ objekt templejtu a načti jej
78 $Template = new TemplateEngine();
79 $error = $Template->LoadTemplate($_SERVER['DOCUMENT_ROOT'].'/'.TEMPLATE_LISTPRJ, $Lang);
80 if ($error!='')
81 Error($error);
82  
83 // Generuj dynamický obsah do proměnných objektu Template
84 ListPrj($SectionDirInfo, $ThisDirInfo, $Template, $Params);
85  
86 // Odešli výsledek klientovi
87 echo $Template->GetPage();
88 return;
89 }
90  
91 // Neplatná cesta (ani adresář, ani projekt)
92 Redirect('/', $Lang);
93 return;
94  
95  
96 function CreateListLinkHTML($Params, $DirName='', $Title='')
97 {
98 // Spoj cestu a (volitelné) jméno adresáře
99 if ($DirName!='')
100 $Params['path'] = $Params['path'].'/'.$DirName;
101  
102 // Odvoď jméno z názvu adresáře
103 $DirName = basename($Params['path']);
104 if ($DirName == '')
105 {
106 $DirName = '(root)';
107 }
108  
109 // Jméno skriptu (statické jméno je pomocí mod_rewrite přesměrováno na tento skript)
110 $ScriptName = '/' . LISTSCRIPT;
111 $ScriptName .= ($Params['lang'] !== '') ? '.'.$Params['lang'] : '';
112 $ScriptName .= '.html';
113  
114 // Sestav odkaz
115 $Link = "<a href=\"{$Params['path']}{$ScriptName}\"";
116 if ($Title!='')
117 $Link .= "\n".' title="'.htmlspecialchars($Title).'"';
118 $Link .= ">$DirName</a>";
119  
120 return $Link;
121 }
122  
123  
124 function CreateListLinkPathHTML($Params, $Title)
125 // Vstupem je cesta (začínající /) od DOCUMENT_ROOT
126 // Výsledkem je řádka odkazů na jednotlivé adresáře cesty
127 // Odkazy jsou odkazy na skript (obsahuje cestu i jazyk)
128 {
129 // Rozděl cestu na kousky
130 $Parts = explode('/', $Params['path']);
131 if ($Parts[0]=='')
132 array_shift($Parts); // vyhoď případnou prázdnou položku
133  
134 // Začínáme od rootu
135 $TempPath = '';
136  
137 // Odkaz na root (je vždy)
138 $Params['path'] = $TempPath;
139 $Link = CreateListLinkHTML($Params, '', $Title);
140  
141 // Je něco víc než root?
142 if (isset($Parts[0]) && $Parts[0]!='')
143 {
144 // Odkaz na všechny další adresáře cesty
145 foreach($Parts as $Key => $Value)
146 {
147 // Přidej adresář
148 $TempPath .= '/'.$Value;
149  
150 // Vyrob odkaz
151 $Link .= " /\n";
152 $Params['path'] = $TempPath;
153 $Link .= CreateListLinkHTML($Params, '', $Title);
154 }
155 }
156  
157 // Vrať výsledek
158 return $Link;
159 }
160  
161  
162 function ListDir($SectionDirInfo, $ThisDirInfo, $Template, $Params)
163 // Tato funkce vkládá informace do objektu Template pro výpis seznamu
164 // položek v adresáři (seznam projektů a sekcí v zadaném adresáři)
165 {
166 // Lokálně používané parametry pěkně při ruce
167 $Path = $Params['path'];
168 $Lang = $Params['lang'];
169  
170 // HTML hlavička - doplň sekci
171 $Template->SetVariable('InfoSection', GetSection($Path));
172  
173 // Zkopíruj informace z DIRINFO (z adresáře sekce a pak z aktuálního adresáře)
174 // do proměnných templejtu
175 foreach($SectionDirInfo->DirData as $Key => $Value)
176 {
177 $Template->SetVariable($Key, $Value, WRAP);
178 }
179 foreach($ThisDirInfo->DirData as $Key => $Value)
180 {
181 $Template->SetVariable($Key, $Value, WRAP);
182 }
183  
184 // Klikací řádka s cestou
185 $Template->SetVariable('InfoPath',
186 CreateListLinkPathHTML($Params, $Template->GetString('InfoPathTitle')));
187  
188 // Permalink
189 $Template->SetVariable('InfoPermaLink', PermaLinkCreateLink($Path));
190  
191 // Procházej adresář
192 // -----------------
193  
194  
195 // Odstraň lomítko u prázdné cesty aby se nezdvojovalo
196 if ($Params['path']=='/')
197 $Params['path'] = '';
198  
199 // Objekt pro načítání informací o adresářích a projektech
200 $DirInfo = new DirMetadata();
201  
202 // Abych nešahal pořád do objektu, použiju proměnnou
203 $Glue = $Template->GetVariable('InfoGlue');
204  
205 // Sem se střádá mezivýsledek
206 // Zvlášť adresáře a projekty aby byly oddělené ve výsledku
207 $LinesDir = ''; // Adresáře
208 $LinesPrj = ''; // Projekty
209  
210 // Procházení adresářem
211 $Dir = glob($_SERVER['DOCUMENT_ROOT'].$Path.'/*', GLOB_ONLYDIR);
212  
213 // Vezmi jen jméno adresáře a vytvoř asociativní pole s klíči
214 foreach ($Dir as $Key => $DirName)
215 {
216 $DirName = basename($DirName);
217 $NewDir[$DirName] = $DirName;
218 }
219 $Dir = $NewDir;
220 unset($NewDir);
221  
222 // Setřídění adresářů podle preferovaného třídění ze [SortPreferences]
223 $NewDir = array();
224 $Sort = $ThisDirInfo->GetVariable('SortPreferences'); // vzorové třídění
225 if ($Sort!='')
226 {
227 $Sort = explode("\n", $Sort);
228 // Najdi a přendej nalezené položky
229 foreach ($Sort as $Value)
230 {
231 $Value = trim($Value);
232 if (isset($Dir[$Value]))
233 {
234 // Zařaď do nového pole
235 $NewDir[] = $Value;
236 // Vyhoď ze starého
237 unset($Dir[$Value]);
238 }
239 }
240 // Přendej zbylé položky
241 foreach ($Dir as $Value)
242 {
243 $NewDir[] = $Value;
244 }
245 $Dir = $NewDir;
246 unset($NewDir);
247 }
248  
249 // Zpracování položek
250 foreach ($Dir as $DirName)
251 {
252 // Načti informace o (každém) adresáři
253 $DirInfoValid = $DirInfo->LoadDirInfo($Path.'/'.$DirName.'/'.DIRINFO, $Lang);
254 // Pokud to není adresář, tak načti informace o projektu
255 if (!$DirInfoValid)
256 {
257 $ProjectInfoValid = $DirInfo->LoadDirInfo($Path.'/'.$DirName.'/'.PRJINFO, $Lang)
258 or
259 // Heuristika pro projekty, které ještě nemají popis
260 $ProjectInfoValid = is_dir($_SERVER['DOCUMENT_ROOT'].$Path.'/'.$DirName.'/DOC')
261 or
262 $ProjectInfoValid = is_dir($_SERVER['DOCUMENT_ROOT'].$Path.'/'.$DirName.'/SCH');
263 }
264  
265 // Zkontroluj, zda jsme v platné sekci
266 if ($DirInfoValid || $ProjectInfoValid)
267 {
268 // Připrav si proměnné
269 unset($Variables);
270 foreach($DirInfo->DirData as $Key => $Value)
271 {
272 $Variables[$Key] = $DirInfo->GetString($Key, WRAP);
273 }
274  
275 $Variables['InfoName'] = ($DirInfoValid or $ProjectInfoValid) ? CreateListLinkHTML($Params, $DirName, $DirInfo->GetString('InfoLongDescription'))
276 : $DirName;
4987 kaklik 277 $Variables['InfoPicture'] = CreatePicturesLink($Params['path'].'/'.$DirName, $Glue, 'Ilustrative Picture', '/'.TEMPLATE_PATH.'/'.$Template->GetVariable('InfoNoPicture'));
4985 kaklik 278 $Variables['InfoDescripion'] = $DirInfo->GetString('InfoShortDescription', WRAP);
279 $Variables['InfoWebSVN'] = CreateSVNLink($Params['path'].'/'.$DirName, $Params['lang'], $Template->GetString('InfoSVNTitle'));
280 if (!$DirInfoValid)
281 {
282 $Variables['InfoWIKI'] = CreateWikiLink($DirName, $Params['lang'], $Template->GetString('InfoWikiTitle'));
283 }
284 $Variables['InfoHTML'] = CreateFilesLink($Params['path'].'/'.$DirName.'/DOC/HTML/*.[hH][tT][mM][lL]', $Glue);
285 $Variables['InfoPDF'] = CreateFilesLink($Params['path'].'/'.$DirName.'/DOC/*.[pP][dD][fF]', $Glue);
286 $Variables['InfoSCH'] = CreateFilesLink($Params['path'].'/'.$DirName.'/SCH/*.[pP][dD][fF]', $Glue);
287  
288 // Vlož info o dostupnosti na UST
289 if($DirInfo->GetString('InfoBuyUST')!= '')
290 {
291 $Variables['InfoBuy'] = CreateLink($DirInfo->GetString('InfoBuyUST'),'UST');
292 }
293  
294 // Poukni proměnné do vzoru a střádej si výsledek
295 if ($DirInfoValid)
296 $LinesDir .= $Template->Substitute($Variables, $Template->GetVariable('InfoLine'));
297 else
298 $LinesPrj .= $Template->Substitute($Variables, $Template->GetVariable('InfoLine'));
299 }
300 }
301  
302 // Slož k sobě obě části (adresář / separátor / projekt)
303 if ($LinesDir!='' and $LinesPrj!='')
304 $Lines = $LinesDir.$Template->GetString('InfoSeparator').$LinesPrj;
305 else
306 $Lines = $LinesDir.$LinesPrj;
307  
308 // Teď sestavené položky ulož do proměnné "InfoLine" objektu
309 $Template->SetVariable('InfoLine', $Lines);
310 }
311  
312  
313 function ListPrj($SectionDirInfo, $ThisDirInfo, $Template, $Params)
314 // Tato funkce vkládá informace do objektu Template pro výpis informací
315 // o projektu (náhled, informace, odkazy na dokuemntaci etc.)
316 {
317 // Lokálně používané parametry pěkně při ruce
318 $Path = $Params['path'];
319 $Lang = $Params['lang'];
320  
321 // Abych nešahal pořád do objektu, použiju proměnnou
322 $Glue = $Template->GetVariable('InfoGlue');
323  
324 // HTML hlavička - doplň sekci
325 $Template->SetVariable('InfoSection', GetSection($Path));
326  
327 // Zkopíruj informace z DIRINFO (z adresáře sekce a pak z aktuálního adresáře)
328 // do proměnných templejtu
329 foreach($SectionDirInfo->DirData as $Key => $Value)
330 {
331 $Template->SetVariable($Key, $Value, WRAP);
332 }
333 foreach($ThisDirInfo->DirData as $Key => $Value)
334 {
335 $Template->SetVariable($Key, $Value, WRAP);
336 }
337  
338 // Klikací řádka s cestou
339 $Template->SetVariable('InfoPath',
340 CreateListLinkPathHTML($Params, $Template->GetString('InfoPathTitle')));
341  
342 // Permalink
343 $Template->SetVariable('InfoPermaLink', PermaLinkCreateLink($Path));
344  
345  
346 // Zpracuj informace o projektu
347 // ----------------------------
348  
349  
350 unset($Variables);
351  
352 // Převezmi data z popisu projektu
353 foreach($ThisDirInfo->DirData as $Key => $Value)
354 {
355 $Variables[$Key] = $ThisDirInfo->GetString($Key, WRAP);
356 }
357  
358 $Template->SetVariable('InfoVariables', $Variables);
359  
360 // Odkaz na obrázky k projektu
4987 kaklik 361 $Template->SetVariable('InfoPictures', CreatePicturesLink($Path, $Template->GetString('InfoPicturesGlue'), 'Ilustrative Picture', ''));
4985 kaklik 362  
363 // Data do tabulky
364 $Template->SetVariable('InfoText', CreateFilesLink($Path.'/DOC/{HTML/*.[hH][tT][mM][lL],*.[pP][dD][fF]}', $Glue));
365  
366 $Template->SetVariable('InfoWebSVN', CreateSVNLink($Path, $Lang, $Template->GetString('InfoSVNTitle')));
367  
368 $Variables['InfoName'] = basename($Path);
369  
370 /* $Variables['InfoName'] = ($DirInfoValid or $ProjectInfoValid) ? CreateListLinkHTML($Params, $DirName, $DirInfo->GetString('InfoLongDescription'))
371 : $DirName;
372 $Variables['InfoPicture'] = CreatePicturesLink($Params['path'].'/'.$DirName, $Glue, 'Ilustrative Picture', '/'.TEMPLATE_PATH.'/'.$Template->GetVariable('InfoNoPicture'), 150);
373 $Variables['InfoDescripion'] = $DirInfo->GetString('InfoShortDescription', WRAP);
374 $Variables['InfoWebSVN'] = CreateSVNLink($Params['path'].'/'.$DirName, $Params['lang'], $Template->GetString('InfoSVNTitle'));
375 if (!$DirInfoValid)
376 {
377 $Variables['InfoWIKI'] = CreateWikiLink($DirName, $Params['lang'], $Template->GetString('InfoWikiTitle'));
378 }
379 $Variables['InfoHTML'] = CreateFilesLink($Params['path'].'/'.$DirName.'/DOC/HTML/*.[hH][tT][mM][lL]', $Glue);
380 $Variables['InfoPDF'] = CreateFilesLink($Params['path'].'/'.$DirName.'/DOC/*.[pP][dD][fF]', $Glue);
381 $Variables['InfoSCH'] = CreateFilesLink($Params['path'].'/'.$DirName.'/SCH/*.[pP][dD][fF]', $Glue);
382  
383 // Vlož info o dostupnosti na UST
384 if($DirInfo->GetString('InfoBuyUST')!= '')
385 {
386 $Variables['InfoBuy'] = CreateLink($DirInfo->GetString('InfoBuyUST'),'UST');
387 }
388 */
389 // Poukni proměnné do vzoru a střádej si výsledek
390 $LinesPrj = $Template->Substitute($Variables, $Template->GetVariable('InfoLine'));
391 $Template->SetVariable('InfoLine', $LinesPrj);
392  
393  
394 /*
395 // Objekt pro načítání informací o adresářích a projektech
396 $DirInfo = new DirMetadata();
397  
398 // Abych nešahal pořád do objektu, použiju proměnnou
399 $Glue = $Template->GetVariable('InfoGlue');
400  
401 // Sem se střádá mezivýsledek
402 // Zvlášť adresáře a projekty aby byly oddělené ve výsledku
403 $LinesDir = ''; // Adresáře
404 $LinesPrj = ''; // Projekty
405  
406 // Procházení adresářem
407 $Dir = glob($_SERVER['DOCUMENT_ROOT'].$Path.'/*', GLOB_ONLYDIR);
408  
409 // Vezmi jen jméno adresáře a vytvoř asociativní pole s klíči
410 foreach ($Dir as $Key => $DirName)
411 {
412 $DirName = basename($DirName);
413 $NewDir[$DirName] = $DirName;
414 }
415 $Dir = $NewDir;
416 unset($NewDir);
417  
418 // Setřídění adresářů podle preferovaného třídění ze [SortPreferences]
419 $NewDir = array();
420 $Sort = $ThisDirInfo->GetVariable('SortPreferences'); // vzorové třídění
421 if ($Sort!='')
422 {
423 $Sort = explode("\n", $Sort);
424 // Najdi a přendej nalezené položky
425 foreach ($Sort as $Value)
426 {
427 $Value = trim($Value);
428 if (isset($Dir[$Value]))
429 {
430 // Zařaď do nového pole
431 $NewDir[] = $Value;
432 // Vyhoď ze starého
433 unset($Dir[$Value]);
434 }
435 }
436 // Přendej zbylé položky
437 foreach ($Dir as $Value)
438 {
439 $NewDir[] = $Value;
440 }
441 $Dir = $NewDir;
442 unset($NewDir);
443 }
444  
445 // Zpracování položek
446 foreach ($Dir as $DirName)
447 {
448 // Načti informace o (každém) adresáři
449 $DirInfoValid = $DirInfo->LoadDirInfo($Path.'/'.$DirName.'/'.DIRINFO, $Lang);
450 // Pokud to není adresář, tak načti informace o projektu
451 if (!$DirInfoValid)
452 {
453 $ProjectInfoValid = $DirInfo->LoadDirInfo($Path.'/'.$DirName.'/'.PRJINFO, $Lang)
454 or
455 // Heuristika pro projekty, které ještě nemají popis
456 $ProjectInfoValid = is_dir($_SERVER['DOCUMENT_ROOT'].$Path.'/'.$DirName.'/DOC')
457 or
458 $ProjectInfoValid = is_dir($_SERVER['DOCUMENT_ROOT'].$Path.'/'.$DirName.'/SCH');
459 }
460  
461 // Zkontroluj, zda jsme v platné sekci
462 if ($DirInfoValid || $ProjectInfoValid)
463 {
464 // Připrav si proměnné
465 unset($Variables);
466 foreach($DirInfo->DirData as $Key => $Value)
467 {
468 $Variables[$Key] = $DirInfo->GetString($Key, WRAP);
469 }
470  
471 $Variables['InfoName'] = ($DirInfoValid or $ProjectInfoValid) ? CreateListLinkHTML($Params, $DirName, $DirInfo->GetString('InfoLongDescription'))
472 : $DirName;
473 $Variables['InfoPicture'] = CreatePicturesLink($Params['path'].'/'.$DirName, $Glue, 'Ilustrative Picture', '/'.TEMPLATE_PATH.'/'.$Template->GetVariable('InfoNoPicture'), 150);
474 $Variables['InfoDescripion'] = $DirInfo->GetString('InfoShortDescription', WRAP);
475 $Variables['InfoWebSVN'] = CreateSVNLink($Params['path'].'/'.$DirName, $Params['lang'], $Template->GetString('InfoSVNTitle'));
476 if (!$DirInfoValid)
477 {
478 $Variables['InfoWIKI'] = CreateWikiLink($DirName, $Params['lang'], $Template->GetString('InfoWikiTitle'));
479 }
480 $Variables['InfoHTML'] = CreateFilesLink($Params['path'].'/'.$DirName.'/DOC/HTML/*.[hH][tT][mM][lL]', $Glue);
481 $Variables['InfoPDF'] = CreateFilesLink($Params['path'].'/'.$DirName.'/DOC/*.[pP][dD][fF]', $Glue);
482 $Variables['InfoSCH'] = CreateFilesLink($Params['path'].'/'.$DirName.'/SCH/*.[pP][dD][fF]', $Glue);
483  
484 // Vlož info o dostupnosti na UST
485 if($DirInfo->GetString('InfoBuyUST')!= '')
486 {
487 $Variables['InfoBuy'] = CreateLink($DirInfo->GetString('InfoBuyUST'),'UST');
488 }
489  
490 // Poukni proměnné do vzoru a střádej si výsledek
491 if ($DirInfoValid)
492 $LinesDir .= $Template->Substitute($Variables, $Template->GetVariable('InfoLine'));
493 else
494 $LinesPrj .= $Template->Substitute($Variables, $Template->GetVariable('InfoLine'));
495 }
496 }
497  
498 // Slož k sobě obě části (adresář / separátor / projekt)
499 if ($LinesDir!='' and $LinesPrj!='')
500 $Lines = $LinesDir.$Template->GetString('InfoSeparator').$LinesPrj;
501 else
502 $Lines = $LinesDir.$LinesPrj;
503  
504 // Teď sestavené položky ulož do proměnné "InfoLine" objektu
505 $Template->SetVariable('InfoLine', $Lines);
506 */
507  
508 }
509  
510  
511 // *************************************
512  
513  
514 function WrapString($String, $Wrap=0)
515 // Provede odstranění nadbytečných bílých znaků
516 // a volitleně (pokud je $Wrap nenulové) provede zálámání na zadaný počet znaků
517 {
518 // Odstaň bílé znaky
519 $String = preg_replace('/\s+/su', ' ', $String);
520  
521 // Volitelné nalámání
522 if ($Wrap!=0)
523 $String = wordwrap($String, $Wrap);
524  
525 return $String;
526 }
527  
528  
529 function xxxCheckWebPath($Path)
530 // Zadaná cesta se chápe jako cesta uvnitř webu (vzhledem k document root).
531 // Případné relativní části (/../..) převede na absolutní a zkontroluje
532 // výsledek, zda nevybočuje mimo web.
533 // Na začátku nechá lomítko, na konci ho odstraní.
534 // Pokud je výsledná cesta neplatná, vrátí prázdný řetězec. Kontroluje, zda
535 // zadaný adresář existuje.
536 {
537 // Převeď cestu na opravdovou, odstraň relativní odkazy
538 $Path = realpath($_SERVER['DOCUMENT_ROOT'].$Path);
539  
540 // Zkontroluj, zda jsme nevybočili z webu
4987 kaklik 541 if ( str_starts_with($Path, $_SERVER['DOCUMENT_ROOT']) )
4985 kaklik 542 {
543 // Shoda - odstraň DOCUMENT_ROOT část cesty
544 return substr( $Path, strlen($_SERVER['DOCUMENT_ROOT']) );
545 }
546 else
547 {
548 // Vybočili jsme z webu
549 return '';
550 }
551 }
552  
553  
554 function GetSection($Path)
555 // Vrátí první část cesty (to je to, co nazýváme sekce)
556 {
557 // Ignoruj lomítko na začátku
558 $Path = ltrim($Path, '/');
559  
560 // Vykousni první slovo až po lomítko
561 $Section = substr($Path, 0, strpos($Path.'/', '/'));
562  
563 // Ošetři root
564 if ($Section=='')
565 $Section = "(root)";
566  
567 // Vrať výsledek
568 return $Section;
569 }
570  
571  
572 function CreateLink($InternetWebPath, $Title='')
573 // Vstupem je cesta do jiného webu.
574 // a volitelně title (zobrazí se při najetí myši na odkaz).
575 // Vrací řetězec s odkazem
576 {
577 $Link = '<a href="'.$InternetWebPath.'"';
578 if ($Title != '')
579 $Link .= "\n".' title="'.$Title.'"';
580 $Link .= '>';
581 $Link .= $Title;
582 $Link .= '</a>';
583  
584 return $Link;
585 }
586  
587  
588 function CreateScriptLink($Params, $DirName='', $Title='')
589 // Vytvoř odkaz na skript s parametry skriptu. Parametry jsou předány jako
590 // pole s jmény položek a hodnotami. Volitelná položka $DirName se přidá k cestě
591 // v položce $Params. Pokud je zadaná cesta prázdná nebo / zobrazí se slovo root
592 {
593 // Připoj volitelné jméno adresáře
594 if ($DirName!='')
595 $Params['path'] = $Params['path'].'/'.$DirName;
596  
597 // Odvoď jméno z názvu adresáře
598 $DirName = basename($Params['path']);
599 if ($DirName == '')
600 {
601 $DirName = '(root)';
602 $Params['path'] = '/';
603 }
604  
605 // Zpracuj pole parametrů
606 $ParamsLine = '';
607 $LocalGlue = '';
608 foreach($Params as $Key => $Value)
609 {
610 $ParamsLine .= $LocalGlue.$Key.'='.urlencode($Value);
611 $LocalGlue = '&amp;';
612 }
613 unset($LocalGlue);
614  
615 // Sestav odkaz
616 $Link = '<a href="'.$_SERVER['SCRIPT_NAME'].'?'.$ParamsLine.'"';
617 if ($Title!='')
618 $Link .= "\n".' title="'.htmlspecialchars($Title).'"';
619 $Link .= ">$DirName</a>";
620  
621 return $Link;
622 }
623  
624  
625 function CreateScriptLinkPath($Params, $Title)
626 // Vstupem je cesta (začínající /) od DOCUMENT_ROOT
627 // Výsledkem je řádka odkazů na jednotlivé adresáře cesty
628 // Odkazy jsou odkazy na skript s parametrem cesty a jazyka
629 // Vstupem je pole parametrů ze kterých použijeme parametr 'path',
630 // ostatní jen umístíme do odkazů.
631 {
632 // Rozděl cestu na kousky
633 $Parts = explode('/', $Params['path']);
634 if ($Parts[0]=='')
635 array_shift($Parts); // vyhoď případnou prázdnou položku
636  
637 // Začínáme od rootu
638 $TempPath = '';
639  
640 // Odkaz na root (je vždy)
641 $Params['path'] = $TempPath;
642 $Link = CreateScriptLink($Params, '', $Title);
643  
644 // Je něco víc než root?
645 if (isset($Parts[0]) && $Parts[0]!='')
646 {
647 // Odkaz na všechny další adresáře cesty
648 foreach($Parts as $Key => $Value)
649 {
650 // Přidej adresář
651 $TempPath .= '/'.$Value;
652  
653 // Vyrob odkaz
654 $Link .= " /\n";
655 $Params['path'] = $TempPath;
656 $Link .= CreateScriptLink($Params, '', $Title);
657 }
658 }
659  
660 // Vrať výsledek
661 return $Link;
662 }
663  
664 ?>