xref: /dokuwiki/inc/html.php (revision 8788dbbd585b42284320d64cc932f3c875eab6b2)
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