1ed7b5f09Sandi<?php 2d4f83172SAndreas Gohr 315fae107Sandi/** 415fae107Sandi * HTML output functions 515fae107Sandi * 615fae107Sandi * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) 715fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 815fae107Sandi */ 915fae107Sandi 1024870174SAndreas Gohruse dokuwiki\Ui\MediaRevisions; 1124870174SAndreas Gohruse dokuwiki\Form\Form; 1279a2d784SGerrit Uitslaguse dokuwiki\Action\Denied; 1379a2d784SGerrit Uitslaguse dokuwiki\Action\Locked; 140c3a5702SAndreas Gohruse dokuwiki\ChangeLog\PageChangeLog; 15e1d9dcc8SAndreas Gohruse dokuwiki\Extension\AuthPlugin; 16cbb44eabSAndreas Gohruse dokuwiki\Extension\Event; 170cba610bSSatoshi Saharause dokuwiki\Search\FulltextSearch; 18efe70805SSatoshi Saharause dokuwiki\Utf8; 1979a2d784SGerrit Uitslaguse dokuwiki\Ui\Backlinks; 2079a2d784SGerrit Uitslaguse dokuwiki\Ui\Editor; 2179a2d784SGerrit Uitslaguse dokuwiki\Ui\Index; 2279a2d784SGerrit Uitslaguse dokuwiki\Ui\Login; 2379a2d784SGerrit Uitslaguse dokuwiki\Ui\PageConflict; 2479a2d784SGerrit Uitslaguse dokuwiki\Ui\PageDiff; 2579a2d784SGerrit Uitslaguse dokuwiki\Ui\PageDraft; 2679a2d784SGerrit Uitslaguse dokuwiki\Ui\PageRevisions; 2779a2d784SGerrit Uitslaguse dokuwiki\Ui\PageView; 2879a2d784SGerrit Uitslaguse dokuwiki\Ui\Recent; 2979a2d784SGerrit Uitslaguse dokuwiki\Ui\UserProfile; 3079a2d784SGerrit Uitslaguse dokuwiki\Ui\UserRegister; 3179a2d784SGerrit Uitslaguse dokuwiki\Ui\UserResendPwd; 3279a2d784SGerrit Uitslaguse dokuwiki\Utf8\Clean; 330c3a5702SAndreas Gohr 342d3b082eSMichael Großeif (!defined('SEC_EDIT_PATTERN')) { 3537c80e0eSLarsDW223 define('SEC_EDIT_PATTERN', '#<!-- EDIT({.*?}) -->#'); 362d3b082eSMichael Große} 372d3b082eSMichael Große 386bbae538Sandi 39f3f0262cSandi/** 40f3f0262cSandi * Convenience function to quickly build a wikilink 4115fae107Sandi * 4215fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 438d5e837eSMichael Hamann * @param string $id id of the target page 448d5e837eSMichael Hamann * @param string $name the name of the link, i.e. the text that is displayed 458d5e837eSMichael Hamann * @param string|array $search search string(s) that shall be highlighted in the target page 468d5e837eSMichael Hamann * @return string the HTML code of the link 47f3f0262cSandi */ 48d868eb89SAndreas Gohrfunction html_wikilink($id, $name = null, $search = '') 49d868eb89SAndreas Gohr{ 50a8397511SGerrit Uitslag /** @var Doku_Renderer_xhtml $xhtml_renderer */ 51db959ae3SAndreas Gohr static $xhtml_renderer = null; 52723d78dbSandi if (is_null($xhtml_renderer)) { 537aea91afSChris Smith $xhtml_renderer = p_get_renderer('xhtml'); 54f3f0262cSandi } 55f3f0262cSandi 56fe9ec250SChris Smith return $xhtml_renderer->internallink($id, $name, $search, true, 'navigation'); 57f3f0262cSandi} 58f3f0262cSandi 59f3f0262cSandi/** 60f3f0262cSandi * The loginform 6115fae107Sandi * 6215fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 63d1d904bbSMichael Große * 64d1d904bbSMichael Große * @param bool $svg Whether to show svg icons in the register and resendpwd links or not 65bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18 66f3f0262cSandi */ 67d868eb89SAndreas Gohrfunction html_login($svg = false) 68d868eb89SAndreas Gohr{ 6979a2d784SGerrit Uitslag dbg_deprecated(Login::class . '::show()'); 7024870174SAndreas Gohr (new Login($svg))->show(); 71f3f0262cSandi} 72f3f0262cSandi 73d59dea9fSGerrit Uitslag 74d59dea9fSGerrit Uitslag/** 75d59dea9fSGerrit Uitslag * Denied page content 76d59dea9fSGerrit Uitslag * 777afe5d93SSatoshi Sahara * @deprecated 2020-07-18 not called anymore, see inc/Action/Denied::tplContent() 78d59dea9fSGerrit Uitslag */ 79d868eb89SAndreas Gohrfunction html_denied() 80d868eb89SAndreas Gohr{ 8179a2d784SGerrit Uitslag dbg_deprecated(Denied::class . '::showBanner()'); 8224870174SAndreas Gohr (new Denied())->showBanner(); 83d59dea9fSGerrit Uitslag} 84d59dea9fSGerrit Uitslag 85f3f0262cSandi/** 8615fae107Sandi * inserts section edit buttons if wanted or removes the markers 8715fae107Sandi * 8815fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 8942ea7f44SGerrit Uitslag * 9042ea7f44SGerrit Uitslag * @param string $text 9142ea7f44SGerrit Uitslag * @param bool $show show section edit buttons? 9242ea7f44SGerrit Uitslag * @return string 9315fae107Sandi */ 94d868eb89SAndreas Gohrfunction html_secedit($text, $show = true) 95d868eb89SAndreas Gohr{ 96f3f0262cSandi global $INFO; 9735dae8b0SBen Coburn 98aac83cd4SPhy if ((isset($INFO) && !$INFO['writable']) || !$show || (isset($INFO) && $INFO['rev'])) { 992d3b082eSMichael Große return preg_replace(SEC_EDIT_PATTERN, '', $text); 100f3f0262cSandi } 10135dae8b0SBen Coburn 102dccd6b2bSAndreas Gohr return preg_replace_callback( 103dccd6b2bSAndreas Gohr SEC_EDIT_PATTERN, 104093fe67eSAndreas Gohr html_secedit_button(...), 105dccd6b2bSAndreas Gohr $text 106dccd6b2bSAndreas Gohr ); 10740868f2fSAdrian Lang} 10840868f2fSAdrian Lang 10940868f2fSAdrian Lang/** 11040868f2fSAdrian Lang * prepares section edit button data for event triggering 11140868f2fSAdrian Lang * used as a callback in html_secedit 11240868f2fSAdrian Lang * 11340868f2fSAdrian Lang * @author Andreas Gohr <andi@splitbrain.org> 11442ea7f44SGerrit Uitslag * 11542ea7f44SGerrit Uitslag * @param array $matches matches with regexp 11642ea7f44SGerrit Uitslag * @return string 11742ea7f44SGerrit Uitslag * @triggers HTML_SECEDIT_BUTTON 11840868f2fSAdrian Lang */ 119d868eb89SAndreas Gohrfunction html_secedit_button($matches) 120d868eb89SAndreas Gohr{ 121ada0d779SMichael Hamann $json = htmlspecialchars_decode($matches[1], ENT_QUOTES); 122cb7312c0SAndreas Gohr 123cb7312c0SAndreas Gohr try { 12424870174SAndreas Gohr $data = json_decode($json, true, 512, JSON_THROW_ON_ERROR); 125093fe67eSAndreas Gohr } catch (JsonException) { 12679a2d784SGerrit Uitslag return ''; 12706917fceSMichael Große } 128ec57f119SLarsDW223 $data['target'] = strtolower($data['target']); 12996ebed36SAndreas Gohr $data['hid'] = strtolower($data['hid'] ?? ''); 13040868f2fSAdrian Lang 13196ebed36SAndreas Gohr return Event::createAndTrigger( 13296ebed36SAndreas Gohr 'HTML_SECEDIT_BUTTON', 13396ebed36SAndreas Gohr $data, 13496ebed36SAndreas Gohr 'html_secedit_get_button' 13596ebed36SAndreas Gohr ); 13640868f2fSAdrian Lang} 13740868f2fSAdrian Lang 13840868f2fSAdrian Lang/** 13940868f2fSAdrian Lang * prints a section editing button 14040868f2fSAdrian Lang * used as default action form HTML_SECEDIT_BUTTON 14140868f2fSAdrian Lang * 14240868f2fSAdrian Lang * @author Adrian Lang <lang@cosmocode.de> 14342ea7f44SGerrit Uitslag * 14442ea7f44SGerrit Uitslag * @param array $data name, section id and target 14542ea7f44SGerrit Uitslag * @return string html 14640868f2fSAdrian Lang */ 147d868eb89SAndreas Gohrfunction html_secedit_get_button($data) 148d868eb89SAndreas Gohr{ 14940868f2fSAdrian Lang global $ID; 15040868f2fSAdrian Lang global $INFO; 15140868f2fSAdrian Lang 1526d9eab4dSMichael Hamann if (!isset($data['name']) || $data['name'] === '') return ''; 15340868f2fSAdrian Lang 15440868f2fSAdrian Lang $name = $data['name']; 15540868f2fSAdrian Lang unset($data['name']); 15640868f2fSAdrian Lang 157905fa971SAdrian Lang $secid = $data['secid']; 158905fa971SAdrian Lang unset($data['secid']); 159905fa971SAdrian Lang 1607afe5d93SSatoshi Sahara $params = array_merge( 16124870174SAndreas Gohr ['do' => 'edit', 'rev' => $INFO['lastmod'], 'summary' => '[' . $name . '] '], 1627afe5d93SSatoshi Sahara $data 1637afe5d93SSatoshi Sahara ); 1647afe5d93SSatoshi Sahara 1657afe5d93SSatoshi Sahara $html = '<div class="secedit editbutton_' . $data['target'] . ' editbutton_' . $secid . '">'; 1667afe5d93SSatoshi Sahara $html .= html_btn('secedit', $ID, '', $params, 'post', $name); 1677afe5d93SSatoshi Sahara $html .= '</div>'; 1687afe5d93SSatoshi Sahara return $html; 169f3f0262cSandi} 170f3f0262cSandi 171f3f0262cSandi/** 172d6c9c552Smatthiasgrimm * Just the back to top button (in its own form) 1736b13307fSandi * 1746b13307fSandi * @author Andreas Gohr <andi@splitbrain.org> 17542ea7f44SGerrit Uitslag * 17642ea7f44SGerrit Uitslag * @return string html 1776b13307fSandi */ 178d868eb89SAndreas Gohrfunction html_topbtn() 179d868eb89SAndreas Gohr{ 1806b13307fSandi global $lang; 1816b13307fSandi 18279a2d784SGerrit Uitslag return '<a class="nolink" href="#dokuwiki__top">' 1837afe5d93SSatoshi Sahara . '<button class="button" onclick="window.scrollTo(0, 0)" title="' . $lang['btn_top'] . '">' 1847afe5d93SSatoshi Sahara . $lang['btn_top'] 1857afe5d93SSatoshi Sahara . '</button></a>'; 1866b13307fSandi} 1876b13307fSandi 1886b13307fSandi/** 189d67ca2c0Smatthiasgrimm * Displays a button (using its own form) 19035dae8b0SBen Coburn * If tooltip exists, the access key tooltip is replaced. 19115fae107Sandi * 19215fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 19342ea7f44SGerrit Uitslag * 19442ea7f44SGerrit Uitslag * @param string $name 19542ea7f44SGerrit Uitslag * @param string $id 19642ea7f44SGerrit Uitslag * @param string $akey access key 197e3710957SGerrit Uitslag * @param string[] $params key-value pairs added as hidden inputs 19842ea7f44SGerrit Uitslag * @param string $method 19942ea7f44SGerrit Uitslag * @param string $tooltip 20042ea7f44SGerrit Uitslag * @param bool|string $label label text, false: lookup btn_$name in localization 201e824d633SMichael Große * @param string $svg (optional) svg code, inserted into the button 20242ea7f44SGerrit Uitslag * @return string 203f3f0262cSandi */ 204d868eb89SAndreas Gohrfunction html_btn($name, $id, $akey, $params, $method = 'get', $tooltip = '', $label = false, $svg = null) 205d868eb89SAndreas Gohr{ 206f3f0262cSandi global $conf; 207f3f0262cSandi global $lang; 208f3f0262cSandi 209f5baf821SAnika Henke if (!$label) 210f3f0262cSandi $label = $lang['btn_' . $name]; 211f3f0262cSandi 21249c713a3Sandi //filter id (without urlencoding) 21349c713a3Sandi $id = idfilter($id, false); 214f3f0262cSandi 215f3f0262cSandi //make nice URLs even for buttons 2166c7843b5Sandi if ($conf['userewrite'] == 2) { 2176c7843b5Sandi $script = DOKU_BASE . DOKU_SCRIPT . '/' . $id; 2186c7843b5Sandi } elseif ($conf['userewrite']) { 2196c7843b5Sandi $script = DOKU_BASE . $id; 2206c7843b5Sandi } else { 2218b00ebcfSandi $script = DOKU_BASE . DOKU_SCRIPT; 222f3f0262cSandi $params['id'] = $id; 223f3f0262cSandi } 224f3f0262cSandi 2257afe5d93SSatoshi Sahara $html = '<form class="button btn_' . $name . '" method="' . $method . '" action="' . $script . '"><div class="no">'; 226f3f0262cSandi 22706a4bf8fSAndreas Gohr if (is_array($params)) { 2289e491c01SAndreas Gohr foreach ($params as $key => $val) { 2297afe5d93SSatoshi Sahara $html .= '<input type="hidden" name="' . $key . '" value="' . hsc($val) . '" />'; 230f3f0262cSandi } 23106a4bf8fSAndreas Gohr } 232f3f0262cSandi 2337afe5d93SSatoshi Sahara $tip = empty($tooltip) ? hsc($label) : hsc($tooltip); 23411ea018fSAndreas Gohr 2357afe5d93SSatoshi Sahara $html .= '<button type="submit" '; 23611ea018fSAndreas Gohr if ($akey) { 23707493d05SAnika Henke $tip .= ' [' . strtoupper($akey) . ']'; 2387afe5d93SSatoshi Sahara $html .= 'accesskey="' . $akey . '" '; 23935dae8b0SBen Coburn } 2407afe5d93SSatoshi Sahara $html .= 'title="' . $tip . '">'; 241e824d633SMichael Große if ($svg) { 2427afe5d93SSatoshi Sahara $html .= '<span>' . hsc($label) . '</span>' . inlineSVG($svg); 243679dba01SMichael Große } else { 2447afe5d93SSatoshi Sahara $html .= hsc($label); 245679dba01SMichael Große } 2467afe5d93SSatoshi Sahara $html .= '</button>'; 2477afe5d93SSatoshi Sahara $html .= '</div></form>'; 248f3f0262cSandi 2497afe5d93SSatoshi Sahara return $html; 250f3f0262cSandi} 2510747f5d7Sghi/** 2520747f5d7Sghi * show a revision warning 2530747f5d7Sghi * 2540747f5d7Sghi * @author Szymon Olewniczak <dokuwiki@imz.re> 25587f229e8SSatoshi Sahara * @deprecated 2020-07-18 2560747f5d7Sghi */ 257d868eb89SAndreas Gohrfunction html_showrev() 258d868eb89SAndreas Gohr{ 25979a2d784SGerrit Uitslag dbg_deprecated(PageView::class . '::showrev()'); 2600747f5d7Sghi} 261f3f0262cSandi 262f3f0262cSandi/** 26342ea7f44SGerrit Uitslag * Show a wiki page 26415fae107Sandi * 26515fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 26642ea7f44SGerrit Uitslag * 26742ea7f44SGerrit Uitslag * @param null|string $txt wiki text or null for showing $ID 268bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18 26915fae107Sandi */ 270d868eb89SAndreas Gohrfunction html_show($txt = null) 271d868eb89SAndreas Gohr{ 27279a2d784SGerrit Uitslag dbg_deprecated(PageView::class . '::show()'); 27324870174SAndreas Gohr (new PageView($txt))->show(); 274f3f0262cSandi} 275f3f0262cSandi 276f3f0262cSandi/** 277ee4c4a1bSAndreas Gohr * ask the user about how to handle an exisiting draft 278ee4c4a1bSAndreas Gohr * 279ee4c4a1bSAndreas Gohr * @author Andreas Gohr <andi@splitbrain.org> 280bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18 281ee4c4a1bSAndreas Gohr */ 282d868eb89SAndreas Gohrfunction html_draft() 283d868eb89SAndreas Gohr{ 28479a2d784SGerrit Uitslag dbg_deprecated(PageDraft::class . '::show()'); 28573022918SAndreas Gohr (new PageDraft())->show(); 286ee4c4a1bSAndreas Gohr} 287ee4c4a1bSAndreas Gohr 288ee4c4a1bSAndreas Gohr/** 289f3f0262cSandi * Highlights searchqueries in HTML code 29015fae107Sandi * 29115fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 2927209be23SAndreas Gohr * @author Harry Fuecks <hfuecks@gmail.com> 29342ea7f44SGerrit Uitslag * 29442ea7f44SGerrit Uitslag * @param string $html 29542ea7f44SGerrit Uitslag * @param array|string $phrases 29642ea7f44SGerrit Uitslag * @return string html 297f3f0262cSandi */ 298d868eb89SAndreas Gohrfunction html_hilight($html, $phrases) 299d868eb89SAndreas Gohr{ 300cc3a3cdeSSatoshi Sahara $FulltextSearch = new FulltextSearch(); 3018a803caeSAndreas Gohr $phrases = (array) $phrases; 302093fe67eSAndreas Gohr $phrases = array_map(preg_quote_cb(...), $phrases); 303*8788dbbdSsplitbrain $phrases = array_map($FulltextSearch->snippetRePreprocess(...), $phrases); 3048a803caeSAndreas Gohr $phrases = array_filter($phrases); 30524870174SAndreas Gohr 3060cba610bSSatoshi Sahara $regex = implode('|', $phrases); 30760c15d7dSAndreas Gohr 30860c15d7dSAndreas Gohr if ($regex === '') return $html; 30979a2d784SGerrit Uitslag if (!Clean::isUtf8($regex)) return $html; 310f3f0262cSandi 31179a2d784SGerrit Uitslag return @preg_replace_callback("/((<[^>]*)|$regex)/ui", function ($match) { 312675d8ce4SSatoshi Sahara $hlight = unslash($match[0]); 313675d8ce4SSatoshi Sahara if (!isset($match[2])) { 314688774a0SAnika Henke $hlight = '<span class="search_hit">' . $hlight . '</span>'; 3157209be23SAndreas Gohr } 3167209be23SAndreas Gohr return $hlight; 317675d8ce4SSatoshi Sahara }, $html); 3187209be23SAndreas Gohr} 3197209be23SAndreas Gohr 3207209be23SAndreas Gohr/** 32115fae107Sandi * Display error on locked pages 32215fae107Sandi * 32315fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 3247afe5d93SSatoshi Sahara * @deprecated 2020-07-18 not called anymore, see inc/Action/Locked::tplContent() 32515fae107Sandi */ 326d868eb89SAndreas Gohrfunction html_locked() 327d868eb89SAndreas Gohr{ 32879a2d784SGerrit Uitslag dbg_deprecated(Locked::class . '::showBanner()'); 32924870174SAndreas Gohr (new Locked())->showBanner(); 330f3f0262cSandi} 331f3f0262cSandi 33215fae107Sandi/** 33315fae107Sandi * list old revisions 33415fae107Sandi * 33515fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 33671726d78SBen Coburn * @author Ben Coburn <btcoburn@silicodon.net> 3378e69fd30SKate Arzamastseva * @author Kate Arzamastseva <pshns@ukr.net> 338e0c26282SGerrit Uitslag * 339e0c26282SGerrit Uitslag * @param int $first skip the first n changelog lines 34030a159abSSatoshi Sahara * @param string $media_id id of media, or empty for current page 341bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18 34215fae107Sandi */ 343d868eb89SAndreas Gohrfunction html_revisions($first = -1, $media_id = '') 344d868eb89SAndreas Gohr{ 34579a2d784SGerrit Uitslag dbg_deprecated(PageRevisions::class . '::show()'); 346b370ebcdSSatoshi Sahara if ($media_id) { 34724870174SAndreas Gohr (new MediaRevisions($media_id))->show($first); 348b370ebcdSSatoshi Sahara } else { 349b370ebcdSSatoshi Sahara global $INFO; 35024870174SAndreas Gohr (new PageRevisions($INFO['id']))->show($first); 351b370ebcdSSatoshi Sahara } 352f3f0262cSandi} 353f3f0262cSandi 35415fae107Sandi/** 35515fae107Sandi * display recent changes 35615fae107Sandi * 35715fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 3585749f1ceSmatthiasgrimm * @author Matthias Grimm <matthiasgrimm@users.sourceforge.net> 35971726d78SBen Coburn * @author Ben Coburn <btcoburn@silicodon.net> 3608d40b4b6SKate Arzamastseva * @author Kate Arzamastseva <pshns@ukr.net> 36142ea7f44SGerrit Uitslag * 36242ea7f44SGerrit Uitslag * @param int $first 36342ea7f44SGerrit Uitslag * @param string $show_changes 364bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18 36515fae107Sandi */ 366d868eb89SAndreas Gohrfunction html_recent($first = 0, $show_changes = 'both') 367d868eb89SAndreas Gohr{ 36879a2d784SGerrit Uitslag dbg_deprecated(Recent::class . '::show()'); 36924870174SAndreas Gohr (new Recent($first, $show_changes))->show(); 370f3f0262cSandi} 371f3f0262cSandi 37215fae107Sandi/** 37315fae107Sandi * Display page index 37415fae107Sandi * 37515fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 37642ea7f44SGerrit Uitslag * 37742ea7f44SGerrit Uitslag * @param string $ns 378bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18 37915fae107Sandi */ 380d868eb89SAndreas Gohrfunction html_index($ns) 381d868eb89SAndreas Gohr{ 38279a2d784SGerrit Uitslag dbg_deprecated(Index::class . '::show()'); 38324870174SAndreas Gohr (new Index($ns))->show(); 384f3f0262cSandi} 385f3f0262cSandi 386f3f0262cSandi/** 38789b939d7SSatoshi Sahara * Index tree item formatter for html_buildlist() 38815fae107Sandi * 389f3f0262cSandi * User function for html_buildlist() 39015fae107Sandi * 39115fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 39242ea7f44SGerrit Uitslag * 39342ea7f44SGerrit Uitslag * @param array $item 39442ea7f44SGerrit Uitslag * @return string 3959c8632b4SSatoshi Sahara * @deprecated 2020-07-18 396f3f0262cSandi */ 397d868eb89SAndreas Gohrfunction html_list_index($item) 398d868eb89SAndreas Gohr{ 39979a2d784SGerrit Uitslag dbg_deprecated(Index::class . '::formatListItem()'); 40073022918SAndreas Gohr return (new Index())->formatListItem($item); 401f3f0262cSandi} 402f3f0262cSandi 403f3f0262cSandi/** 40489b939d7SSatoshi Sahara * Index list item formatter for html_buildlist() 405cb70c441Sandi * 406a1dee2b9SAdrian Lang * This user function is used in html_buildlist to build the 407cb70c441Sandi * <li> tags for namespaces when displaying the page index 408cb70c441Sandi * it gives different classes to opened or closed "folders" 409cb70c441Sandi * 410cb70c441Sandi * @author Andreas Gohr <andi@splitbrain.org> 41142ea7f44SGerrit Uitslag * 41242ea7f44SGerrit Uitslag * @param array $item 41342ea7f44SGerrit Uitslag * @return string html 4149c8632b4SSatoshi Sahara * @deprecated 2020-07-18 415cb70c441Sandi */ 416d868eb89SAndreas Gohrfunction html_li_index($item) 417d868eb89SAndreas Gohr{ 41879a2d784SGerrit Uitslag dbg_deprecated(Index::class . '::tagListItem()'); 41973022918SAndreas Gohr return (new Index())->tagListItem($item); 420cb70c441Sandi} 421cb70c441Sandi 422cb70c441Sandi/** 42389b939d7SSatoshi Sahara * Default list item formatter for html_buildlist() 424cb70c441Sandi * 425cb70c441Sandi * @author Andreas Gohr <andi@splitbrain.org> 42642ea7f44SGerrit Uitslag * 42742ea7f44SGerrit Uitslag * @param array $item 42842ea7f44SGerrit Uitslag * @return string html 42989b939d7SSatoshi Sahara * @deprecated 2020-07-18 430cb70c441Sandi */ 431d868eb89SAndreas Gohrfunction html_li_default($item) 432d868eb89SAndreas Gohr{ 433cb70c441Sandi return '<li class="level' . $item['level'] . '">'; 434cb70c441Sandi} 435cb70c441Sandi 436cb70c441Sandi/** 43715fae107Sandi * Build an unordered list 43815fae107Sandi * 439f3f0262cSandi * Build an unordered list from the given $data array 440f3f0262cSandi * Each item in the array has to have a 'level' property 441f3f0262cSandi * the item itself gets printed by the given $func user 442cb70c441Sandi * function. The second and optional function is used to 443cb70c441Sandi * print the <li> tag. Both user function need to accept 444cb70c441Sandi * a single item. 44515fae107Sandi * 446c5a8fd96SAndreas Gohr * Both user functions can be given as array to point to 447c5a8fd96SAndreas Gohr * a member of an object. 448c5a8fd96SAndreas Gohr * 44915fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 45080679bafSGerrit Uitslag * 45180679bafSGerrit Uitslag * @param array $data array with item arrays 45280679bafSGerrit Uitslag * @param string $class class of ul wrapper 45380679bafSGerrit Uitslag * @param callable $func callback to print an list item 454bde560b4SSatoshi Sahara * @param callable $lifunc (optional) callback to the opening li tag 455bde560b4SSatoshi Sahara * @param bool $forcewrapper (optional) Trigger building a wrapper ul if the first level is 456ae614416SAnika Henke * 0 (we have a root object) or 1 (just the root content) 45780679bafSGerrit Uitslag * @return string html of an unordered list 458f3f0262cSandi */ 459d868eb89SAndreas Gohrfunction html_buildlist($data, $class, $func, $lifunc = null, $forcewrapper = false) 460d868eb89SAndreas Gohr{ 46124870174SAndreas Gohr if ($data === []) { 462a1dee2b9SAdrian Lang return ''; 463a1dee2b9SAdrian Lang } 464a1dee2b9SAdrian Lang 4652689c55fSMichael Große $firstElement = reset($data); 4662689c55fSMichael Große $start_level = $firstElement['level']; 4679e4f7880SAdrian Lang $level = $start_level; 4689c8632b4SSatoshi Sahara $html = ''; 469434f5921SHakan Sandell $open = 0; 4709e4f7880SAdrian Lang 471bde560b4SSatoshi Sahara // set callback function to build the <li> tag, formerly defined as html_li_default() 472bde560b4SSatoshi Sahara if (!is_callable($lifunc)) { 47324870174SAndreas Gohr $lifunc = static fn($item) => '<li class="level' . $item['level'] . '">'; 474bde560b4SSatoshi Sahara } 475f3f0262cSandi 476f3f0262cSandi foreach ($data as $item) { 477f3f0262cSandi if ($item['level'] > $level) { 478f3f0262cSandi //open new list 479df52d0feSandi for ($i = 0; $i < ($item['level'] - $level); $i++) { 4809c8632b4SSatoshi Sahara if ($i) $html .= '<li class="clear">'; 4819c8632b4SSatoshi Sahara $html .= "\n" . '<ul class="' . $class . '">' . "\n"; 482434f5921SHakan Sandell $open++; 483df52d0feSandi } 484434f5921SHakan Sandell $level = $item['level']; 485f3f0262cSandi } elseif ($item['level'] < $level) { 486f3f0262cSandi //close last item 4879c8632b4SSatoshi Sahara $html .= '</li>' . "\n"; 488434f5921SHakan Sandell while ($level > $item['level'] && $open > 0) { 489f3f0262cSandi //close higher lists 4909c8632b4SSatoshi Sahara $html .= '</ul>' . "\n" . '</li>' . "\n"; 491434f5921SHakan Sandell $level--; 492434f5921SHakan Sandell $open--; 493f3f0262cSandi } 4949c8632b4SSatoshi Sahara } elseif ($html !== '') { 49587671313SHakan Sandell //close previous item 4969c8632b4SSatoshi Sahara $html .= '</li>' . "\n"; 497f3f0262cSandi } 498f3f0262cSandi 499f3f0262cSandi //print item 5009c8632b4SSatoshi Sahara $html .= call_user_func($lifunc, $item); 5019c8632b4SSatoshi Sahara $html .= '<div class="li">'; 50234dbe711Schris 5039c8632b4SSatoshi Sahara $html .= call_user_func($func, $item); 5049c8632b4SSatoshi Sahara $html .= '</div>'; 505f3f0262cSandi } 506f3f0262cSandi 507f3f0262cSandi //close remaining items and lists 5089c8632b4SSatoshi Sahara $html .= '</li>' . "\n"; 509434f5921SHakan Sandell while ($open-- > 0) { 5109c8632b4SSatoshi Sahara $html .= '</ul></li>' . "\n"; 511434f5921SHakan Sandell } 512434f5921SHakan Sandell 513434f5921SHakan Sandell if ($forcewrapper || $start_level < 2) { 514434f5921SHakan Sandell // Trigger building a wrapper ul if the first level is 515434f5921SHakan Sandell // 0 (we have a root object) or 1 (just the root content) 5169c8632b4SSatoshi Sahara $html = "\n" . '<ul class="' . $class . '">' . "\n" . $html . '</ul>' . "\n"; 517f3f0262cSandi } 518f3f0262cSandi 5199c8632b4SSatoshi Sahara return $html; 520f3f0262cSandi} 521f3f0262cSandi 52215fae107Sandi/** 52315fae107Sandi * display backlinks 52415fae107Sandi * 52515fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 52611df47ecSMichael Klier * @author Michael Klier <chi@chimeric.de> 527bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18 52815fae107Sandi */ 529d868eb89SAndreas Gohrfunction html_backlinks() 530d868eb89SAndreas Gohr{ 53179a2d784SGerrit Uitslag dbg_deprecated(Backlinks::class . '::show()'); 53273022918SAndreas Gohr (new Backlinks())->show(); 533f3f0262cSandi} 534f3f0262cSandi 5358d5e837eSMichael Hamann/** 5368d5e837eSMichael Hamann * Get header of diff HTML 53742ea7f44SGerrit Uitslag * 5388d5e837eSMichael Hamann * @param string $l_rev Left revisions 5398d5e837eSMichael Hamann * @param string $r_rev Right revision 5408d5e837eSMichael Hamann * @param string $id Page id, if null $ID is used 5418d5e837eSMichael Hamann * @param bool $media If it is for media files 542f76724a4STom N Harris * @param bool $inline Return the header on a single line 54342ea7f44SGerrit Uitslag * @return string[] HTML snippets for diff header 544a215faf2SSatoshi Sahara * @deprecated 2020-07-18 5458d5e837eSMichael Hamann */ 546d868eb89SAndreas Gohrfunction html_diff_head($l_rev, $r_rev, $id = null, $media = false, $inline = false) 547d868eb89SAndreas Gohr{ 54879a2d784SGerrit Uitslag dbg_deprecated('see ' . PageDiff::class . '::buildDiffHead()'); 54979a2d784SGerrit Uitslag return ['', '', '', '']; 55095b451bcSAdrian Lang} 55195b451bcSAdrian Lang 55215fae107Sandi/** 55304e99fe1SGerrit Uitslag * Show diff 554baf0c3e5SGerrit Uitslag * between current page version and provided $text 555baf0c3e5SGerrit Uitslag * or between the revisions provided via GET or POST 55615fae107Sandi * 55715fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 558baf0c3e5SGerrit Uitslag * @param string $text when non-empty: compare with this text with most current version 55904e99fe1SGerrit Uitslag * @param bool $intro display the intro text 5608d5e837eSMichael Hamann * @param string $type type of the diff (inline or sidebyside) 561bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18 56215fae107Sandi */ 563d868eb89SAndreas Gohrfunction html_diff($text = '', $intro = true, $type = null) 564d868eb89SAndreas Gohr{ 56579a2d784SGerrit Uitslag dbg_deprecated(PageDiff::class . '::show()'); 566edb50e6aSSatoshi Sahara global $INFO; 56724870174SAndreas Gohr (new PageDiff($INFO['id']))->compareWith($text)->preference([ 568edb50e6aSSatoshi Sahara 'showIntro' => $intro, 569edb50e6aSSatoshi Sahara 'difftype' => $type, 570edb50e6aSSatoshi Sahara ])->show(); 571f3f0262cSandi} 572f3f0262cSandi 5734fc1354aSGerrit Uitslag/** 574baf0c3e5SGerrit Uitslag * Create html for revision navigation 575baf0c3e5SGerrit Uitslag * 576baf0c3e5SGerrit Uitslag * @param PageChangeLog $pagelog changelog object of current page 577baf0c3e5SGerrit Uitslag * @param string $type inline vs sidebyside 578baf0c3e5SGerrit Uitslag * @param int $l_rev left revision timestamp 579baf0c3e5SGerrit Uitslag * @param int $r_rev right revision timestamp 580baf0c3e5SGerrit Uitslag * @return string[] html of left and right navigation elements 581a215faf2SSatoshi Sahara * @deprecated 2020-07-18 582baf0c3e5SGerrit Uitslag */ 583d868eb89SAndreas Gohrfunction html_diff_navigation($pagelog, $type, $l_rev, $r_rev) 584d868eb89SAndreas Gohr{ 58579a2d784SGerrit Uitslag dbg_deprecated('see ' . PageDiff::class . '::buildRevisionsNavigation()'); 58679a2d784SGerrit Uitslag return ['', '']; 587baf0c3e5SGerrit Uitslag} 588baf0c3e5SGerrit Uitslag 589baf0c3e5SGerrit Uitslag/** 5904fc1354aSGerrit Uitslag * Create html link to a diff defined by two revisions 5914fc1354aSGerrit Uitslag * 59298a6b214SAnika Henke * @param string $difftype display type 59398a6b214SAnika Henke * @param string $linktype 5944fc1354aSGerrit Uitslag * @param int $lrev oldest revision 5954fc1354aSGerrit Uitslag * @param int $rrev newest revision or null for diff with current revision 5964fc1354aSGerrit Uitslag * @return string html of link to a diff 597a215faf2SSatoshi Sahara * @deprecated 2020-07-18 5984fc1354aSGerrit Uitslag */ 599d868eb89SAndreas Gohrfunction html_diff_navigationlink($difftype, $linktype, $lrev, $rrev = null) 600d868eb89SAndreas Gohr{ 60179a2d784SGerrit Uitslag dbg_deprecated('see ' . PageDiff::class . '::diffViewlink()'); 60279a2d784SGerrit Uitslag return ''; 6034fc1354aSGerrit Uitslag} 6044fc1354aSGerrit Uitslag 605a8397511SGerrit Uitslag/** 606a8397511SGerrit Uitslag * Insert soft breaks in diff html 607a8397511SGerrit Uitslag * 60842ea7f44SGerrit Uitslag * @param string $diffhtml 609a8397511SGerrit Uitslag * @return string 610a215faf2SSatoshi Sahara * @deprecated 2020-07-18 611a8397511SGerrit Uitslag */ 612d868eb89SAndreas Gohrfunction html_insert_softbreaks($diffhtml) 613d868eb89SAndreas Gohr{ 61479a2d784SGerrit Uitslag dbg_deprecated(PageDiff::class . '::insertSoftbreaks()'); 61573022918SAndreas Gohr return (new PageDiff())->insertSoftbreaks($diffhtml); 616fcfecb69SChristopher Smith} 617fcfecb69SChristopher Smith 61815fae107Sandi/** 61915fae107Sandi * show warning on conflict detection 62015fae107Sandi * 62115fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 62242ea7f44SGerrit Uitslag * 62342ea7f44SGerrit Uitslag * @param string $text 62442ea7f44SGerrit Uitslag * @param string $summary 625bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18 62615fae107Sandi */ 627d868eb89SAndreas Gohrfunction html_conflict($text, $summary) 628d868eb89SAndreas Gohr{ 62979a2d784SGerrit Uitslag dbg_deprecated(PageConflict::class . '::show()'); 63024870174SAndreas Gohr (new PageConflict($text, $summary))->show(); 631f3f0262cSandi} 632f3f0262cSandi 633f3f0262cSandi/** 63415fae107Sandi * Prints the global message array 63515fae107Sandi * 63615fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 637f3f0262cSandi */ 638d868eb89SAndreas Gohrfunction html_msgarea() 639d868eb89SAndreas Gohr{ 640cc58224cSMichael Hamann global $MSG, $MSG_shown; 6418d5e837eSMichael Hamann /** @var array $MSG */ 642cc58224cSMichael Hamann // store if the global $MSG has already been shown and thus HTML output has been started 643cc58224cSMichael Hamann $MSG_shown = true; 644cc58224cSMichael Hamann 645f3f0262cSandi if (!isset($MSG)) return; 646f3f0262cSandi 64724870174SAndreas Gohr $shown = []; 648f3f0262cSandi foreach ($MSG as $msg) { 6494af9f0d4SAndreas Gohr $hash = md5($msg['msg']); 6504af9f0d4SAndreas Gohr if (isset($shown[$hash])) continue; // skip double messages 651f755f9abSChristopher Smith if (info_msg_allowed($msg)) { 65226dfc232SAndreas Gohr echo '<div class="' . $msg['lvl'] . '">'; 65326dfc232SAndreas Gohr echo $msg['msg']; 65426dfc232SAndreas Gohr echo '</div>'; 655d3bae478SChristopher Smith } 6564af9f0d4SAndreas Gohr $shown[$hash] = 1; 657f3f0262cSandi } 658cc58224cSMichael Hamann 659cc58224cSMichael Hamann unset($GLOBALS['MSG']); 660f3f0262cSandi} 661f3f0262cSandi 662f3f0262cSandi/** 663f3f0262cSandi * Prints the registration form 66415fae107Sandi * 66515fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 666bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18 667f3f0262cSandi */ 668d868eb89SAndreas Gohrfunction html_register() 669d868eb89SAndreas Gohr{ 67079a2d784SGerrit Uitslag dbg_deprecated(UserRegister::class . '::show()'); 67173022918SAndreas Gohr (new UserRegister())->show(); 672f3f0262cSandi} 673f3f0262cSandi 674f3f0262cSandi/** 6758b06d178Schris * Print the update profile form 6768b06d178Schris * 6778b06d178Schris * @author Christopher Smith <chris@jalakai.co.uk> 6788b06d178Schris * @author Andreas Gohr <andi@splitbrain.org> 679bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18 6808b06d178Schris */ 681d868eb89SAndreas Gohrfunction html_updateprofile() 682d868eb89SAndreas Gohr{ 68379a2d784SGerrit Uitslag dbg_deprecated(UserProfile::class . '::show()'); 68473022918SAndreas Gohr (new UserProfile())->show(); 6858b06d178Schris} 6868b06d178Schris 6878b06d178Schris/** 6887c4635c4SAdrian Lang * Preprocess edit form data 68915fae107Sandi * 69015fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 6912ffea8f2SAdrian Lang * 692bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18 693f3f0262cSandi */ 694d868eb89SAndreas Gohrfunction html_edit() 695d868eb89SAndreas Gohr{ 69679a2d784SGerrit Uitslag dbg_deprecated(Editor::class . '::show()'); 69773022918SAndreas Gohr (new Editor())->show(); 698f3f0262cSandi} 699f3f0262cSandi 700f3f0262cSandi/** 7018e4da260SAdrian Lang * Display the default edit form 7028e4da260SAdrian Lang * 7038e4da260SAdrian Lang * Is the default action for HTML_EDIT_FORMSELECTION. 70442ea7f44SGerrit Uitslag * 70579a2d784SGerrit Uitslag * @param array $param 706bf69f8cbSSatoshi Sahara * @deprecated 2020-07-18 7078e4da260SAdrian Lang */ 708d868eb89SAndreas Gohrfunction html_edit_form($param) 709d868eb89SAndreas Gohr{ 71079a2d784SGerrit Uitslag dbg_deprecated(Editor::class . '::addTextarea()'); 71173022918SAndreas Gohr (new Editor())->addTextarea($param); 712b6912aeaSAndreas Gohr} 713b6912aeaSAndreas Gohr 714b6912aeaSAndreas Gohr/** 715f3f0262cSandi * prints some debug info 71615fae107Sandi * 71715fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 718f3f0262cSandi */ 719d868eb89SAndreas Gohrfunction html_debug() 720d868eb89SAndreas Gohr{ 721f3f0262cSandi global $conf; 722d16a4edaSandi global $lang; 723e1d9dcc8SAndreas Gohr /** @var AuthPlugin $auth */ 7245298a619SAndreas Gohr global $auth; 725100a97e3SAndreas Gohr global $INFO; 726100a97e3SAndreas Gohr 72728fb55ffSandi //remove sensitive data 72828fb55ffSandi $cnf = $conf; 72924297a69SAndreas Gohr debug_guard($cnf); 730100a97e3SAndreas Gohr $nfo = $INFO; 73124297a69SAndreas Gohr debug_guard($nfo); 732100a97e3SAndreas Gohr $ses = $_SESSION; 73324297a69SAndreas Gohr debug_guard($ses); 734f3f0262cSandi 73526dfc232SAndreas Gohr echo '<html><body>'; 736f3f0262cSandi 73726dfc232SAndreas Gohr echo '<p>When reporting bugs please send all the following '; 73826dfc232SAndreas Gohr echo 'output as a mail to andi@splitbrain.org '; 73926dfc232SAndreas Gohr echo 'The best way to do this is to save this page in your browser</p>'; 740f3f0262cSandi 74126dfc232SAndreas Gohr echo '<b>$INFO:</b><pre>'; 742100a97e3SAndreas Gohr print_r($nfo); 74326dfc232SAndreas Gohr echo '</pre>'; 744100a97e3SAndreas Gohr 74526dfc232SAndreas Gohr echo '<b>$_SERVER:</b><pre>'; 746f3f0262cSandi print_r($_SERVER); 74726dfc232SAndreas Gohr echo '</pre>'; 748f3f0262cSandi 74926dfc232SAndreas Gohr echo '<b>$conf:</b><pre>'; 75028fb55ffSandi print_r($cnf); 75126dfc232SAndreas Gohr echo '</pre>'; 752f3f0262cSandi 75326dfc232SAndreas Gohr echo '<b>DOKU_BASE:</b><pre>'; 75426dfc232SAndreas Gohr echo DOKU_BASE; 75526dfc232SAndreas Gohr echo '</pre>'; 756f3f0262cSandi 75726dfc232SAndreas Gohr echo '<b>abs DOKU_BASE:</b><pre>'; 75826dfc232SAndreas Gohr echo DOKU_URL; 75926dfc232SAndreas Gohr echo '</pre>'; 760ed7b5f09Sandi 76126dfc232SAndreas Gohr echo '<b>rel DOKU_BASE:</b><pre>'; 76226dfc232SAndreas Gohr echo dirname($_SERVER['PHP_SELF']) . '/'; 76326dfc232SAndreas Gohr echo '</pre>'; 764f3f0262cSandi 76526dfc232SAndreas Gohr echo '<b>PHP Version:</b><pre>'; 76626dfc232SAndreas Gohr echo phpversion(); 76726dfc232SAndreas Gohr echo '</pre>'; 768f3f0262cSandi 76926dfc232SAndreas Gohr echo '<b>locale:</b><pre>'; 77026dfc232SAndreas Gohr echo setlocale(LC_ALL, 0); 77126dfc232SAndreas Gohr echo '</pre>'; 772f3f0262cSandi 77326dfc232SAndreas Gohr echo '<b>encoding:</b><pre>'; 77426dfc232SAndreas Gohr echo $lang['encoding']; 77526dfc232SAndreas Gohr echo '</pre>'; 776d16a4edaSandi 7776547cfc7SGerrit Uitslag if ($auth instanceof AuthPlugin) { 77826dfc232SAndreas Gohr echo '<b>Auth backend capabilities:</b><pre>'; 7792f46ade0SChristopher Smith foreach ($auth->getCapabilities() as $cando) { 78026dfc232SAndreas Gohr echo ' ' . str_pad($cando, 16) . ' => ' . (int)$auth->canDo($cando) . DOKU_LF; 7812f46ade0SChristopher Smith } 78226dfc232SAndreas Gohr echo '</pre>'; 7835298a619SAndreas Gohr } 7845298a619SAndreas Gohr 78526dfc232SAndreas Gohr echo '<b>$_SESSION:</b><pre>'; 786100a97e3SAndreas Gohr print_r($ses); 78726dfc232SAndreas Gohr echo '</pre>'; 7883aa54d7cSAndreas Gohr 78926dfc232SAndreas Gohr echo '<b>Environment:</b><pre>'; 790f3f0262cSandi print_r($_ENV); 79126dfc232SAndreas Gohr echo '</pre>'; 792f3f0262cSandi 79326dfc232SAndreas Gohr echo '<b>PHP settings:</b><pre>'; 794f3f0262cSandi $inis = ini_get_all(); 795f3f0262cSandi print_r($inis); 79626dfc232SAndreas Gohr echo '</pre>'; 797f3f0262cSandi 798e89b7c1eSChristopher Smith if (function_exists('apache_get_version')) { 79924870174SAndreas Gohr $apache = []; 800e89b7c1eSChristopher Smith $apache['version'] = apache_get_version(); 801e89b7c1eSChristopher Smith 802e89b7c1eSChristopher Smith if (function_exists('apache_get_modules')) { 803e89b7c1eSChristopher Smith $apache['modules'] = apache_get_modules(); 804e89b7c1eSChristopher Smith } 80526dfc232SAndreas Gohr echo '<b>Apache</b><pre>'; 806e89b7c1eSChristopher Smith print_r($apache); 80726dfc232SAndreas Gohr echo '</pre>'; 808e89b7c1eSChristopher Smith } 809e89b7c1eSChristopher Smith 81026dfc232SAndreas Gohr echo '</body></html>'; 811f3f0262cSandi} 812f3f0262cSandi 81310271ce4SAndreas Gohr/** 8148b06d178Schris * Form to request a new password for an existing account 8158b06d178Schris * 8168b06d178Schris * @author Benoit Chesneau <benoit@bchesneau.info> 817cc204bbdSAndreas Gohr * @author Andreas Gohr <gohr@cosmocode.de> 818bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18 81911e2ce22Schris */ 820d868eb89SAndreas Gohrfunction html_resendpwd() 821d868eb89SAndreas Gohr{ 82279a2d784SGerrit Uitslag dbg_deprecated(UserResendPwd::class . '::show()'); 82373022918SAndreas Gohr (new UserResendPwd())->show(); 824cc204bbdSAndreas Gohr} 825cc204bbdSAndreas Gohr 826fdb8d77bSTom N Harris/** 827b8595a66SAndreas Gohr * Return the TOC rendered to XHTML 828b8595a66SAndreas Gohr * 829b8595a66SAndreas Gohr * @author Andreas Gohr <andi@splitbrain.org> 83042ea7f44SGerrit Uitslag * 83142ea7f44SGerrit Uitslag * @param array $toc 83242ea7f44SGerrit Uitslag * @return string html 833b8595a66SAndreas Gohr */ 834d868eb89SAndreas Gohrfunction html_TOC($toc) 835d868eb89SAndreas Gohr{ 83624870174SAndreas Gohr if ($toc === []) return ''; 837b8595a66SAndreas Gohr global $lang; 838b8595a66SAndreas Gohr $out = '<!-- TOC START -->' . DOKU_LF; 839158a5bffSDeathCamel57 $out .= '<div id="dw__toc" class="dw__toc">' . DOKU_LF; 84048722ac8SAnika Henke $out .= '<h3 class="toggle">'; 841b8595a66SAndreas Gohr $out .= $lang['toc']; 842d5acc30dSAnika Henke $out .= '</h3>' . DOKU_LF; 843d5acc30dSAnika Henke $out .= '<div>' . DOKU_LF; 844bde560b4SSatoshi Sahara $out .= html_buildlist($toc, 'toc', 'html_list_toc', null, true); 845b8595a66SAndreas Gohr $out .= '</div>' . DOKU_LF . '</div>' . DOKU_LF; 846b8595a66SAndreas Gohr $out .= '<!-- TOC END -->' . DOKU_LF; 847db959ae3SAndreas Gohr return $out; 848db959ae3SAndreas Gohr} 849b8595a66SAndreas Gohr 850b8595a66SAndreas Gohr/** 851b8595a66SAndreas Gohr * Callback for html_buildlist 85242ea7f44SGerrit Uitslag * 85342ea7f44SGerrit Uitslag * @param array $item 85442ea7f44SGerrit Uitslag * @return string html 855b8595a66SAndreas Gohr */ 856d868eb89SAndreas Gohrfunction html_list_toc($item) 857d868eb89SAndreas Gohr{ 858c66972f2SAdrian Lang if (isset($item['hid'])) { 8597d91652aSAndreas Gohr $link = '#' . $item['hid']; 8607d91652aSAndreas Gohr } else { 8617d91652aSAndreas Gohr $link = $item['link']; 8627d91652aSAndreas Gohr } 8637d91652aSAndreas Gohr 864d5acc30dSAnika Henke return '<a href="' . $link . '">' . hsc($item['title']) . '</a>'; 865b8595a66SAndreas Gohr} 866b8595a66SAndreas Gohr 867b8595a66SAndreas Gohr/** 868b8595a66SAndreas Gohr * Helper function to build TOC items 869b8595a66SAndreas Gohr * 870b8595a66SAndreas Gohr * Returns an array ready to be added to a TOC array 871b8595a66SAndreas Gohr * 872b8595a66SAndreas Gohr * @param string $link - where to link (if $hash set to '#' it's a local anchor) 873b8595a66SAndreas Gohr * @param string $text - what to display in the TOC 874b8595a66SAndreas Gohr * @param int $level - nesting level 875b8595a66SAndreas Gohr * @param string $hash - is prepended to the given $link, set blank if you want full links 8768d5e837eSMichael Hamann * @return array the toc item 877b8595a66SAndreas Gohr */ 878d868eb89SAndreas Gohrfunction html_mktocitem($link, $text, $level, $hash = '#') 879d868eb89SAndreas Gohr{ 88024870174SAndreas Gohr return [ 881bde560b4SSatoshi Sahara 'link' => $hash . $link, 882b8595a66SAndreas Gohr 'title' => $text, 883b8595a66SAndreas Gohr 'type' => 'ul', 884bde560b4SSatoshi Sahara 'level' => $level 88524870174SAndreas Gohr ]; 886b8595a66SAndreas Gohr} 887b8595a66SAndreas Gohr 888b8595a66SAndreas Gohr/** 889fdb8d77bSTom N Harris * Output a Doku_Form object. 890fdb8d77bSTom N Harris * Triggers an event with the form name: HTML_{$name}FORM_OUTPUT 891fdb8d77bSTom N Harris * 892fdb8d77bSTom N Harris * @author Tom N Harris <tnharris@whoopdedo.org> 89342ea7f44SGerrit Uitslag * 8948d5e837eSMichael Hamann * @param string $name The name of the form 8958d5e837eSMichael Hamann * @param Doku_Form $form The form 8962162df3aSSatoshi Sahara * @return void 8972162df3aSSatoshi Sahara * @deprecated 2020-07-18 898fdb8d77bSTom N Harris */ 899d868eb89SAndreas Gohrfunction html_form($name, $form) 900d868eb89SAndreas Gohr{ 9018a5f08afSSatoshi Sahara dbg_deprecated('use dokuwiki\Form\Form instead of Doku_Form'); 902fdb8d77bSTom N Harris // Safety check in case the caller forgets. 903fdb8d77bSTom N Harris $form->endFieldset(); 904cbb44eabSAndreas Gohr Event::createAndTrigger('HTML_' . strtoupper($name) . 'FORM_OUTPUT', $form, 'html_form_output', false); 905fdb8d77bSTom N Harris} 906fdb8d77bSTom N Harris 907fdb8d77bSTom N Harris/** 908fdb8d77bSTom N Harris * Form print function. 909c29600d0SSatoshi Sahara * Just calls printForm() on the form object. 91042ea7f44SGerrit Uitslag * 911c29600d0SSatoshi Sahara * @param Doku_Form $form The form 9122162df3aSSatoshi Sahara * @return void 9132162df3aSSatoshi Sahara * @deprecated 2020-07-18 914fdb8d77bSTom N Harris */ 915d868eb89SAndreas Gohrfunction html_form_output($form) 916d868eb89SAndreas Gohr{ 91724870174SAndreas Gohr dbg_deprecated('use ' . Form::class . '::toHTML()'); 91825dd2a2fSSatoshi Sahara $form->printForm(); 9198b06d178Schris} 920340756e4Sandi 92107bf32b2SAndreas Gohr/** 92207bf32b2SAndreas Gohr * Embed a flash object in HTML 92307bf32b2SAndreas Gohr * 92407bf32b2SAndreas Gohr * This will create the needed HTML to embed a flash movie in a cross browser 92507bf32b2SAndreas Gohr * compatble way using valid XHTML 92607bf32b2SAndreas Gohr * 92707bf32b2SAndreas Gohr * The parameters $params, $flashvars and $atts need to be associative arrays. 92807bf32b2SAndreas Gohr * No escaping needs to be done for them. The alternative content *has* to be 92907bf32b2SAndreas Gohr * escaped because it is used as is. If no alternative content is given 93007bf32b2SAndreas Gohr * $lang['noflash'] is used. 93107bf32b2SAndreas Gohr * 93207bf32b2SAndreas Gohr * @author Andreas Gohr <andi@splitbrain.org> 93307bf32b2SAndreas Gohr * @link http://latrine.dgx.cz/how-to-correctly-insert-a-flash-into-xhtml 93407bf32b2SAndreas Gohr * 93507bf32b2SAndreas Gohr * @param string $swf - the SWF movie to embed 93607bf32b2SAndreas Gohr * @param int $width - width of the flash movie in pixels 93707bf32b2SAndreas Gohr * @param int $height - height of the flash movie in pixels 93807bf32b2SAndreas Gohr * @param array $params - additional parameters (<param>) 93907bf32b2SAndreas Gohr * @param array $flashvars - parameters to be passed in the flashvar parameter 94007bf32b2SAndreas Gohr * @param array $atts - additional attributes for the <object> tag 94107bf32b2SAndreas Gohr * @param string $alt - alternative content (is NOT automatically escaped!) 942b3d1090eSMichael Hamann * @return string - the XHTML markup 94307bf32b2SAndreas Gohr */ 944d868eb89SAndreas Gohrfunction html_flashobject($swf, $width, $height, $params = null, $flashvars = null, $atts = null, $alt = '') 945d868eb89SAndreas Gohr{ 94607bf32b2SAndreas Gohr global $lang; 94707bf32b2SAndreas Gohr 94807bf32b2SAndreas Gohr $out = ''; 94907bf32b2SAndreas Gohr 95007bf32b2SAndreas Gohr // prepare the object attributes 95124870174SAndreas Gohr if (is_null($atts)) $atts = []; 95207bf32b2SAndreas Gohr $atts['width'] = (int) $width; 953d4c61e61SAndreas Gohr $atts['height'] = (int) $height; 95407bf32b2SAndreas Gohr if (!$atts['width']) $atts['width'] = 425; 95507bf32b2SAndreas Gohr if (!$atts['height']) $atts['height'] = 350; 95607bf32b2SAndreas Gohr 95707bf32b2SAndreas Gohr // add object attributes for standard compliant browsers 95807bf32b2SAndreas Gohr $std = $atts; 95907bf32b2SAndreas Gohr $std['type'] = 'application/x-shockwave-flash'; 96007bf32b2SAndreas Gohr $std['data'] = $swf; 96107bf32b2SAndreas Gohr 96207bf32b2SAndreas Gohr // add object attributes for IE 96307bf32b2SAndreas Gohr $ie = $atts; 96407bf32b2SAndreas Gohr $ie['classid'] = 'clsid:D27CDB6E-AE6D-11cf-96B8-444553540000'; 96507bf32b2SAndreas Gohr 96607bf32b2SAndreas Gohr // open object (with conditional comments) 96707bf32b2SAndreas Gohr $out .= '<!--[if !IE]> -->' . NL; 96807bf32b2SAndreas Gohr $out .= '<object ' . buildAttributes($std) . '>' . NL; 96907bf32b2SAndreas Gohr $out .= '<!-- <![endif]-->' . NL; 97007bf32b2SAndreas Gohr $out .= '<!--[if IE]>' . NL; 97107bf32b2SAndreas Gohr $out .= '<object ' . buildAttributes($ie) . '>' . NL; 97207bf32b2SAndreas Gohr $out .= ' <param name="movie" value="' . hsc($swf) . '" />' . NL; 9739ae41cdcSAndreas Gohr $out .= '<!--><!-- -->' . NL; 97407bf32b2SAndreas Gohr 97507bf32b2SAndreas Gohr // print params 97607bf32b2SAndreas Gohr if (is_array($params)) foreach ($params as $key => $val) { 97707bf32b2SAndreas Gohr $out .= ' <param name="' . hsc($key) . '" value="' . hsc($val) . '" />' . NL; 97807bf32b2SAndreas Gohr } 97907bf32b2SAndreas Gohr 98007bf32b2SAndreas Gohr // add flashvars 98107bf32b2SAndreas Gohr if (is_array($flashvars)) { 982d4c61e61SAndreas Gohr $out .= ' <param name="FlashVars" value="' . buildURLparams($flashvars) . '" />' . NL; 98307bf32b2SAndreas Gohr } 98407bf32b2SAndreas Gohr 98507bf32b2SAndreas Gohr // alternative content 98607bf32b2SAndreas Gohr if ($alt) { 98707bf32b2SAndreas Gohr $out .= $alt . NL; 98807bf32b2SAndreas Gohr } else { 98907bf32b2SAndreas Gohr $out .= $lang['noflash'] . NL; 99007bf32b2SAndreas Gohr } 99107bf32b2SAndreas Gohr 99207bf32b2SAndreas Gohr // finish 99307bf32b2SAndreas Gohr $out .= '</object>' . NL; 99407bf32b2SAndreas Gohr $out .= '<!-- <![endif]-->' . NL; 99507bf32b2SAndreas Gohr 99607bf32b2SAndreas Gohr return $out; 99707bf32b2SAndreas Gohr} 99807bf32b2SAndreas Gohr 9998d5e837eSMichael Hamann/** 10008d5e837eSMichael Hamann * Prints HTML code for the given tab structure 10018d5e837eSMichael Hamann * 10028d5e837eSMichael Hamann * @param array $tabs tab structure 10038d5e837eSMichael Hamann * @param string $current_tab the current tab id 10042162df3aSSatoshi Sahara * @return void 10058d5e837eSMichael Hamann */ 1006d868eb89SAndreas Gohrfunction html_tabs($tabs, $current_tab = null) 1007d868eb89SAndreas Gohr{ 100894add303SAnika Henke echo '<ul class="tabs">' . NL; 100995b451bcSAdrian Lang 101095b451bcSAdrian Lang foreach ($tabs as $id => $tab) { 101195b451bcSAdrian Lang html_tab($tab['href'], $tab['caption'], $id === $current_tab); 101295b451bcSAdrian Lang } 101395b451bcSAdrian Lang 101494add303SAnika Henke echo '</ul>' . NL; 101595b451bcSAdrian Lang} 1016cd2a4cfdSAnika Henke 101795b451bcSAdrian Lang/** 101895b451bcSAdrian Lang * Prints a single tab 101995b451bcSAdrian Lang * 102095b451bcSAdrian Lang * @author Kate Arzamastseva <pshns@ukr.net> 102195b451bcSAdrian Lang * @author Adrian Lang <mail@adrianlang.de> 102295b451bcSAdrian Lang * 102395b451bcSAdrian Lang * @param string $href - tab href 102495b451bcSAdrian Lang * @param string $caption - tab caption 102595b451bcSAdrian Lang * @param boolean $selected - is tab selected 10262162df3aSSatoshi Sahara * @return void 102795b451bcSAdrian Lang */ 102895b451bcSAdrian Lang 1029d868eb89SAndreas Gohrfunction html_tab($href, $caption, $selected = false) 1030d868eb89SAndreas Gohr{ 103195b451bcSAdrian Lang $tab = '<li>'; 103295b451bcSAdrian Lang if ($selected) { 103395b451bcSAdrian Lang $tab .= '<strong>'; 103495b451bcSAdrian Lang } else { 103595b451bcSAdrian Lang $tab .= '<a href="' . hsc($href) . '">'; 103695b451bcSAdrian Lang } 103795b451bcSAdrian Lang $tab .= hsc($caption) 103895b451bcSAdrian Lang . '</' . ($selected ? 'strong' : 'a') . '>' 103994add303SAnika Henke . '</li>' . NL; 104095b451bcSAdrian Lang echo $tab; 104195b451bcSAdrian Lang} 104295b451bcSAdrian Lang 1043cd2a4cfdSAnika Henke/** 1044cd2a4cfdSAnika Henke * Display size change 1045cd2a4cfdSAnika Henke * 1046cd2a4cfdSAnika Henke * @param int $sizechange - size of change in Bytes 1047e34d6962SSatoshi Sahara * @param Doku_Form $form - (optional) form to add elements to 1048e34d6962SSatoshi Sahara * @return void|string 1049cd2a4cfdSAnika Henke */ 1050d868eb89SAndreas Gohrfunction html_sizechange($sizechange, $form = null) 1051d868eb89SAndreas Gohr{ 1052cd2a4cfdSAnika Henke if (isset($sizechange)) { 1053cd2a4cfdSAnika Henke $class = 'sizechange'; 1054cd2a4cfdSAnika Henke $value = filesize_h(abs($sizechange)); 1055cd2a4cfdSAnika Henke if ($sizechange > 0) { 1056cd2a4cfdSAnika Henke $class .= ' positive'; 1057cd2a4cfdSAnika Henke $value = '+' . $value; 1058cd2a4cfdSAnika Henke } elseif ($sizechange < 0) { 1059cd2a4cfdSAnika Henke $class .= ' negative'; 1060cd2a4cfdSAnika Henke $value = '-' . $value; 10610b78a6edSAnika Henke } else { 10620b78a6edSAnika Henke $value = '±' . $value; 1063cd2a4cfdSAnika Henke } 1064e34d6962SSatoshi Sahara if (!isset($form)) { 1065e34d6962SSatoshi Sahara return '<span class="' . $class . '">' . $value . '</span>'; 1066b0f23f4eSSatoshi Sahara } else { // Doku_Form 106724870174SAndreas Gohr $form->addElement(form_makeOpenTag('span', ['class' => $class])); 1068cd2a4cfdSAnika Henke $form->addElement($value); 1069cd2a4cfdSAnika Henke $form->addElement(form_makeCloseTag('span')); 1070cd2a4cfdSAnika Henke } 1071cd2a4cfdSAnika Henke } 1072b0f23f4eSSatoshi Sahara} 1073