1ed7b5f09Sandi<?php 215fae107Sandi/** 315fae107Sandi * HTML output functions 415fae107Sandi * 515fae107Sandi * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) 615fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 715fae107Sandi */ 815fae107Sandi 90c3a5702SAndreas Gohruse dokuwiki\ChangeLog\MediaChangeLog; 100c3a5702SAndreas Gohruse dokuwiki\ChangeLog\PageChangeLog; 11e1d9dcc8SAndreas Gohruse dokuwiki\Extension\AuthPlugin; 12cbb44eabSAndreas Gohruse dokuwiki\Extension\Event; 130c3a5702SAndreas Gohr 142d3b082eSMichael Großeif (!defined('SEC_EDIT_PATTERN')) { 1537c80e0eSLarsDW223 define('SEC_EDIT_PATTERN', '#<!-- EDIT({.*?}) -->#'); 162d3b082eSMichael Große} 172d3b082eSMichael Große 186bbae538Sandi 19f3f0262cSandi/** 20f3f0262cSandi * Convenience function to quickly build a wikilink 2115fae107Sandi * 2215fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 238d5e837eSMichael Hamann * @param string $id id of the target page 248d5e837eSMichael Hamann * @param string $name the name of the link, i.e. the text that is displayed 258d5e837eSMichael Hamann * @param string|array $search search string(s) that shall be highlighted in the target page 268d5e837eSMichael Hamann * @return string the HTML code of the link 27f3f0262cSandi */ 28db959ae3SAndreas Gohrfunction html_wikilink($id, $name = null, $search = '') { 29a8397511SGerrit Uitslag /** @var Doku_Renderer_xhtml $xhtml_renderer */ 30db959ae3SAndreas Gohr static $xhtml_renderer = null; 31723d78dbSandi if (is_null($xhtml_renderer)) { 327aea91afSChris Smith $xhtml_renderer = p_get_renderer('xhtml'); 33f3f0262cSandi } 34f3f0262cSandi 35fe9ec250SChris Smith return $xhtml_renderer->internallink($id,$name,$search,true,'navigation'); 36f3f0262cSandi} 37f3f0262cSandi 38f3f0262cSandi/** 39f3f0262cSandi * The loginform 4015fae107Sandi * 4115fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 42d1d904bbSMichael Große * 43d1d904bbSMichael Große * @param bool $svg Whether to show svg icons in the register and resendpwd links or not 44bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18 45f3f0262cSandi */ 46d1d904bbSMichael Großefunction html_login($svg = false) { 47bab2b7f0SSatoshi Sahara (new dokuwiki\Ui\Login($svg))->show(); 48f3f0262cSandi} 49f3f0262cSandi 50d59dea9fSGerrit Uitslag 51d59dea9fSGerrit Uitslag/** 52d59dea9fSGerrit Uitslag * Denied page content 53d59dea9fSGerrit Uitslag * 54d59dea9fSGerrit Uitslag * @return string html 55*7afe5d93SSatoshi Sahara * @deprecated 2020-07-18 not called anymore, see inc/Action/Denied::tplContent() 56d59dea9fSGerrit Uitslag */ 57d59dea9fSGerrit Uitslagfunction html_denied() { 58d59dea9fSGerrit Uitslag} 59d59dea9fSGerrit Uitslag 60f3f0262cSandi/** 6115fae107Sandi * inserts section edit buttons if wanted or removes the markers 6215fae107Sandi * 6315fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 6442ea7f44SGerrit Uitslag * 6542ea7f44SGerrit Uitslag * @param string $text 6642ea7f44SGerrit Uitslag * @param bool $show show section edit buttons? 6742ea7f44SGerrit Uitslag * @return string 6815fae107Sandi */ 69f3f0262cSandifunction html_secedit($text, $show = true) { 70f3f0262cSandi global $INFO; 7135dae8b0SBen Coburn 72aac83cd4SPhy if ((isset($INFO) && !$INFO['writable']) || !$show || (isset($INFO) && $INFO['rev'])) { 732d3b082eSMichael Große return preg_replace(SEC_EDIT_PATTERN,'',$text); 74f3f0262cSandi } 7535dae8b0SBen Coburn 762d3b082eSMichael Große return preg_replace_callback(SEC_EDIT_PATTERN, 7740868f2fSAdrian Lang 'html_secedit_button', $text); 7840868f2fSAdrian Lang} 7940868f2fSAdrian Lang 8040868f2fSAdrian Lang/** 8140868f2fSAdrian Lang * prepares section edit button data for event triggering 8240868f2fSAdrian Lang * used as a callback in html_secedit 8340868f2fSAdrian Lang * 8440868f2fSAdrian Lang * @author Andreas Gohr <andi@splitbrain.org> 8542ea7f44SGerrit Uitslag * 8642ea7f44SGerrit Uitslag * @param array $matches matches with regexp 8742ea7f44SGerrit Uitslag * @return string 8842ea7f44SGerrit Uitslag * @triggers HTML_SECEDIT_BUTTON 8940868f2fSAdrian Lang */ 9040868f2fSAdrian Langfunction html_secedit_button($matches){ 91ada0d779SMichael Hamann $json = htmlspecialchars_decode($matches[1], ENT_QUOTES); 92ada0d779SMichael Hamann $data = json_decode($json, true); 93ec57f119SLarsDW223 if ($data == NULL) { 94ec57f119SLarsDW223 return; 9506917fceSMichael Große } 96ec57f119SLarsDW223 $data ['target'] = strtolower($data['target']); 97ec57f119SLarsDW223 $data ['hid'] = strtolower($data['hid']); 9840868f2fSAdrian Lang 99cbb44eabSAndreas Gohr return Event::createAndTrigger('HTML_SECEDIT_BUTTON', $data, 10040868f2fSAdrian Lang 'html_secedit_get_button'); 10140868f2fSAdrian Lang} 10240868f2fSAdrian Lang 10340868f2fSAdrian Lang/** 10440868f2fSAdrian Lang * prints a section editing button 10540868f2fSAdrian Lang * used as default action form HTML_SECEDIT_BUTTON 10640868f2fSAdrian Lang * 10740868f2fSAdrian Lang * @author Adrian Lang <lang@cosmocode.de> 10842ea7f44SGerrit Uitslag * 10942ea7f44SGerrit Uitslag * @param array $data name, section id and target 11042ea7f44SGerrit Uitslag * @return string html 11140868f2fSAdrian Lang */ 11240868f2fSAdrian Langfunction html_secedit_get_button($data) { 11340868f2fSAdrian Lang global $ID; 11440868f2fSAdrian Lang global $INFO; 11540868f2fSAdrian Lang 1166d9eab4dSMichael Hamann if (!isset($data['name']) || $data['name'] === '') return ''; 11740868f2fSAdrian Lang 11840868f2fSAdrian Lang $name = $data['name']; 11940868f2fSAdrian Lang unset($data['name']); 12040868f2fSAdrian Lang 121905fa971SAdrian Lang $secid = $data['secid']; 122905fa971SAdrian Lang unset($data['secid']); 123905fa971SAdrian Lang 124*7afe5d93SSatoshi Sahara $params = array_merge( 125*7afe5d93SSatoshi Sahara array('do' => 'edit', 'rev' => $INFO['lastmod'], 'summary' => '['.$name.'] '), 126*7afe5d93SSatoshi Sahara $data 127*7afe5d93SSatoshi Sahara ); 128*7afe5d93SSatoshi Sahara 129*7afe5d93SSatoshi Sahara $html = '<div class="secedit editbutton_'.$data['target'] .' editbutton_'.$secid .'">'; 130*7afe5d93SSatoshi Sahara $html.= html_btn('secedit', $ID, '', $params, 'post', $name); 131*7afe5d93SSatoshi Sahara $html.= '</div>'; 132*7afe5d93SSatoshi Sahara return $html; 133f3f0262cSandi} 134f3f0262cSandi 135f3f0262cSandi/** 136d6c9c552Smatthiasgrimm * Just the back to top button (in its own form) 1376b13307fSandi * 1386b13307fSandi * @author Andreas Gohr <andi@splitbrain.org> 13942ea7f44SGerrit Uitslag * 14042ea7f44SGerrit Uitslag * @return string html 1416b13307fSandi */ 1426b13307fSandifunction html_topbtn() { 1436b13307fSandi global $lang; 1446b13307fSandi 145*7afe5d93SSatoshi Sahara $html = '<a class="nolink" href="#dokuwiki__top">' 146*7afe5d93SSatoshi Sahara .'<button class="button" onclick="window.scrollTo(0, 0)" title="'. $lang['btn_top'] .'">' 147*7afe5d93SSatoshi Sahara . $lang['btn_top'] 148*7afe5d93SSatoshi Sahara .'</button></a>'; 149*7afe5d93SSatoshi Sahara return $html; 1506b13307fSandi} 1516b13307fSandi 1526b13307fSandi/** 153d67ca2c0Smatthiasgrimm * Displays a button (using its own form) 15435dae8b0SBen Coburn * If tooltip exists, the access key tooltip is replaced. 15515fae107Sandi * 15615fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 15742ea7f44SGerrit Uitslag * 15842ea7f44SGerrit Uitslag * @param string $name 15942ea7f44SGerrit Uitslag * @param string $id 16042ea7f44SGerrit Uitslag * @param string $akey access key 161e3710957SGerrit Uitslag * @param string[] $params key-value pairs added as hidden inputs 16242ea7f44SGerrit Uitslag * @param string $method 16342ea7f44SGerrit Uitslag * @param string $tooltip 16442ea7f44SGerrit Uitslag * @param bool|string $label label text, false: lookup btn_$name in localization 165e824d633SMichael Große * @param string $svg (optional) svg code, inserted into the button 16642ea7f44SGerrit Uitslag * @return string 167f3f0262cSandi */ 168e824d633SMichael Großefunction html_btn($name, $id, $akey, $params, $method = 'get', $tooltip = '', $label = false, $svg = null) { 169f3f0262cSandi global $conf; 170f3f0262cSandi global $lang; 171f3f0262cSandi 172f5baf821SAnika Henke if (!$label) 173f3f0262cSandi $label = $lang['btn_'.$name]; 174f3f0262cSandi 17549c713a3Sandi //filter id (without urlencoding) 17649c713a3Sandi $id = idfilter($id,false); 177f3f0262cSandi 178f3f0262cSandi //make nice URLs even for buttons 1796c7843b5Sandi if ($conf['userewrite'] == 2) { 1806c7843b5Sandi $script = DOKU_BASE.DOKU_SCRIPT.'/'.$id; 1816c7843b5Sandi } elseif ($conf['userewrite']) { 1826c7843b5Sandi $script = DOKU_BASE.$id; 1836c7843b5Sandi } else { 1848b00ebcfSandi $script = DOKU_BASE.DOKU_SCRIPT; 185f3f0262cSandi $params['id'] = $id; 186f3f0262cSandi } 187f3f0262cSandi 188*7afe5d93SSatoshi Sahara $html = '<form class="button btn_'.$name.'" method="'.$method.'" action="'.$script.'"><div class="no">'; 189f3f0262cSandi 19006a4bf8fSAndreas Gohr if (is_array($params)) { 1919e491c01SAndreas Gohr foreach ($params as $key => $val) { 192*7afe5d93SSatoshi Sahara $html .= '<input type="hidden" name="'.$key.'" value="'.hsc($val).'" />'; 193f3f0262cSandi } 19406a4bf8fSAndreas Gohr } 195f3f0262cSandi 196*7afe5d93SSatoshi Sahara $tip = empty($tooltip) ? hsc($label) : hsc($tooltip); 19711ea018fSAndreas Gohr 198*7afe5d93SSatoshi Sahara $html .= '<button type="submit" '; 19911ea018fSAndreas Gohr if ($akey) { 20007493d05SAnika Henke $tip .= ' ['.strtoupper($akey).']'; 201*7afe5d93SSatoshi Sahara $html .= 'accesskey="'.$akey.'" '; 20235dae8b0SBen Coburn } 203*7afe5d93SSatoshi Sahara $html .= 'title="'.$tip.'">'; 204e824d633SMichael Große if ($svg) { 205*7afe5d93SSatoshi Sahara $html .= '<span>'. hsc($label) .'</span>'. inlineSVG($svg); 206679dba01SMichael Große } else { 207*7afe5d93SSatoshi Sahara $html .= hsc($label); 208679dba01SMichael Große } 209*7afe5d93SSatoshi Sahara $html .= '</button>'; 210*7afe5d93SSatoshi Sahara $html .= '</div></form>'; 211f3f0262cSandi 212*7afe5d93SSatoshi Sahara return $html; 213f3f0262cSandi} 2140747f5d7Sghi/** 2150747f5d7Sghi * show a revision warning 2160747f5d7Sghi * 2170747f5d7Sghi * @author Szymon Olewniczak <dokuwiki@imz.re> 2180747f5d7Sghi */ 219c8556525Sghifunction html_showrev() { 220c8556525Sghi print p_locale_xhtml('showrev'); 2210747f5d7Sghi} 222f3f0262cSandi 223f3f0262cSandi/** 22442ea7f44SGerrit Uitslag * Show a wiki page 22515fae107Sandi * 22615fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 22742ea7f44SGerrit Uitslag * 22842ea7f44SGerrit Uitslag * @param null|string $txt wiki text or null for showing $ID 229bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18 23015fae107Sandi */ 23111c78c94SAndreas Gohrfunction html_show($txt=null) { 232bab2b7f0SSatoshi Sahara (new dokuwiki\Ui\PageView($txt))->show(); 233f3f0262cSandi} 234f3f0262cSandi 235f3f0262cSandi/** 236ee4c4a1bSAndreas Gohr * ask the user about how to handle an exisiting draft 237ee4c4a1bSAndreas Gohr * 238ee4c4a1bSAndreas Gohr * @author Andreas Gohr <andi@splitbrain.org> 239bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18 240ee4c4a1bSAndreas Gohr */ 241ee4c4a1bSAndreas Gohrfunction html_draft() { 242bab2b7f0SSatoshi Sahara (new dokuwiki\Ui\Draft)->show(); 243ee4c4a1bSAndreas Gohr} 244ee4c4a1bSAndreas Gohr 245ee4c4a1bSAndreas Gohr/** 246f3f0262cSandi * Highlights searchqueries in HTML code 24715fae107Sandi * 24815fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 2497209be23SAndreas Gohr * @author Harry Fuecks <hfuecks@gmail.com> 25042ea7f44SGerrit Uitslag * 25142ea7f44SGerrit Uitslag * @param string $html 25242ea7f44SGerrit Uitslag * @param array|string $phrases 25342ea7f44SGerrit Uitslag * @return string html 254f3f0262cSandi */ 255546d3a99SAndreas Gohrfunction html_hilight($html, $phrases) { 2568a803caeSAndreas Gohr $phrases = (array) $phrases; 2578a803caeSAndreas Gohr $phrases = array_map('preg_quote_cb', $phrases); 2588a803caeSAndreas Gohr $phrases = array_map('ft_snippet_re_preprocess', $phrases); 2598a803caeSAndreas Gohr $phrases = array_filter($phrases); 2608a803caeSAndreas Gohr $regex = join('|',$phrases); 26160c15d7dSAndreas Gohr 26260c15d7dSAndreas Gohr if ($regex === '') return $html; 2638cbc5ee8SAndreas Gohr if (!\dokuwiki\Utf8\Clean::isUtf8($regex)) return $html; 264f3f0262cSandi 265675d8ce4SSatoshi Sahara $html = @preg_replace_callback("/((<[^>]*)|$regex)/ui", function ($match) { 266675d8ce4SSatoshi Sahara $hlight = unslash($match[0]); 267675d8ce4SSatoshi Sahara if (!isset($match[2])) { 268688774a0SAnika Henke $hlight = '<span class="search_hit">'.$hlight.'</span>'; 2697209be23SAndreas Gohr } 2707209be23SAndreas Gohr return $hlight; 271675d8ce4SSatoshi Sahara }, $html); 272675d8ce4SSatoshi Sahara return $html; 2737209be23SAndreas Gohr} 2747209be23SAndreas Gohr 2757209be23SAndreas Gohr/** 27615fae107Sandi * Display error on locked pages 27715fae107Sandi * 27815fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 279*7afe5d93SSatoshi Sahara * @deprecated 2020-07-18 not called anymore, see inc/Action/Locked::tplContent() 28015fae107Sandi */ 281ee20e7d1Sandifunction html_locked() { 282f3f0262cSandi} 283f3f0262cSandi 28415fae107Sandi/** 28515fae107Sandi * list old revisions 28615fae107Sandi * 28715fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 28871726d78SBen Coburn * @author Ben Coburn <btcoburn@silicodon.net> 2898e69fd30SKate Arzamastseva * @author Kate Arzamastseva <pshns@ukr.net> 290e0c26282SGerrit Uitslag * 291e0c26282SGerrit Uitslag * @param int $first skip the first n changelog lines 292e0c26282SGerrit Uitslag * @param bool|string $media_id id of media, or false for current page 293bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18 29415fae107Sandi */ 2958e69fd30SKate Arzamastsevafunction html_revisions($first=0, $media_id = false) { 296bab2b7f0SSatoshi Sahara (new dokuwiki\Ui\Revisions($first, $media_id))->show(); 297f3f0262cSandi} 298f3f0262cSandi 29915fae107Sandi/** 30015fae107Sandi * display recent changes 30115fae107Sandi * 30215fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 3035749f1ceSmatthiasgrimm * @author Matthias Grimm <matthiasgrimm@users.sourceforge.net> 30471726d78SBen Coburn * @author Ben Coburn <btcoburn@silicodon.net> 3058d40b4b6SKate Arzamastseva * @author Kate Arzamastseva <pshns@ukr.net> 30642ea7f44SGerrit Uitslag * 30742ea7f44SGerrit Uitslag * @param int $first 30842ea7f44SGerrit Uitslag * @param string $show_changes 309bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18 31015fae107Sandi */ 3110739a638SKate Arzamastsevafunction html_recent($first = 0, $show_changes = 'both') { 312bab2b7f0SSatoshi Sahara (new dokuwiki\Ui\Recent($first, $show_changes))->show(); 313f3f0262cSandi} 314f3f0262cSandi 31515fae107Sandi/** 31615fae107Sandi * Display page index 31715fae107Sandi * 31815fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 31942ea7f44SGerrit Uitslag * 32042ea7f44SGerrit Uitslag * @param string $ns 321bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18 32215fae107Sandi */ 323f3f0262cSandifunction html_index($ns) { 324bab2b7f0SSatoshi Sahara (new dokuwiki\Ui\Index($ns))->show(); 325f3f0262cSandi} 326f3f0262cSandi 327f3f0262cSandi/** 32815fae107Sandi * Index item formatter 32915fae107Sandi * 330f3f0262cSandi * User function for html_buildlist() 33115fae107Sandi * 33215fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 33342ea7f44SGerrit Uitslag * 33442ea7f44SGerrit Uitslag * @param array $item 33542ea7f44SGerrit Uitslag * @return string 3369c8632b4SSatoshi Sahara * @deprecated 2020-07-18 337f3f0262cSandi */ 3389c8632b4SSatoshi Saharafunction html_list_index($item) { 3399c8632b4SSatoshi Sahara return (new dokuwiki\Ui\Index)->formatListItem($item); 340f3f0262cSandi} 341f3f0262cSandi 342f3f0262cSandi/** 343cb70c441Sandi * Index List item 344cb70c441Sandi * 345a1dee2b9SAdrian Lang * This user function is used in html_buildlist to build the 346cb70c441Sandi * <li> tags for namespaces when displaying the page index 347cb70c441Sandi * it gives different classes to opened or closed "folders" 348cb70c441Sandi * 349cb70c441Sandi * @author Andreas Gohr <andi@splitbrain.org> 35042ea7f44SGerrit Uitslag * 35142ea7f44SGerrit Uitslag * @param array $item 35242ea7f44SGerrit Uitslag * @return string html 3539c8632b4SSatoshi Sahara * @deprecated 2020-07-18 354cb70c441Sandi */ 3559c8632b4SSatoshi Saharafunction html_li_index($item) { 3569c8632b4SSatoshi Sahara return (new dokuwiki\Ui\Index)->tagListItem($item); 357cb70c441Sandi} 358cb70c441Sandi 359cb70c441Sandi/** 36015fae107Sandi * Build an unordered list 36115fae107Sandi * 362f3f0262cSandi * Build an unordered list from the given $data array 363f3f0262cSandi * Each item in the array has to have a 'level' property 364f3f0262cSandi * the item itself gets printed by the given $func user 365cb70c441Sandi * function. The second and optional function is used to 366cb70c441Sandi * print the <li> tag. Both user function need to accept 367cb70c441Sandi * a single item. 36815fae107Sandi * 369c5a8fd96SAndreas Gohr * Both user functions can be given as array to point to 370c5a8fd96SAndreas Gohr * a member of an object. 371c5a8fd96SAndreas Gohr * 37215fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 37380679bafSGerrit Uitslag * 37480679bafSGerrit Uitslag * @param array $data array with item arrays 37580679bafSGerrit Uitslag * @param string $class class of ul wrapper 37680679bafSGerrit Uitslag * @param callable $func callback to print an list item 377bde560b4SSatoshi Sahara * @param callable $lifunc (optional) callback to the opening li tag 378bde560b4SSatoshi Sahara * @param bool $forcewrapper (optional) Trigger building a wrapper ul if the first level is 379ae614416SAnika Henke * 0 (we have a root object) or 1 (just the root content) 38080679bafSGerrit Uitslag * @return string html of an unordered list 381f3f0262cSandi */ 382bde560b4SSatoshi Saharafunction html_buildlist($data, $class, $func, $lifunc = null, $forcewrapper = false) { 383a1dee2b9SAdrian Lang if (count($data) === 0) { 384a1dee2b9SAdrian Lang return ''; 385a1dee2b9SAdrian Lang } 386a1dee2b9SAdrian Lang 3872689c55fSMichael Große $firstElement = reset($data); 3882689c55fSMichael Große $start_level = $firstElement['level']; 3899e4f7880SAdrian Lang $level = $start_level; 3909c8632b4SSatoshi Sahara $html = ''; 391434f5921SHakan Sandell $open = 0; 3929e4f7880SAdrian Lang 393bde560b4SSatoshi Sahara // set callback function to build the <li> tag, formerly defined as html_li_default() 394bde560b4SSatoshi Sahara if (!is_callable($lifunc)) { 3959c8632b4SSatoshi Sahara $lifunc = function ($item) { 3969c8632b4SSatoshi Sahara return '<li class="level'.$item['level'].'">'; 3979c8632b4SSatoshi Sahara }; 398bde560b4SSatoshi Sahara } 399bde560b4SSatoshi Sahara 400f3f0262cSandi foreach ($data as $item) { 401f3f0262cSandi if ($item['level'] > $level) { 402f3f0262cSandi //open new list 403df52d0feSandi for ($i = 0; $i < ($item['level'] - $level); $i++) { 4049c8632b4SSatoshi Sahara if ($i) $html .= '<li class="clear">'; 4059c8632b4SSatoshi Sahara $html .= "\n".'<ul class="'.$class.'">'."\n"; 406434f5921SHakan Sandell $open++; 407df52d0feSandi } 408434f5921SHakan Sandell $level = $item['level']; 409434f5921SHakan Sandell 410f3f0262cSandi } elseif ($item['level'] < $level) { 411f3f0262cSandi //close last item 4129c8632b4SSatoshi Sahara $html .= '</li>'."\n"; 413434f5921SHakan Sandell while ($level > $item['level'] && $open > 0 ) { 414f3f0262cSandi //close higher lists 4159c8632b4SSatoshi Sahara $html .= '</ul>'."\n".'</li>'."\n"; 416434f5921SHakan Sandell $level--; 417434f5921SHakan Sandell $open--; 418f3f0262cSandi } 4199c8632b4SSatoshi Sahara } elseif ($html !== '') { 42087671313SHakan Sandell //close previous item 4219c8632b4SSatoshi Sahara $html .= '</li>'."\n"; 422f3f0262cSandi } 423f3f0262cSandi 424f3f0262cSandi //print item 4259c8632b4SSatoshi Sahara $html .= call_user_func($lifunc, $item); 4269c8632b4SSatoshi Sahara $html .= '<div class="li">'; 42734dbe711Schris 4289c8632b4SSatoshi Sahara $html .= call_user_func($func, $item); 4299c8632b4SSatoshi Sahara $html .= '</div>'; 430f3f0262cSandi } 431f3f0262cSandi 432f3f0262cSandi //close remaining items and lists 4339c8632b4SSatoshi Sahara $html .= '</li>'."\n"; 434434f5921SHakan Sandell while ($open-- > 0) { 4359c8632b4SSatoshi Sahara $html .= '</ul></li>'."\n"; 436434f5921SHakan Sandell } 437434f5921SHakan Sandell 438434f5921SHakan Sandell if ($forcewrapper || $start_level < 2) { 439434f5921SHakan Sandell // Trigger building a wrapper ul if the first level is 440434f5921SHakan Sandell // 0 (we have a root object) or 1 (just the root content) 4419c8632b4SSatoshi Sahara $html = "\n".'<ul class="'.$class.'">'."\n".$html.'</ul>'."\n"; 442f3f0262cSandi } 443f3f0262cSandi 4449c8632b4SSatoshi Sahara return $html; 445f3f0262cSandi} 446f3f0262cSandi 44715fae107Sandi/** 44815fae107Sandi * display backlinks 44915fae107Sandi * 45015fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 45111df47ecSMichael Klier * @author Michael Klier <chi@chimeric.de> 452bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18 45315fae107Sandi */ 454f3f0262cSandifunction html_backlinks() { 455bab2b7f0SSatoshi Sahara (new dokuwiki\Ui\Backlinks)->show(); 45695b451bcSAdrian Lang} 45795b451bcSAdrian Lang 45815fae107Sandi/** 45904e99fe1SGerrit Uitslag * Show diff 460baf0c3e5SGerrit Uitslag * between current page version and provided $text 461baf0c3e5SGerrit Uitslag * or between the revisions provided via GET or POST 46215fae107Sandi * 46315fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 464baf0c3e5SGerrit Uitslag * @param string $text when non-empty: compare with this text with most current version 46504e99fe1SGerrit Uitslag * @param bool $intro display the intro text 4668d5e837eSMichael Hamann * @param string $type type of the diff (inline or sidebyside) 467bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18 46815fae107Sandi */ 46972165381SAndreas Gohrfunction html_diff($text = '', $intro = true, $type = null) { 470bab2b7f0SSatoshi Sahara (new dokuwiki\Ui\Diff($text, $intro, $type))->show(); 471fcfecb69SChristopher Smith} 472fcfecb69SChristopher Smith 47315fae107Sandi/** 47415fae107Sandi * show warning on conflict detection 47515fae107Sandi * 47615fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 47742ea7f44SGerrit Uitslag * 47842ea7f44SGerrit Uitslag * @param string $text 47942ea7f44SGerrit Uitslag * @param string $summary 480bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18 48115fae107Sandi */ 482f3f0262cSandifunction html_conflict($text, $summary) { 483bab2b7f0SSatoshi Sahara (new dokuwiki\Ui\Conflict($text, $summary))->show(); 484f3f0262cSandi} 485f3f0262cSandi 486f3f0262cSandi/** 48715fae107Sandi * Prints the global message array 48815fae107Sandi * 48915fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 490f3f0262cSandi */ 491f3f0262cSandifunction html_msgarea() { 492cc58224cSMichael Hamann global $MSG, $MSG_shown; 4938d5e837eSMichael Hamann /** @var array $MSG */ 494cc58224cSMichael Hamann // store if the global $MSG has already been shown and thus HTML output has been started 495cc58224cSMichael Hamann $MSG_shown = true; 496cc58224cSMichael Hamann 497f3f0262cSandi if (!isset($MSG)) return; 498f3f0262cSandi 4994af9f0d4SAndreas Gohr $shown = array(); 500f3f0262cSandi foreach ($MSG as $msg) { 5014af9f0d4SAndreas Gohr $hash = md5($msg['msg']); 5024af9f0d4SAndreas Gohr if (isset($shown[$hash])) continue; // skip double messages 503f755f9abSChristopher Smith if (info_msg_allowed($msg)) { 504f3f0262cSandi print '<div class="'.$msg['lvl'].'">'; 505f3f0262cSandi print $msg['msg']; 506f3f0262cSandi print '</div>'; 507d3bae478SChristopher Smith } 5084af9f0d4SAndreas Gohr $shown[$hash] = 1; 509f3f0262cSandi } 510cc58224cSMichael Hamann 511cc58224cSMichael Hamann unset($GLOBALS['MSG']); 512f3f0262cSandi} 513f3f0262cSandi 514f3f0262cSandi/** 515f3f0262cSandi * Prints the registration form 51615fae107Sandi * 51715fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 518bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18 519f3f0262cSandi */ 520f3f0262cSandifunction html_register() { 521bab2b7f0SSatoshi Sahara (new dokuwiki\Ui\UserRegister)->show(); 522f3f0262cSandi} 523f3f0262cSandi 524f3f0262cSandi/** 5258b06d178Schris * Print the update profile form 5268b06d178Schris * 5278b06d178Schris * @author Christopher Smith <chris@jalakai.co.uk> 5288b06d178Schris * @author Andreas Gohr <andi@splitbrain.org> 529bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18 5308b06d178Schris */ 5318b06d178Schrisfunction html_updateprofile() { 532bab2b7f0SSatoshi Sahara (new dokuwiki\Ui\UserProfile)->show(); 5338b06d178Schris} 5348b06d178Schris 5358b06d178Schris/** 5367c4635c4SAdrian Lang * Preprocess edit form data 53715fae107Sandi * 53815fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 5392ffea8f2SAdrian Lang * 5402ffea8f2SAdrian Lang * @triggers HTML_EDITFORM_OUTPUT 541bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18 542f3f0262cSandi */ 5435a932e77SAdrian Langfunction html_edit() { 544bab2b7f0SSatoshi Sahara (new dokuwiki\Ui\Editor)->show(); 545b6912aeaSAndreas Gohr} 546b6912aeaSAndreas Gohr 547b6912aeaSAndreas Gohr/** 548f3f0262cSandi * prints some debug info 54915fae107Sandi * 55015fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 551f3f0262cSandi */ 552f3f0262cSandifunction html_debug() { 553f3f0262cSandi global $conf; 554d16a4edaSandi global $lang; 555e1d9dcc8SAndreas Gohr /** @var AuthPlugin $auth */ 5565298a619SAndreas Gohr global $auth; 557100a97e3SAndreas Gohr global $INFO; 558100a97e3SAndreas Gohr 55928fb55ffSandi //remove sensitive data 56028fb55ffSandi $cnf = $conf; 56124297a69SAndreas Gohr debug_guard($cnf); 562100a97e3SAndreas Gohr $nfo = $INFO; 56324297a69SAndreas Gohr debug_guard($nfo); 564100a97e3SAndreas Gohr $ses = $_SESSION; 56524297a69SAndreas Gohr debug_guard($ses); 566f3f0262cSandi 567f3f0262cSandi print '<html><body>'; 568f3f0262cSandi 569f3f0262cSandi print '<p>When reporting bugs please send all the following '; 570f3f0262cSandi print 'output as a mail to andi@splitbrain.org '; 571f3f0262cSandi print 'The best way to do this is to save this page in your browser</p>'; 572f3f0262cSandi 573100a97e3SAndreas Gohr print '<b>$INFO:</b><pre>'; 574100a97e3SAndreas Gohr print_r($nfo); 575100a97e3SAndreas Gohr print '</pre>'; 576100a97e3SAndreas Gohr 577f3f0262cSandi print '<b>$_SERVER:</b><pre>'; 578f3f0262cSandi print_r($_SERVER); 579f3f0262cSandi print '</pre>'; 580f3f0262cSandi 581f3f0262cSandi print '<b>$conf:</b><pre>'; 58228fb55ffSandi print_r($cnf); 583f3f0262cSandi print '</pre>'; 584f3f0262cSandi 585ed7b5f09Sandi print '<b>DOKU_BASE:</b><pre>'; 586ed7b5f09Sandi print DOKU_BASE; 587f3f0262cSandi print '</pre>'; 588f3f0262cSandi 589ed7b5f09Sandi print '<b>abs DOKU_BASE:</b><pre>'; 590ed7b5f09Sandi print DOKU_URL; 591ed7b5f09Sandi print '</pre>'; 592ed7b5f09Sandi 593ed7b5f09Sandi print '<b>rel DOKU_BASE:</b><pre>'; 594f3f0262cSandi print dirname($_SERVER['PHP_SELF']).'/'; 595f3f0262cSandi print '</pre>'; 596f3f0262cSandi 597f3f0262cSandi print '<b>PHP Version:</b><pre>'; 598f3f0262cSandi print phpversion(); 599f3f0262cSandi print '</pre>'; 600f3f0262cSandi 601f3f0262cSandi print '<b>locale:</b><pre>'; 602f3f0262cSandi print setlocale(LC_ALL,0); 603f3f0262cSandi print '</pre>'; 604f3f0262cSandi 605d16a4edaSandi print '<b>encoding:</b><pre>'; 606d16a4edaSandi print $lang['encoding']; 607d16a4edaSandi print '</pre>'; 608d16a4edaSandi 6095298a619SAndreas Gohr if ($auth) { 6105298a619SAndreas Gohr print '<b>Auth backend capabilities:</b><pre>'; 6112f46ade0SChristopher Smith foreach ($auth->getCapabilities() as $cando) { 612*7afe5d93SSatoshi Sahara print ' '.str_pad($cando,16) .' => '. (int)$auth->canDo($cando) . DOKU_LF; 6132f46ade0SChristopher Smith } 6145298a619SAndreas Gohr print '</pre>'; 6155298a619SAndreas Gohr } 6165298a619SAndreas Gohr 6173aa54d7cSAndreas Gohr print '<b>$_SESSION:</b><pre>'; 618100a97e3SAndreas Gohr print_r($ses); 6193aa54d7cSAndreas Gohr print '</pre>'; 6203aa54d7cSAndreas Gohr 621f3f0262cSandi print '<b>Environment:</b><pre>'; 622f3f0262cSandi print_r($_ENV); 623f3f0262cSandi print '</pre>'; 624f3f0262cSandi 625f3f0262cSandi print '<b>PHP settings:</b><pre>'; 626f3f0262cSandi $inis = ini_get_all(); 627f3f0262cSandi print_r($inis); 628f3f0262cSandi print '</pre>'; 629f3f0262cSandi 630e89b7c1eSChristopher Smith if (function_exists('apache_get_version')) { 63159bc3b48SGerrit Uitslag $apache = array(); 632e89b7c1eSChristopher Smith $apache['version'] = apache_get_version(); 633e89b7c1eSChristopher Smith 634e89b7c1eSChristopher Smith if (function_exists('apache_get_modules')) { 635e89b7c1eSChristopher Smith $apache['modules'] = apache_get_modules(); 636e89b7c1eSChristopher Smith } 637e89b7c1eSChristopher Smith print '<b>Apache</b><pre>'; 638e89b7c1eSChristopher Smith print_r($apache); 639e89b7c1eSChristopher Smith print '</pre>'; 640e89b7c1eSChristopher Smith } 641e89b7c1eSChristopher Smith 642f3f0262cSandi print '</body></html>'; 643f3f0262cSandi} 644f3f0262cSandi 64510271ce4SAndreas Gohr/** 6468b06d178Schris * Form to request a new password for an existing account 6478b06d178Schris * 6488b06d178Schris * @author Benoit Chesneau <benoit@bchesneau.info> 649cc204bbdSAndreas Gohr * @author Andreas Gohr <gohr@cosmocode.de> 650bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18 65111e2ce22Schris */ 6528b06d178Schrisfunction html_resendpwd() { 653bab2b7f0SSatoshi Sahara (new dokuwiki\Ui\UserResendPwd)->show(); 654cc204bbdSAndreas Gohr} 655cc204bbdSAndreas Gohr 656fdb8d77bSTom N Harris/** 657b8595a66SAndreas Gohr * Return the TOC rendered to XHTML 658b8595a66SAndreas Gohr * 659b8595a66SAndreas Gohr * @author Andreas Gohr <andi@splitbrain.org> 66042ea7f44SGerrit Uitslag * 66142ea7f44SGerrit Uitslag * @param array $toc 66242ea7f44SGerrit Uitslag * @return string html 663b8595a66SAndreas Gohr */ 664b8595a66SAndreas Gohrfunction html_TOC($toc) { 665b8595a66SAndreas Gohr if (!count($toc)) return ''; 666b8595a66SAndreas Gohr global $lang; 667b8595a66SAndreas Gohr $out = '<!-- TOC START -->'.DOKU_LF; 668158a5bffSDeathCamel57 $out .= '<div id="dw__toc" class="dw__toc">'.DOKU_LF; 66948722ac8SAnika Henke $out .= '<h3 class="toggle">'; 670b8595a66SAndreas Gohr $out .= $lang['toc']; 671d5acc30dSAnika Henke $out .= '</h3>'.DOKU_LF; 672d5acc30dSAnika Henke $out .= '<div>'.DOKU_LF; 673bde560b4SSatoshi Sahara $out .= html_buildlist($toc, 'toc', 'html_list_toc', null, true); 674b8595a66SAndreas Gohr $out .= '</div>'.DOKU_LF.'</div>'.DOKU_LF; 675b8595a66SAndreas Gohr $out .= '<!-- TOC END -->'.DOKU_LF; 676db959ae3SAndreas Gohr return $out; 677db959ae3SAndreas Gohr} 678b8595a66SAndreas Gohr 679b8595a66SAndreas Gohr/** 680b8595a66SAndreas Gohr * Callback for html_buildlist 68142ea7f44SGerrit Uitslag * 68242ea7f44SGerrit Uitslag * @param array $item 68342ea7f44SGerrit Uitslag * @return string html 684b8595a66SAndreas Gohr */ 685b8595a66SAndreas Gohrfunction html_list_toc($item) { 686c66972f2SAdrian Lang if (isset($item['hid'])){ 6877d91652aSAndreas Gohr $link = '#'.$item['hid']; 6887d91652aSAndreas Gohr } else { 6897d91652aSAndreas Gohr $link = $item['link']; 6907d91652aSAndreas Gohr } 6917d91652aSAndreas Gohr 692d5acc30dSAnika Henke return '<a href="'.$link.'">'.hsc($item['title']).'</a>'; 693b8595a66SAndreas Gohr} 694b8595a66SAndreas Gohr 695b8595a66SAndreas Gohr/** 696b8595a66SAndreas Gohr * Helper function to build TOC items 697b8595a66SAndreas Gohr * 698b8595a66SAndreas Gohr * Returns an array ready to be added to a TOC array 699b8595a66SAndreas Gohr * 700b8595a66SAndreas Gohr * @param string $link - where to link (if $hash set to '#' it's a local anchor) 701b8595a66SAndreas Gohr * @param string $text - what to display in the TOC 702b8595a66SAndreas Gohr * @param int $level - nesting level 703b8595a66SAndreas Gohr * @param string $hash - is prepended to the given $link, set blank if you want full links 7048d5e837eSMichael Hamann * @return array the toc item 705b8595a66SAndreas Gohr */ 706b8595a66SAndreas Gohrfunction html_mktocitem($link, $text, $level, $hash='#') { 707bde560b4SSatoshi Sahara return array( 708bde560b4SSatoshi Sahara 'link' => $hash.$link, 709b8595a66SAndreas Gohr 'title' => $text, 710b8595a66SAndreas Gohr 'type' => 'ul', 711bde560b4SSatoshi Sahara 'level' => $level 712bde560b4SSatoshi Sahara ); 713b8595a66SAndreas Gohr} 714b8595a66SAndreas Gohr 715b8595a66SAndreas Gohr/** 716fdb8d77bSTom N Harris * Output a Doku_Form object. 717fdb8d77bSTom N Harris * Triggers an event with the form name: HTML_{$name}FORM_OUTPUT 718fdb8d77bSTom N Harris * 719fdb8d77bSTom N Harris * @author Tom N Harris <tnharris@whoopdedo.org> 72042ea7f44SGerrit Uitslag * 7218d5e837eSMichael Hamann * @param string $name The name of the form 7228d5e837eSMichael Hamann * @param Doku_Form $form The form 723fdb8d77bSTom N Harris */ 724c29600d0SSatoshi Saharafunction html_form($name, $form) { 725fdb8d77bSTom N Harris // Safety check in case the caller forgets. 726fdb8d77bSTom N Harris $form->endFieldset(); 727cbb44eabSAndreas Gohr Event::createAndTrigger('HTML_'.strtoupper($name).'FORM_OUTPUT', $form, 'html_form_output', false); 728fdb8d77bSTom N Harris} 729fdb8d77bSTom N Harris 730fdb8d77bSTom N Harris/** 731fdb8d77bSTom N Harris * Form print function. 732c29600d0SSatoshi Sahara * Just calls printForm() on the form object. 73342ea7f44SGerrit Uitslag * 734c29600d0SSatoshi Sahara * @param Doku_Form $form The form 735fdb8d77bSTom N Harris */ 73625dd2a2fSSatoshi Saharafunction html_form_output($form) { 73725dd2a2fSSatoshi Sahara $form->printForm(); 73825dd2a2fSSatoshi Sahara} 739340756e4Sandi 74007bf32b2SAndreas Gohr/** 74107bf32b2SAndreas Gohr * Embed a flash object in HTML 74207bf32b2SAndreas Gohr * 74307bf32b2SAndreas Gohr * This will create the needed HTML to embed a flash movie in a cross browser 74407bf32b2SAndreas Gohr * compatble way using valid XHTML 74507bf32b2SAndreas Gohr * 74607bf32b2SAndreas Gohr * The parameters $params, $flashvars and $atts need to be associative arrays. 74707bf32b2SAndreas Gohr * No escaping needs to be done for them. The alternative content *has* to be 74807bf32b2SAndreas Gohr * escaped because it is used as is. If no alternative content is given 74907bf32b2SAndreas Gohr * $lang['noflash'] is used. 75007bf32b2SAndreas Gohr * 75107bf32b2SAndreas Gohr * @author Andreas Gohr <andi@splitbrain.org> 75207bf32b2SAndreas Gohr * @link http://latrine.dgx.cz/how-to-correctly-insert-a-flash-into-xhtml 75307bf32b2SAndreas Gohr * 75407bf32b2SAndreas Gohr * @param string $swf - the SWF movie to embed 75507bf32b2SAndreas Gohr * @param int $width - width of the flash movie in pixels 75607bf32b2SAndreas Gohr * @param int $height - height of the flash movie in pixels 75707bf32b2SAndreas Gohr * @param array $params - additional parameters (<param>) 75807bf32b2SAndreas Gohr * @param array $flashvars - parameters to be passed in the flashvar parameter 75907bf32b2SAndreas Gohr * @param array $atts - additional attributes for the <object> tag 76007bf32b2SAndreas Gohr * @param string $alt - alternative content (is NOT automatically escaped!) 761b3d1090eSMichael Hamann * @return string - the XHTML markup 76207bf32b2SAndreas Gohr */ 76307bf32b2SAndreas Gohrfunction html_flashobject($swf,$width,$height,$params=null,$flashvars=null,$atts=null,$alt=''){ 76407bf32b2SAndreas Gohr global $lang; 76507bf32b2SAndreas Gohr 76607bf32b2SAndreas Gohr $out = ''; 76707bf32b2SAndreas Gohr 76807bf32b2SAndreas Gohr // prepare the object attributes 76907bf32b2SAndreas Gohr if(is_null($atts)) $atts = array(); 77007bf32b2SAndreas Gohr $atts['width'] = (int) $width; 771d4c61e61SAndreas Gohr $atts['height'] = (int) $height; 77207bf32b2SAndreas Gohr if(!$atts['width']) $atts['width'] = 425; 77307bf32b2SAndreas Gohr if(!$atts['height']) $atts['height'] = 350; 77407bf32b2SAndreas Gohr 77507bf32b2SAndreas Gohr // add object attributes for standard compliant browsers 77607bf32b2SAndreas Gohr $std = $atts; 77707bf32b2SAndreas Gohr $std['type'] = 'application/x-shockwave-flash'; 77807bf32b2SAndreas Gohr $std['data'] = $swf; 77907bf32b2SAndreas Gohr 78007bf32b2SAndreas Gohr // add object attributes for IE 78107bf32b2SAndreas Gohr $ie = $atts; 78207bf32b2SAndreas Gohr $ie['classid'] = 'clsid:D27CDB6E-AE6D-11cf-96B8-444553540000'; 78307bf32b2SAndreas Gohr 78407bf32b2SAndreas Gohr // open object (with conditional comments) 78507bf32b2SAndreas Gohr $out .= '<!--[if !IE]> -->'.NL; 78607bf32b2SAndreas Gohr $out .= '<object '.buildAttributes($std).'>'.NL; 78707bf32b2SAndreas Gohr $out .= '<!-- <![endif]-->'.NL; 78807bf32b2SAndreas Gohr $out .= '<!--[if IE]>'.NL; 78907bf32b2SAndreas Gohr $out .= '<object '.buildAttributes($ie).'>'.NL; 79007bf32b2SAndreas Gohr $out .= ' <param name="movie" value="'.hsc($swf).'" />'.NL; 7919ae41cdcSAndreas Gohr $out .= '<!--><!-- -->'.NL; 79207bf32b2SAndreas Gohr 79307bf32b2SAndreas Gohr // print params 79407bf32b2SAndreas Gohr if(is_array($params)) foreach($params as $key => $val){ 79507bf32b2SAndreas Gohr $out .= ' <param name="'.hsc($key).'" value="'.hsc($val).'" />'.NL; 79607bf32b2SAndreas Gohr } 79707bf32b2SAndreas Gohr 79807bf32b2SAndreas Gohr // add flashvars 79907bf32b2SAndreas Gohr if(is_array($flashvars)){ 800d4c61e61SAndreas Gohr $out .= ' <param name="FlashVars" value="'.buildURLparams($flashvars).'" />'.NL; 80107bf32b2SAndreas Gohr } 80207bf32b2SAndreas Gohr 80307bf32b2SAndreas Gohr // alternative content 80407bf32b2SAndreas Gohr if($alt){ 80507bf32b2SAndreas Gohr $out .= $alt.NL; 80607bf32b2SAndreas Gohr }else{ 80707bf32b2SAndreas Gohr $out .= $lang['noflash'].NL; 80807bf32b2SAndreas Gohr } 80907bf32b2SAndreas Gohr 81007bf32b2SAndreas Gohr // finish 81107bf32b2SAndreas Gohr $out .= '</object>'.NL; 81207bf32b2SAndreas Gohr $out .= '<!-- <![endif]-->'.NL; 81307bf32b2SAndreas Gohr 81407bf32b2SAndreas Gohr return $out; 81507bf32b2SAndreas Gohr} 81607bf32b2SAndreas Gohr 8178d5e837eSMichael Hamann/** 8188d5e837eSMichael Hamann * Prints HTML code for the given tab structure 8198d5e837eSMichael Hamann * 8208d5e837eSMichael Hamann * @param array $tabs tab structure 8218d5e837eSMichael Hamann * @param string $current_tab the current tab id 8228d5e837eSMichael Hamann */ 82395b451bcSAdrian Langfunction html_tabs($tabs, $current_tab = null) { 82494add303SAnika Henke echo '<ul class="tabs">'.NL; 82595b451bcSAdrian Lang 82695b451bcSAdrian Lang foreach ($tabs as $id => $tab) { 82795b451bcSAdrian Lang html_tab($tab['href'], $tab['caption'], $id === $current_tab); 82895b451bcSAdrian Lang } 82995b451bcSAdrian Lang 83094add303SAnika Henke echo '</ul>'.NL; 83195b451bcSAdrian Lang} 832cd2a4cfdSAnika Henke 83395b451bcSAdrian Lang/** 83495b451bcSAdrian Lang * Prints a single tab 83595b451bcSAdrian Lang * 83695b451bcSAdrian Lang * @author Kate Arzamastseva <pshns@ukr.net> 83795b451bcSAdrian Lang * @author Adrian Lang <mail@adrianlang.de> 83895b451bcSAdrian Lang * 83995b451bcSAdrian Lang * @param string $href - tab href 84095b451bcSAdrian Lang * @param string $caption - tab caption 84195b451bcSAdrian Lang * @param boolean $selected - is tab selected 84295b451bcSAdrian Lang */ 84395b451bcSAdrian Lang 84495b451bcSAdrian Langfunction html_tab($href, $caption, $selected = false) { 84595b451bcSAdrian Lang $tab = '<li>'; 84695b451bcSAdrian Lang if ($selected) { 84795b451bcSAdrian Lang $tab .= '<strong>'; 84895b451bcSAdrian Lang } else { 84995b451bcSAdrian Lang $tab .= '<a href="' . hsc($href) . '">'; 85095b451bcSAdrian Lang } 85195b451bcSAdrian Lang $tab .= hsc($caption) 85295b451bcSAdrian Lang . '</' . ($selected ? 'strong' : 'a') . '>' 85394add303SAnika Henke . '</li>'.NL; 85495b451bcSAdrian Lang echo $tab; 85595b451bcSAdrian Lang} 85695b451bcSAdrian Lang 857cd2a4cfdSAnika Henke/** 858cd2a4cfdSAnika Henke * Display size change 859cd2a4cfdSAnika Henke * 860cd2a4cfdSAnika Henke * @param int $sizechange - size of change in Bytes 861e34d6962SSatoshi Sahara * @param Doku_Form $form - (optional) form to add elements to 862e34d6962SSatoshi Sahara * @return void|string 863cd2a4cfdSAnika Henke */ 864e34d6962SSatoshi Saharafunction html_sizechange($sizechange, $form = null) { 865cd2a4cfdSAnika Henke if (isset($sizechange)) { 866cd2a4cfdSAnika Henke $class = 'sizechange'; 867cd2a4cfdSAnika Henke $value = filesize_h(abs($sizechange)); 868cd2a4cfdSAnika Henke if ($sizechange > 0) { 869cd2a4cfdSAnika Henke $class .= ' positive'; 870cd2a4cfdSAnika Henke $value = '+' . $value; 871cd2a4cfdSAnika Henke } elseif ($sizechange < 0) { 872cd2a4cfdSAnika Henke $class .= ' negative'; 873cd2a4cfdSAnika Henke $value = '-' . $value; 8740b78a6edSAnika Henke } else { 8750b78a6edSAnika Henke $value = '±' . $value; 876cd2a4cfdSAnika Henke } 877e34d6962SSatoshi Sahara if (!isset($form)) { 878e34d6962SSatoshi Sahara return '<span class="'.$class.'">'.$value.'</span>'; 879b0f23f4eSSatoshi Sahara } else { // Doku_Form 880cd2a4cfdSAnika Henke $form->addElement(form_makeOpenTag('span', array('class' => $class))); 881cd2a4cfdSAnika Henke $form->addElement($value); 882cd2a4cfdSAnika Henke $form->addElement(form_makeCloseTag('span')); 883cd2a4cfdSAnika Henke } 884cd2a4cfdSAnika Henke } 885b0f23f4eSSatoshi Sahara} 886