Rev Author Line No. Line
4985 kaklik 1 <?php
2  
3  
4 // *********************************
5 // Konfigurace
6 // *********************************
7  
8  
4987 kaklik 9 define('DIRINFO', 'DirInfo.txt'); // Jméno souboru s informacemi o adresáři
10 define('PRJINFO', 'PrjInfo.txt'); // Jméno souboru s informacemi o projektu
4985 kaklik 11  
4987 kaklik 12 define('PERMALINK', '/PermaLink'); // Začátek cesty s permalinkem (zpracovává mod_rewrite)
13 define('LISTSCRIPT', 'List'); // Jméno skriptu v rootu pro výpis
14 define('WEBSVNSCRIPT', '/WebSVN/listing.php'); // Cesta k WebSVN skriptu
15 define('WIKISERVER', 'wiki'); // Jméno Wiki serveru (co se strčí místo jména stávajícího serveru)
4985 kaklik 16  
17 // Cesta k templejtům
4987 kaklik 18 define('TEMPLATE_PATH', 'Server/PrjInfo/Templates'); // Cesta do adresáře s templejty
19 define('TEMPLATE_PERMALINK', TEMPLATE_PATH . '/PermaLink.ihtml'); // Zobrazení PermaLinku (přípona jazyka se doplní sama)
20 define('TEMPLATE_PERMALINK_PATH', TEMPLATE_PATH . '/PermaLinkPath.ihtml'); // Zobrazení PermaLinku s cestou (přípona jazyka se doplní sama)
21 define('TEMPLATE_LISTDIR', TEMPLATE_PATH . '/ListDir.ihtml'); // Zobrazení sekce (přípona jazyka se doplní sama)
22 define('TEMPLATE_LISTPRJ', TEMPLATE_PATH . '/ListPrj.ihtml'); // Zobrazení projektu (přípona jazyka se doplní sama)
4985 kaklik 23  
24  
25 // *********************************
26 // Obecné funkce
27 // *********************************
28  
29  
30 // Ukončení běhu při chybě
31 function Error($str)
32 {
33 echo '<b>Ups...<b><br>'.PHP_EOL.$str.PHP_EOL;
34 exit;
35 }
36  
37  
38 // Vytiskni strukturu s názvem
39 function print_rx($Nadpis, $Struktura)
40 {
41 print $Nadpis.PHP_EOL;
42 print str_pad('', strpos($Nadpis.PHP_EOL, PHP_EOL), '-').PHP_EOL;
43 $str=print_r($Struktura, true);
44 $str = ' '.str_replace(PHP_EOL, PHP_EOL.' ', $str);
45 print $str.PHP_EOL;
46 }
47  
48  
49 // *********************************
50 // Výroba odkazů
51 // *********************************
52  
53  
54 // Ze zadané cesty a pole s názvy souborů slepí HTML odkazy
55 // na jednotlivé soubory
56 function CreateFilesLink2($Path, $FileNames, $Glue)
57 {
58 $Path = htmlspecialchars($Path);
59  
60 $Glue = " $Glue\n";
61 $Result = '';
62 foreach($FileNames as $Name)
63 {
64 $Name = htmlspecialchars($Name);
65 $Result .= "<a href=\"$Path/$Name \">$Name</a>" . $Glue;
66 }
67 $Result=substr($Result, 0, -strlen($Glue));
68 return $Result;
69 }
70  
71  
72 /*
73 // Vyrobí HTML odkaz na soubor/adresář/skript
74 function CreateLinkHTML($Path, $Text, $Title='')
75 {
76 $Path = htmlspecialchars($Path);
77  
78 $Title = htmlspecialchars($Title);
79  
80 $Link = '<a href="http://'.$_SERVER['SERVER_NAME'].$FileName.'"';
81 if ($Title != '')
82 $Link .= "\n".' title="'.$Title.'"';
83 $Link .= '>';
84 if (basename($FileName)=='')
85 $Link .= '(root)';
86 else
87 $Link .= basename($FileName);
88 $Link .= '</a>';
89  
90 return $Link;
91  
92 }
93 */
94  
95 function CreateSVNLink($Path, $Lang, $Title)
96 // Vytvoří odkaz do WebSVN podle cesty a jazyka
97 {
98 $Path = htmlspecialchars($Path);
99  
100 $Link = '<a href="http://';
101 $Link .= $_SERVER['SERVER_NAME'];
102 $Link .= WEBSVNSCRIPT;
103 $Link .= '?repname=MLAB&amp;path=';
104 $Link .= $Path;
105 $Link .= '/';
106 if ($Lang=='cs')
107 $Link .= '&amp;langchoice=Česky';
108 else
109 $Link .= '&amp;langchoice=English';
110 $Link .= '"';
111 if ($Title!='')
112 $Link .= "\n".' title="'.htmlspecialchars($Title).'"';
113 $Link .= '>WebSVN</a>';
114  
115 return $Link;
116 }
117  
118  
119 function CreateWikiLink($Name, $Lang, $Title)
120 // Vytvoří odkaz do Wiki podle jména modulu a jazyka
121 {
122 // Ukousni verzi a revizi modulu (například 01A)
123 $Name = preg_replace('/[0-9][0-9][a-z]$/i', '', $Name);
124 $Name = htmlspecialchars($Name);
125  
126 // Sestav odkaz
127 $Link = '<a href="http://';
128 $Link .= preg_replace('/^.+?\./', WIKISERVER.'.', $_SERVER['SERVER_NAME']);
129 $Link .= '/doku.php?id='.$Lang.':'.$Name;
130 $Link .= '"';
131  
132 if ($Title!='')
133 $Link .= "\n".' title="'.htmlspecialchars($Title).'"';
134 $Link .= '>Wiki</a>';
135  
136 return $Link;
137 }
138  
139  
140 function CreatePicturesLink($Path, $Glue, $Alt='', $NoPicture, $Width='')
141 // Najde na uvedené cestě obrázky, které mají v názvu Small
142 // a sestaví na ně odkaz. Pokud není žádný obrázek, vytvoří odkaz na obrázek
143 // v parametru $NoPicture.
144 {
145 // Najdi všechny soubory
146 $Files = array();
147 foreach (glob($_SERVER['DOCUMENT_ROOT'].$Path.'/*') as $File)
148 {
149 if (is_file($File))
150 {
151 // Jen jméno souboru
152 $File = substr($File, 1+strlen($_SERVER['DOCUMENT_ROOT'].$Path));
153  
154 // TOHLE ASI RADĚJI PŘEZ REGEX
155  
156 // Odděl příponu
157 $DotPos = strrpos($File, '.');
158 $Extension = substr($File, $DotPos+1);
159 $BaseName = substr($File, 0, $DotPos);
160  
161 // Vezmi obrázky, které mají ve jméně Small
162 if( (strtolower($Extension)=='jpg' or strtolower($Extension)=='png')
163 and strpos($BaseName, 'Small')>0 )
164 {
165 $Files[] = $Path.'/'.$File;
166 }
167 }
168 }
169  
170 // V adresáři nejsou žádné vhodné obrázky
171 if (count($Files) == 0)
172 {
173 // Není na co udělat odkaz
174 if ($NoPicture=='')
175 return '';
176 // Přidej odkaz nikam
177 $Files[] = $NoPicture;
178 }
179  
180 // Udělej odkazy na pole souborů
181 $Alt = htmlspecialchars($Alt);
182 $Line = '';
183 $FirstGlue = TRUE;
184 foreach($Files as $File)
185 {
186 $File = htmlspecialchars($File);
187  
188 if(!$FirstGlue)
189 $Line .= ' '.$Glue."\n";
190 $FirstGlue = FALSE;
191  
192 $Line .= '<a href="'.$File.'">'."\n";
193 $Line .= '<img src="'.$File.'"'."\n";
194 if($Width!='')
195 $Line .= ' width="' . $Width . '"'."\n";
196 $Line .= ' alt="'.$Alt.'">'."\n";
197 $Line .= '</a>'."\n";
198 }
199  
200 return $Line;
201 }
202  
203 // Vstupem je cesta k souboru v rámci webu (od DOCUMENT_ROOT)
204 // a volitelně title (zobrazí se při najetí myši na odkaz).
205 // Vrací řetězec s odkazem
206 function CreateFileLink($FileName, $Title='')
207 {
208 $FileName = htmlspecialchars($FileName);
209  
210 $Link = '<a href="http://'.$_SERVER['SERVER_NAME'].$FileName.'"';
211 if ($Title != '')
212 $Link .= "\n".' title="'.$Title.'"';
213 $Link .= '>';
214 if (basename($FileName)=='')
215 $Link .= '(root)';
216 else
217 $Link .= basename($FileName);
218 $Link .= '</a>';
219  
220 return $Link;
221 }
222  
223  
224 // Vyrobí odkaz na projekt
225 // vstupem je cesta k projektu (začíná lomítkem) a volitelně jazyk
226 function CreateProjectLink($Path, $Lang='')
227 {
228 if($Lang!='')
229 $Lang .= '.';
230 return 'http://' . $_SERVER["HTTP_HOST"] . $Path . '/' . LISTSCRIPT . '.' .$Lang . 'html';
231 }
232  
233  
234 // Provede přesměrování na projekt na zadané cestě (volitelně i s jazykem)
235 function Redirect($Path, $Lang='')
236 {
237 $NewUrl = CreateProjectLink($Path, $Lang);
238 // print "Redirect: $NewUrl<br>";
239 header("HTTP/1.1 301 Moved Permanently");
240 header("Location: $NewUrl");
241 header("Connection: close");
242 die();
243 }
244  
245  
246 // Provede přesměrování na projekt na zadané cestě (volitelně i s jazykem)
247 function RedirectToFile($Path)
248 {
249 // print "Redirect: $NewUrl<br>";
250 header("HTTP/1.1 301 Moved Permanently");
251 header("Location: $Path");
252 header("Connection: close");
253 die();
254 }
255  
256  
257 // Dostává cestu k souboru a jazyk. Zkusí ověřit existenci souboru s doplněným
258 // zadaným jazykem, dále zkusí angličtinu a nakonec zkusí nemodifikovaný název.
259 // Vrací jméno souboru s tou variantou, kterou našel.
260 function LangFile($FileName, $Lang)
261 {
262 // Najdi příponu (poslední tečka)
263 $Pos = strrpos($FileName, '.');
264 if ($Pos === false)
265 return '';
266 if ($Pos < strrchr($FileName, '/'))
267 return '';
268  
269 // Zkus doplnit zadaný jazyk
270 $File = substr($FileName, 0, $Pos+1).$Lang.substr($FileName, $Pos);
271  
272 if (is_file($File))
273 return $File;
274  
275 // Zkus doplnit en
276 $File = substr($FileName, 0, $Pos+1).'en'.substr($FileName, $Pos);
277  
278 if (is_file($File))
279 return $File;
280  
281 // Zkus soubor tak jak je
282 if (is_file($FileName))
283 return $FileName;
284  
285 // Nic nevyšlo
286 return '';
287 }
288  
289  
290  
291  
292 // Sestaví odkazy na všechny soubory zadaného jména slepené lepidlem
293 // Volitelně lze zadat title (zobrazí se při najetí myši na odkaz).
294 // Cesta se chápe v rámci webu (od DOCUMENT_ROOT).
295 // Vrací řetězec s odkazy
296 function CreateFilesLink($Path, $Glue, $Title='')
297 {
298 // Při lepení odřádkujeme aby byl generovaný kód strukturovaný
299 $Glue = ' '.$Glue."\n";
300  
301 // Pro každou položku
302 $Line = '';
303 $Ofset = strlen($_SERVER['DOCUMENT_ROOT']);
304 foreach (glob($_SERVER['DOCUMENT_ROOT'].$Path, 0) as $DirName) // GLOB_BRACE???????????
305 {
306 // Sestav odkaz
307 if (is_file($DirName))
308 $Line .= $Glue.CreateFileLink(substr($DirName, $Ofset), $Title);
309 }
310  
311 // Vrať výsledek ale bez lepidla na začátku
312 return substr($Line, strlen($Glue));
313 }
314  
315  
316 // *********************************
317 // Zpracování stromu sekcí a projektů
318 // *********************************
319  
320  
321 // Vrací true/false na základě validní struktury sekce (adresáře)
322 // (testuje přítomnost DIRINFO souboru)
323 function IsDir($Path)
324 {
325 return is_file($_SERVER['DOCUMENT_ROOT'].$Path.'/'.DIRINFO);
326 }
327  
328  
329 // Vrací true/false na základě validní struktury projektu
330 // (testuje přítomnost PRJINFO a pokud není tak heuristiku)
331 function IsPrj($Path)
332 {
333 // Existuje popisný soubor projektu
334 if(is_file($_SERVER['DOCUMENT_ROOT'].$Path.'/'.PRJINFO))
335 return true;
336  
337 // Není popis projektu, nastupuje heuristika
338 if(is_dir($_SERVER['DOCUMENT_ROOT'].$Path.'/DOC'))
339 return true;
340 if(is_dir($_SERVER['DOCUMENT_ROOT'].$Path.'/SCH'))
341 return true;
342  
343 // Nic nezabralo, není platný projekt
344 return false;
345 }
346  
347  
348 // Funkce vrací pole obsahující pole Projects a pole Sections
349 function RecurseDirs($Path)
350 {
351 $Dirs = array();
352 $Path = rtrim($Path, '/');
353 $Items = glob($_SERVER['DOCUMENT_ROOT'].$Path.'/*', GLOB_ONLYDIR);
354  
355 // If not valid directory (vracím prázdný výsledek)
356 if(!is_array($Items))
357 return $Dirs;
358  
359 // Recourse the directory tree (přidávám nalezené adresáře ke konci pole)
360 for($i=0; $i<count($Items); $i++)
361 {
362 if (is_file($Items[$i].'/'.DIRINFO))
363 {
364 $SubDirs = glob($Items[$i] . '/*', GLOB_ONLYDIR);
365 $Items = array_merge($Items, $SubDirs);
366 }
367 }
368  
369 // Remove invalid items (with no DIRINFO/PRJINFO) and Local Path
370 $Sections=array();
371 $Projects=array();
372 $EatLeftChars = strlen($_SERVER['DOCUMENT_ROOT']);
373 foreach($Items as $Key => $Data)
374 {
375 // Remove web path
376 $Data = substr($Data, $EatLeftChars);
377 if(IsDir($Data))
378 $Sections[]=$Data;
379 elseif (IsPrj($Data))
380 $Projects[]=$Data;
381 }
382  
383 // Sort Sections
384 sort($Sections, SORT_STRING);
385  
386 // Sort Projects
387 sort($Projects, SORT_STRING);
388  
389 // Return combined result
390 $All["Projects"] = $Projects;
391 $All["Sections"] = $Sections;
392 return $All;
393 }
394  
395  
396 // *********************************
397 // Permalinky
398 // *********************************
399  
400  
401 // Filtr pro náhradu nepohodlných znaků v permalinku
402 // Nahrazuje všechny znaky kromě písmen a čísel, odstraní diakritiku
403 // u českých znaků
404 function PermaLinkFilter($String)
405 {
406 // Odstraň diakritiku
407 $SubstTable = array (
408 "ě" => "e", "š" => "s", "č" => "c", "ř" => "r", "ž" => "z", "ý" => "y", "á" => "a",
409 "í" => "i", "é" => "e", "ď" => "d", "ť" => "t", "ň" => "n", "ů" => "u", "ú" => "u",
410 "Ě" => "E", "Š" => "S", "Č" => "C", "Ř" => "R", "Ž" => "Z", "Ý" => "Y", "Á" => "A",
411 "Í" => "I", "É" => "E", "Ď" => "D", "Ť" => "T", "Ň" => "N", "Ů" => "U", "Ú" => "U"
412 );
413 $String = strtr($String, $SubstTable);
414  
415 // Nahraď nepohodlné znaky mínusem
416 $String = preg_replace("~[^A-Z0-9]+~ui", "-", $String);
417  
418 // Odtsraň duplicity mínusů
419 $String = preg_replace("~-+~u", "-", $String);
420  
421 // Odstraň počáteční a koncové mínusy
422 $String = ltrim(rtrim($String,'-'),'-');
423  
424 return $String;
425 }
426  
427  
428 // Vrací z cesty platný permalink
429 // Vstupem je cesta k projektu nebo k sekci, z ní se vrací jen název (poslední část cesty)
430 function PermaLinkCreateKey($ProjectPath)
431 {
432 // Odstraň cestu
433 $PermaLinkKey = basename($ProjectPath);
434  
435 // Odstraň nepohodlné znaky
436 $PermaLinkKey = PermaLinkFilter($PermaLinkKey);
437  
438 // Hotovo
439 return $PermaLinkKey;
440 }
441  
442  
443 // Zvýrazní jméno projektu (poslední část zadané cesty dá do značky span)
444 function MarkPath($Path)
445 {
446 $Pos = strrpos($Path, '/');
447 if($Pos===false)
448 return "<span class='Marked'>".$Path."</span>";
449 else
450 return substr($Path, 0, $Pos+1)."<span class='Marked'>".substr($Path, $Pos+1)."</span>";
451 }
452  
453  
454 // Vytvoří z klíče (upravený název projektu či sekce) celý klikací permalinkový odkaz
455 // Je-li zadána přídavná cesta tak ji přidá na konec
456 // ??????????????????????????? k čemu se použije $AditionalPath ?????????????? možná zrušit
457 function PermaLinkCreateLink($PermaLinkKey, $AditionalPath='')
458 {
459 $AditionalPath = ltrim($AditionalPath, '/');
460 $AditionalPath = rtrim($AditionalPath, '/');
461 if($AditionalPath!=='')
462 $AditionalPath = '/'.$AditionalPath;
463 $PermaLinkKey = PermaLinkCreateKey($PermaLinkKey);
464 return 'http://'.$_SERVER['HTTP_HOST'].PERMALINK.'/'.$PermaLinkKey.$AditionalPath;
465 }
466  
467  
468 // Na základě pole se všemi projekty a sekcemi vytvoří pole permalinků se všemi projekty a sekcemi
469 function PermaLinkCreateArray($ProjectsArray)
470 {
471 $PermaLinkArray = array();
472  
473 foreach($ProjectsArray['Projects'] as $Data)
474 {
475 $PermaLink = PermaLinkCreateKey($Data);
476 $PermaLinkArray[] = array('SortKey' => mb_strtolower($PermaLink), 'PermaLink' => $PermaLink, 'Path' => $Data, 'Type' => 'Project');
477 }
478  
479 foreach($ProjectsArray['Sections'] as $Data)
480 {
481 $PermaLink = PermaLinkCreateKey($Data);
482 $PermaLinkArray[] = array('SortKey' => mb_strtolower($PermaLink), 'PermaLink' => $PermaLink, 'Path' => $Data, 'Type' => 'Section');
483 }
484  
485 return $PermaLinkArray;
486 }
487  
488  
489 // V zadaném poli odkazů najde klíč a vrátí pole s nalezenými shodami
490 // (v případě neshody vrací prázdné pole, ignoruje velikost písmen)
491 function PermaLinkFind($AllPermas, $Key)
492 {
493 $Key = mb_strtolower($Key);
494 $Key = PermaLinkFilter($Key);
495 $KeyLen = strlen($Key);
496 $Result = array();
497 if($KeyLen!==0)
498 {
499 foreach($AllPermas as $Data)
500 {
501 /*
502 // Hledej permalinky, které začínají jako zadaný klíč
503 if(mb_strtolower(substr($Data['PermaLink'], 0, $KeyLen))===$Key)
504 $Result[] = $Data;
505 */
506 // Hledej permalinky, které obsahují zadaný klíč
4987 kaklik 507 if(str_contains(mb_strtolower($Data['PermaLink']), $Key))
4985 kaklik 508 $Result[] = $Data;
509 }
510 return $Result;
511 }
512 }
513 ?>