16b13307fSandi<?php 26b13307fSandi/** 36b13307fSandi * DokuWiki template functions 46b13307fSandi * 56b13307fSandi * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) 66b13307fSandi * @author Andreas Gohr <andi@splitbrain.org> 76b13307fSandi */ 86b13307fSandi 96b13307fSandi if(!defined('DOKU_INC')) define('DOKU_INC',realpath(dirname(__FILE__).'/../').'/'); 106b13307fSandi require_once(DOKU_INC.'conf/dokuwiki.php'); 116b13307fSandi 126b13307fSandi/** 136b13307fSandi * Wrapper around htmlspecialchars() 146b13307fSandi * 156b13307fSandi * @author Andreas Gohr <andi@splitbrain.org> 166b13307fSandi * @see htmlspecialchars() 176b13307fSandi */ 186b13307fSandifunction hsc($string){ 196b13307fSandi return htmlspecialchars($string); 206b13307fSandi} 216b13307fSandi 226b13307fSandi/** 236b13307fSandi * print a newline terminated string 246b13307fSandi * 256b13307fSandi * You can give an indention as optional parameter 266b13307fSandi * 276b13307fSandi * @author Andreas Gohr <andi@splitbrain.org> 286b13307fSandi */ 296b13307fSandifunction ptln($string,$intend=0){ 306b13307fSandi for($i=0; $i<$intend; $i++) print ' '; 316b13307fSandi print"$string\n"; 326b13307fSandi} 336b13307fSandi 346b13307fSandi/** 356b13307fSandi * Print the content 366b13307fSandi * 376b13307fSandi * This function is used for printing all the usual content 386b13307fSandi * (defined by the global $ACT var) by calling the appropriate 396b13307fSandi * outputfunction(s) from html.php 406b13307fSandi * 416b13307fSandi * Everything that doesn't use the default template isn't 426b13307fSandi * handled by this function. ACL stuff is not done either. 436b13307fSandi * 446b13307fSandi * @author Andreas Gohr <andi@splitbrain.org> 456b13307fSandi */ 466b13307fSandifunction tpl_content(){ 476b13307fSandi global $ACT; 486b13307fSandi global $TEXT; 496b13307fSandi global $PRE; 506b13307fSandi global $SUF; 516b13307fSandi global $SUM; 526b13307fSandi global $IDX; 536b13307fSandi 546b13307fSandi switch($ACT){ 556b13307fSandi case 'show': 566b13307fSandi html_show(); 576b13307fSandi break; 58ea67f144Sandi case 'preview': 596b13307fSandi html_edit($TEXT); 606b13307fSandi html_show($TEXT); 616b13307fSandi break; 626b13307fSandi case 'edit': 636b13307fSandi html_edit(); 646b13307fSandi break; 656b13307fSandi case 'wordblock': 666b13307fSandi html_edit($TEXT,'wordblock'); 676b13307fSandi break; 686b13307fSandi case 'search': 696b13307fSandi html_search(); 706b13307fSandi break; 716b13307fSandi case 'revisions': 726b13307fSandi html_revisions(); 736b13307fSandi break; 746b13307fSandi case 'diff': 756b13307fSandi html_diff(); 766b13307fSandi break; 776b13307fSandi case 'recent': 785749f1ceSmatthiasgrimm $first = is_numeric($_REQUEST['first']) ? intval($_REQUEST['first']) : 0; 79a39955b0Smatthiasgrimm html_recent($first); 806b13307fSandi break; 816b13307fSandi case 'index': 826b13307fSandi html_index($IDX); #FIXME can this be pulled from globals? is it sanitized correctly? 836b13307fSandi break; 846b13307fSandi case 'backlink': 856b13307fSandi html_backlinks(); 866b13307fSandi break; 876b13307fSandi case 'conflict': 886b13307fSandi html_conflict(con($PRE,$TEXT,$SUF),$SUM); 896b13307fSandi html_diff(con($PRE,$TEXT,$SUF),false); 906b13307fSandi break; 916b13307fSandi case 'locked': 92ee20e7d1Sandi html_locked(); 936b13307fSandi break; 946b13307fSandi case 'login': 956b13307fSandi html_login(); 966b13307fSandi break; 976b13307fSandi case 'register': 986b13307fSandi html_register(); 996b13307fSandi break; 100820fa24bSandi case 'denied': 1015e991bd8Sandi print p_locale_xhtml('denied'); 102820fa24bSandi break; 103c19fe9c0Sandi case 'admin': 104c19fe9c0Sandi tpl_admin(); 105c19fe9c0Sandi break; 1066b13307fSandi default: 107ea67f144Sandi msg("Failed to handle command: ".hsc($ACT),-1); 1086b13307fSandi } 1096b13307fSandi} 1106b13307fSandi 111c19fe9c0Sandi/** 112c19fe9c0Sandi * Handle the admin page contents 113c19fe9c0Sandi * 114c19fe9c0Sandi * @author Andreas Gohr <andi@splitbrain.org> 115c19fe9c0Sandi */ 116c19fe9c0Sandifunction tpl_admin(){ 117c19fe9c0Sandi switch($_REQUEST['page']){ 118c19fe9c0Sandi case 'acl': 119c19fe9c0Sandi admin_acl_html(); 120c19fe9c0Sandi break; 121c19fe9c0Sandi default: 122c19fe9c0Sandi html_admin(); 123c19fe9c0Sandi } 124c19fe9c0Sandi} 1256b13307fSandi 1266b13307fSandi/** 1276b13307fSandi * Print the correct HTML meta headers 1286b13307fSandi * 1296b13307fSandi * This has to go into the head section of your template. 1306b13307fSandi * 1316b13307fSandi * @author Andreas Gohr <andi@splitbrain.org> 1326b13307fSandi */ 1336b13307fSandifunction tpl_metaheaders(){ 1346b13307fSandi global $ID; 1356b13307fSandi global $INFO; 1366b13307fSandi global $ACT; 1376b13307fSandi global $lang; 138dc57ef04Sandi global $conf; 1396b13307fSandi $it=2; 1406b13307fSandi 1416b13307fSandi // the usual stuff 1426b13307fSandi ptln('<meta name="generator" content="DokuWiki '.getVersion().'" />',$it); 1436b13307fSandi ptln('<link rel="start" href="'.DOKU_BASE.'" />',$it); 1446b13307fSandi ptln('<link rel="contents" href="'.wl($ID,'do=index').'" title="'.$lang['index'].'" />',$it); 1456b13307fSandi ptln('<link rel="alternate" type="application/rss+xml" title="Recent Changes" href="'.DOKU_BASE.'feed.php" />',$it); 1466b13307fSandi ptln('<link rel="alternate" type="application/rss+xml" title="Current Namespace" href="'.DOKU_BASE.'feed.php?mode=list&ns='.$INFO['namespace'].'" />',$it); 1476b13307fSandi ptln('<link rel="alternate" type="text/html" title="Plain HTML" href="'.wl($ID,'do=export_html').'" />',$it); 1486b13307fSandi ptln('<link rel="alternate" type="text/plain" title="Wiki Markup" href="'.wl($ID, 'do=export_raw').'" />',$it); 149f62ea8a1Sandi ptln('<link rel="stylesheet" media="screen" type="text/css" href="'.DOKU_BASE.'lib/styles/style.css" />',$it); 1506b13307fSandi 1516b13307fSandi // setup robot tags apropriate for different modes 1526b13307fSandi if( ($ACT=='show' || $ACT=='export_html') && !$REV){ 1536b13307fSandi if($INFO['exists']){ 1546b13307fSandi ptln('<meta name="date" content="'.date('Y-m-d\TH:i:sO',$INFO['lastmod']).'" />',$it); 1556b13307fSandi //delay indexing: 1566b13307fSandi if((time() - $INFO['lastmod']) >= $conf['indexdelay']){ 1576b13307fSandi ptln('<meta name="robots" content="index,follow" />',$it); 1586b13307fSandi }else{ 1596b13307fSandi ptln('<meta name="robots" content="noindex,nofollow" />',$it); 1606b13307fSandi } 1616b13307fSandi }else{ 1626b13307fSandi ptln('<meta name="robots" content="noindex,follow" />',$it); 1636b13307fSandi } 1646b13307fSandi }else{ 1656b13307fSandi ptln('<meta name="robots" content="noindex,nofollow" />',$it); 1666b13307fSandi } 1676b13307fSandi 1686b13307fSandi // include some JavaScript language strings 169ea2eed85Sandi ptln('<script language="javascript" type="text/javascript" charset="utf-8">',$it); 1706b13307fSandi ptln(" var alertText = '".$lang['qb_alert']."'",$it); 1716b13307fSandi ptln(" var notSavedYet = '".$lang['notsavedyet']."'",$it); 1726b13307fSandi ptln(" var DOKU_BASE = '".DOKU_BASE."'",$it); 1736b13307fSandi ptln('</script>',$it); 1746b13307fSandi 1759a3ea4f8Sandi // load the default JavaScript files 176ea2eed85Sandi ptln('<script language="javascript" type="text/javascript" charset="utf-8" src="'. 177f62ea8a1Sandi DOKU_BASE.'lib/scripts/script.js"></script>',$it); 178ea2eed85Sandi ptln('<script language="javascript" type="text/javascript" charset="utf-8" src="'. 179f62ea8a1Sandi DOKU_BASE.'lib/scripts/tw-sack.js"></script>',$it); 180ea2eed85Sandi ptln('<script language="javascript" type="text/javascript" charset="utf-8" src="'. 181f62ea8a1Sandi DOKU_BASE.'lib/scripts/ajax.js"></script>',$it); 1826b13307fSandi 183dc57ef04Sandi // load spellchecker script if wanted 184dc57ef04Sandi if($conf['spellchecker'] && ($ACT=='edit' || $ACT=='preview')){ 185ea2eed85Sandi ptln('<script language="javascript" type="text/javascript" charset="utf-8" src="'. 186dc57ef04Sandi DOKU_BASE.'lib/scripts/spellcheck.js"></script>',$it); 187dc57ef04Sandi } 188dc57ef04Sandi 1896b13307fSandi //FIXME include some default CSS ? IE FIX? 1906b13307fSandi} 1916b13307fSandi 1926b13307fSandi/** 1936b13307fSandi * Print a link 1946b13307fSandi * 1956b13307fSandi * Just builds a link but adds additional JavaScript needed for 1966b13307fSandi * the unsaved data check needed in the edit form. 1976b13307fSandi * 1986b13307fSandi * @author Andreas Gohr <andi@splitbrain.org> 1996b13307fSandi */ 2006b13307fSandifunction tpl_link($url,$name,$more=''){ 2016b13307fSandi print '<a href="'.$url.'" onclick="return svchk()" onkeypress="return svchk()"'; 2026b13307fSandi if ($more) print ' '.$more; 2036b13307fSandi print ">$name</a>"; 2046b13307fSandi} 2056b13307fSandi 2066b13307fSandi/** 207a3ec5f4aSmatthiasgrimm * get the parent page 208a3ec5f4aSmatthiasgrimm * 209a3ec5f4aSmatthiasgrimm * Tries to find out which page is parent. 210a3ec5f4aSmatthiasgrimm * returns false if none is available 211a3ec5f4aSmatthiasgrimm * 212a3ec5f4aSmatthiasgrimm * @author Matthias Grimm <matthiasgrimm@users.sourceforge.net> 213a3ec5f4aSmatthiasgrimm */ 214a3ec5f4aSmatthiasgrimmfunction tpl_getparent($ID){ 215a3ec5f4aSmatthiasgrimm global $conf; 216a3ec5f4aSmatthiasgrimm 217a3ec5f4aSmatthiasgrimm if ($ID != $conf['start']) { 218a3ec5f4aSmatthiasgrimm $idparts = explode(':', $ID); 219a3ec5f4aSmatthiasgrimm $pn = array_pop($idparts); // get the page name 220a3ec5f4aSmatthiasgrimm 221a3ec5f4aSmatthiasgrimm for ($n=0; $n < 2; $n++) { 222a3ec5f4aSmatthiasgrimm if (count($idparts) == 0) { 223a3ec5f4aSmatthiasgrimm $ID = $conf['start']; // go to topmost page 224a3ec5f4aSmatthiasgrimm break; 225a3ec5f4aSmatthiasgrimm }else{ 226a3ec5f4aSmatthiasgrimm $ns = array_pop($idparts); // get the last part of namespace 227a3ec5f4aSmatthiasgrimm if ($pn != $ns) { // are we already home? 228a3ec5f4aSmatthiasgrimm array_push($idparts, $ns, $ns); // no, then add a page with same name 229a3ec5f4aSmatthiasgrimm $ID = implode (':', $idparts); // as the namespace and recombine $ID 230a3ec5f4aSmatthiasgrimm break; 231a3ec5f4aSmatthiasgrimm } 232a3ec5f4aSmatthiasgrimm } 233a3ec5f4aSmatthiasgrimm } 234a3ec5f4aSmatthiasgrimm 235a3ec5f4aSmatthiasgrimm if (@file_exists(wikiFN($ID))) { 236a3ec5f4aSmatthiasgrimm return $ID; 237a3ec5f4aSmatthiasgrimm } 238a3ec5f4aSmatthiasgrimm } 239a3ec5f4aSmatthiasgrimm return false; 240a3ec5f4aSmatthiasgrimm} 241a3ec5f4aSmatthiasgrimm 242a3ec5f4aSmatthiasgrimm/** 2436b13307fSandi * Print one of the buttons 2446b13307fSandi * 2456b13307fSandi * Available Buttons are 2466b13307fSandi * 2476b13307fSandi * edit - edit/create/show button 2486b13307fSandi * history - old revisions 2496b13307fSandi * recent - recent changes 2506b13307fSandi * login - login/logout button - if ACL enabled 2516b13307fSandi * index - The index 252c19fe9c0Sandi * admin - admin page - if enough rights 2536b13307fSandi * top - a back to top button 254a3ec5f4aSmatthiasgrimm * back - a back to parent button - if available 255d67ca2c0Smatthiasgrimm * backtomedia - returns to the mediafile upload dialog 256d67ca2c0Smatthiasgrimm * after references have been displayed 2576b13307fSandi * 2586b13307fSandi * @author Andreas Gohr <andi@splitbrain.org> 259a3ec5f4aSmatthiasgrimm * @author Matthias Grimm <matthiasgrimm@users.sourceforge.net> 2606b13307fSandi */ 2616b13307fSandifunction tpl_button($type){ 2626b13307fSandi global $ID; 263d67ca2c0Smatthiasgrimm global $NS; 264c19fe9c0Sandi global $INFO; 2656b13307fSandi global $conf; 2666b13307fSandi 2676b13307fSandi switch($type){ 2686b13307fSandi case 'edit': 2696b13307fSandi print html_editbutton(); 2706b13307fSandi break; 2716b13307fSandi case 'history': 2725bc81eb9SAnders Betnér print html_btn('revs',$ID,'o',array('do' => 'revisions')); 2736b13307fSandi break; 2746b13307fSandi case 'recent': 2755bc81eb9SAnders Betnér print html_btn('recent','','r',array('do' => 'recent')); 2766b13307fSandi break; 2776b13307fSandi case 'index': 2785bc81eb9SAnders Betnér print html_btn('index',$ID,'x',array('do' => 'index')); 2796b13307fSandi break; 280a3ec5f4aSmatthiasgrimm case 'back': 281a3ec5f4aSmatthiasgrimm if ($ID = tpl_getparent($ID)) { 2825bc81eb9SAnders Betnér print html_btn('back',$ID,'b',array('do' => 'show')); 283a3ec5f4aSmatthiasgrimm } 284a3ec5f4aSmatthiasgrimm break; 2856b13307fSandi case 'top': 2866b13307fSandi print html_topbtn(); 2876b13307fSandi break; 2886b13307fSandi case 'login': 2896b13307fSandi if($conf['useacl']){ 2906b13307fSandi if($_SERVER['REMOTE_USER']){ 2916b13307fSandi print html_btn('logout',$ID,'',array('do' => 'logout',)); 2926b13307fSandi }else{ 2936b13307fSandi print html_btn('login',$ID,'',array('do' => 'login')); 2946b13307fSandi } 2956b13307fSandi } 2966b13307fSandi break; 297c19fe9c0Sandi case 'admin': 298c19fe9c0Sandi if($INFO['perm'] == AUTH_ADMIN) 2995bc81eb9SAnders Betnér print html_btn('admin',$ID,'',array('do' => 'admin')); 300c19fe9c0Sandi break; 301d67ca2c0Smatthiasgrimm case 'backtomedia': 302d67ca2c0Smatthiasgrimm print html_backtomedia_button(array('ns' => $NS),'b'); 303d67ca2c0Smatthiasgrimm break; 304c19fe9c0Sandi default: 305c19fe9c0Sandi print '[unknown button type]'; 3066b13307fSandi } 3076b13307fSandi} 3086b13307fSandi 3096b13307fSandi/** 310ed630903Sandi * Like the action buttons but links 311ed630903Sandi * 312ed630903Sandi * Available links are 313ed630903Sandi * 314ed630903Sandi * edit - edit/create/show button 315ed630903Sandi * history - old revisions 316ed630903Sandi * recent - recent changes 317ed630903Sandi * login - login/logout button - if ACL enabled 318ed630903Sandi * index - The index 319ed630903Sandi * admin - admin page - if enough rights 320ed630903Sandi * top - a back to top button 321a3ec5f4aSmatthiasgrimm * back - a back to parent button - if available 322ed630903Sandi * 323ed630903Sandi * @author Andreas Gohr <andi@splitbrain.org> 324a3ec5f4aSmatthiasgrimm * @author Matthias Grimm <matthiasgrimm@users.sourceforge.net> 325ed630903Sandi * @see tpl_button 326ed630903Sandi */ 327ed630903Sandifunction tpl_actionlink($type,$pre='',$suf=''){ 328ed630903Sandi global $ID; 329ed630903Sandi global $INFO; 330ed630903Sandi global $REV; 331ed630903Sandi global $ACT; 332ed630903Sandi global $conf; 333ed630903Sandi global $lang; 334ed630903Sandi 335ed630903Sandi switch($type){ 336ed630903Sandi case 'edit': 337ed630903Sandi #most complicated type - we need to decide on current action 338ed630903Sandi if($ACT == 'show' || $ACT == 'search'){ 339ed630903Sandi if($INFO['writable']){ 340ed630903Sandi if($INFO['exists']){ 341ed630903Sandi tpl_link(wl($ID,'do=edit&rev='.$REV), 342ed630903Sandi $pre.$lang['btn_edit'].$suf, 343ed630903Sandi 'class="action" accesskey="e" rel="nofollow"'); 344ed630903Sandi }else{ 345ed630903Sandi tpl_link(wl($ID,'do=edit&rev='.$REV), 346ed630903Sandi $pre.$lang['btn_create'].$suf, 347ed630903Sandi 'class="action" accesskey="e" rel="nofollow"'); 348ed630903Sandi } 349ed630903Sandi }else{ 350ed630903Sandi tpl_link(wl($ID,'do=edit&rev='.$REV), 351ed630903Sandi $pre.$lang['btn_source'].$suf, 352ed630903Sandi 'class="action" accesskey="v" rel="nofollow"'); 353ed630903Sandi } 354ed630903Sandi }else{ 355ed630903Sandi tpl_link(wl($ID,'do=show'), 356ed630903Sandi $pre.$lang['btn_show'].$suf, 357ed630903Sandi 'class="action" accesskey="v" rel="nofollow"'); 358ed630903Sandi } 359ed630903Sandi break; 360ed630903Sandi case 'history': 361ed630903Sandi tpl_link(wl($ID,'do=revisions'),$pre.$lang['btn_revs'].$suf,'class="action" accesskey="o"'); 362ed630903Sandi break; 363ed630903Sandi case 'recent': 364ed630903Sandi tpl_link(wl($ID,'do=recent'),$pre.$lang['btn_recent'].$suf,'class="action" accesskey="r"'); 365ed630903Sandi break; 366ed630903Sandi case 'index': 367ed630903Sandi tpl_link(wl($ID,'do=index'),$pre.$lang['btn_index'].$suf,'class="action" accesskey="x"'); 368ed630903Sandi break; 369ed630903Sandi case 'top': 370ed630903Sandi print '<a href="#top" class="action" accesskey="x">'.$pre.$lang['btn_top'].$suf.'</a>'; 371ed630903Sandi break; 372a3ec5f4aSmatthiasgrimm case 'back': 373a3ec5f4aSmatthiasgrimm if ($ID = tpl_getparent($ID)) { 374a3ec5f4aSmatthiasgrimm tpl_link(wl($ID,'do=show'),$pre.$lang['btn_back'].$suf,'class="action" accesskey="b"'); 375a3ec5f4aSmatthiasgrimm } 376a3ec5f4aSmatthiasgrimm break; 377ed630903Sandi case 'login': 378ed630903Sandi if($conf['useacl']){ 379ed630903Sandi if($_SERVER['REMOTE_USER']){ 380ed630903Sandi tpl_link(wl($ID,'do=logout'),$pre.$lang['btn_logout'].$suf,'class="action"'); 381ed630903Sandi }else{ 382ed630903Sandi tpl_link(wl($ID,'do=login'),$pre.$lang['btn_login'].$suf,'class="action"'); 383ed630903Sandi } 384ed630903Sandi } 385ed630903Sandi break; 386ed630903Sandi case 'admin': 387ed630903Sandi if($INFO['perm'] == AUTH_ADMIN) 388ed630903Sandi tpl_link(wl($ID,'do=admin'),$pre.$lang['btn_admin'].$suf,'class="action"'); 389ed630903Sandi break; 390ed630903Sandi default: 391ed630903Sandi print '[unknown link type]'; 392ed630903Sandi } 393ed630903Sandi} 394ed630903Sandi 395ed630903Sandi/** 3966b13307fSandi * Print the search form 3976b13307fSandi * 3986b13307fSandi * @author Andreas Gohr <andi@splitbrain.org> 3996b13307fSandi */ 4006b13307fSandifunction tpl_searchform(){ 4016b13307fSandi global $lang; 402c1e3b7d9Smatthiasgrimm global $ACT; 403c1e3b7d9Smatthiasgrimm 40432c04430Sandi print '<form action="'.wl().'" accept-charset="utf-8" class="search" name="search" onsubmit="return svchk()">'; 4056b13307fSandi print '<input type="hidden" name="do" value="search" />'; 406c1e3b7d9Smatthiasgrimm print '<input type="text" '; 407c1e3b7d9Smatthiasgrimm 408c1e3b7d9Smatthiasgrimm if ($ACT == 'search') 409c1e3b7d9Smatthiasgrimm print 'value="'.$_REQUEST['id'].'" '; /* keep search input as long as user stays on search page */ 410c1e3b7d9Smatthiasgrimm 411c1e3b7d9Smatthiasgrimm print 'id="qsearch_in" accesskey="f" name="id" class="edit" onkeyup="ajax_qsearch.call(\'qsearch_in\',\'qsearch_out\')" />'; 4126b13307fSandi print '<input type="submit" value="'.$lang['btn_search'].'" class="button" />'; 4139a3ea4f8Sandi print '<div id="qsearch_out" class="ajax_qsearch" onclick="this.style.display=\'none\'"></div>'; 4146b13307fSandi print '</form>'; 4156b13307fSandi} 4166b13307fSandi 4176b13307fSandi/** 4186b13307fSandi * Print the breadcrumbs trace 4196b13307fSandi * 4206b13307fSandi * @author Andreas Gohr <andi@splitbrain.org> 4216b13307fSandi */ 4226b13307fSandifunction tpl_breadcrumbs(){ 4236b13307fSandi global $lang; 4246b13307fSandi global $conf; 4256b13307fSandi 4266b13307fSandi //check if enabled 4276b13307fSandi if(!$conf['breadcrumbs']) return; 4286b13307fSandi 4296b13307fSandi $crumbs = breadcrumbs(); //setup crumb trace 430265e3787Sandi 431265e3787Sandi //reverse crumborder in right-to-left mode 432265e3787Sandi if($lang['direction'] == 'rtl') $crumbs = array_reverse($crumbs,true); 433265e3787Sandi 43440eb54bbSjan //render crumbs, highlight the last one 4356b13307fSandi print $lang['breadcrumb'].':'; 43640eb54bbSjan $last = count($crumbs); 43740eb54bbSjan $i = 0; 438a77f5846Sjan foreach ($crumbs as $id => $name){ 43940eb54bbSjan $i++; 440265e3787Sandi print ' <span class="bcsep">»</span> '; 44192795d04Sandi if ($i == $last) print '<span class="curid">'; 442a77f5846Sjan tpl_link(wl($id),$name,'class="breadcrumbs" title="'.$id.'"'); 44392795d04Sandi if ($i == $last) print '</span>'; 4446b13307fSandi } 4456b13307fSandi} 4466b13307fSandi 4476b13307fSandi/** 4481734437eSandi * Hierarchical breadcrumbs 4491734437eSandi * 4501734437eSandi * This code was suggested as replacement for the usual breadcrumbs 4511734437eSandi * trail in the Wiki and was modified by me. 4521734437eSandi * It only makes sense with a deep site structure. 4531734437eSandi * 4541734437eSandi * @author Andreas Gohr <andi@splitbrain.org> 4551734437eSandi * @link http://wiki.splitbrain.org/wiki:tipsandtricks:hierarchicalbreadcrumbs 456265e3787Sandi * @todo May behave starngely in RTL languages 4571734437eSandi */ 4581734437eSandifunction tpl_youarehere(){ 4591734437eSandi global $conf; 4601734437eSandi global $ID; 4611734437eSandi global $lang; 4621734437eSandi 4631734437eSandi 4641734437eSandi $parts = explode(':', $ID); 4651734437eSandi 4661734437eSandi print $lang['breadcrumb'].': '; 4671734437eSandi 4681734437eSandi //always print the startpage 4691734437eSandi if( $a_part[0] != $conf['start'] ) 4701734437eSandi tpl_link(wl($conf['start']),$conf['start'],'title="'.$conf['start'].'"'); 4711734437eSandi 4721734437eSandi $page = ''; 4731734437eSandi foreach ($parts as $part){ 4741734437eSandi print ' » '; 4751734437eSandi $page .= $part; 4761734437eSandi 4771734437eSandi if(file_exists(wikiFN($page))){ 4781734437eSandi tpl_link(wl($page),$part,'title="'.$page.'"'); 4791734437eSandi }else{ 4801734437eSandi print $page; 4811734437eSandi } 4821734437eSandi 4831734437eSandi $page .= ':'; 4841734437eSandi } 4851734437eSandi} 4861734437eSandi 4871734437eSandi/** 4886b13307fSandi * Print info if the user is logged in 489a2488c3cSMatthias Grimm * and show full name in that case 4906b13307fSandi * 4916b13307fSandi * Could be enhanced with a profile link in future? 4926b13307fSandi * 4936b13307fSandi * @author Andreas Gohr <andi@splitbrain.org> 4946b13307fSandi */ 4956b13307fSandifunction tpl_userinfo(){ 4966b13307fSandi global $lang; 497a2488c3cSMatthias Grimm global $INFO; 4986b13307fSandi if($_SERVER['REMOTE_USER']) 499a2488c3cSMatthias Grimm print $lang['loggedinas'].': '.$INFO['userinfo']['name']; 5006b13307fSandi} 5016b13307fSandi 5026b13307fSandi/** 5036b13307fSandi * Print some info about the current page 5046b13307fSandi * 5056b13307fSandi * @author Andreas Gohr <andi@splitbrain.org> 5066b13307fSandi */ 5076b13307fSandifunction tpl_pageinfo(){ 5086b13307fSandi global $conf; 5096b13307fSandi global $lang; 5106b13307fSandi global $INFO; 5116b13307fSandi global $REV; 5126b13307fSandi 5136b13307fSandi // prepare date and path 5146b13307fSandi $fn = $INFO['filepath']; 5156b13307fSandi if(!$conf['fullpath']){ 5166b13307fSandi if($REV){ 5176b13307fSandi $fn = str_replace(realpath($conf['olddir']).DIRECTORY_SEPARATOR,'',$fn); 5186b13307fSandi }else{ 5196b13307fSandi $fn = str_replace(realpath($conf['datadir']).DIRECTORY_SEPARATOR,'',$fn); 5206b13307fSandi } 5216b13307fSandi } 522bee6dc82Sandi $fn = utf8_decodeFN($fn); 5236b13307fSandi $date = date($conf['dformat'],$INFO['lastmod']); 5246b13307fSandi 5256b13307fSandi // print it 5266b13307fSandi if($INFO['exists']){ 5276b13307fSandi print $fn; 5286b13307fSandi print ' · '; 5296b13307fSandi print $lang['lastmod']; 5306b13307fSandi print ': '; 5316b13307fSandi print $date; 5326b13307fSandi if($INFO['editor']){ 5336b13307fSandi print ' '.$lang['by'].' '; 5346b13307fSandi print $INFO['editor']; 5356b13307fSandi } 5366b13307fSandi if($INFO['locked']){ 5376b13307fSandi print ' · '; 5386b13307fSandi print $lang['lockedby']; 5396b13307fSandi print ': '; 5406b13307fSandi print $INFO['locked']; 5416b13307fSandi } 5426b13307fSandi } 5436b13307fSandi} 5446b13307fSandi 545820fa24bSandi/** 546820fa24bSandi * Print a list of namespaces containing media files 547820fa24bSandi * 548820fa24bSandi * @author Andreas Gohr <andi@splitbrain.org> 549820fa24bSandi */ 550820fa24bSandifunction tpl_medianamespaces(){ 551820fa24bSandi global $conf; 552820fa24bSandi 553820fa24bSandi $data = array(); 554820fa24bSandi search($data,$conf['mediadir'],'search_namespaces',array()); 555820fa24bSandi print html_buildlist($data,'idx',media_html_list_namespaces); 556820fa24bSandi} 557820fa24bSandi 558820fa24bSandi/** 559820fa24bSandi * Print a list of mediafiles in the current namespace 560820fa24bSandi * 561820fa24bSandi * @author Andreas Gohr <andi@splitbrain.org> 562820fa24bSandi */ 563820fa24bSandifunction tpl_mediafilelist(){ 564820fa24bSandi global $conf; 565820fa24bSandi global $lang; 566820fa24bSandi global $NS; 5678ef6b7caSandi global $AUTH; 568820fa24bSandi $dir = utf8_encodeFN(str_replace(':','/',$NS)); 569820fa24bSandi 570820fa24bSandi $data = array(); 571820fa24bSandi search($data,$conf['mediadir'],'search_media',array(),$dir); 572820fa24bSandi 573820fa24bSandi if(!count($data)){ 574820fa24bSandi ptln('<div class="nothing">'.$lang['nothingfound'].'<div>'); 575820fa24bSandi return; 576820fa24bSandi } 577820fa24bSandi 578820fa24bSandi ptln('<ul>',2); 579820fa24bSandi foreach($data as $item){ 580820fa24bSandi ptln('<li>',4); 581820fa24bSandi ptln('<a href="javascript:mediaSelect(\''.$item['id'].'\')">'. 582820fa24bSandi utf8_decodeFN($item['file']). 583820fa24bSandi '</a>',6); 5848ef6b7caSandi 5858ef6b7caSandi //prepare deletion button 5868ef6b7caSandi if($AUTH >= AUTH_DELETE){ 5878ef6b7caSandi $ask = $lang['del_confirm'].'\\n'; 5888ef6b7caSandi $ask .= $item['id']; 5898ef6b7caSandi 590f62ea8a1Sandi $del = '<a href="'.DOKU_BASE.'lib/exe/media.php?delete='.urlencode($item['id']).'" '. 5918ef6b7caSandi 'onclick="return confirm(\''.$ask.'\')" onkeypress="return confirm(\''.$ask.'\')">'. 592f62ea8a1Sandi '<img src="'.DOKU_BASE.'lib/images/del.png" alt="'.$lang['btn_delete'].'" '. 5938ef6b7caSandi 'align="bottom" title="'.$lang['btn_delete'].'" /></a>'; 5948ef6b7caSandi }else{ 5958ef6b7caSandi $del = ''; 5968ef6b7caSandi } 5978ef6b7caSandi 598820fa24bSandi if($item['isimg']){ 5999fcd3d1dSandi $w = $item['info'][0]; 6009fcd3d1dSandi $h = $item['info'][1]; 601820fa24bSandi 6028ef6b7caSandi ptln('('.$w.'×'.$h.' '.filesize_h($item['size']).')',6); 6038ef6b7caSandi ptln($del.'<br />',6); 6049fcd3d1dSandi ptln('<a href="javascript:mediaSelect(\''.$item['id'].'\')">'); 6059fcd3d1dSandi 6069fcd3d1dSandi if($w>120){ 607f62ea8a1Sandi print '<img src="'.DOKU_BASE.'lib/exe/fetch.php?w=120&media='.urlencode($item['id']).'" width="120" />'; 6089fcd3d1dSandi }else{ 609f62ea8a1Sandi print '<img src="'.DOKU_BASE.'lib/exe/fetch.php?media='.urlencode($item['id']).'" width="'.$w.'" height="'.$h.'" />'; 6109fcd3d1dSandi } 6119fcd3d1dSandi print '</a>'; 612820fa24bSandi 613820fa24bSandi }else{ 614820fa24bSandi ptln ('('.filesize_h($item['size']).')',6); 6158ef6b7caSandi ptln($del,6); 616820fa24bSandi } 617820fa24bSandi ptln('</li>',4); 618820fa24bSandi } 619820fa24bSandi ptln('</ul>',2); 620820fa24bSandi} 621820fa24bSandi 622820fa24bSandi/** 623d67ca2c0Smatthiasgrimm * show references to a media file 624d67ca2c0Smatthiasgrimm * References uses the same visual as search results and share 625d67ca2c0Smatthiasgrimm * their CSS tags except pagenames won't be links. 626d67ca2c0Smatthiasgrimm * 627d67ca2c0Smatthiasgrimm * @author Matthias Grimm <matthiasgrimm@users.sourceforge.net> 628d67ca2c0Smatthiasgrimm */ 629d67ca2c0Smatthiasgrimmfunction tpl_showreferences(&$data){ 630d67ca2c0Smatthiasgrimm global $lang; 631d67ca2c0Smatthiasgrimm 632d67ca2c0Smatthiasgrimm $hidden=0; //count of hits without read permission 633d67ca2c0Smatthiasgrimm 634d67ca2c0Smatthiasgrimm if(count($data)){ 635d67ca2c0Smatthiasgrimm usort($data,'sort_search_fulltext'); 636d67ca2c0Smatthiasgrimm foreach($data as $row){ 637d67ca2c0Smatthiasgrimm if(auth_quickaclcheck($row['id']) >= AUTH_READ){ 638d67ca2c0Smatthiasgrimm print '<div class="search_result">'; 639d67ca2c0Smatthiasgrimm print '<span class="mediaref_ref">'.$row['id'].'</span>'; 640d67ca2c0Smatthiasgrimm print ': <span class="search_cnt">'.$row['count'].' '.$lang['hits'].'</span><br />'; 641d67ca2c0Smatthiasgrimm print '<div class="search_snippet">'.$row['snippet'].'</div>'; 642d67ca2c0Smatthiasgrimm print '</div>'; 643d67ca2c0Smatthiasgrimm }else 644d67ca2c0Smatthiasgrimm $hidden++; 645d67ca2c0Smatthiasgrimm } 646d67ca2c0Smatthiasgrimm if ($hidden){ 647d67ca2c0Smatthiasgrimm print '<div class="mediaref_hidden">'.$lang['ref_hidden'].'</div>'; 648d67ca2c0Smatthiasgrimm } 649d67ca2c0Smatthiasgrimm } 650d67ca2c0Smatthiasgrimm} 651d67ca2c0Smatthiasgrimm 652d67ca2c0Smatthiasgrimm/** 653820fa24bSandi * Print the media upload form if permissions are correct 654820fa24bSandi * 655820fa24bSandi * @author Andreas Gohr <andi@splitbrain.org> 656820fa24bSandi */ 657820fa24bSandifunction tpl_mediauploadform(){ 658820fa24bSandi global $NS; 659820fa24bSandi global $UPLOADOK; 6608ef6b7caSandi global $AUTH; 661820fa24bSandi global $lang; 662820fa24bSandi 663820fa24bSandi if(!$UPLOADOK) return; 664820fa24bSandi 6658dd5e97bSandi ptln('<form action="'.DOKU_BASE.'lib/exe/media.php" name="upload"'. 666820fa24bSandi ' method="post" enctype="multipart/form-data">',2); 667820fa24bSandi ptln($lang['txt_upload'].':<br />',4); 668820fa24bSandi ptln('<input type="file" name="upload" class="edit" onchange="suggestWikiname();" />',4); 669820fa24bSandi ptln('<input type="hidden" name="ns" value="'.hsc($NS).'" /><br />',4); 670820fa24bSandi ptln($lang['txt_filename'].'<br />',4); 671820fa24bSandi ptln('<input type="text" name="id" class="edit" />',4); 672820fa24bSandi ptln('<input type="submit" class="button" value="'.$lang['btn_upload'].'" accesskey="s" />',4); 6738ef6b7caSandi if($AUTH >= AUTH_DELETE){ 6748ef6b7caSandi ptln('<label for="ow" class="simple"><input type="checkbox" name="ow" value="1" id="ow">'.$lang['txt_overwrt'].'</label>',4); 6758ef6b7caSandi } 676820fa24bSandi ptln('</form>',2); 677820fa24bSandi} 678820fa24bSandi 679*87c434ceSAndreas Gohr/** 680*87c434ceSAndreas Gohr * Prints the name of the given page (current one if none given). 681*87c434ceSAndreas Gohr * 682*87c434ceSAndreas Gohr * If useheading is enabled this will use the first headline else 683*87c434ceSAndreas Gohr * the given ID is printed. 684*87c434ceSAndreas Gohr * 685*87c434ceSAndreas Gohr * @author Andreas Gohr <andi@splitbrain.org> 686*87c434ceSAndreas Gohr */ 687*87c434ceSAndreas Gohrfunction tpl_pagetitle($id=null){ 688*87c434ceSAndreas Gohr global $conf; 689*87c434ceSAndreas Gohr if(is_null($id)){ 690*87c434ceSAndreas Gohr global $ID; 691*87c434ceSAndreas Gohr $id = $ID; 692*87c434ceSAndreas Gohr } 693*87c434ceSAndreas Gohr 694*87c434ceSAndreas Gohr $name = $id; 695*87c434ceSAndreas Gohr if ($conf['useheading']) { 696*87c434ceSAndreas Gohr $title = p_get_first_heading($id); 697*87c434ceSAndreas Gohr if ($title) $name = $title; 698*87c434ceSAndreas Gohr } 699*87c434ceSAndreas Gohr print hsc($name); 700*87c434ceSAndreas Gohr} 701340756e4Sandi 702340756e4Sandi//Setup VIM: ex: et ts=2 enc=utf-8 : 703