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 9*79a2d784SGerrit Uitslaguse dokuwiki\Action\Denied; 10*79a2d784SGerrit Uitslaguse dokuwiki\Action\Locked; 110c3a5702SAndreas Gohruse dokuwiki\ChangeLog\PageChangeLog; 12e1d9dcc8SAndreas Gohruse dokuwiki\Extension\AuthPlugin; 13cbb44eabSAndreas Gohruse dokuwiki\Extension\Event; 14*79a2d784SGerrit Uitslaguse dokuwiki\Ui\Backlinks; 15*79a2d784SGerrit Uitslaguse dokuwiki\Ui\Editor; 16*79a2d784SGerrit Uitslaguse dokuwiki\Ui\Index; 17*79a2d784SGerrit Uitslaguse dokuwiki\Ui\Login; 18*79a2d784SGerrit Uitslaguse dokuwiki\Ui\PageConflict; 19*79a2d784SGerrit Uitslaguse dokuwiki\Ui\PageDiff; 20*79a2d784SGerrit Uitslaguse dokuwiki\Ui\PageDraft; 21*79a2d784SGerrit Uitslaguse dokuwiki\Ui\PageRevisions; 22*79a2d784SGerrit Uitslaguse dokuwiki\Ui\PageView; 23*79a2d784SGerrit Uitslaguse dokuwiki\Ui\Recent; 24*79a2d784SGerrit Uitslaguse dokuwiki\Ui\UserProfile; 25*79a2d784SGerrit Uitslaguse dokuwiki\Ui\UserRegister; 26*79a2d784SGerrit Uitslaguse dokuwiki\Ui\UserResendPwd; 27*79a2d784SGerrit Uitslaguse dokuwiki\Utf8\Clean; 280c3a5702SAndreas Gohr 292d3b082eSMichael Großeif (!defined('SEC_EDIT_PATTERN')) { 3037c80e0eSLarsDW223 define('SEC_EDIT_PATTERN', '#<!-- EDIT({.*?}) -->#'); 312d3b082eSMichael Große} 322d3b082eSMichael Große 336bbae538Sandi 34f3f0262cSandi/** 35f3f0262cSandi * Convenience function to quickly build a wikilink 3615fae107Sandi * 3715fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 388d5e837eSMichael Hamann * @param string $id id of the target page 398d5e837eSMichael Hamann * @param string $name the name of the link, i.e. the text that is displayed 408d5e837eSMichael Hamann * @param string|array $search search string(s) that shall be highlighted in the target page 418d5e837eSMichael Hamann * @return string the HTML code of the link 42f3f0262cSandi */ 43db959ae3SAndreas Gohrfunction html_wikilink($id, $name = null, $search = '') { 44a8397511SGerrit Uitslag /** @var Doku_Renderer_xhtml $xhtml_renderer */ 45db959ae3SAndreas Gohr static $xhtml_renderer = null; 46723d78dbSandi if (is_null($xhtml_renderer)) { 477aea91afSChris Smith $xhtml_renderer = p_get_renderer('xhtml'); 48f3f0262cSandi } 49f3f0262cSandi 50fe9ec250SChris Smith return $xhtml_renderer->internallink($id,$name,$search,true,'navigation'); 51f3f0262cSandi} 52f3f0262cSandi 53f3f0262cSandi/** 54f3f0262cSandi * The loginform 5515fae107Sandi * 5615fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 57d1d904bbSMichael Große * 58d1d904bbSMichael Große * @param bool $svg Whether to show svg icons in the register and resendpwd links or not 59bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18 60f3f0262cSandi */ 61d1d904bbSMichael Großefunction html_login($svg = false) { 62*79a2d784SGerrit Uitslag dbg_deprecated(Login::class .'::show()'); 63bab2b7f0SSatoshi Sahara (new dokuwiki\Ui\Login($svg))->show(); 64f3f0262cSandi} 65f3f0262cSandi 66d59dea9fSGerrit Uitslag 67d59dea9fSGerrit Uitslag/** 68d59dea9fSGerrit Uitslag * Denied page content 69d59dea9fSGerrit Uitslag * 707afe5d93SSatoshi Sahara * @deprecated 2020-07-18 not called anymore, see inc/Action/Denied::tplContent() 71d59dea9fSGerrit Uitslag */ 72d59dea9fSGerrit Uitslagfunction html_denied() { 73*79a2d784SGerrit Uitslag dbg_deprecated(Denied::class .'::showBanner()'); 74a215faf2SSatoshi Sahara (new dokuwiki\Action\Denied())->showBanner(); 75d59dea9fSGerrit Uitslag} 76d59dea9fSGerrit Uitslag 77f3f0262cSandi/** 7815fae107Sandi * inserts section edit buttons if wanted or removes the markers 7915fae107Sandi * 8015fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 8142ea7f44SGerrit Uitslag * 8242ea7f44SGerrit Uitslag * @param string $text 8342ea7f44SGerrit Uitslag * @param bool $show show section edit buttons? 8442ea7f44SGerrit Uitslag * @return string 8515fae107Sandi */ 86f3f0262cSandifunction html_secedit($text, $show = true) { 87f3f0262cSandi global $INFO; 8835dae8b0SBen Coburn 89aac83cd4SPhy if ((isset($INFO) && !$INFO['writable']) || !$show || (isset($INFO) && $INFO['rev'])) { 902d3b082eSMichael Große return preg_replace(SEC_EDIT_PATTERN,'',$text); 91f3f0262cSandi } 9235dae8b0SBen Coburn 932d3b082eSMichael Große return preg_replace_callback(SEC_EDIT_PATTERN, 9440868f2fSAdrian Lang 'html_secedit_button', $text); 9540868f2fSAdrian Lang} 9640868f2fSAdrian Lang 9740868f2fSAdrian Lang/** 9840868f2fSAdrian Lang * prepares section edit button data for event triggering 9940868f2fSAdrian Lang * used as a callback in html_secedit 10040868f2fSAdrian Lang * 10140868f2fSAdrian Lang * @author Andreas Gohr <andi@splitbrain.org> 10242ea7f44SGerrit Uitslag * 10342ea7f44SGerrit Uitslag * @param array $matches matches with regexp 10442ea7f44SGerrit Uitslag * @return string 10542ea7f44SGerrit Uitslag * @triggers HTML_SECEDIT_BUTTON 10640868f2fSAdrian Lang */ 10740868f2fSAdrian Langfunction html_secedit_button($matches){ 108ada0d779SMichael Hamann $json = htmlspecialchars_decode($matches[1], ENT_QUOTES); 109ada0d779SMichael Hamann $data = json_decode($json, true); 110ec57f119SLarsDW223 if ($data == NULL) { 111*79a2d784SGerrit Uitslag return ''; 11206917fceSMichael Große } 113ec57f119SLarsDW223 $data ['target'] = strtolower($data['target']); 114ec57f119SLarsDW223 $data ['hid'] = strtolower($data['hid']); 11540868f2fSAdrian Lang 116cbb44eabSAndreas Gohr return Event::createAndTrigger('HTML_SECEDIT_BUTTON', $data, 11740868f2fSAdrian Lang 'html_secedit_get_button'); 11840868f2fSAdrian Lang} 11940868f2fSAdrian Lang 12040868f2fSAdrian Lang/** 12140868f2fSAdrian Lang * prints a section editing button 12240868f2fSAdrian Lang * used as default action form HTML_SECEDIT_BUTTON 12340868f2fSAdrian Lang * 12440868f2fSAdrian Lang * @author Adrian Lang <lang@cosmocode.de> 12542ea7f44SGerrit Uitslag * 12642ea7f44SGerrit Uitslag * @param array $data name, section id and target 12742ea7f44SGerrit Uitslag * @return string html 12840868f2fSAdrian Lang */ 12940868f2fSAdrian Langfunction html_secedit_get_button($data) { 13040868f2fSAdrian Lang global $ID; 13140868f2fSAdrian Lang global $INFO; 13240868f2fSAdrian Lang 1336d9eab4dSMichael Hamann if (!isset($data['name']) || $data['name'] === '') return ''; 13440868f2fSAdrian Lang 13540868f2fSAdrian Lang $name = $data['name']; 13640868f2fSAdrian Lang unset($data['name']); 13740868f2fSAdrian Lang 138905fa971SAdrian Lang $secid = $data['secid']; 139905fa971SAdrian Lang unset($data['secid']); 140905fa971SAdrian Lang 1417afe5d93SSatoshi Sahara $params = array_merge( 1427afe5d93SSatoshi Sahara array('do' => 'edit', 'rev' => $INFO['lastmod'], 'summary' => '['.$name.'] '), 1437afe5d93SSatoshi Sahara $data 1447afe5d93SSatoshi Sahara ); 1457afe5d93SSatoshi Sahara 1467afe5d93SSatoshi Sahara $html = '<div class="secedit editbutton_'.$data['target'] .' editbutton_'.$secid .'">'; 1477afe5d93SSatoshi Sahara $html.= html_btn('secedit', $ID, '', $params, 'post', $name); 1487afe5d93SSatoshi Sahara $html.= '</div>'; 1497afe5d93SSatoshi Sahara return $html; 150f3f0262cSandi} 151f3f0262cSandi 152f3f0262cSandi/** 153d6c9c552Smatthiasgrimm * Just the back to top button (in its own form) 1546b13307fSandi * 1556b13307fSandi * @author Andreas Gohr <andi@splitbrain.org> 15642ea7f44SGerrit Uitslag * 15742ea7f44SGerrit Uitslag * @return string html 1586b13307fSandi */ 1596b13307fSandifunction html_topbtn() { 1606b13307fSandi global $lang; 1616b13307fSandi 162*79a2d784SGerrit Uitslag return '<a class="nolink" href="#dokuwiki__top">' 1637afe5d93SSatoshi Sahara .'<button class="button" onclick="window.scrollTo(0, 0)" title="'. $lang['btn_top'] .'">' 1647afe5d93SSatoshi Sahara . $lang['btn_top'] 1657afe5d93SSatoshi Sahara .'</button></a>'; 1666b13307fSandi} 1676b13307fSandi 1686b13307fSandi/** 169d67ca2c0Smatthiasgrimm * Displays a button (using its own form) 17035dae8b0SBen Coburn * If tooltip exists, the access key tooltip is replaced. 17115fae107Sandi * 17215fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 17342ea7f44SGerrit Uitslag * 17442ea7f44SGerrit Uitslag * @param string $name 17542ea7f44SGerrit Uitslag * @param string $id 17642ea7f44SGerrit Uitslag * @param string $akey access key 177e3710957SGerrit Uitslag * @param string[] $params key-value pairs added as hidden inputs 17842ea7f44SGerrit Uitslag * @param string $method 17942ea7f44SGerrit Uitslag * @param string $tooltip 18042ea7f44SGerrit Uitslag * @param bool|string $label label text, false: lookup btn_$name in localization 181e824d633SMichael Große * @param string $svg (optional) svg code, inserted into the button 18242ea7f44SGerrit Uitslag * @return string 183f3f0262cSandi */ 184e824d633SMichael Großefunction html_btn($name, $id, $akey, $params, $method = 'get', $tooltip = '', $label = false, $svg = null) { 185f3f0262cSandi global $conf; 186f3f0262cSandi global $lang; 187f3f0262cSandi 188f5baf821SAnika Henke if (!$label) 189f3f0262cSandi $label = $lang['btn_'.$name]; 190f3f0262cSandi 19149c713a3Sandi //filter id (without urlencoding) 19249c713a3Sandi $id = idfilter($id,false); 193f3f0262cSandi 194f3f0262cSandi //make nice URLs even for buttons 1956c7843b5Sandi if ($conf['userewrite'] == 2) { 1966c7843b5Sandi $script = DOKU_BASE.DOKU_SCRIPT.'/'.$id; 1976c7843b5Sandi } elseif ($conf['userewrite']) { 1986c7843b5Sandi $script = DOKU_BASE.$id; 1996c7843b5Sandi } else { 2008b00ebcfSandi $script = DOKU_BASE.DOKU_SCRIPT; 201f3f0262cSandi $params['id'] = $id; 202f3f0262cSandi } 203f3f0262cSandi 2047afe5d93SSatoshi Sahara $html = '<form class="button btn_'.$name.'" method="'.$method.'" action="'.$script.'"><div class="no">'; 205f3f0262cSandi 20606a4bf8fSAndreas Gohr if (is_array($params)) { 2079e491c01SAndreas Gohr foreach ($params as $key => $val) { 2087afe5d93SSatoshi Sahara $html .= '<input type="hidden" name="'.$key.'" value="'.hsc($val).'" />'; 209f3f0262cSandi } 21006a4bf8fSAndreas Gohr } 211f3f0262cSandi 2127afe5d93SSatoshi Sahara $tip = empty($tooltip) ? hsc($label) : hsc($tooltip); 21311ea018fSAndreas Gohr 2147afe5d93SSatoshi Sahara $html .= '<button type="submit" '; 21511ea018fSAndreas Gohr if ($akey) { 21607493d05SAnika Henke $tip .= ' ['.strtoupper($akey).']'; 2177afe5d93SSatoshi Sahara $html .= 'accesskey="'.$akey.'" '; 21835dae8b0SBen Coburn } 2197afe5d93SSatoshi Sahara $html .= 'title="'.$tip.'">'; 220e824d633SMichael Große if ($svg) { 2217afe5d93SSatoshi Sahara $html .= '<span>'. hsc($label) .'</span>'. inlineSVG($svg); 222679dba01SMichael Große } else { 2237afe5d93SSatoshi Sahara $html .= hsc($label); 224679dba01SMichael Große } 2257afe5d93SSatoshi Sahara $html .= '</button>'; 2267afe5d93SSatoshi Sahara $html .= '</div></form>'; 227f3f0262cSandi 2287afe5d93SSatoshi Sahara return $html; 229f3f0262cSandi} 2300747f5d7Sghi/** 2310747f5d7Sghi * show a revision warning 2320747f5d7Sghi * 2330747f5d7Sghi * @author Szymon Olewniczak <dokuwiki@imz.re> 23487f229e8SSatoshi Sahara * @deprecated 2020-07-18 2350747f5d7Sghi */ 236c8556525Sghifunction html_showrev() { 237*79a2d784SGerrit Uitslag dbg_deprecated(PageView::class .'::showrev()'); 2380747f5d7Sghi} 239f3f0262cSandi 240f3f0262cSandi/** 24142ea7f44SGerrit Uitslag * Show a wiki page 24215fae107Sandi * 24315fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 24442ea7f44SGerrit Uitslag * 24542ea7f44SGerrit Uitslag * @param null|string $txt wiki text or null for showing $ID 246bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18 24715fae107Sandi */ 24811c78c94SAndreas Gohrfunction html_show($txt=null) { 249*79a2d784SGerrit Uitslag dbg_deprecated(PageView::class .'::show()'); 250bab2b7f0SSatoshi Sahara (new dokuwiki\Ui\PageView($txt))->show(); 251f3f0262cSandi} 252f3f0262cSandi 253f3f0262cSandi/** 254ee4c4a1bSAndreas Gohr * ask the user about how to handle an exisiting draft 255ee4c4a1bSAndreas Gohr * 256ee4c4a1bSAndreas Gohr * @author Andreas Gohr <andi@splitbrain.org> 257bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18 258ee4c4a1bSAndreas Gohr */ 259ee4c4a1bSAndreas Gohrfunction html_draft() { 260*79a2d784SGerrit Uitslag dbg_deprecated(PageDraft::class .'::show()'); 261*79a2d784SGerrit Uitslag (new dokuwiki\Ui\PageDraft)->show(); 262ee4c4a1bSAndreas Gohr} 263ee4c4a1bSAndreas Gohr 264ee4c4a1bSAndreas Gohr/** 265f3f0262cSandi * Highlights searchqueries in HTML code 26615fae107Sandi * 26715fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 2687209be23SAndreas Gohr * @author Harry Fuecks <hfuecks@gmail.com> 26942ea7f44SGerrit Uitslag * 27042ea7f44SGerrit Uitslag * @param string $html 27142ea7f44SGerrit Uitslag * @param array|string $phrases 27242ea7f44SGerrit Uitslag * @return string html 273f3f0262cSandi */ 274546d3a99SAndreas Gohrfunction html_hilight($html, $phrases) { 2758a803caeSAndreas Gohr $phrases = (array) $phrases; 2768a803caeSAndreas Gohr $phrases = array_map('preg_quote_cb', $phrases); 2778a803caeSAndreas Gohr $phrases = array_map('ft_snippet_re_preprocess', $phrases); 2788a803caeSAndreas Gohr $phrases = array_filter($phrases); 2798a803caeSAndreas Gohr $regex = join('|',$phrases); 28060c15d7dSAndreas Gohr 28160c15d7dSAndreas Gohr if ($regex === '') return $html; 282*79a2d784SGerrit Uitslag if (!Clean::isUtf8($regex)) return $html; 283f3f0262cSandi 284*79a2d784SGerrit Uitslag return @preg_replace_callback("/((<[^>]*)|$regex)/ui", function ($match) { 285675d8ce4SSatoshi Sahara $hlight = unslash($match[0]); 286675d8ce4SSatoshi Sahara if (!isset($match[2])) { 287688774a0SAnika Henke $hlight = '<span class="search_hit">'.$hlight.'</span>'; 2887209be23SAndreas Gohr } 2897209be23SAndreas Gohr return $hlight; 290675d8ce4SSatoshi Sahara }, $html); 2917209be23SAndreas Gohr} 2927209be23SAndreas Gohr 2937209be23SAndreas Gohr/** 29415fae107Sandi * Display error on locked pages 29515fae107Sandi * 29615fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 2977afe5d93SSatoshi Sahara * @deprecated 2020-07-18 not called anymore, see inc/Action/Locked::tplContent() 29815fae107Sandi */ 299ee20e7d1Sandifunction html_locked() { 300*79a2d784SGerrit Uitslag dbg_deprecated(Locked::class .'::showBanner()'); 301a215faf2SSatoshi Sahara (new dokuwiki\Action\Locked())->showBanner(); 302f3f0262cSandi} 303f3f0262cSandi 30415fae107Sandi/** 30515fae107Sandi * list old revisions 30615fae107Sandi * 30715fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 30871726d78SBen Coburn * @author Ben Coburn <btcoburn@silicodon.net> 3098e69fd30SKate Arzamastseva * @author Kate Arzamastseva <pshns@ukr.net> 310e0c26282SGerrit Uitslag * 311e0c26282SGerrit Uitslag * @param int $first skip the first n changelog lines 31230a159abSSatoshi Sahara * @param string $media_id id of media, or empty for current page 313bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18 31415fae107Sandi */ 31530a159abSSatoshi Saharafunction html_revisions($first = 0, $media_id = '') { 316*79a2d784SGerrit Uitslag dbg_deprecated(PageRevisions::class .'::show()'); 317b370ebcdSSatoshi Sahara if ($media_id) { 318b370ebcdSSatoshi Sahara (new dokuwiki\Ui\MediaRevisions($media_id))->show($first); 319b370ebcdSSatoshi Sahara } else { 320b370ebcdSSatoshi Sahara global $INFO; 321b370ebcdSSatoshi Sahara (new dokuwiki\Ui\PageRevisions($INFO['id']))->show($first); 322b370ebcdSSatoshi Sahara } 323f3f0262cSandi} 324f3f0262cSandi 32515fae107Sandi/** 32615fae107Sandi * display recent changes 32715fae107Sandi * 32815fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 3295749f1ceSmatthiasgrimm * @author Matthias Grimm <matthiasgrimm@users.sourceforge.net> 33071726d78SBen Coburn * @author Ben Coburn <btcoburn@silicodon.net> 3318d40b4b6SKate Arzamastseva * @author Kate Arzamastseva <pshns@ukr.net> 33242ea7f44SGerrit Uitslag * 33342ea7f44SGerrit Uitslag * @param int $first 33442ea7f44SGerrit Uitslag * @param string $show_changes 335bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18 33615fae107Sandi */ 3370739a638SKate Arzamastsevafunction html_recent($first = 0, $show_changes = 'both') { 338*79a2d784SGerrit Uitslag dbg_deprecated(Recent::class .'::show()'); 339bab2b7f0SSatoshi Sahara (new dokuwiki\Ui\Recent($first, $show_changes))->show(); 340f3f0262cSandi} 341f3f0262cSandi 34215fae107Sandi/** 34315fae107Sandi * Display page index 34415fae107Sandi * 34515fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 34642ea7f44SGerrit Uitslag * 34742ea7f44SGerrit Uitslag * @param string $ns 348bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18 34915fae107Sandi */ 350f3f0262cSandifunction html_index($ns) { 351*79a2d784SGerrit Uitslag dbg_deprecated(Index::class .'::show()'); 352bab2b7f0SSatoshi Sahara (new dokuwiki\Ui\Index($ns))->show(); 353f3f0262cSandi} 354f3f0262cSandi 355f3f0262cSandi/** 35689b939d7SSatoshi Sahara * Index tree item formatter for html_buildlist() 35715fae107Sandi * 358f3f0262cSandi * User function for html_buildlist() 35915fae107Sandi * 36015fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 36142ea7f44SGerrit Uitslag * 36242ea7f44SGerrit Uitslag * @param array $item 36342ea7f44SGerrit Uitslag * @return string 3649c8632b4SSatoshi Sahara * @deprecated 2020-07-18 365f3f0262cSandi */ 3669c8632b4SSatoshi Saharafunction html_list_index($item) { 367*79a2d784SGerrit Uitslag dbg_deprecated(Index::class .'::formatListItem()'); 3689c8632b4SSatoshi Sahara return (new dokuwiki\Ui\Index)->formatListItem($item); 369f3f0262cSandi} 370f3f0262cSandi 371f3f0262cSandi/** 37289b939d7SSatoshi Sahara * Index list item formatter for html_buildlist() 373cb70c441Sandi * 374a1dee2b9SAdrian Lang * This user function is used in html_buildlist to build the 375cb70c441Sandi * <li> tags for namespaces when displaying the page index 376cb70c441Sandi * it gives different classes to opened or closed "folders" 377cb70c441Sandi * 378cb70c441Sandi * @author Andreas Gohr <andi@splitbrain.org> 37942ea7f44SGerrit Uitslag * 38042ea7f44SGerrit Uitslag * @param array $item 38142ea7f44SGerrit Uitslag * @return string html 3829c8632b4SSatoshi Sahara * @deprecated 2020-07-18 383cb70c441Sandi */ 3849c8632b4SSatoshi Saharafunction html_li_index($item) { 385*79a2d784SGerrit Uitslag dbg_deprecated(Index::class .'::tagListItem()'); 3869c8632b4SSatoshi Sahara return (new dokuwiki\Ui\Index)->tagListItem($item); 387cb70c441Sandi} 388cb70c441Sandi 389cb70c441Sandi/** 39089b939d7SSatoshi Sahara * Default list item formatter for html_buildlist() 39189b939d7SSatoshi Sahara * 39289b939d7SSatoshi Sahara * @author Andreas Gohr <andi@splitbrain.org> 39389b939d7SSatoshi Sahara * 39489b939d7SSatoshi Sahara * @param array $item 39589b939d7SSatoshi Sahara * @return string html 39689b939d7SSatoshi Sahara * @deprecated 2020-07-18 39789b939d7SSatoshi Sahara */ 39889b939d7SSatoshi Saharafunction html_li_default($item){ 39989b939d7SSatoshi Sahara return '<li class="level'.$item['level'].'">'; 40089b939d7SSatoshi Sahara} 40189b939d7SSatoshi Sahara 40289b939d7SSatoshi Sahara/** 40315fae107Sandi * Build an unordered list 40415fae107Sandi * 405f3f0262cSandi * Build an unordered list from the given $data array 406f3f0262cSandi * Each item in the array has to have a 'level' property 407f3f0262cSandi * the item itself gets printed by the given $func user 408cb70c441Sandi * function. The second and optional function is used to 409cb70c441Sandi * print the <li> tag. Both user function need to accept 410cb70c441Sandi * a single item. 41115fae107Sandi * 412c5a8fd96SAndreas Gohr * Both user functions can be given as array to point to 413c5a8fd96SAndreas Gohr * a member of an object. 414c5a8fd96SAndreas Gohr * 41515fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 41680679bafSGerrit Uitslag * 41780679bafSGerrit Uitslag * @param array $data array with item arrays 41880679bafSGerrit Uitslag * @param string $class class of ul wrapper 41980679bafSGerrit Uitslag * @param callable $func callback to print an list item 420bde560b4SSatoshi Sahara * @param callable $lifunc (optional) callback to the opening li tag 421bde560b4SSatoshi Sahara * @param bool $forcewrapper (optional) Trigger building a wrapper ul if the first level is 422ae614416SAnika Henke * 0 (we have a root object) or 1 (just the root content) 42380679bafSGerrit Uitslag * @return string html of an unordered list 424f3f0262cSandi */ 425bde560b4SSatoshi Saharafunction html_buildlist($data, $class, $func, $lifunc = null, $forcewrapper = false) { 426a1dee2b9SAdrian Lang if (count($data) === 0) { 427a1dee2b9SAdrian Lang return ''; 428a1dee2b9SAdrian Lang } 429a1dee2b9SAdrian Lang 4302689c55fSMichael Große $firstElement = reset($data); 4312689c55fSMichael Große $start_level = $firstElement['level']; 4329e4f7880SAdrian Lang $level = $start_level; 4339c8632b4SSatoshi Sahara $html = ''; 434434f5921SHakan Sandell $open = 0; 4359e4f7880SAdrian Lang 436bde560b4SSatoshi Sahara // set callback function to build the <li> tag, formerly defined as html_li_default() 437bde560b4SSatoshi Sahara if (!is_callable($lifunc)) { 4389c8632b4SSatoshi Sahara $lifunc = function ($item) { 4399c8632b4SSatoshi Sahara return '<li class="level'.$item['level'].'">'; 4409c8632b4SSatoshi Sahara }; 441bde560b4SSatoshi Sahara } 442bde560b4SSatoshi Sahara 443f3f0262cSandi foreach ($data as $item) { 444f3f0262cSandi if ($item['level'] > $level) { 445f3f0262cSandi //open new list 446df52d0feSandi for ($i = 0; $i < ($item['level'] - $level); $i++) { 4479c8632b4SSatoshi Sahara if ($i) $html .= '<li class="clear">'; 4489c8632b4SSatoshi Sahara $html .= "\n".'<ul class="'.$class.'">'."\n"; 449434f5921SHakan Sandell $open++; 450df52d0feSandi } 451434f5921SHakan Sandell $level = $item['level']; 452434f5921SHakan Sandell 453f3f0262cSandi } elseif ($item['level'] < $level) { 454f3f0262cSandi //close last item 4559c8632b4SSatoshi Sahara $html .= '</li>'."\n"; 456434f5921SHakan Sandell while ($level > $item['level'] && $open > 0 ) { 457f3f0262cSandi //close higher lists 4589c8632b4SSatoshi Sahara $html .= '</ul>'."\n".'</li>'."\n"; 459434f5921SHakan Sandell $level--; 460434f5921SHakan Sandell $open--; 461f3f0262cSandi } 4629c8632b4SSatoshi Sahara } elseif ($html !== '') { 46387671313SHakan Sandell //close previous item 4649c8632b4SSatoshi Sahara $html .= '</li>'."\n"; 465f3f0262cSandi } 466f3f0262cSandi 467f3f0262cSandi //print item 4689c8632b4SSatoshi Sahara $html .= call_user_func($lifunc, $item); 4699c8632b4SSatoshi Sahara $html .= '<div class="li">'; 47034dbe711Schris 4719c8632b4SSatoshi Sahara $html .= call_user_func($func, $item); 4729c8632b4SSatoshi Sahara $html .= '</div>'; 473f3f0262cSandi } 474f3f0262cSandi 475f3f0262cSandi //close remaining items and lists 4769c8632b4SSatoshi Sahara $html .= '</li>'."\n"; 477434f5921SHakan Sandell while ($open-- > 0) { 4789c8632b4SSatoshi Sahara $html .= '</ul></li>'."\n"; 479434f5921SHakan Sandell } 480434f5921SHakan Sandell 481434f5921SHakan Sandell if ($forcewrapper || $start_level < 2) { 482434f5921SHakan Sandell // Trigger building a wrapper ul if the first level is 483434f5921SHakan Sandell // 0 (we have a root object) or 1 (just the root content) 4849c8632b4SSatoshi Sahara $html = "\n".'<ul class="'.$class.'">'."\n".$html.'</ul>'."\n"; 485f3f0262cSandi } 486f3f0262cSandi 4879c8632b4SSatoshi Sahara return $html; 488f3f0262cSandi} 489f3f0262cSandi 49015fae107Sandi/** 49115fae107Sandi * display backlinks 49215fae107Sandi * 49315fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 49411df47ecSMichael Klier * @author Michael Klier <chi@chimeric.de> 495bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18 49615fae107Sandi */ 497f3f0262cSandifunction html_backlinks() { 498*79a2d784SGerrit Uitslag dbg_deprecated(Backlinks::class .'::show()'); 499bab2b7f0SSatoshi Sahara (new dokuwiki\Ui\Backlinks)->show(); 50095b451bcSAdrian Lang} 50195b451bcSAdrian Lang 50215fae107Sandi/** 503a215faf2SSatoshi Sahara * Get header of diff HTML 504a215faf2SSatoshi Sahara * 505a215faf2SSatoshi Sahara * @param string $l_rev Left revisions 506a215faf2SSatoshi Sahara * @param string $r_rev Right revision 507a215faf2SSatoshi Sahara * @param string $id Page id, if null $ID is used 508a215faf2SSatoshi Sahara * @param bool $media If it is for media files 509a215faf2SSatoshi Sahara * @param bool $inline Return the header on a single line 510a215faf2SSatoshi Sahara * @return string[] HTML snippets for diff header 511a215faf2SSatoshi Sahara * @deprecated 2020-07-18 512a215faf2SSatoshi Sahara */ 513a215faf2SSatoshi Saharafunction html_diff_head($l_rev, $r_rev, $id = null, $media = false, $inline = false) { 514*79a2d784SGerrit Uitslag dbg_deprecated('see '. PageDiff::class .'::buildDiffHead()'); 515*79a2d784SGerrit Uitslag return ['', '', '', '']; 516a215faf2SSatoshi Sahara} 517a215faf2SSatoshi Sahara 518a215faf2SSatoshi Sahara/** 51904e99fe1SGerrit Uitslag * Show diff 520baf0c3e5SGerrit Uitslag * between current page version and provided $text 521baf0c3e5SGerrit Uitslag * or between the revisions provided via GET or POST 52215fae107Sandi * 52315fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 524baf0c3e5SGerrit Uitslag * @param string $text when non-empty: compare with this text with most current version 52504e99fe1SGerrit Uitslag * @param bool $intro display the intro text 5268d5e837eSMichael Hamann * @param string $type type of the diff (inline or sidebyside) 527bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18 52815fae107Sandi */ 52972165381SAndreas Gohrfunction html_diff($text = '', $intro = true, $type = null) { 530*79a2d784SGerrit Uitslag dbg_deprecated(PageDiff::class .'::show()'); 531edb50e6aSSatoshi Sahara global $INFO; 532e4c881bdSSatoshi Sahara (new dokuwiki\Ui\PageDiff($INFO['id']))->compareWith($text)->preference([ 533edb50e6aSSatoshi Sahara 'showIntro' => $intro, 534edb50e6aSSatoshi Sahara 'difftype' => $type, 535edb50e6aSSatoshi Sahara ])->show(); 536fcfecb69SChristopher Smith} 537fcfecb69SChristopher Smith 53815fae107Sandi/** 539a215faf2SSatoshi Sahara * Create html for revision navigation 540a215faf2SSatoshi Sahara * 541a215faf2SSatoshi Sahara * @param PageChangeLog $pagelog changelog object of current page 542a215faf2SSatoshi Sahara * @param string $type inline vs sidebyside 543a215faf2SSatoshi Sahara * @param int $l_rev left revision timestamp 544a215faf2SSatoshi Sahara * @param int $r_rev right revision timestamp 545a215faf2SSatoshi Sahara * @return string[] html of left and right navigation elements 546a215faf2SSatoshi Sahara * @deprecated 2020-07-18 547a215faf2SSatoshi Sahara */ 548a215faf2SSatoshi Saharafunction html_diff_navigation($pagelog, $type, $l_rev, $r_rev) { 549*79a2d784SGerrit Uitslag dbg_deprecated('see '. PageDiff::class .'::buildRevisionsNavigation()'); 550*79a2d784SGerrit Uitslag return ['', '']; 551a215faf2SSatoshi Sahara} 552a215faf2SSatoshi Sahara 553a215faf2SSatoshi Sahara/** 554a215faf2SSatoshi Sahara * Create html link to a diff defined by two revisions 555a215faf2SSatoshi Sahara * 556a215faf2SSatoshi Sahara * @param string $difftype display type 557a215faf2SSatoshi Sahara * @param string $linktype 558a215faf2SSatoshi Sahara * @param int $lrev oldest revision 559a215faf2SSatoshi Sahara * @param int $rrev newest revision or null for diff with current revision 560a215faf2SSatoshi Sahara * @return string html of link to a diff 561a215faf2SSatoshi Sahara * @deprecated 2020-07-18 562a215faf2SSatoshi Sahara */ 563a215faf2SSatoshi Saharafunction html_diff_navigationlink($difftype, $linktype, $lrev, $rrev = null) { 564*79a2d784SGerrit Uitslag dbg_deprecated('see '. PageDiff::class .'::diffViewlink()'); 565*79a2d784SGerrit Uitslag return ''; 566a215faf2SSatoshi Sahara} 567a215faf2SSatoshi Sahara 568a215faf2SSatoshi Sahara/** 569a215faf2SSatoshi Sahara * Insert soft breaks in diff html 570a215faf2SSatoshi Sahara * 571a215faf2SSatoshi Sahara * @param string $diffhtml 572a215faf2SSatoshi Sahara * @return string 573a215faf2SSatoshi Sahara * @deprecated 2020-07-18 574a215faf2SSatoshi Sahara */ 575a215faf2SSatoshi Saharafunction html_insert_softbreaks($diffhtml) { 576*79a2d784SGerrit Uitslag dbg_deprecated(PageDiff::class .'::insertSoftbreaks()'); 57787922387SSatoshi Sahara return (new dokuwiki\Ui\PageDiff)->insertSoftbreaks($diffhtml); 578a215faf2SSatoshi Sahara} 579a215faf2SSatoshi Sahara 580a215faf2SSatoshi Sahara/** 58115fae107Sandi * show warning on conflict detection 58215fae107Sandi * 58315fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 58442ea7f44SGerrit Uitslag * 58542ea7f44SGerrit Uitslag * @param string $text 58642ea7f44SGerrit Uitslag * @param string $summary 587bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18 58815fae107Sandi */ 589f3f0262cSandifunction html_conflict($text, $summary) { 590*79a2d784SGerrit Uitslag dbg_deprecated(PageConflict::class .'::show()'); 591edb50e6aSSatoshi Sahara (new dokuwiki\Ui\PageConflict($text, $summary))->show(); 592f3f0262cSandi} 593f3f0262cSandi 594f3f0262cSandi/** 59515fae107Sandi * Prints the global message array 59615fae107Sandi * 59715fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 598f3f0262cSandi */ 599f3f0262cSandifunction html_msgarea() { 600cc58224cSMichael Hamann global $MSG, $MSG_shown; 6018d5e837eSMichael Hamann /** @var array $MSG */ 602cc58224cSMichael Hamann // store if the global $MSG has already been shown and thus HTML output has been started 603cc58224cSMichael Hamann $MSG_shown = true; 604cc58224cSMichael Hamann 605f3f0262cSandi if (!isset($MSG)) return; 606f3f0262cSandi 6074af9f0d4SAndreas Gohr $shown = array(); 608f3f0262cSandi foreach ($MSG as $msg) { 6094af9f0d4SAndreas Gohr $hash = md5($msg['msg']); 6104af9f0d4SAndreas Gohr if (isset($shown[$hash])) continue; // skip double messages 611f755f9abSChristopher Smith if (info_msg_allowed($msg)) { 612f3f0262cSandi print '<div class="'.$msg['lvl'].'">'; 613f3f0262cSandi print $msg['msg']; 614f3f0262cSandi print '</div>'; 615d3bae478SChristopher Smith } 6164af9f0d4SAndreas Gohr $shown[$hash] = 1; 617f3f0262cSandi } 618cc58224cSMichael Hamann 619cc58224cSMichael Hamann unset($GLOBALS['MSG']); 620f3f0262cSandi} 621f3f0262cSandi 622f3f0262cSandi/** 623f3f0262cSandi * Prints the registration form 62415fae107Sandi * 62515fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 626bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18 627f3f0262cSandi */ 628f3f0262cSandifunction html_register() { 629*79a2d784SGerrit Uitslag dbg_deprecated(UserRegister::class .'::show()'); 630bab2b7f0SSatoshi Sahara (new dokuwiki\Ui\UserRegister)->show(); 631f3f0262cSandi} 632f3f0262cSandi 633f3f0262cSandi/** 6348b06d178Schris * Print the update profile form 6358b06d178Schris * 6368b06d178Schris * @author Christopher Smith <chris@jalakai.co.uk> 6378b06d178Schris * @author Andreas Gohr <andi@splitbrain.org> 638bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18 6398b06d178Schris */ 6408b06d178Schrisfunction html_updateprofile() { 641*79a2d784SGerrit Uitslag dbg_deprecated(UserProfile::class .'::show()'); 642bab2b7f0SSatoshi Sahara (new dokuwiki\Ui\UserProfile)->show(); 6438b06d178Schris} 6448b06d178Schris 6458b06d178Schris/** 6467c4635c4SAdrian Lang * Preprocess edit form data 64715fae107Sandi * 64815fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 6492ffea8f2SAdrian Lang * 650bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18 651f3f0262cSandi */ 6525a932e77SAdrian Langfunction html_edit() { 653*79a2d784SGerrit Uitslag dbg_deprecated(Editor::class .'::show()'); 654bab2b7f0SSatoshi Sahara (new dokuwiki\Ui\Editor)->show(); 655b6912aeaSAndreas Gohr} 656b6912aeaSAndreas Gohr 657b6912aeaSAndreas Gohr/** 658bf69f8cbSSatoshi Sahara * Display the default edit form 659bf69f8cbSSatoshi Sahara * 660bf69f8cbSSatoshi Sahara * Is the default action for HTML_EDIT_FORMSELECTION. 661bf69f8cbSSatoshi Sahara * 662*79a2d784SGerrit Uitslag * @param array $param 663bf69f8cbSSatoshi Sahara * @deprecated 2020-07-18 664bf69f8cbSSatoshi Sahara */ 665bf69f8cbSSatoshi Saharafunction html_edit_form($param) { 666*79a2d784SGerrit Uitslag dbg_deprecated(Editor::class .'::addTextarea()'); 667*79a2d784SGerrit Uitslag (new dokuwiki\Ui\Editor)->addTextarea($param); 668bf69f8cbSSatoshi Sahara} 669bf69f8cbSSatoshi Sahara 670bf69f8cbSSatoshi Sahara/** 671f3f0262cSandi * prints some debug info 67215fae107Sandi * 67315fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 674f3f0262cSandi */ 675f3f0262cSandifunction html_debug() { 676f3f0262cSandi global $conf; 677d16a4edaSandi global $lang; 678e1d9dcc8SAndreas Gohr /** @var AuthPlugin $auth */ 6795298a619SAndreas Gohr global $auth; 680100a97e3SAndreas Gohr global $INFO; 681100a97e3SAndreas Gohr 68228fb55ffSandi //remove sensitive data 68328fb55ffSandi $cnf = $conf; 68424297a69SAndreas Gohr debug_guard($cnf); 685100a97e3SAndreas Gohr $nfo = $INFO; 68624297a69SAndreas Gohr debug_guard($nfo); 687100a97e3SAndreas Gohr $ses = $_SESSION; 68824297a69SAndreas Gohr debug_guard($ses); 689f3f0262cSandi 690f3f0262cSandi print '<html><body>'; 691f3f0262cSandi 692f3f0262cSandi print '<p>When reporting bugs please send all the following '; 693f3f0262cSandi print 'output as a mail to andi@splitbrain.org '; 694f3f0262cSandi print 'The best way to do this is to save this page in your browser</p>'; 695f3f0262cSandi 696100a97e3SAndreas Gohr print '<b>$INFO:</b><pre>'; 697100a97e3SAndreas Gohr print_r($nfo); 698100a97e3SAndreas Gohr print '</pre>'; 699100a97e3SAndreas Gohr 700f3f0262cSandi print '<b>$_SERVER:</b><pre>'; 701f3f0262cSandi print_r($_SERVER); 702f3f0262cSandi print '</pre>'; 703f3f0262cSandi 704f3f0262cSandi print '<b>$conf:</b><pre>'; 70528fb55ffSandi print_r($cnf); 706f3f0262cSandi print '</pre>'; 707f3f0262cSandi 708ed7b5f09Sandi print '<b>DOKU_BASE:</b><pre>'; 709ed7b5f09Sandi print DOKU_BASE; 710f3f0262cSandi print '</pre>'; 711f3f0262cSandi 712ed7b5f09Sandi print '<b>abs DOKU_BASE:</b><pre>'; 713ed7b5f09Sandi print DOKU_URL; 714ed7b5f09Sandi print '</pre>'; 715ed7b5f09Sandi 716ed7b5f09Sandi print '<b>rel DOKU_BASE:</b><pre>'; 717f3f0262cSandi print dirname($_SERVER['PHP_SELF']).'/'; 718f3f0262cSandi print '</pre>'; 719f3f0262cSandi 720f3f0262cSandi print '<b>PHP Version:</b><pre>'; 721f3f0262cSandi print phpversion(); 722f3f0262cSandi print '</pre>'; 723f3f0262cSandi 724f3f0262cSandi print '<b>locale:</b><pre>'; 725f3f0262cSandi print setlocale(LC_ALL,0); 726f3f0262cSandi print '</pre>'; 727f3f0262cSandi 728d16a4edaSandi print '<b>encoding:</b><pre>'; 729d16a4edaSandi print $lang['encoding']; 730d16a4edaSandi print '</pre>'; 731d16a4edaSandi 7325298a619SAndreas Gohr if ($auth) { 7335298a619SAndreas Gohr print '<b>Auth backend capabilities:</b><pre>'; 7342f46ade0SChristopher Smith foreach ($auth->getCapabilities() as $cando) { 7357afe5d93SSatoshi Sahara print ' '.str_pad($cando,16) .' => '. (int)$auth->canDo($cando) . DOKU_LF; 7362f46ade0SChristopher Smith } 7375298a619SAndreas Gohr print '</pre>'; 7385298a619SAndreas Gohr } 7395298a619SAndreas Gohr 7403aa54d7cSAndreas Gohr print '<b>$_SESSION:</b><pre>'; 741100a97e3SAndreas Gohr print_r($ses); 7423aa54d7cSAndreas Gohr print '</pre>'; 7433aa54d7cSAndreas Gohr 744f3f0262cSandi print '<b>Environment:</b><pre>'; 745f3f0262cSandi print_r($_ENV); 746f3f0262cSandi print '</pre>'; 747f3f0262cSandi 748f3f0262cSandi print '<b>PHP settings:</b><pre>'; 749f3f0262cSandi $inis = ini_get_all(); 750f3f0262cSandi print_r($inis); 751f3f0262cSandi print '</pre>'; 752f3f0262cSandi 753e89b7c1eSChristopher Smith if (function_exists('apache_get_version')) { 75459bc3b48SGerrit Uitslag $apache = array(); 755e89b7c1eSChristopher Smith $apache['version'] = apache_get_version(); 756e89b7c1eSChristopher Smith 757e89b7c1eSChristopher Smith if (function_exists('apache_get_modules')) { 758e89b7c1eSChristopher Smith $apache['modules'] = apache_get_modules(); 759e89b7c1eSChristopher Smith } 760e89b7c1eSChristopher Smith print '<b>Apache</b><pre>'; 761e89b7c1eSChristopher Smith print_r($apache); 762e89b7c1eSChristopher Smith print '</pre>'; 763e89b7c1eSChristopher Smith } 764e89b7c1eSChristopher Smith 765f3f0262cSandi print '</body></html>'; 766f3f0262cSandi} 767f3f0262cSandi 76810271ce4SAndreas Gohr/** 7698b06d178Schris * Form to request a new password for an existing account 7708b06d178Schris * 7718b06d178Schris * @author Benoit Chesneau <benoit@bchesneau.info> 772cc204bbdSAndreas Gohr * @author Andreas Gohr <gohr@cosmocode.de> 773bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18 77411e2ce22Schris */ 7758b06d178Schrisfunction html_resendpwd() { 776*79a2d784SGerrit Uitslag dbg_deprecated(UserResendPwd::class .'::show()'); 777bab2b7f0SSatoshi Sahara (new dokuwiki\Ui\UserResendPwd)->show(); 778cc204bbdSAndreas Gohr} 779cc204bbdSAndreas Gohr 780fdb8d77bSTom N Harris/** 781b8595a66SAndreas Gohr * Return the TOC rendered to XHTML 782b8595a66SAndreas Gohr * 783b8595a66SAndreas Gohr * @author Andreas Gohr <andi@splitbrain.org> 78442ea7f44SGerrit Uitslag * 78542ea7f44SGerrit Uitslag * @param array $toc 78642ea7f44SGerrit Uitslag * @return string html 787b8595a66SAndreas Gohr */ 788b8595a66SAndreas Gohrfunction html_TOC($toc) { 789b8595a66SAndreas Gohr if (!count($toc)) return ''; 790b8595a66SAndreas Gohr global $lang; 791b8595a66SAndreas Gohr $out = '<!-- TOC START -->'.DOKU_LF; 792158a5bffSDeathCamel57 $out .= '<div id="dw__toc" class="dw__toc">'.DOKU_LF; 79348722ac8SAnika Henke $out .= '<h3 class="toggle">'; 794b8595a66SAndreas Gohr $out .= $lang['toc']; 795d5acc30dSAnika Henke $out .= '</h3>'.DOKU_LF; 796d5acc30dSAnika Henke $out .= '<div>'.DOKU_LF; 797bde560b4SSatoshi Sahara $out .= html_buildlist($toc, 'toc', 'html_list_toc', null, true); 798b8595a66SAndreas Gohr $out .= '</div>'.DOKU_LF.'</div>'.DOKU_LF; 799b8595a66SAndreas Gohr $out .= '<!-- TOC END -->'.DOKU_LF; 800db959ae3SAndreas Gohr return $out; 801db959ae3SAndreas Gohr} 802b8595a66SAndreas Gohr 803b8595a66SAndreas Gohr/** 804b8595a66SAndreas Gohr * Callback for html_buildlist 80542ea7f44SGerrit Uitslag * 80642ea7f44SGerrit Uitslag * @param array $item 80742ea7f44SGerrit Uitslag * @return string html 808b8595a66SAndreas Gohr */ 809b8595a66SAndreas Gohrfunction html_list_toc($item) { 810c66972f2SAdrian Lang if (isset($item['hid'])){ 8117d91652aSAndreas Gohr $link = '#'.$item['hid']; 8127d91652aSAndreas Gohr } else { 8137d91652aSAndreas Gohr $link = $item['link']; 8147d91652aSAndreas Gohr } 8157d91652aSAndreas Gohr 816d5acc30dSAnika Henke return '<a href="'.$link.'">'.hsc($item['title']).'</a>'; 817b8595a66SAndreas Gohr} 818b8595a66SAndreas Gohr 819b8595a66SAndreas Gohr/** 820b8595a66SAndreas Gohr * Helper function to build TOC items 821b8595a66SAndreas Gohr * 822b8595a66SAndreas Gohr * Returns an array ready to be added to a TOC array 823b8595a66SAndreas Gohr * 824b8595a66SAndreas Gohr * @param string $link - where to link (if $hash set to '#' it's a local anchor) 825b8595a66SAndreas Gohr * @param string $text - what to display in the TOC 826b8595a66SAndreas Gohr * @param int $level - nesting level 827b8595a66SAndreas Gohr * @param string $hash - is prepended to the given $link, set blank if you want full links 8288d5e837eSMichael Hamann * @return array the toc item 829b8595a66SAndreas Gohr */ 830b8595a66SAndreas Gohrfunction html_mktocitem($link, $text, $level, $hash='#') { 831bde560b4SSatoshi Sahara return array( 832bde560b4SSatoshi Sahara 'link' => $hash.$link, 833b8595a66SAndreas Gohr 'title' => $text, 834b8595a66SAndreas Gohr 'type' => 'ul', 835bde560b4SSatoshi Sahara 'level' => $level 836bde560b4SSatoshi Sahara ); 837b8595a66SAndreas Gohr} 838b8595a66SAndreas Gohr 839b8595a66SAndreas Gohr/** 840fdb8d77bSTom N Harris * Output a Doku_Form object. 841fdb8d77bSTom N Harris * Triggers an event with the form name: HTML_{$name}FORM_OUTPUT 842fdb8d77bSTom N Harris * 843fdb8d77bSTom N Harris * @author Tom N Harris <tnharris@whoopdedo.org> 84442ea7f44SGerrit Uitslag * 8458d5e837eSMichael Hamann * @param string $name The name of the form 8468d5e837eSMichael Hamann * @param Doku_Form $form The form 8472162df3aSSatoshi Sahara * @return void 8482162df3aSSatoshi Sahara * @deprecated 2020-07-18 849fdb8d77bSTom N Harris */ 850c29600d0SSatoshi Saharafunction html_form($name, $form) { 8518a5f08afSSatoshi Sahara dbg_deprecated('use dokuwiki\Form\Form instead of Doku_Form'); 852fdb8d77bSTom N Harris // Safety check in case the caller forgets. 853fdb8d77bSTom N Harris $form->endFieldset(); 854cbb44eabSAndreas Gohr Event::createAndTrigger('HTML_'.strtoupper($name).'FORM_OUTPUT', $form, 'html_form_output', false); 855fdb8d77bSTom N Harris} 856fdb8d77bSTom N Harris 857fdb8d77bSTom N Harris/** 858fdb8d77bSTom N Harris * Form print function. 859c29600d0SSatoshi Sahara * Just calls printForm() on the form object. 86042ea7f44SGerrit Uitslag * 861c29600d0SSatoshi Sahara * @param Doku_Form $form The form 8622162df3aSSatoshi Sahara * @return void 8632162df3aSSatoshi Sahara * @deprecated 2020-07-18 864fdb8d77bSTom N Harris */ 86525dd2a2fSSatoshi Saharafunction html_form_output($form) { 8668a5f08afSSatoshi Sahara dbg_deprecated('use dokuwiki\Form\Form::toHTML()'); 86725dd2a2fSSatoshi Sahara $form->printForm(); 86825dd2a2fSSatoshi Sahara} 869340756e4Sandi 87007bf32b2SAndreas Gohr/** 87107bf32b2SAndreas Gohr * Embed a flash object in HTML 87207bf32b2SAndreas Gohr * 87307bf32b2SAndreas Gohr * This will create the needed HTML to embed a flash movie in a cross browser 87407bf32b2SAndreas Gohr * compatble way using valid XHTML 87507bf32b2SAndreas Gohr * 87607bf32b2SAndreas Gohr * The parameters $params, $flashvars and $atts need to be associative arrays. 87707bf32b2SAndreas Gohr * No escaping needs to be done for them. The alternative content *has* to be 87807bf32b2SAndreas Gohr * escaped because it is used as is. If no alternative content is given 87907bf32b2SAndreas Gohr * $lang['noflash'] is used. 88007bf32b2SAndreas Gohr * 88107bf32b2SAndreas Gohr * @author Andreas Gohr <andi@splitbrain.org> 88207bf32b2SAndreas Gohr * @link http://latrine.dgx.cz/how-to-correctly-insert-a-flash-into-xhtml 88307bf32b2SAndreas Gohr * 88407bf32b2SAndreas Gohr * @param string $swf - the SWF movie to embed 88507bf32b2SAndreas Gohr * @param int $width - width of the flash movie in pixels 88607bf32b2SAndreas Gohr * @param int $height - height of the flash movie in pixels 88707bf32b2SAndreas Gohr * @param array $params - additional parameters (<param>) 88807bf32b2SAndreas Gohr * @param array $flashvars - parameters to be passed in the flashvar parameter 88907bf32b2SAndreas Gohr * @param array $atts - additional attributes for the <object> tag 89007bf32b2SAndreas Gohr * @param string $alt - alternative content (is NOT automatically escaped!) 891b3d1090eSMichael Hamann * @return string - the XHTML markup 89207bf32b2SAndreas Gohr */ 89307bf32b2SAndreas Gohrfunction html_flashobject($swf,$width,$height,$params=null,$flashvars=null,$atts=null,$alt=''){ 89407bf32b2SAndreas Gohr global $lang; 89507bf32b2SAndreas Gohr 89607bf32b2SAndreas Gohr $out = ''; 89707bf32b2SAndreas Gohr 89807bf32b2SAndreas Gohr // prepare the object attributes 89907bf32b2SAndreas Gohr if(is_null($atts)) $atts = array(); 90007bf32b2SAndreas Gohr $atts['width'] = (int) $width; 901d4c61e61SAndreas Gohr $atts['height'] = (int) $height; 90207bf32b2SAndreas Gohr if(!$atts['width']) $atts['width'] = 425; 90307bf32b2SAndreas Gohr if(!$atts['height']) $atts['height'] = 350; 90407bf32b2SAndreas Gohr 90507bf32b2SAndreas Gohr // add object attributes for standard compliant browsers 90607bf32b2SAndreas Gohr $std = $atts; 90707bf32b2SAndreas Gohr $std['type'] = 'application/x-shockwave-flash'; 90807bf32b2SAndreas Gohr $std['data'] = $swf; 90907bf32b2SAndreas Gohr 91007bf32b2SAndreas Gohr // add object attributes for IE 91107bf32b2SAndreas Gohr $ie = $atts; 91207bf32b2SAndreas Gohr $ie['classid'] = 'clsid:D27CDB6E-AE6D-11cf-96B8-444553540000'; 91307bf32b2SAndreas Gohr 91407bf32b2SAndreas Gohr // open object (with conditional comments) 91507bf32b2SAndreas Gohr $out .= '<!--[if !IE]> -->'.NL; 91607bf32b2SAndreas Gohr $out .= '<object '.buildAttributes($std).'>'.NL; 91707bf32b2SAndreas Gohr $out .= '<!-- <![endif]-->'.NL; 91807bf32b2SAndreas Gohr $out .= '<!--[if IE]>'.NL; 91907bf32b2SAndreas Gohr $out .= '<object '.buildAttributes($ie).'>'.NL; 92007bf32b2SAndreas Gohr $out .= ' <param name="movie" value="'.hsc($swf).'" />'.NL; 9219ae41cdcSAndreas Gohr $out .= '<!--><!-- -->'.NL; 92207bf32b2SAndreas Gohr 92307bf32b2SAndreas Gohr // print params 92407bf32b2SAndreas Gohr if(is_array($params)) foreach($params as $key => $val){ 92507bf32b2SAndreas Gohr $out .= ' <param name="'.hsc($key).'" value="'.hsc($val).'" />'.NL; 92607bf32b2SAndreas Gohr } 92707bf32b2SAndreas Gohr 92807bf32b2SAndreas Gohr // add flashvars 92907bf32b2SAndreas Gohr if(is_array($flashvars)){ 930d4c61e61SAndreas Gohr $out .= ' <param name="FlashVars" value="'.buildURLparams($flashvars).'" />'.NL; 93107bf32b2SAndreas Gohr } 93207bf32b2SAndreas Gohr 93307bf32b2SAndreas Gohr // alternative content 93407bf32b2SAndreas Gohr if($alt){ 93507bf32b2SAndreas Gohr $out .= $alt.NL; 93607bf32b2SAndreas Gohr }else{ 93707bf32b2SAndreas Gohr $out .= $lang['noflash'].NL; 93807bf32b2SAndreas Gohr } 93907bf32b2SAndreas Gohr 94007bf32b2SAndreas Gohr // finish 94107bf32b2SAndreas Gohr $out .= '</object>'.NL; 94207bf32b2SAndreas Gohr $out .= '<!-- <![endif]-->'.NL; 94307bf32b2SAndreas Gohr 94407bf32b2SAndreas Gohr return $out; 94507bf32b2SAndreas Gohr} 94607bf32b2SAndreas Gohr 9478d5e837eSMichael Hamann/** 9488d5e837eSMichael Hamann * Prints HTML code for the given tab structure 9498d5e837eSMichael Hamann * 9508d5e837eSMichael Hamann * @param array $tabs tab structure 9518d5e837eSMichael Hamann * @param string $current_tab the current tab id 9522162df3aSSatoshi Sahara * @return void 9538d5e837eSMichael Hamann */ 95495b451bcSAdrian Langfunction html_tabs($tabs, $current_tab = null) { 95594add303SAnika Henke echo '<ul class="tabs">'.NL; 95695b451bcSAdrian Lang 95795b451bcSAdrian Lang foreach ($tabs as $id => $tab) { 95895b451bcSAdrian Lang html_tab($tab['href'], $tab['caption'], $id === $current_tab); 95995b451bcSAdrian Lang } 96095b451bcSAdrian Lang 96194add303SAnika Henke echo '</ul>'.NL; 96295b451bcSAdrian Lang} 963cd2a4cfdSAnika Henke 96495b451bcSAdrian Lang/** 96595b451bcSAdrian Lang * Prints a single tab 96695b451bcSAdrian Lang * 96795b451bcSAdrian Lang * @author Kate Arzamastseva <pshns@ukr.net> 96895b451bcSAdrian Lang * @author Adrian Lang <mail@adrianlang.de> 96995b451bcSAdrian Lang * 97095b451bcSAdrian Lang * @param string $href - tab href 97195b451bcSAdrian Lang * @param string $caption - tab caption 97295b451bcSAdrian Lang * @param boolean $selected - is tab selected 9732162df3aSSatoshi Sahara * @return void 97495b451bcSAdrian Lang */ 97595b451bcSAdrian Lang 97695b451bcSAdrian Langfunction html_tab($href, $caption, $selected = false) { 97795b451bcSAdrian Lang $tab = '<li>'; 97895b451bcSAdrian Lang if ($selected) { 97995b451bcSAdrian Lang $tab .= '<strong>'; 98095b451bcSAdrian Lang } else { 98195b451bcSAdrian Lang $tab .= '<a href="' . hsc($href) . '">'; 98295b451bcSAdrian Lang } 98395b451bcSAdrian Lang $tab .= hsc($caption) 98495b451bcSAdrian Lang . '</' . ($selected ? 'strong' : 'a') . '>' 98594add303SAnika Henke . '</li>'.NL; 98695b451bcSAdrian Lang echo $tab; 98795b451bcSAdrian Lang} 98895b451bcSAdrian Lang 989cd2a4cfdSAnika Henke/** 990cd2a4cfdSAnika Henke * Display size change 991cd2a4cfdSAnika Henke * 992cd2a4cfdSAnika Henke * @param int $sizechange - size of change in Bytes 993e34d6962SSatoshi Sahara * @param Doku_Form $form - (optional) form to add elements to 994e34d6962SSatoshi Sahara * @return void|string 995cd2a4cfdSAnika Henke */ 996e34d6962SSatoshi Saharafunction html_sizechange($sizechange, $form = null) { 997cd2a4cfdSAnika Henke if (isset($sizechange)) { 998cd2a4cfdSAnika Henke $class = 'sizechange'; 999cd2a4cfdSAnika Henke $value = filesize_h(abs($sizechange)); 1000cd2a4cfdSAnika Henke if ($sizechange > 0) { 1001cd2a4cfdSAnika Henke $class .= ' positive'; 1002cd2a4cfdSAnika Henke $value = '+' . $value; 1003cd2a4cfdSAnika Henke } elseif ($sizechange < 0) { 1004cd2a4cfdSAnika Henke $class .= ' negative'; 1005cd2a4cfdSAnika Henke $value = '-' . $value; 10060b78a6edSAnika Henke } else { 10070b78a6edSAnika Henke $value = '±' . $value; 1008cd2a4cfdSAnika Henke } 1009e34d6962SSatoshi Sahara if (!isset($form)) { 1010e34d6962SSatoshi Sahara return '<span class="'.$class.'">'.$value.'</span>'; 1011b0f23f4eSSatoshi Sahara } else { // Doku_Form 1012cd2a4cfdSAnika Henke $form->addElement(form_makeOpenTag('span', array('class' => $class))); 1013cd2a4cfdSAnika Henke $form->addElement($value); 1014cd2a4cfdSAnika Henke $form->addElement(form_makeCloseTag('span')); 1015cd2a4cfdSAnika Henke } 1016cd2a4cfdSAnika Henke } 1017b0f23f4eSSatoshi Sahara} 1018