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 */ 824870174SAndreas Gohruse dokuwiki\Ui\MediaRevisions; 924870174SAndreas Gohruse dokuwiki\Form\Form; 1079a2d784SGerrit Uitslaguse dokuwiki\Action\Denied; 1179a2d784SGerrit Uitslaguse dokuwiki\Action\Locked; 120c3a5702SAndreas Gohruse dokuwiki\ChangeLog\PageChangeLog; 13e1d9dcc8SAndreas Gohruse dokuwiki\Extension\AuthPlugin; 14cbb44eabSAndreas Gohruse dokuwiki\Extension\Event; 1579a2d784SGerrit Uitslaguse dokuwiki\Ui\Backlinks; 1679a2d784SGerrit Uitslaguse dokuwiki\Ui\Editor; 1779a2d784SGerrit Uitslaguse dokuwiki\Ui\Index; 1879a2d784SGerrit Uitslaguse dokuwiki\Ui\Login; 1979a2d784SGerrit Uitslaguse dokuwiki\Ui\PageConflict; 2079a2d784SGerrit Uitslaguse dokuwiki\Ui\PageDiff; 2179a2d784SGerrit Uitslaguse dokuwiki\Ui\PageDraft; 2279a2d784SGerrit Uitslaguse dokuwiki\Ui\PageRevisions; 2379a2d784SGerrit Uitslaguse dokuwiki\Ui\PageView; 2479a2d784SGerrit Uitslaguse dokuwiki\Ui\Recent; 2579a2d784SGerrit Uitslaguse dokuwiki\Ui\UserProfile; 2679a2d784SGerrit Uitslaguse dokuwiki\Ui\UserRegister; 2779a2d784SGerrit Uitslaguse dokuwiki\Ui\UserResendPwd; 2879a2d784SGerrit Uitslaguse dokuwiki\Utf8\Clean; 290c3a5702SAndreas Gohr 302d3b082eSMichael Großeif (!defined('SEC_EDIT_PATTERN')) { 3137c80e0eSLarsDW223 define('SEC_EDIT_PATTERN', '#<!-- EDIT({.*?}) -->#'); 322d3b082eSMichael Große} 332d3b082eSMichael Große 346bbae538Sandi 35f3f0262cSandi/** 36f3f0262cSandi * Convenience function to quickly build a wikilink 3715fae107Sandi * 3815fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 398d5e837eSMichael Hamann * @param string $id id of the target page 408d5e837eSMichael Hamann * @param string $name the name of the link, i.e. the text that is displayed 418d5e837eSMichael Hamann * @param string|array $search search string(s) that shall be highlighted in the target page 428d5e837eSMichael Hamann * @return string the HTML code of the link 43f3f0262cSandi */ 44d868eb89SAndreas Gohrfunction html_wikilink($id, $name = null, $search = '') 45d868eb89SAndreas Gohr{ 46a8397511SGerrit Uitslag /** @var Doku_Renderer_xhtml $xhtml_renderer */ 47db959ae3SAndreas Gohr static $xhtml_renderer = null; 48723d78dbSandi if (is_null($xhtml_renderer)) { 497aea91afSChris Smith $xhtml_renderer = p_get_renderer('xhtml'); 50f3f0262cSandi } 51f3f0262cSandi 52fe9ec250SChris Smith return $xhtml_renderer->internallink($id, $name, $search, true, 'navigation'); 53f3f0262cSandi} 54f3f0262cSandi 55f3f0262cSandi/** 56f3f0262cSandi * The loginform 5715fae107Sandi * 5815fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 59d1d904bbSMichael Große * 60d1d904bbSMichael Große * @param bool $svg Whether to show svg icons in the register and resendpwd links or not 61bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18 62f3f0262cSandi */ 63d868eb89SAndreas Gohrfunction html_login($svg = false) 64d868eb89SAndreas Gohr{ 6579a2d784SGerrit Uitslag dbg_deprecated(Login::class .'::show()'); 6624870174SAndreas Gohr (new Login($svg))->show(); 67f3f0262cSandi} 68f3f0262cSandi 69d59dea9fSGerrit Uitslag 70d59dea9fSGerrit Uitslag/** 71d59dea9fSGerrit Uitslag * Denied page content 72d59dea9fSGerrit Uitslag * 737afe5d93SSatoshi Sahara * @deprecated 2020-07-18 not called anymore, see inc/Action/Denied::tplContent() 74d59dea9fSGerrit Uitslag */ 75d868eb89SAndreas Gohrfunction html_denied() 76d868eb89SAndreas Gohr{ 7779a2d784SGerrit Uitslag dbg_deprecated(Denied::class .'::showBanner()'); 7824870174SAndreas Gohr (new Denied())->showBanner(); 79d59dea9fSGerrit Uitslag} 80d59dea9fSGerrit Uitslag 81f3f0262cSandi/** 8215fae107Sandi * inserts section edit buttons if wanted or removes the markers 8315fae107Sandi * 8415fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 8542ea7f44SGerrit Uitslag * 8642ea7f44SGerrit Uitslag * @param string $text 8742ea7f44SGerrit Uitslag * @param bool $show show section edit buttons? 8842ea7f44SGerrit Uitslag * @return string 8915fae107Sandi */ 90d868eb89SAndreas Gohrfunction html_secedit($text, $show = true) 91d868eb89SAndreas Gohr{ 92f3f0262cSandi global $INFO; 9335dae8b0SBen Coburn 94aac83cd4SPhy if ((isset($INFO) && !$INFO['writable']) || !$show || (isset($INFO) && $INFO['rev'])) { 952d3b082eSMichael Große return preg_replace(SEC_EDIT_PATTERN, '', $text); 96f3f0262cSandi } 9735dae8b0SBen Coburn 98dccd6b2bSAndreas Gohr return preg_replace_callback( 99dccd6b2bSAndreas Gohr SEC_EDIT_PATTERN, 100dccd6b2bSAndreas Gohr 'html_secedit_button', 101dccd6b2bSAndreas Gohr $text 102dccd6b2bSAndreas Gohr ); 10340868f2fSAdrian Lang} 10440868f2fSAdrian Lang 10540868f2fSAdrian Lang/** 10640868f2fSAdrian Lang * prepares section edit button data for event triggering 10740868f2fSAdrian Lang * used as a callback in html_secedit 10840868f2fSAdrian Lang * 10940868f2fSAdrian Lang * @author Andreas Gohr <andi@splitbrain.org> 11042ea7f44SGerrit Uitslag * 11142ea7f44SGerrit Uitslag * @param array $matches matches with regexp 11242ea7f44SGerrit Uitslag * @return string 11342ea7f44SGerrit Uitslag * @triggers HTML_SECEDIT_BUTTON 11440868f2fSAdrian Lang */ 115d868eb89SAndreas Gohrfunction html_secedit_button($matches) 116d868eb89SAndreas Gohr{ 117ada0d779SMichael Hamann $json = htmlspecialchars_decode($matches[1], ENT_QUOTES); 118cb7312c0SAndreas Gohr 119cb7312c0SAndreas Gohr try { 12024870174SAndreas Gohr $data = json_decode($json, true, 512, JSON_THROW_ON_ERROR); 121cb7312c0SAndreas Gohr } catch (JsonException $e) { 12279a2d784SGerrit Uitslag return ''; 12306917fceSMichael Große } 124ec57f119SLarsDW223 $data['target'] = strtolower($data['target']); 12596ebed36SAndreas Gohr $data['hid'] = strtolower($data['hid'] ?? ''); 12640868f2fSAdrian Lang 12796ebed36SAndreas Gohr return Event::createAndTrigger( 12896ebed36SAndreas Gohr 'HTML_SECEDIT_BUTTON', 12996ebed36SAndreas Gohr $data, 13096ebed36SAndreas Gohr 'html_secedit_get_button' 13196ebed36SAndreas Gohr ); 13240868f2fSAdrian Lang} 13340868f2fSAdrian Lang 13440868f2fSAdrian Lang/** 13540868f2fSAdrian Lang * prints a section editing button 13640868f2fSAdrian Lang * used as default action form HTML_SECEDIT_BUTTON 13740868f2fSAdrian Lang * 13840868f2fSAdrian Lang * @author Adrian Lang <lang@cosmocode.de> 13942ea7f44SGerrit Uitslag * 14042ea7f44SGerrit Uitslag * @param array $data name, section id and target 14142ea7f44SGerrit Uitslag * @return string html 14240868f2fSAdrian Lang */ 143d868eb89SAndreas Gohrfunction html_secedit_get_button($data) 144d868eb89SAndreas Gohr{ 14540868f2fSAdrian Lang global $ID; 14640868f2fSAdrian Lang global $INFO; 14740868f2fSAdrian Lang 1486d9eab4dSMichael Hamann if (!isset($data['name']) || $data['name'] === '') return ''; 14940868f2fSAdrian Lang 15040868f2fSAdrian Lang $name = $data['name']; 15140868f2fSAdrian Lang unset($data['name']); 15240868f2fSAdrian Lang 153905fa971SAdrian Lang $secid = $data['secid']; 154905fa971SAdrian Lang unset($data['secid']); 155905fa971SAdrian Lang 1567afe5d93SSatoshi Sahara $params = array_merge( 15724870174SAndreas Gohr ['do' => 'edit', 'rev' => $INFO['lastmod'], 'summary' => '['.$name.'] '], 1587afe5d93SSatoshi Sahara $data 1597afe5d93SSatoshi Sahara ); 1607afe5d93SSatoshi Sahara 1617afe5d93SSatoshi Sahara $html = '<div class="secedit editbutton_'.$data['target'] .' editbutton_'.$secid .'">'; 1627afe5d93SSatoshi Sahara $html.= html_btn('secedit', $ID, '', $params, 'post', $name); 1637afe5d93SSatoshi Sahara $html.= '</div>'; 1647afe5d93SSatoshi Sahara return $html; 165f3f0262cSandi} 166f3f0262cSandi 167f3f0262cSandi/** 168d6c9c552Smatthiasgrimm * Just the back to top button (in its own form) 1696b13307fSandi * 1706b13307fSandi * @author Andreas Gohr <andi@splitbrain.org> 17142ea7f44SGerrit Uitslag * 17242ea7f44SGerrit Uitslag * @return string html 1736b13307fSandi */ 174d868eb89SAndreas Gohrfunction html_topbtn() 175d868eb89SAndreas Gohr{ 1766b13307fSandi global $lang; 1776b13307fSandi 17879a2d784SGerrit Uitslag return '<a class="nolink" href="#dokuwiki__top">' 1797afe5d93SSatoshi Sahara .'<button class="button" onclick="window.scrollTo(0, 0)" title="'. $lang['btn_top'] .'">' 1807afe5d93SSatoshi Sahara . $lang['btn_top'] 1817afe5d93SSatoshi Sahara .'</button></a>'; 1826b13307fSandi} 1836b13307fSandi 1846b13307fSandi/** 185d67ca2c0Smatthiasgrimm * Displays a button (using its own form) 18635dae8b0SBen Coburn * If tooltip exists, the access key tooltip is replaced. 18715fae107Sandi * 18815fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 18942ea7f44SGerrit Uitslag * 19042ea7f44SGerrit Uitslag * @param string $name 19142ea7f44SGerrit Uitslag * @param string $id 19242ea7f44SGerrit Uitslag * @param string $akey access key 193e3710957SGerrit Uitslag * @param string[] $params key-value pairs added as hidden inputs 19442ea7f44SGerrit Uitslag * @param string $method 19542ea7f44SGerrit Uitslag * @param string $tooltip 19642ea7f44SGerrit Uitslag * @param bool|string $label label text, false: lookup btn_$name in localization 197e824d633SMichael Große * @param string $svg (optional) svg code, inserted into the button 19842ea7f44SGerrit Uitslag * @return string 199f3f0262cSandi */ 200d868eb89SAndreas Gohrfunction html_btn($name, $id, $akey, $params, $method = 'get', $tooltip = '', $label = false, $svg = null) 201d868eb89SAndreas Gohr{ 202f3f0262cSandi global $conf; 203f3f0262cSandi global $lang; 204f3f0262cSandi 205f5baf821SAnika Henke if (!$label) 206f3f0262cSandi $label = $lang['btn_'.$name]; 207f3f0262cSandi 20849c713a3Sandi //filter id (without urlencoding) 20949c713a3Sandi $id = idfilter($id, false); 210f3f0262cSandi 211f3f0262cSandi //make nice URLs even for buttons 2126c7843b5Sandi if ($conf['userewrite'] == 2) { 2136c7843b5Sandi $script = DOKU_BASE.DOKU_SCRIPT.'/'.$id; 2146c7843b5Sandi } elseif ($conf['userewrite']) { 2156c7843b5Sandi $script = DOKU_BASE.$id; 2166c7843b5Sandi } else { 2178b00ebcfSandi $script = DOKU_BASE.DOKU_SCRIPT; 218f3f0262cSandi $params['id'] = $id; 219f3f0262cSandi } 220f3f0262cSandi 2217afe5d93SSatoshi Sahara $html = '<form class="button btn_'.$name.'" method="'.$method.'" action="'.$script.'"><div class="no">'; 222f3f0262cSandi 22306a4bf8fSAndreas Gohr if (is_array($params)) { 2249e491c01SAndreas Gohr foreach ($params as $key => $val) { 2257afe5d93SSatoshi Sahara $html .= '<input type="hidden" name="'.$key.'" value="'.hsc($val).'" />'; 226f3f0262cSandi } 22706a4bf8fSAndreas Gohr } 228f3f0262cSandi 2297afe5d93SSatoshi Sahara $tip = empty($tooltip) ? hsc($label) : hsc($tooltip); 23011ea018fSAndreas Gohr 2317afe5d93SSatoshi Sahara $html .= '<button type="submit" '; 23211ea018fSAndreas Gohr if ($akey) { 23307493d05SAnika Henke $tip .= ' ['.strtoupper($akey).']'; 2347afe5d93SSatoshi Sahara $html .= 'accesskey="'.$akey.'" '; 23535dae8b0SBen Coburn } 2367afe5d93SSatoshi Sahara $html .= 'title="'.$tip.'">'; 237e824d633SMichael Große if ($svg) { 2387afe5d93SSatoshi Sahara $html .= '<span>'. hsc($label) .'</span>'. inlineSVG($svg); 239679dba01SMichael Große } else { 2407afe5d93SSatoshi Sahara $html .= hsc($label); 241679dba01SMichael Große } 2427afe5d93SSatoshi Sahara $html .= '</button>'; 2437afe5d93SSatoshi Sahara $html .= '</div></form>'; 244f3f0262cSandi 2457afe5d93SSatoshi Sahara return $html; 246f3f0262cSandi} 2470747f5d7Sghi/** 2480747f5d7Sghi * show a revision warning 2490747f5d7Sghi * 2500747f5d7Sghi * @author Szymon Olewniczak <dokuwiki@imz.re> 25187f229e8SSatoshi Sahara * @deprecated 2020-07-18 2520747f5d7Sghi */ 253d868eb89SAndreas Gohrfunction html_showrev() 254d868eb89SAndreas Gohr{ 25579a2d784SGerrit Uitslag dbg_deprecated(PageView::class .'::showrev()'); 2560747f5d7Sghi} 257f3f0262cSandi 258f3f0262cSandi/** 25942ea7f44SGerrit Uitslag * Show a wiki page 26015fae107Sandi * 26115fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 26242ea7f44SGerrit Uitslag * 26342ea7f44SGerrit Uitslag * @param null|string $txt wiki text or null for showing $ID 264bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18 26515fae107Sandi */ 266d868eb89SAndreas Gohrfunction html_show($txt = null) 267d868eb89SAndreas Gohr{ 26879a2d784SGerrit Uitslag dbg_deprecated(PageView::class .'::show()'); 26924870174SAndreas Gohr (new PageView($txt))->show(); 270f3f0262cSandi} 271f3f0262cSandi 272f3f0262cSandi/** 273ee4c4a1bSAndreas Gohr * ask the user about how to handle an exisiting draft 274ee4c4a1bSAndreas Gohr * 275ee4c4a1bSAndreas Gohr * @author Andreas Gohr <andi@splitbrain.org> 276bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18 277ee4c4a1bSAndreas Gohr */ 278d868eb89SAndreas Gohrfunction html_draft() 279d868eb89SAndreas Gohr{ 28079a2d784SGerrit Uitslag dbg_deprecated(PageDraft::class .'::show()'); 28173022918SAndreas Gohr (new PageDraft())->show(); 282ee4c4a1bSAndreas Gohr} 283ee4c4a1bSAndreas Gohr 284ee4c4a1bSAndreas Gohr/** 285f3f0262cSandi * Highlights searchqueries in HTML code 28615fae107Sandi * 28715fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 2887209be23SAndreas Gohr * @author Harry Fuecks <hfuecks@gmail.com> 28942ea7f44SGerrit Uitslag * 29042ea7f44SGerrit Uitslag * @param string $html 29142ea7f44SGerrit Uitslag * @param array|string $phrases 29242ea7f44SGerrit Uitslag * @return string html 293f3f0262cSandi */ 294d868eb89SAndreas Gohrfunction html_hilight($html, $phrases) 295d868eb89SAndreas Gohr{ 2968a803caeSAndreas Gohr $phrases = (array) $phrases; 2978a803caeSAndreas Gohr $phrases = array_map('preg_quote_cb', $phrases); 2988a803caeSAndreas Gohr $phrases = array_map('ft_snippet_re_preprocess', $phrases); 2998a803caeSAndreas Gohr $phrases = array_filter($phrases); 30024870174SAndreas Gohr 30124870174SAndreas Gohr $regex = implode('|', $phrases); 30260c15d7dSAndreas Gohr 30360c15d7dSAndreas Gohr if ($regex === '') return $html; 30479a2d784SGerrit Uitslag if (!Clean::isUtf8($regex)) return $html; 305f3f0262cSandi 30679a2d784SGerrit Uitslag return @preg_replace_callback("/((<[^>]*)|$regex)/ui", function ($match) { 307675d8ce4SSatoshi Sahara $hlight = unslash($match[0]); 308675d8ce4SSatoshi Sahara if (!isset($match[2])) { 309688774a0SAnika Henke $hlight = '<span class="search_hit">'.$hlight.'</span>'; 3107209be23SAndreas Gohr } 3117209be23SAndreas Gohr return $hlight; 312675d8ce4SSatoshi Sahara }, $html); 3137209be23SAndreas Gohr} 3147209be23SAndreas Gohr 3157209be23SAndreas Gohr/** 31615fae107Sandi * Display error on locked pages 31715fae107Sandi * 31815fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 3197afe5d93SSatoshi Sahara * @deprecated 2020-07-18 not called anymore, see inc/Action/Locked::tplContent() 32015fae107Sandi */ 321d868eb89SAndreas Gohrfunction html_locked() 322d868eb89SAndreas Gohr{ 32379a2d784SGerrit Uitslag dbg_deprecated(Locked::class .'::showBanner()'); 32424870174SAndreas Gohr (new Locked())->showBanner(); 325f3f0262cSandi} 326f3f0262cSandi 32715fae107Sandi/** 32815fae107Sandi * list old revisions 32915fae107Sandi * 33015fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 33171726d78SBen Coburn * @author Ben Coburn <btcoburn@silicodon.net> 3328e69fd30SKate Arzamastseva * @author Kate Arzamastseva <pshns@ukr.net> 333e0c26282SGerrit Uitslag * 334e0c26282SGerrit Uitslag * @param int $first skip the first n changelog lines 33530a159abSSatoshi Sahara * @param string $media_id id of media, or empty for current page 336bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18 33715fae107Sandi */ 338d868eb89SAndreas Gohrfunction html_revisions($first = -1, $media_id = '') 339d868eb89SAndreas Gohr{ 34079a2d784SGerrit Uitslag dbg_deprecated(PageRevisions::class .'::show()'); 341b370ebcdSSatoshi Sahara if ($media_id) { 34224870174SAndreas Gohr (new MediaRevisions($media_id))->show($first); 343b370ebcdSSatoshi Sahara } else { 344b370ebcdSSatoshi Sahara global $INFO; 34524870174SAndreas Gohr (new PageRevisions($INFO['id']))->show($first); 346b370ebcdSSatoshi Sahara } 347f3f0262cSandi} 348f3f0262cSandi 34915fae107Sandi/** 35015fae107Sandi * display recent changes 35115fae107Sandi * 35215fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 3535749f1ceSmatthiasgrimm * @author Matthias Grimm <matthiasgrimm@users.sourceforge.net> 35471726d78SBen Coburn * @author Ben Coburn <btcoburn@silicodon.net> 3558d40b4b6SKate Arzamastseva * @author Kate Arzamastseva <pshns@ukr.net> 35642ea7f44SGerrit Uitslag * 35742ea7f44SGerrit Uitslag * @param int $first 35842ea7f44SGerrit Uitslag * @param string $show_changes 359bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18 36015fae107Sandi */ 361d868eb89SAndreas Gohrfunction html_recent($first = 0, $show_changes = 'both') 362d868eb89SAndreas Gohr{ 36379a2d784SGerrit Uitslag dbg_deprecated(Recent::class .'::show()'); 36424870174SAndreas Gohr (new Recent($first, $show_changes))->show(); 365f3f0262cSandi} 366f3f0262cSandi 36715fae107Sandi/** 36815fae107Sandi * Display page index 36915fae107Sandi * 37015fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 37142ea7f44SGerrit Uitslag * 37242ea7f44SGerrit Uitslag * @param string $ns 373bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18 37415fae107Sandi */ 375d868eb89SAndreas Gohrfunction html_index($ns) 376d868eb89SAndreas Gohr{ 37779a2d784SGerrit Uitslag dbg_deprecated(Index::class .'::show()'); 37824870174SAndreas Gohr (new Index($ns))->show(); 379f3f0262cSandi} 380f3f0262cSandi 381f3f0262cSandi/** 38289b939d7SSatoshi Sahara * Index tree item formatter for html_buildlist() 38315fae107Sandi * 384f3f0262cSandi * User function for html_buildlist() 38515fae107Sandi * 38615fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 38742ea7f44SGerrit Uitslag * 38842ea7f44SGerrit Uitslag * @param array $item 38942ea7f44SGerrit Uitslag * @return string 3909c8632b4SSatoshi Sahara * @deprecated 2020-07-18 391f3f0262cSandi */ 392d868eb89SAndreas Gohrfunction html_list_index($item) 393d868eb89SAndreas Gohr{ 39479a2d784SGerrit Uitslag dbg_deprecated(Index::class .'::formatListItem()'); 39573022918SAndreas Gohr return (new Index())->formatListItem($item); 396f3f0262cSandi} 397f3f0262cSandi 398f3f0262cSandi/** 39989b939d7SSatoshi Sahara * Index list item formatter for html_buildlist() 400cb70c441Sandi * 401a1dee2b9SAdrian Lang * This user function is used in html_buildlist to build the 402cb70c441Sandi * <li> tags for namespaces when displaying the page index 403cb70c441Sandi * it gives different classes to opened or closed "folders" 404cb70c441Sandi * 405cb70c441Sandi * @author Andreas Gohr <andi@splitbrain.org> 40642ea7f44SGerrit Uitslag * 40742ea7f44SGerrit Uitslag * @param array $item 40842ea7f44SGerrit Uitslag * @return string html 4099c8632b4SSatoshi Sahara * @deprecated 2020-07-18 410cb70c441Sandi */ 411d868eb89SAndreas Gohrfunction html_li_index($item) 412d868eb89SAndreas Gohr{ 41379a2d784SGerrit Uitslag dbg_deprecated(Index::class .'::tagListItem()'); 41473022918SAndreas Gohr return (new Index())->tagListItem($item); 415cb70c441Sandi} 416cb70c441Sandi 417cb70c441Sandi/** 41889b939d7SSatoshi Sahara * Default list item formatter for html_buildlist() 41989b939d7SSatoshi Sahara * 42089b939d7SSatoshi Sahara * @author Andreas Gohr <andi@splitbrain.org> 42189b939d7SSatoshi Sahara * 42289b939d7SSatoshi Sahara * @param array $item 42389b939d7SSatoshi Sahara * @return string html 42489b939d7SSatoshi Sahara * @deprecated 2020-07-18 42589b939d7SSatoshi Sahara */ 426d868eb89SAndreas Gohrfunction html_li_default($item) 427d868eb89SAndreas Gohr{ 42889b939d7SSatoshi Sahara return '<li class="level'.$item['level'].'">'; 42989b939d7SSatoshi Sahara} 43089b939d7SSatoshi Sahara 43189b939d7SSatoshi Sahara/** 43215fae107Sandi * Build an unordered list 43315fae107Sandi * 434f3f0262cSandi * Build an unordered list from the given $data array 435f3f0262cSandi * Each item in the array has to have a 'level' property 436f3f0262cSandi * the item itself gets printed by the given $func user 437cb70c441Sandi * function. The second and optional function is used to 438cb70c441Sandi * print the <li> tag. Both user function need to accept 439cb70c441Sandi * a single item. 44015fae107Sandi * 441c5a8fd96SAndreas Gohr * Both user functions can be given as array to point to 442c5a8fd96SAndreas Gohr * a member of an object. 443c5a8fd96SAndreas Gohr * 44415fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 44580679bafSGerrit Uitslag * 44680679bafSGerrit Uitslag * @param array $data array with item arrays 44780679bafSGerrit Uitslag * @param string $class class of ul wrapper 44880679bafSGerrit Uitslag * @param callable $func callback to print an list item 449bde560b4SSatoshi Sahara * @param callable $lifunc (optional) callback to the opening li tag 450bde560b4SSatoshi Sahara * @param bool $forcewrapper (optional) Trigger building a wrapper ul if the first level is 451ae614416SAnika Henke * 0 (we have a root object) or 1 (just the root content) 45280679bafSGerrit Uitslag * @return string html of an unordered list 453f3f0262cSandi */ 454d868eb89SAndreas Gohrfunction html_buildlist($data, $class, $func, $lifunc = null, $forcewrapper = false) 455d868eb89SAndreas Gohr{ 45624870174SAndreas Gohr if ($data === []) { 457a1dee2b9SAdrian Lang return ''; 458a1dee2b9SAdrian Lang } 459a1dee2b9SAdrian Lang 4602689c55fSMichael Große $firstElement = reset($data); 4612689c55fSMichael Große $start_level = $firstElement['level']; 4629e4f7880SAdrian Lang $level = $start_level; 4639c8632b4SSatoshi Sahara $html = ''; 464434f5921SHakan Sandell $open = 0; 4659e4f7880SAdrian Lang 466bde560b4SSatoshi Sahara // set callback function to build the <li> tag, formerly defined as html_li_default() 467bde560b4SSatoshi Sahara if (!is_callable($lifunc)) { 46824870174SAndreas Gohr $lifunc = static fn($item) => '<li class="level'.$item['level'].'">'; 469bde560b4SSatoshi Sahara } 470bde560b4SSatoshi Sahara 471f3f0262cSandi foreach ($data as $item) { 472f3f0262cSandi if ($item['level'] > $level) { 473f3f0262cSandi //open new list 474df52d0feSandi for ($i = 0; $i < ($item['level'] - $level); $i++) { 4759c8632b4SSatoshi Sahara if ($i) $html .= '<li class="clear">'; 4769c8632b4SSatoshi Sahara $html .= "\n".'<ul class="'.$class.'">'."\n"; 477434f5921SHakan Sandell $open++; 478df52d0feSandi } 479434f5921SHakan Sandell $level = $item['level']; 480f3f0262cSandi } elseif ($item['level'] < $level) { 481f3f0262cSandi //close last item 4829c8632b4SSatoshi Sahara $html .= '</li>'."\n"; 483434f5921SHakan Sandell while ($level > $item['level'] && $open > 0) { 484f3f0262cSandi //close higher lists 4859c8632b4SSatoshi Sahara $html .= '</ul>'."\n".'</li>'."\n"; 486434f5921SHakan Sandell $level--; 487434f5921SHakan Sandell $open--; 488f3f0262cSandi } 4899c8632b4SSatoshi Sahara } elseif ($html !== '') { 49087671313SHakan Sandell //close previous item 4919c8632b4SSatoshi Sahara $html .= '</li>'."\n"; 492f3f0262cSandi } 493f3f0262cSandi 494f3f0262cSandi //print item 4959c8632b4SSatoshi Sahara $html .= call_user_func($lifunc, $item); 4969c8632b4SSatoshi Sahara $html .= '<div class="li">'; 49734dbe711Schris 4989c8632b4SSatoshi Sahara $html .= call_user_func($func, $item); 4999c8632b4SSatoshi Sahara $html .= '</div>'; 500f3f0262cSandi } 501f3f0262cSandi 502f3f0262cSandi //close remaining items and lists 5039c8632b4SSatoshi Sahara $html .= '</li>'."\n"; 504434f5921SHakan Sandell while ($open-- > 0) { 5059c8632b4SSatoshi Sahara $html .= '</ul></li>'."\n"; 506434f5921SHakan Sandell } 507434f5921SHakan Sandell 508434f5921SHakan Sandell if ($forcewrapper || $start_level < 2) { 509434f5921SHakan Sandell // Trigger building a wrapper ul if the first level is 510434f5921SHakan Sandell // 0 (we have a root object) or 1 (just the root content) 5119c8632b4SSatoshi Sahara $html = "\n".'<ul class="'.$class.'">'."\n".$html.'</ul>'."\n"; 512f3f0262cSandi } 513f3f0262cSandi 5149c8632b4SSatoshi Sahara return $html; 515f3f0262cSandi} 516f3f0262cSandi 51715fae107Sandi/** 51815fae107Sandi * display backlinks 51915fae107Sandi * 52015fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 52111df47ecSMichael Klier * @author Michael Klier <chi@chimeric.de> 522bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18 52315fae107Sandi */ 524d868eb89SAndreas Gohrfunction html_backlinks() 525d868eb89SAndreas Gohr{ 52679a2d784SGerrit Uitslag dbg_deprecated(Backlinks::class .'::show()'); 52773022918SAndreas Gohr (new Backlinks())->show(); 52895b451bcSAdrian Lang} 52995b451bcSAdrian Lang 53015fae107Sandi/** 531a215faf2SSatoshi Sahara * Get header of diff HTML 532a215faf2SSatoshi Sahara * 533a215faf2SSatoshi Sahara * @param string $l_rev Left revisions 534a215faf2SSatoshi Sahara * @param string $r_rev Right revision 535a215faf2SSatoshi Sahara * @param string $id Page id, if null $ID is used 536a215faf2SSatoshi Sahara * @param bool $media If it is for media files 537a215faf2SSatoshi Sahara * @param bool $inline Return the header on a single line 538a215faf2SSatoshi Sahara * @return string[] HTML snippets for diff header 539a215faf2SSatoshi Sahara * @deprecated 2020-07-18 540a215faf2SSatoshi Sahara */ 541d868eb89SAndreas Gohrfunction html_diff_head($l_rev, $r_rev, $id = null, $media = false, $inline = false) 542d868eb89SAndreas Gohr{ 54379a2d784SGerrit Uitslag dbg_deprecated('see '. PageDiff::class .'::buildDiffHead()'); 54479a2d784SGerrit Uitslag return ['', '', '', '']; 545a215faf2SSatoshi Sahara} 546a215faf2SSatoshi Sahara 547a215faf2SSatoshi Sahara/** 54804e99fe1SGerrit Uitslag * Show diff 549baf0c3e5SGerrit Uitslag * between current page version and provided $text 550baf0c3e5SGerrit Uitslag * or between the revisions provided via GET or POST 55115fae107Sandi * 55215fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 553baf0c3e5SGerrit Uitslag * @param string $text when non-empty: compare with this text with most current version 55404e99fe1SGerrit Uitslag * @param bool $intro display the intro text 5558d5e837eSMichael Hamann * @param string $type type of the diff (inline or sidebyside) 556bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18 55715fae107Sandi */ 558d868eb89SAndreas Gohrfunction html_diff($text = '', $intro = true, $type = null) 559d868eb89SAndreas Gohr{ 56079a2d784SGerrit Uitslag dbg_deprecated(PageDiff::class .'::show()'); 561edb50e6aSSatoshi Sahara global $INFO; 56224870174SAndreas Gohr (new PageDiff($INFO['id']))->compareWith($text)->preference([ 563edb50e6aSSatoshi Sahara 'showIntro' => $intro, 564edb50e6aSSatoshi Sahara 'difftype' => $type, 565edb50e6aSSatoshi Sahara ])->show(); 566fcfecb69SChristopher Smith} 567fcfecb69SChristopher Smith 56815fae107Sandi/** 569a215faf2SSatoshi Sahara * Create html for revision navigation 570a215faf2SSatoshi Sahara * 571a215faf2SSatoshi Sahara * @param PageChangeLog $pagelog changelog object of current page 572a215faf2SSatoshi Sahara * @param string $type inline vs sidebyside 573a215faf2SSatoshi Sahara * @param int $l_rev left revision timestamp 574a215faf2SSatoshi Sahara * @param int $r_rev right revision timestamp 575a215faf2SSatoshi Sahara * @return string[] html of left and right navigation elements 576a215faf2SSatoshi Sahara * @deprecated 2020-07-18 577a215faf2SSatoshi Sahara */ 578d868eb89SAndreas Gohrfunction html_diff_navigation($pagelog, $type, $l_rev, $r_rev) 579d868eb89SAndreas Gohr{ 58079a2d784SGerrit Uitslag dbg_deprecated('see '. PageDiff::class .'::buildRevisionsNavigation()'); 58179a2d784SGerrit Uitslag return ['', '']; 582a215faf2SSatoshi Sahara} 583a215faf2SSatoshi Sahara 584a215faf2SSatoshi Sahara/** 585a215faf2SSatoshi Sahara * Create html link to a diff defined by two revisions 586a215faf2SSatoshi Sahara * 587a215faf2SSatoshi Sahara * @param string $difftype display type 588a215faf2SSatoshi Sahara * @param string $linktype 589a215faf2SSatoshi Sahara * @param int $lrev oldest revision 590a215faf2SSatoshi Sahara * @param int $rrev newest revision or null for diff with current revision 591a215faf2SSatoshi Sahara * @return string html of link to a diff 592a215faf2SSatoshi Sahara * @deprecated 2020-07-18 593a215faf2SSatoshi Sahara */ 594d868eb89SAndreas Gohrfunction html_diff_navigationlink($difftype, $linktype, $lrev, $rrev = null) 595d868eb89SAndreas Gohr{ 59679a2d784SGerrit Uitslag dbg_deprecated('see '. PageDiff::class .'::diffViewlink()'); 59779a2d784SGerrit Uitslag return ''; 598a215faf2SSatoshi Sahara} 599a215faf2SSatoshi Sahara 600a215faf2SSatoshi Sahara/** 601a215faf2SSatoshi Sahara * Insert soft breaks in diff html 602a215faf2SSatoshi Sahara * 603a215faf2SSatoshi Sahara * @param string $diffhtml 604a215faf2SSatoshi Sahara * @return string 605a215faf2SSatoshi Sahara * @deprecated 2020-07-18 606a215faf2SSatoshi Sahara */ 607d868eb89SAndreas Gohrfunction html_insert_softbreaks($diffhtml) 608d868eb89SAndreas Gohr{ 60979a2d784SGerrit Uitslag dbg_deprecated(PageDiff::class .'::insertSoftbreaks()'); 61073022918SAndreas Gohr return (new PageDiff())->insertSoftbreaks($diffhtml); 611a215faf2SSatoshi Sahara} 612a215faf2SSatoshi Sahara 613a215faf2SSatoshi Sahara/** 61415fae107Sandi * show warning on conflict detection 61515fae107Sandi * 61615fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 61742ea7f44SGerrit Uitslag * 61842ea7f44SGerrit Uitslag * @param string $text 61942ea7f44SGerrit Uitslag * @param string $summary 620bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18 62115fae107Sandi */ 622d868eb89SAndreas Gohrfunction html_conflict($text, $summary) 623d868eb89SAndreas Gohr{ 62479a2d784SGerrit Uitslag dbg_deprecated(PageConflict::class .'::show()'); 62524870174SAndreas Gohr (new PageConflict($text, $summary))->show(); 626f3f0262cSandi} 627f3f0262cSandi 628f3f0262cSandi/** 62915fae107Sandi * Prints the global message array 63015fae107Sandi * 63115fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 632f3f0262cSandi */ 633d868eb89SAndreas Gohrfunction html_msgarea() 634d868eb89SAndreas Gohr{ 635cc58224cSMichael Hamann global $MSG, $MSG_shown; 6368d5e837eSMichael Hamann /** @var array $MSG */ 637cc58224cSMichael Hamann // store if the global $MSG has already been shown and thus HTML output has been started 638cc58224cSMichael Hamann $MSG_shown = true; 639cc58224cSMichael Hamann 640f3f0262cSandi if (!isset($MSG)) return; 641f3f0262cSandi 64224870174SAndreas Gohr $shown = []; 643f3f0262cSandi foreach ($MSG as $msg) { 6444af9f0d4SAndreas Gohr $hash = md5($msg['msg']); 6454af9f0d4SAndreas Gohr if (isset($shown[$hash])) continue; // skip double messages 646f755f9abSChristopher Smith if (info_msg_allowed($msg)) { 647*26dfc232SAndreas Gohr echo '<div class="'.$msg['lvl'].'">'; 648*26dfc232SAndreas Gohr echo $msg['msg']; 649*26dfc232SAndreas Gohr echo '</div>'; 650d3bae478SChristopher Smith } 6514af9f0d4SAndreas Gohr $shown[$hash] = 1; 652f3f0262cSandi } 653cc58224cSMichael Hamann 654cc58224cSMichael Hamann unset($GLOBALS['MSG']); 655f3f0262cSandi} 656f3f0262cSandi 657f3f0262cSandi/** 658f3f0262cSandi * Prints the registration form 65915fae107Sandi * 66015fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 661bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18 662f3f0262cSandi */ 663d868eb89SAndreas Gohrfunction html_register() 664d868eb89SAndreas Gohr{ 66579a2d784SGerrit Uitslag dbg_deprecated(UserRegister::class .'::show()'); 66673022918SAndreas Gohr (new UserRegister())->show(); 667f3f0262cSandi} 668f3f0262cSandi 669f3f0262cSandi/** 6708b06d178Schris * Print the update profile form 6718b06d178Schris * 6728b06d178Schris * @author Christopher Smith <chris@jalakai.co.uk> 6738b06d178Schris * @author Andreas Gohr <andi@splitbrain.org> 674bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18 6758b06d178Schris */ 676d868eb89SAndreas Gohrfunction html_updateprofile() 677d868eb89SAndreas Gohr{ 67879a2d784SGerrit Uitslag dbg_deprecated(UserProfile::class .'::show()'); 67973022918SAndreas Gohr (new UserProfile())->show(); 6808b06d178Schris} 6818b06d178Schris 6828b06d178Schris/** 6837c4635c4SAdrian Lang * Preprocess edit form data 68415fae107Sandi * 68515fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 6862ffea8f2SAdrian Lang * 687bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18 688f3f0262cSandi */ 689d868eb89SAndreas Gohrfunction html_edit() 690d868eb89SAndreas Gohr{ 69179a2d784SGerrit Uitslag dbg_deprecated(Editor::class .'::show()'); 69273022918SAndreas Gohr (new Editor())->show(); 693b6912aeaSAndreas Gohr} 694b6912aeaSAndreas Gohr 695b6912aeaSAndreas Gohr/** 696bf69f8cbSSatoshi Sahara * Display the default edit form 697bf69f8cbSSatoshi Sahara * 698bf69f8cbSSatoshi Sahara * Is the default action for HTML_EDIT_FORMSELECTION. 699bf69f8cbSSatoshi Sahara * 70079a2d784SGerrit Uitslag * @param array $param 701bf69f8cbSSatoshi Sahara * @deprecated 2020-07-18 702bf69f8cbSSatoshi Sahara */ 703d868eb89SAndreas Gohrfunction html_edit_form($param) 704d868eb89SAndreas Gohr{ 70579a2d784SGerrit Uitslag dbg_deprecated(Editor::class .'::addTextarea()'); 70673022918SAndreas Gohr (new Editor())->addTextarea($param); 707bf69f8cbSSatoshi Sahara} 708bf69f8cbSSatoshi Sahara 709bf69f8cbSSatoshi Sahara/** 710f3f0262cSandi * prints some debug info 71115fae107Sandi * 71215fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 713f3f0262cSandi */ 714d868eb89SAndreas Gohrfunction html_debug() 715d868eb89SAndreas Gohr{ 716f3f0262cSandi global $conf; 717d16a4edaSandi global $lang; 718e1d9dcc8SAndreas Gohr /** @var AuthPlugin $auth */ 7195298a619SAndreas Gohr global $auth; 720100a97e3SAndreas Gohr global $INFO; 721100a97e3SAndreas Gohr 72228fb55ffSandi //remove sensitive data 72328fb55ffSandi $cnf = $conf; 72424297a69SAndreas Gohr debug_guard($cnf); 725100a97e3SAndreas Gohr $nfo = $INFO; 72624297a69SAndreas Gohr debug_guard($nfo); 727100a97e3SAndreas Gohr $ses = $_SESSION; 72824297a69SAndreas Gohr debug_guard($ses); 729f3f0262cSandi 730*26dfc232SAndreas Gohr echo '<html><body>'; 731f3f0262cSandi 732*26dfc232SAndreas Gohr echo '<p>When reporting bugs please send all the following '; 733*26dfc232SAndreas Gohr echo 'output as a mail to andi@splitbrain.org '; 734*26dfc232SAndreas Gohr echo 'The best way to do this is to save this page in your browser</p>'; 735f3f0262cSandi 736*26dfc232SAndreas Gohr echo '<b>$INFO:</b><pre>'; 737100a97e3SAndreas Gohr print_r($nfo); 738*26dfc232SAndreas Gohr echo '</pre>'; 739100a97e3SAndreas Gohr 740*26dfc232SAndreas Gohr echo '<b>$_SERVER:</b><pre>'; 741f3f0262cSandi print_r($_SERVER); 742*26dfc232SAndreas Gohr echo '</pre>'; 743f3f0262cSandi 744*26dfc232SAndreas Gohr echo '<b>$conf:</b><pre>'; 74528fb55ffSandi print_r($cnf); 746*26dfc232SAndreas Gohr echo '</pre>'; 747f3f0262cSandi 748*26dfc232SAndreas Gohr echo '<b>DOKU_BASE:</b><pre>'; 749*26dfc232SAndreas Gohr echo DOKU_BASE; 750*26dfc232SAndreas Gohr echo '</pre>'; 751f3f0262cSandi 752*26dfc232SAndreas Gohr echo '<b>abs DOKU_BASE:</b><pre>'; 753*26dfc232SAndreas Gohr echo DOKU_URL; 754*26dfc232SAndreas Gohr echo '</pre>'; 755ed7b5f09Sandi 756*26dfc232SAndreas Gohr echo '<b>rel DOKU_BASE:</b><pre>'; 757*26dfc232SAndreas Gohr echo dirname($_SERVER['PHP_SELF']).'/'; 758*26dfc232SAndreas Gohr echo '</pre>'; 759f3f0262cSandi 760*26dfc232SAndreas Gohr echo '<b>PHP Version:</b><pre>'; 761*26dfc232SAndreas Gohr echo phpversion(); 762*26dfc232SAndreas Gohr echo '</pre>'; 763f3f0262cSandi 764*26dfc232SAndreas Gohr echo '<b>locale:</b><pre>'; 765*26dfc232SAndreas Gohr echo setlocale(LC_ALL, 0); 766*26dfc232SAndreas Gohr echo '</pre>'; 767f3f0262cSandi 768*26dfc232SAndreas Gohr echo '<b>encoding:</b><pre>'; 769*26dfc232SAndreas Gohr echo $lang['encoding']; 770*26dfc232SAndreas Gohr echo '</pre>'; 771d16a4edaSandi 7725298a619SAndreas Gohr if ($auth) { 773*26dfc232SAndreas Gohr echo '<b>Auth backend capabilities:</b><pre>'; 7742f46ade0SChristopher Smith foreach ($auth->getCapabilities() as $cando) { 775*26dfc232SAndreas Gohr echo ' '.str_pad($cando, 16) .' => '. (int)$auth->canDo($cando) . DOKU_LF; 7762f46ade0SChristopher Smith } 777*26dfc232SAndreas Gohr echo '</pre>'; 7785298a619SAndreas Gohr } 7795298a619SAndreas Gohr 780*26dfc232SAndreas Gohr echo '<b>$_SESSION:</b><pre>'; 781100a97e3SAndreas Gohr print_r($ses); 782*26dfc232SAndreas Gohr echo '</pre>'; 7833aa54d7cSAndreas Gohr 784*26dfc232SAndreas Gohr echo '<b>Environment:</b><pre>'; 785f3f0262cSandi print_r($_ENV); 786*26dfc232SAndreas Gohr echo '</pre>'; 787f3f0262cSandi 788*26dfc232SAndreas Gohr echo '<b>PHP settings:</b><pre>'; 789f3f0262cSandi $inis = ini_get_all(); 790f3f0262cSandi print_r($inis); 791*26dfc232SAndreas Gohr echo '</pre>'; 792f3f0262cSandi 793e89b7c1eSChristopher Smith if (function_exists('apache_get_version')) { 79424870174SAndreas Gohr $apache = []; 795e89b7c1eSChristopher Smith $apache['version'] = apache_get_version(); 796e89b7c1eSChristopher Smith 797e89b7c1eSChristopher Smith if (function_exists('apache_get_modules')) { 798e89b7c1eSChristopher Smith $apache['modules'] = apache_get_modules(); 799e89b7c1eSChristopher Smith } 800*26dfc232SAndreas Gohr echo '<b>Apache</b><pre>'; 801e89b7c1eSChristopher Smith print_r($apache); 802*26dfc232SAndreas Gohr echo '</pre>'; 803e89b7c1eSChristopher Smith } 804e89b7c1eSChristopher Smith 805*26dfc232SAndreas Gohr echo '</body></html>'; 806f3f0262cSandi} 807f3f0262cSandi 80810271ce4SAndreas Gohr/** 8098b06d178Schris * Form to request a new password for an existing account 8108b06d178Schris * 8118b06d178Schris * @author Benoit Chesneau <benoit@bchesneau.info> 812cc204bbdSAndreas Gohr * @author Andreas Gohr <gohr@cosmocode.de> 813bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18 81411e2ce22Schris */ 815d868eb89SAndreas Gohrfunction html_resendpwd() 816d868eb89SAndreas Gohr{ 81779a2d784SGerrit Uitslag dbg_deprecated(UserResendPwd::class .'::show()'); 81873022918SAndreas Gohr (new UserResendPwd())->show(); 819cc204bbdSAndreas Gohr} 820cc204bbdSAndreas Gohr 821fdb8d77bSTom N Harris/** 822b8595a66SAndreas Gohr * Return the TOC rendered to XHTML 823b8595a66SAndreas Gohr * 824b8595a66SAndreas Gohr * @author Andreas Gohr <andi@splitbrain.org> 82542ea7f44SGerrit Uitslag * 82642ea7f44SGerrit Uitslag * @param array $toc 82742ea7f44SGerrit Uitslag * @return string html 828b8595a66SAndreas Gohr */ 829d868eb89SAndreas Gohrfunction html_TOC($toc) 830d868eb89SAndreas Gohr{ 83124870174SAndreas Gohr if ($toc === []) return ''; 832b8595a66SAndreas Gohr global $lang; 833b8595a66SAndreas Gohr $out = '<!-- TOC START -->'.DOKU_LF; 834158a5bffSDeathCamel57 $out .= '<div id="dw__toc" class="dw__toc">'.DOKU_LF; 83548722ac8SAnika Henke $out .= '<h3 class="toggle">'; 836b8595a66SAndreas Gohr $out .= $lang['toc']; 837d5acc30dSAnika Henke $out .= '</h3>'.DOKU_LF; 838d5acc30dSAnika Henke $out .= '<div>'.DOKU_LF; 839bde560b4SSatoshi Sahara $out .= html_buildlist($toc, 'toc', 'html_list_toc', null, true); 840b8595a66SAndreas Gohr $out .= '</div>'.DOKU_LF.'</div>'.DOKU_LF; 841b8595a66SAndreas Gohr $out .= '<!-- TOC END -->'.DOKU_LF; 842db959ae3SAndreas Gohr return $out; 843db959ae3SAndreas Gohr} 844b8595a66SAndreas Gohr 845b8595a66SAndreas Gohr/** 846b8595a66SAndreas Gohr * Callback for html_buildlist 84742ea7f44SGerrit Uitslag * 84842ea7f44SGerrit Uitslag * @param array $item 84942ea7f44SGerrit Uitslag * @return string html 850b8595a66SAndreas Gohr */ 851d868eb89SAndreas Gohrfunction html_list_toc($item) 852d868eb89SAndreas Gohr{ 853c66972f2SAdrian Lang if (isset($item['hid'])) { 8547d91652aSAndreas Gohr $link = '#'.$item['hid']; 8557d91652aSAndreas Gohr } else { 8567d91652aSAndreas Gohr $link = $item['link']; 8577d91652aSAndreas Gohr } 8587d91652aSAndreas Gohr 859d5acc30dSAnika Henke return '<a href="'.$link.'">'.hsc($item['title']).'</a>'; 860b8595a66SAndreas Gohr} 861b8595a66SAndreas Gohr 862b8595a66SAndreas Gohr/** 863b8595a66SAndreas Gohr * Helper function to build TOC items 864b8595a66SAndreas Gohr * 865b8595a66SAndreas Gohr * Returns an array ready to be added to a TOC array 866b8595a66SAndreas Gohr * 867b8595a66SAndreas Gohr * @param string $link - where to link (if $hash set to '#' it's a local anchor) 868b8595a66SAndreas Gohr * @param string $text - what to display in the TOC 869b8595a66SAndreas Gohr * @param int $level - nesting level 870b8595a66SAndreas Gohr * @param string $hash - is prepended to the given $link, set blank if you want full links 8718d5e837eSMichael Hamann * @return array the toc item 872b8595a66SAndreas Gohr */ 873d868eb89SAndreas Gohrfunction html_mktocitem($link, $text, $level, $hash = '#') 874d868eb89SAndreas Gohr{ 87524870174SAndreas Gohr return [ 876bde560b4SSatoshi Sahara 'link' => $hash.$link, 877b8595a66SAndreas Gohr 'title' => $text, 878b8595a66SAndreas Gohr 'type' => 'ul', 879bde560b4SSatoshi Sahara 'level' => $level 88024870174SAndreas Gohr ]; 881b8595a66SAndreas Gohr} 882b8595a66SAndreas Gohr 883b8595a66SAndreas Gohr/** 884fdb8d77bSTom N Harris * Output a Doku_Form object. 885fdb8d77bSTom N Harris * Triggers an event with the form name: HTML_{$name}FORM_OUTPUT 886fdb8d77bSTom N Harris * 887fdb8d77bSTom N Harris * @author Tom N Harris <tnharris@whoopdedo.org> 88842ea7f44SGerrit Uitslag * 8898d5e837eSMichael Hamann * @param string $name The name of the form 8908d5e837eSMichael Hamann * @param Doku_Form $form The form 8912162df3aSSatoshi Sahara * @return void 8922162df3aSSatoshi Sahara * @deprecated 2020-07-18 893fdb8d77bSTom N Harris */ 894d868eb89SAndreas Gohrfunction html_form($name, $form) 895d868eb89SAndreas Gohr{ 8968a5f08afSSatoshi Sahara dbg_deprecated('use dokuwiki\Form\Form instead of Doku_Form'); 897fdb8d77bSTom N Harris // Safety check in case the caller forgets. 898fdb8d77bSTom N Harris $form->endFieldset(); 899cbb44eabSAndreas Gohr Event::createAndTrigger('HTML_'.strtoupper($name).'FORM_OUTPUT', $form, 'html_form_output', false); 900fdb8d77bSTom N Harris} 901fdb8d77bSTom N Harris 902fdb8d77bSTom N Harris/** 903fdb8d77bSTom N Harris * Form print function. 904c29600d0SSatoshi Sahara * Just calls printForm() on the form object. 90542ea7f44SGerrit Uitslag * 906c29600d0SSatoshi Sahara * @param Doku_Form $form The form 9072162df3aSSatoshi Sahara * @return void 9082162df3aSSatoshi Sahara * @deprecated 2020-07-18 909fdb8d77bSTom N Harris */ 910d868eb89SAndreas Gohrfunction html_form_output($form) 911d868eb89SAndreas Gohr{ 91224870174SAndreas Gohr dbg_deprecated('use ' . Form::class . '::toHTML()'); 91325dd2a2fSSatoshi Sahara $form->printForm(); 91425dd2a2fSSatoshi Sahara} 915340756e4Sandi 91607bf32b2SAndreas Gohr/** 91707bf32b2SAndreas Gohr * Embed a flash object in HTML 91807bf32b2SAndreas Gohr * 91907bf32b2SAndreas Gohr * This will create the needed HTML to embed a flash movie in a cross browser 92007bf32b2SAndreas Gohr * compatble way using valid XHTML 92107bf32b2SAndreas Gohr * 92207bf32b2SAndreas Gohr * The parameters $params, $flashvars and $atts need to be associative arrays. 92307bf32b2SAndreas Gohr * No escaping needs to be done for them. The alternative content *has* to be 92407bf32b2SAndreas Gohr * escaped because it is used as is. If no alternative content is given 92507bf32b2SAndreas Gohr * $lang['noflash'] is used. 92607bf32b2SAndreas Gohr * 92707bf32b2SAndreas Gohr * @author Andreas Gohr <andi@splitbrain.org> 92807bf32b2SAndreas Gohr * @link http://latrine.dgx.cz/how-to-correctly-insert-a-flash-into-xhtml 92907bf32b2SAndreas Gohr * 93007bf32b2SAndreas Gohr * @param string $swf - the SWF movie to embed 93107bf32b2SAndreas Gohr * @param int $width - width of the flash movie in pixels 93207bf32b2SAndreas Gohr * @param int $height - height of the flash movie in pixels 93307bf32b2SAndreas Gohr * @param array $params - additional parameters (<param>) 93407bf32b2SAndreas Gohr * @param array $flashvars - parameters to be passed in the flashvar parameter 93507bf32b2SAndreas Gohr * @param array $atts - additional attributes for the <object> tag 93607bf32b2SAndreas Gohr * @param string $alt - alternative content (is NOT automatically escaped!) 937b3d1090eSMichael Hamann * @return string - the XHTML markup 93807bf32b2SAndreas Gohr */ 939d868eb89SAndreas Gohrfunction html_flashobject($swf, $width, $height, $params = null, $flashvars = null, $atts = null, $alt = '') 940d868eb89SAndreas Gohr{ 94107bf32b2SAndreas Gohr global $lang; 94207bf32b2SAndreas Gohr 94307bf32b2SAndreas Gohr $out = ''; 94407bf32b2SAndreas Gohr 94507bf32b2SAndreas Gohr // prepare the object attributes 94624870174SAndreas Gohr if (is_null($atts)) $atts = []; 94707bf32b2SAndreas Gohr $atts['width'] = (int) $width; 948d4c61e61SAndreas Gohr $atts['height'] = (int) $height; 94907bf32b2SAndreas Gohr if (!$atts['width']) $atts['width'] = 425; 95007bf32b2SAndreas Gohr if (!$atts['height']) $atts['height'] = 350; 95107bf32b2SAndreas Gohr 95207bf32b2SAndreas Gohr // add object attributes for standard compliant browsers 95307bf32b2SAndreas Gohr $std = $atts; 95407bf32b2SAndreas Gohr $std['type'] = 'application/x-shockwave-flash'; 95507bf32b2SAndreas Gohr $std['data'] = $swf; 95607bf32b2SAndreas Gohr 95707bf32b2SAndreas Gohr // add object attributes for IE 95807bf32b2SAndreas Gohr $ie = $atts; 95907bf32b2SAndreas Gohr $ie['classid'] = 'clsid:D27CDB6E-AE6D-11cf-96B8-444553540000'; 96007bf32b2SAndreas Gohr 96107bf32b2SAndreas Gohr // open object (with conditional comments) 96207bf32b2SAndreas Gohr $out .= '<!--[if !IE]> -->'.NL; 96307bf32b2SAndreas Gohr $out .= '<object '.buildAttributes($std).'>'.NL; 96407bf32b2SAndreas Gohr $out .= '<!-- <![endif]-->'.NL; 96507bf32b2SAndreas Gohr $out .= '<!--[if IE]>'.NL; 96607bf32b2SAndreas Gohr $out .= '<object '.buildAttributes($ie).'>'.NL; 96707bf32b2SAndreas Gohr $out .= ' <param name="movie" value="'.hsc($swf).'" />'.NL; 9689ae41cdcSAndreas Gohr $out .= '<!--><!-- -->'.NL; 96907bf32b2SAndreas Gohr 97007bf32b2SAndreas Gohr // print params 97107bf32b2SAndreas Gohr if (is_array($params)) foreach ($params as $key => $val) { 97207bf32b2SAndreas Gohr $out .= ' <param name="'.hsc($key).'" value="'.hsc($val).'" />'.NL; 97307bf32b2SAndreas Gohr } 97407bf32b2SAndreas Gohr 97507bf32b2SAndreas Gohr // add flashvars 97607bf32b2SAndreas Gohr if (is_array($flashvars)) { 977d4c61e61SAndreas Gohr $out .= ' <param name="FlashVars" value="'.buildURLparams($flashvars).'" />'.NL; 97807bf32b2SAndreas Gohr } 97907bf32b2SAndreas Gohr 98007bf32b2SAndreas Gohr // alternative content 98107bf32b2SAndreas Gohr if ($alt) { 98207bf32b2SAndreas Gohr $out .= $alt.NL; 98307bf32b2SAndreas Gohr } else { 98407bf32b2SAndreas Gohr $out .= $lang['noflash'].NL; 98507bf32b2SAndreas Gohr } 98607bf32b2SAndreas Gohr 98707bf32b2SAndreas Gohr // finish 98807bf32b2SAndreas Gohr $out .= '</object>'.NL; 98907bf32b2SAndreas Gohr $out .= '<!-- <![endif]-->'.NL; 99007bf32b2SAndreas Gohr 99107bf32b2SAndreas Gohr return $out; 99207bf32b2SAndreas Gohr} 99307bf32b2SAndreas Gohr 9948d5e837eSMichael Hamann/** 9958d5e837eSMichael Hamann * Prints HTML code for the given tab structure 9968d5e837eSMichael Hamann * 9978d5e837eSMichael Hamann * @param array $tabs tab structure 9988d5e837eSMichael Hamann * @param string $current_tab the current tab id 9992162df3aSSatoshi Sahara * @return void 10008d5e837eSMichael Hamann */ 1001d868eb89SAndreas Gohrfunction html_tabs($tabs, $current_tab = null) 1002d868eb89SAndreas Gohr{ 100394add303SAnika Henke echo '<ul class="tabs">'.NL; 100495b451bcSAdrian Lang 100595b451bcSAdrian Lang foreach ($tabs as $id => $tab) { 100695b451bcSAdrian Lang html_tab($tab['href'], $tab['caption'], $id === $current_tab); 100795b451bcSAdrian Lang } 100895b451bcSAdrian Lang 100994add303SAnika Henke echo '</ul>'.NL; 101095b451bcSAdrian Lang} 1011cd2a4cfdSAnika Henke 101295b451bcSAdrian Lang/** 101395b451bcSAdrian Lang * Prints a single tab 101495b451bcSAdrian Lang * 101595b451bcSAdrian Lang * @author Kate Arzamastseva <pshns@ukr.net> 101695b451bcSAdrian Lang * @author Adrian Lang <mail@adrianlang.de> 101795b451bcSAdrian Lang * 101895b451bcSAdrian Lang * @param string $href - tab href 101995b451bcSAdrian Lang * @param string $caption - tab caption 102095b451bcSAdrian Lang * @param boolean $selected - is tab selected 10212162df3aSSatoshi Sahara * @return void 102295b451bcSAdrian Lang */ 102395b451bcSAdrian Lang 1024d868eb89SAndreas Gohrfunction html_tab($href, $caption, $selected = false) 1025d868eb89SAndreas Gohr{ 102695b451bcSAdrian Lang $tab = '<li>'; 102795b451bcSAdrian Lang if ($selected) { 102895b451bcSAdrian Lang $tab .= '<strong>'; 102995b451bcSAdrian Lang } else { 103095b451bcSAdrian Lang $tab .= '<a href="' . hsc($href) . '">'; 103195b451bcSAdrian Lang } 103295b451bcSAdrian Lang $tab .= hsc($caption) 103395b451bcSAdrian Lang . '</' . ($selected ? 'strong' : 'a') . '>' 103494add303SAnika Henke . '</li>'.NL; 103595b451bcSAdrian Lang echo $tab; 103695b451bcSAdrian Lang} 103795b451bcSAdrian Lang 1038cd2a4cfdSAnika Henke/** 1039cd2a4cfdSAnika Henke * Display size change 1040cd2a4cfdSAnika Henke * 1041cd2a4cfdSAnika Henke * @param int $sizechange - size of change in Bytes 1042e34d6962SSatoshi Sahara * @param Doku_Form $form - (optional) form to add elements to 1043e34d6962SSatoshi Sahara * @return void|string 1044cd2a4cfdSAnika Henke */ 1045d868eb89SAndreas Gohrfunction html_sizechange($sizechange, $form = null) 1046d868eb89SAndreas Gohr{ 1047cd2a4cfdSAnika Henke if (isset($sizechange)) { 1048cd2a4cfdSAnika Henke $class = 'sizechange'; 1049cd2a4cfdSAnika Henke $value = filesize_h(abs($sizechange)); 1050cd2a4cfdSAnika Henke if ($sizechange > 0) { 1051cd2a4cfdSAnika Henke $class .= ' positive'; 1052cd2a4cfdSAnika Henke $value = '+' . $value; 1053cd2a4cfdSAnika Henke } elseif ($sizechange < 0) { 1054cd2a4cfdSAnika Henke $class .= ' negative'; 1055cd2a4cfdSAnika Henke $value = '-' . $value; 10560b78a6edSAnika Henke } else { 10570b78a6edSAnika Henke $value = '±' . $value; 1058cd2a4cfdSAnika Henke } 1059e34d6962SSatoshi Sahara if (!isset($form)) { 1060e34d6962SSatoshi Sahara return '<span class="'.$class.'">'.$value.'</span>'; 1061b0f23f4eSSatoshi Sahara } else { // Doku_Form 106224870174SAndreas Gohr $form->addElement(form_makeOpenTag('span', ['class' => $class])); 1063cd2a4cfdSAnika Henke $form->addElement($value); 1064cd2a4cfdSAnika Henke $form->addElement(form_makeCloseTag('span')); 1065cd2a4cfdSAnika Henke } 1066cd2a4cfdSAnika Henke } 1067b0f23f4eSSatoshi Sahara} 1068