xref: /dokuwiki/inc/html.php (revision d4f83172d9533c4d84f450fe22ef630816b21d75)
1ed7b5f09Sandi<?php
2*d4f83172SAndreas 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 */
9*d4f83172SAndreas Gohr
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;
1779a2d784SGerrit Uitslaguse dokuwiki\Ui\Backlinks;
1879a2d784SGerrit Uitslaguse dokuwiki\Ui\Editor;
1979a2d784SGerrit Uitslaguse dokuwiki\Ui\Index;
2079a2d784SGerrit Uitslaguse dokuwiki\Ui\Login;
2179a2d784SGerrit Uitslaguse dokuwiki\Ui\PageConflict;
2279a2d784SGerrit Uitslaguse dokuwiki\Ui\PageDiff;
2379a2d784SGerrit Uitslaguse dokuwiki\Ui\PageDraft;
2479a2d784SGerrit Uitslaguse dokuwiki\Ui\PageRevisions;
2579a2d784SGerrit Uitslaguse dokuwiki\Ui\PageView;
2679a2d784SGerrit Uitslaguse dokuwiki\Ui\Recent;
2779a2d784SGerrit Uitslaguse dokuwiki\Ui\UserProfile;
2879a2d784SGerrit Uitslaguse dokuwiki\Ui\UserRegister;
2979a2d784SGerrit Uitslaguse dokuwiki\Ui\UserResendPwd;
3079a2d784SGerrit Uitslaguse dokuwiki\Utf8\Clean;
310c3a5702SAndreas Gohr
322d3b082eSMichael Großeif (!defined('SEC_EDIT_PATTERN')) {
3337c80e0eSLarsDW223    define('SEC_EDIT_PATTERN', '#<!-- EDIT({.*?}) -->#');
342d3b082eSMichael Große}
352d3b082eSMichael Große
366bbae538Sandi
37f3f0262cSandi/**
38f3f0262cSandi * Convenience function to quickly build a wikilink
3915fae107Sandi *
4015fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
418d5e837eSMichael Hamann * @param string  $id      id of the target page
428d5e837eSMichael Hamann * @param string  $name    the name of the link, i.e. the text that is displayed
438d5e837eSMichael Hamann * @param string|array  $search  search string(s) that shall be highlighted in the target page
448d5e837eSMichael Hamann * @return string the HTML code of the link
45f3f0262cSandi */
46d868eb89SAndreas Gohrfunction html_wikilink($id, $name = null, $search = '')
47d868eb89SAndreas Gohr{
48a8397511SGerrit Uitslag    /** @var Doku_Renderer_xhtml $xhtml_renderer */
49db959ae3SAndreas Gohr    static $xhtml_renderer = null;
50723d78dbSandi    if (is_null($xhtml_renderer)) {
517aea91afSChris Smith        $xhtml_renderer = p_get_renderer('xhtml');
52f3f0262cSandi    }
53f3f0262cSandi
54fe9ec250SChris Smith    return $xhtml_renderer->internallink($id, $name, $search, true, 'navigation');
55f3f0262cSandi}
56f3f0262cSandi
57f3f0262cSandi/**
58f3f0262cSandi * The loginform
5915fae107Sandi *
6015fae107Sandi * @author   Andreas Gohr <andi@splitbrain.org>
61d1d904bbSMichael Große *
62d1d904bbSMichael Große * @param bool $svg Whether to show svg icons in the register and resendpwd links or not
63bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18
64f3f0262cSandi */
65d868eb89SAndreas Gohrfunction html_login($svg = false)
66d868eb89SAndreas Gohr{
6779a2d784SGerrit Uitslag    dbg_deprecated(Login::class . '::show()');
6824870174SAndreas Gohr    (new Login($svg))->show();
69f3f0262cSandi}
70f3f0262cSandi
71d59dea9fSGerrit Uitslag
72d59dea9fSGerrit Uitslag/**
73d59dea9fSGerrit Uitslag * Denied page content
74d59dea9fSGerrit Uitslag *
757afe5d93SSatoshi Sahara * @deprecated 2020-07-18 not called anymore, see inc/Action/Denied::tplContent()
76d59dea9fSGerrit Uitslag */
77d868eb89SAndreas Gohrfunction html_denied()
78d868eb89SAndreas Gohr{
7979a2d784SGerrit Uitslag    dbg_deprecated(Denied::class . '::showBanner()');
8024870174SAndreas Gohr    (new Denied())->showBanner();
81d59dea9fSGerrit Uitslag}
82d59dea9fSGerrit Uitslag
83f3f0262cSandi/**
8415fae107Sandi * inserts section edit buttons if wanted or removes the markers
8515fae107Sandi *
8615fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
8742ea7f44SGerrit Uitslag *
8842ea7f44SGerrit Uitslag * @param string $text
8942ea7f44SGerrit Uitslag * @param bool   $show show section edit buttons?
9042ea7f44SGerrit Uitslag * @return string
9115fae107Sandi */
92d868eb89SAndreas Gohrfunction html_secedit($text, $show = true)
93d868eb89SAndreas Gohr{
94f3f0262cSandi    global $INFO;
9535dae8b0SBen Coburn
96aac83cd4SPhy    if ((isset($INFO) && !$INFO['writable']) || !$show || (isset($INFO) && $INFO['rev'])) {
972d3b082eSMichael Große        return preg_replace(SEC_EDIT_PATTERN, '', $text);
98f3f0262cSandi    }
9935dae8b0SBen Coburn
100dccd6b2bSAndreas Gohr    return preg_replace_callback(
101dccd6b2bSAndreas Gohr        SEC_EDIT_PATTERN,
102dccd6b2bSAndreas Gohr        'html_secedit_button',
103dccd6b2bSAndreas Gohr        $text
104dccd6b2bSAndreas Gohr    );
10540868f2fSAdrian Lang}
10640868f2fSAdrian Lang
10740868f2fSAdrian Lang/**
10840868f2fSAdrian Lang * prepares section edit button data for event triggering
10940868f2fSAdrian Lang * used as a callback in html_secedit
11040868f2fSAdrian Lang *
11140868f2fSAdrian Lang * @author Andreas Gohr <andi@splitbrain.org>
11242ea7f44SGerrit Uitslag *
11342ea7f44SGerrit Uitslag * @param array $matches matches with regexp
11442ea7f44SGerrit Uitslag * @return string
11542ea7f44SGerrit Uitslag * @triggers HTML_SECEDIT_BUTTON
11640868f2fSAdrian Lang */
117d868eb89SAndreas Gohrfunction html_secedit_button($matches)
118d868eb89SAndreas Gohr{
119ada0d779SMichael Hamann    $json = htmlspecialchars_decode($matches[1], ENT_QUOTES);
120cb7312c0SAndreas Gohr
121cb7312c0SAndreas Gohr    try {
12224870174SAndreas Gohr        $data = json_decode($json, true, 512, JSON_THROW_ON_ERROR);
123cb7312c0SAndreas Gohr    } catch (JsonException $e) {
12479a2d784SGerrit Uitslag        return '';
12506917fceSMichael Große    }
126ec57f119SLarsDW223    $data['target'] = strtolower($data['target']);
12796ebed36SAndreas Gohr    $data['hid'] = strtolower($data['hid'] ?? '');
12840868f2fSAdrian Lang
12996ebed36SAndreas Gohr    return Event::createAndTrigger(
13096ebed36SAndreas Gohr        'HTML_SECEDIT_BUTTON',
13196ebed36SAndreas Gohr        $data,
13296ebed36SAndreas Gohr        'html_secedit_get_button'
13396ebed36SAndreas Gohr    );
13440868f2fSAdrian Lang}
13540868f2fSAdrian Lang
13640868f2fSAdrian Lang/**
13740868f2fSAdrian Lang * prints a section editing button
13840868f2fSAdrian Lang * used as default action form HTML_SECEDIT_BUTTON
13940868f2fSAdrian Lang *
14040868f2fSAdrian Lang * @author Adrian Lang <lang@cosmocode.de>
14142ea7f44SGerrit Uitslag *
14242ea7f44SGerrit Uitslag * @param array $data name, section id and target
14342ea7f44SGerrit Uitslag * @return string html
14440868f2fSAdrian Lang */
145d868eb89SAndreas Gohrfunction html_secedit_get_button($data)
146d868eb89SAndreas Gohr{
14740868f2fSAdrian Lang    global $ID;
14840868f2fSAdrian Lang    global $INFO;
14940868f2fSAdrian Lang
1506d9eab4dSMichael Hamann    if (!isset($data['name']) || $data['name'] === '') return '';
15140868f2fSAdrian Lang
15240868f2fSAdrian Lang    $name = $data['name'];
15340868f2fSAdrian Lang    unset($data['name']);
15440868f2fSAdrian Lang
155905fa971SAdrian Lang    $secid = $data['secid'];
156905fa971SAdrian Lang    unset($data['secid']);
157905fa971SAdrian Lang
1587afe5d93SSatoshi Sahara    $params = array_merge(
15924870174SAndreas Gohr        ['do'  => 'edit', 'rev' => $INFO['lastmod'], 'summary' => '[' . $name . '] '],
1607afe5d93SSatoshi Sahara        $data
1617afe5d93SSatoshi Sahara    );
1627afe5d93SSatoshi Sahara
1637afe5d93SSatoshi Sahara    $html = '<div class="secedit editbutton_' . $data['target'] . ' editbutton_' . $secid . '">';
1647afe5d93SSatoshi Sahara    $html .= html_btn('secedit', $ID, '', $params, 'post', $name);
1657afe5d93SSatoshi Sahara    $html .= '</div>';
1667afe5d93SSatoshi Sahara    return $html;
167f3f0262cSandi}
168f3f0262cSandi
169f3f0262cSandi/**
170d6c9c552Smatthiasgrimm * Just the back to top button (in its own form)
1716b13307fSandi *
1726b13307fSandi * @author Andreas Gohr <andi@splitbrain.org>
17342ea7f44SGerrit Uitslag *
17442ea7f44SGerrit Uitslag * @return string html
1756b13307fSandi */
176d868eb89SAndreas Gohrfunction html_topbtn()
177d868eb89SAndreas Gohr{
1786b13307fSandi    global $lang;
1796b13307fSandi
18079a2d784SGerrit Uitslag    return '<a class="nolink" href="#dokuwiki__top">'
1817afe5d93SSatoshi Sahara        . '<button class="button" onclick="window.scrollTo(0, 0)" title="' . $lang['btn_top'] . '">'
1827afe5d93SSatoshi Sahara        . $lang['btn_top']
1837afe5d93SSatoshi Sahara        . '</button></a>';
1846b13307fSandi}
1856b13307fSandi
1866b13307fSandi/**
187d67ca2c0Smatthiasgrimm * Displays a button (using its own form)
18835dae8b0SBen Coburn * If tooltip exists, the access key tooltip is replaced.
18915fae107Sandi *
19015fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
19142ea7f44SGerrit Uitslag *
19242ea7f44SGerrit Uitslag * @param string         $name
19342ea7f44SGerrit Uitslag * @param string         $id
19442ea7f44SGerrit Uitslag * @param string         $akey   access key
195e3710957SGerrit Uitslag * @param string[]       $params key-value pairs added as hidden inputs
19642ea7f44SGerrit Uitslag * @param string         $method
19742ea7f44SGerrit Uitslag * @param string         $tooltip
19842ea7f44SGerrit Uitslag * @param bool|string    $label  label text, false: lookup btn_$name in localization
199e824d633SMichael Große * @param string         $svg (optional) svg code, inserted into the button
20042ea7f44SGerrit Uitslag * @return string
201f3f0262cSandi */
202d868eb89SAndreas Gohrfunction html_btn($name, $id, $akey, $params, $method = 'get', $tooltip = '', $label = false, $svg = null)
203d868eb89SAndreas Gohr{
204f3f0262cSandi    global $conf;
205f3f0262cSandi    global $lang;
206f3f0262cSandi
207f5baf821SAnika Henke    if (!$label)
208f3f0262cSandi        $label = $lang['btn_' . $name];
209f3f0262cSandi
21049c713a3Sandi    //filter id (without urlencoding)
21149c713a3Sandi    $id = idfilter($id, false);
212f3f0262cSandi
213f3f0262cSandi    //make nice URLs even for buttons
2146c7843b5Sandi    if ($conf['userewrite'] == 2) {
2156c7843b5Sandi        $script = DOKU_BASE . DOKU_SCRIPT . '/' . $id;
2166c7843b5Sandi    } elseif ($conf['userewrite']) {
2176c7843b5Sandi        $script = DOKU_BASE . $id;
2186c7843b5Sandi    } else {
2198b00ebcfSandi        $script = DOKU_BASE . DOKU_SCRIPT;
220f3f0262cSandi        $params['id'] = $id;
221f3f0262cSandi    }
222f3f0262cSandi
2237afe5d93SSatoshi Sahara    $html = '<form class="button btn_' . $name . '" method="' . $method . '" action="' . $script . '"><div class="no">';
224f3f0262cSandi
22506a4bf8fSAndreas Gohr    if (is_array($params)) {
2269e491c01SAndreas Gohr        foreach ($params as $key => $val) {
2277afe5d93SSatoshi Sahara            $html .= '<input type="hidden" name="' . $key . '" value="' . hsc($val) . '" />';
228f3f0262cSandi        }
22906a4bf8fSAndreas Gohr    }
230f3f0262cSandi
2317afe5d93SSatoshi Sahara    $tip = empty($tooltip) ? hsc($label) : hsc($tooltip);
23211ea018fSAndreas Gohr
2337afe5d93SSatoshi Sahara    $html .= '<button type="submit" ';
23411ea018fSAndreas Gohr    if ($akey) {
23507493d05SAnika Henke        $tip  .= ' [' . strtoupper($akey) . ']';
2367afe5d93SSatoshi Sahara        $html .= 'accesskey="' . $akey . '" ';
23735dae8b0SBen Coburn    }
2387afe5d93SSatoshi Sahara    $html .= 'title="' . $tip . '">';
239e824d633SMichael Große    if ($svg) {
2407afe5d93SSatoshi Sahara        $html .= '<span>' . hsc($label) . '</span>' . inlineSVG($svg);
241679dba01SMichael Große    } else {
2427afe5d93SSatoshi Sahara        $html .= hsc($label);
243679dba01SMichael Große    }
2447afe5d93SSatoshi Sahara    $html .= '</button>';
2457afe5d93SSatoshi Sahara    $html .= '</div></form>';
246f3f0262cSandi
2477afe5d93SSatoshi Sahara    return $html;
248f3f0262cSandi}
2490747f5d7Sghi/**
2500747f5d7Sghi * show a revision warning
2510747f5d7Sghi *
2520747f5d7Sghi * @author Szymon Olewniczak <dokuwiki@imz.re>
25387f229e8SSatoshi Sahara * @deprecated 2020-07-18
2540747f5d7Sghi */
255d868eb89SAndreas Gohrfunction html_showrev()
256d868eb89SAndreas Gohr{
25779a2d784SGerrit Uitslag    dbg_deprecated(PageView::class . '::showrev()');
2580747f5d7Sghi}
259f3f0262cSandi
260f3f0262cSandi/**
26142ea7f44SGerrit Uitslag * Show a wiki page
26215fae107Sandi *
26315fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
26442ea7f44SGerrit Uitslag *
26542ea7f44SGerrit Uitslag * @param null|string $txt wiki text or null for showing $ID
266bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18
26715fae107Sandi */
268d868eb89SAndreas Gohrfunction html_show($txt = null)
269d868eb89SAndreas Gohr{
27079a2d784SGerrit Uitslag    dbg_deprecated(PageView::class . '::show()');
27124870174SAndreas Gohr    (new PageView($txt))->show();
272f3f0262cSandi}
273f3f0262cSandi
274f3f0262cSandi/**
275ee4c4a1bSAndreas Gohr * ask the user about how to handle an exisiting draft
276ee4c4a1bSAndreas Gohr *
277ee4c4a1bSAndreas Gohr * @author Andreas Gohr <andi@splitbrain.org>
278bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18
279ee4c4a1bSAndreas Gohr */
280d868eb89SAndreas Gohrfunction html_draft()
281d868eb89SAndreas Gohr{
28279a2d784SGerrit Uitslag    dbg_deprecated(PageDraft::class . '::show()');
28373022918SAndreas Gohr    (new PageDraft())->show();
284ee4c4a1bSAndreas Gohr}
285ee4c4a1bSAndreas Gohr
286ee4c4a1bSAndreas Gohr/**
287f3f0262cSandi * Highlights searchqueries in HTML code
28815fae107Sandi *
28915fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
2907209be23SAndreas Gohr * @author Harry Fuecks <hfuecks@gmail.com>
29142ea7f44SGerrit Uitslag *
29242ea7f44SGerrit Uitslag * @param string $html
29342ea7f44SGerrit Uitslag * @param array|string $phrases
29442ea7f44SGerrit Uitslag * @return string html
295f3f0262cSandi */
296d868eb89SAndreas Gohrfunction html_hilight($html, $phrases)
297d868eb89SAndreas Gohr{
2988a803caeSAndreas Gohr    $phrases = (array) $phrases;
2998a803caeSAndreas Gohr    $phrases = array_map('preg_quote_cb', $phrases);
3008a803caeSAndreas Gohr    $phrases = array_map('ft_snippet_re_preprocess', $phrases);
3018a803caeSAndreas Gohr    $phrases = array_filter($phrases);
30224870174SAndreas Gohr
30324870174SAndreas Gohr    $regex = implode('|', $phrases);
30460c15d7dSAndreas Gohr
30560c15d7dSAndreas Gohr    if ($regex === '') return $html;
30679a2d784SGerrit Uitslag    if (!Clean::isUtf8($regex)) return $html;
307f3f0262cSandi
30879a2d784SGerrit Uitslag    return @preg_replace_callback("/((<[^>]*)|$regex)/ui", function ($match) {
309675d8ce4SSatoshi Sahara        $hlight = unslash($match[0]);
310675d8ce4SSatoshi Sahara        if (!isset($match[2])) {
311688774a0SAnika Henke            $hlight = '<span class="search_hit">' . $hlight . '</span>';
3127209be23SAndreas Gohr        }
3137209be23SAndreas Gohr        return $hlight;
314675d8ce4SSatoshi Sahara    }, $html);
3157209be23SAndreas Gohr}
3167209be23SAndreas Gohr
3177209be23SAndreas Gohr/**
31815fae107Sandi * Display error on locked pages
31915fae107Sandi *
32015fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
3217afe5d93SSatoshi Sahara * @deprecated 2020-07-18 not called anymore, see inc/Action/Locked::tplContent()
32215fae107Sandi */
323d868eb89SAndreas Gohrfunction html_locked()
324d868eb89SAndreas Gohr{
32579a2d784SGerrit Uitslag    dbg_deprecated(Locked::class . '::showBanner()');
32624870174SAndreas Gohr    (new Locked())->showBanner();
327f3f0262cSandi}
328f3f0262cSandi
32915fae107Sandi/**
33015fae107Sandi * list old revisions
33115fae107Sandi *
33215fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
33371726d78SBen Coburn * @author Ben Coburn <btcoburn@silicodon.net>
3348e69fd30SKate Arzamastseva * @author Kate Arzamastseva <pshns@ukr.net>
335e0c26282SGerrit Uitslag *
336e0c26282SGerrit Uitslag * @param int $first skip the first n changelog lines
33730a159abSSatoshi Sahara * @param string $media_id id of media, or empty for current page
338bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18
33915fae107Sandi */
340d868eb89SAndreas Gohrfunction html_revisions($first = -1, $media_id = '')
341d868eb89SAndreas Gohr{
34279a2d784SGerrit Uitslag    dbg_deprecated(PageRevisions::class . '::show()');
343b370ebcdSSatoshi Sahara    if ($media_id) {
34424870174SAndreas Gohr        (new MediaRevisions($media_id))->show($first);
345b370ebcdSSatoshi Sahara    } else {
346b370ebcdSSatoshi Sahara        global $INFO;
34724870174SAndreas Gohr        (new PageRevisions($INFO['id']))->show($first);
348b370ebcdSSatoshi Sahara    }
349f3f0262cSandi}
350f3f0262cSandi
35115fae107Sandi/**
35215fae107Sandi * display recent changes
35315fae107Sandi *
35415fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
3555749f1ceSmatthiasgrimm * @author Matthias Grimm <matthiasgrimm@users.sourceforge.net>
35671726d78SBen Coburn * @author Ben Coburn <btcoburn@silicodon.net>
3578d40b4b6SKate Arzamastseva * @author Kate Arzamastseva <pshns@ukr.net>
35842ea7f44SGerrit Uitslag *
35942ea7f44SGerrit Uitslag * @param int $first
36042ea7f44SGerrit Uitslag * @param string $show_changes
361bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18
36215fae107Sandi */
363d868eb89SAndreas Gohrfunction html_recent($first = 0, $show_changes = 'both')
364d868eb89SAndreas Gohr{
36579a2d784SGerrit Uitslag    dbg_deprecated(Recent::class . '::show()');
36624870174SAndreas Gohr    (new Recent($first, $show_changes))->show();
367f3f0262cSandi}
368f3f0262cSandi
36915fae107Sandi/**
37015fae107Sandi * Display page index
37115fae107Sandi *
37215fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
37342ea7f44SGerrit Uitslag *
37442ea7f44SGerrit Uitslag * @param string $ns
375bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18
37615fae107Sandi */
377d868eb89SAndreas Gohrfunction html_index($ns)
378d868eb89SAndreas Gohr{
37979a2d784SGerrit Uitslag    dbg_deprecated(Index::class . '::show()');
38024870174SAndreas Gohr    (new Index($ns))->show();
381f3f0262cSandi}
382f3f0262cSandi
383f3f0262cSandi/**
38489b939d7SSatoshi Sahara * Index tree item formatter for html_buildlist()
38515fae107Sandi *
386f3f0262cSandi * User function for html_buildlist()
38715fae107Sandi *
38815fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
38942ea7f44SGerrit Uitslag *
39042ea7f44SGerrit Uitslag * @param array $item
39142ea7f44SGerrit Uitslag * @return string
3929c8632b4SSatoshi Sahara * @deprecated 2020-07-18
393f3f0262cSandi */
394d868eb89SAndreas Gohrfunction html_list_index($item)
395d868eb89SAndreas Gohr{
39679a2d784SGerrit Uitslag    dbg_deprecated(Index::class . '::formatListItem()');
39773022918SAndreas Gohr    return (new Index())->formatListItem($item);
398f3f0262cSandi}
399f3f0262cSandi
400f3f0262cSandi/**
40189b939d7SSatoshi Sahara * Index list item formatter for html_buildlist()
402cb70c441Sandi *
403a1dee2b9SAdrian Lang * This user function is used in html_buildlist to build the
404cb70c441Sandi * <li> tags for namespaces when displaying the page index
405cb70c441Sandi * it gives different classes to opened or closed "folders"
406cb70c441Sandi *
407cb70c441Sandi * @author Andreas Gohr <andi@splitbrain.org>
40842ea7f44SGerrit Uitslag *
40942ea7f44SGerrit Uitslag * @param array $item
41042ea7f44SGerrit Uitslag * @return string html
4119c8632b4SSatoshi Sahara * @deprecated 2020-07-18
412cb70c441Sandi */
413d868eb89SAndreas Gohrfunction html_li_index($item)
414d868eb89SAndreas Gohr{
41579a2d784SGerrit Uitslag    dbg_deprecated(Index::class . '::tagListItem()');
41673022918SAndreas Gohr    return (new Index())->tagListItem($item);
417cb70c441Sandi}
418cb70c441Sandi
419cb70c441Sandi/**
42089b939d7SSatoshi Sahara * Default list item formatter for html_buildlist()
42189b939d7SSatoshi Sahara *
42289b939d7SSatoshi Sahara * @author Andreas Gohr <andi@splitbrain.org>
42389b939d7SSatoshi Sahara *
42489b939d7SSatoshi Sahara * @param array $item
42589b939d7SSatoshi Sahara * @return string html
42689b939d7SSatoshi Sahara * @deprecated 2020-07-18
42789b939d7SSatoshi Sahara */
428d868eb89SAndreas Gohrfunction html_li_default($item)
429d868eb89SAndreas Gohr{
43089b939d7SSatoshi Sahara    return '<li class="level' . $item['level'] . '">';
43189b939d7SSatoshi Sahara}
43289b939d7SSatoshi Sahara
43389b939d7SSatoshi Sahara/**
43415fae107Sandi * Build an unordered list
43515fae107Sandi *
436f3f0262cSandi * Build an unordered list from the given $data array
437f3f0262cSandi * Each item in the array has to have a 'level' property
438f3f0262cSandi * the item itself gets printed by the given $func user
439cb70c441Sandi * function. The second and optional function is used to
440cb70c441Sandi * print the <li> tag. Both user function need to accept
441cb70c441Sandi * a single item.
44215fae107Sandi *
443c5a8fd96SAndreas Gohr * Both user functions can be given as array to point to
444c5a8fd96SAndreas Gohr * a member of an object.
445c5a8fd96SAndreas Gohr *
44615fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
44780679bafSGerrit Uitslag *
44880679bafSGerrit Uitslag * @param array    $data  array with item arrays
44980679bafSGerrit Uitslag * @param string   $class class of ul wrapper
45080679bafSGerrit Uitslag * @param callable $func  callback to print an list item
451bde560b4SSatoshi Sahara * @param callable $lifunc (optional) callback to the opening li tag
452bde560b4SSatoshi Sahara * @param bool     $forcewrapper (optional) Trigger building a wrapper ul if the first level is
453ae614416SAnika Henke *                               0 (we have a root object) or 1 (just the root content)
45480679bafSGerrit Uitslag * @return string html of an unordered list
455f3f0262cSandi */
456d868eb89SAndreas Gohrfunction html_buildlist($data, $class, $func, $lifunc = null, $forcewrapper = false)
457d868eb89SAndreas Gohr{
45824870174SAndreas Gohr    if ($data === []) {
459a1dee2b9SAdrian Lang        return '';
460a1dee2b9SAdrian Lang    }
461a1dee2b9SAdrian Lang
4622689c55fSMichael Große    $firstElement = reset($data);
4632689c55fSMichael Große    $start_level = $firstElement['level'];
4649e4f7880SAdrian Lang    $level = $start_level;
4659c8632b4SSatoshi Sahara    $html  = '';
466434f5921SHakan Sandell    $open  = 0;
4679e4f7880SAdrian Lang
468bde560b4SSatoshi Sahara    // set callback function to build the <li> tag, formerly defined as html_li_default()
469bde560b4SSatoshi Sahara    if (!is_callable($lifunc)) {
47024870174SAndreas Gohr        $lifunc = static fn($item) => '<li class="level' . $item['level'] . '">';
471bde560b4SSatoshi Sahara    }
472bde560b4SSatoshi Sahara
473f3f0262cSandi    foreach ($data as $item) {
474f3f0262cSandi        if ($item['level'] > $level) {
475f3f0262cSandi            //open new list
476df52d0feSandi            for ($i = 0; $i < ($item['level'] - $level); $i++) {
4779c8632b4SSatoshi Sahara                if ($i) $html .= '<li class="clear">';
4789c8632b4SSatoshi Sahara                $html .= "\n" . '<ul class="' . $class . '">' . "\n";
479434f5921SHakan Sandell                $open++;
480df52d0feSandi            }
481434f5921SHakan Sandell            $level = $item['level'];
482f3f0262cSandi        } elseif ($item['level'] < $level) {
483f3f0262cSandi            //close last item
4849c8632b4SSatoshi Sahara            $html .= '</li>' . "\n";
485434f5921SHakan Sandell            while ($level > $item['level'] && $open > 0) {
486f3f0262cSandi                //close higher lists
4879c8632b4SSatoshi Sahara                $html .= '</ul>' . "\n" . '</li>' . "\n";
488434f5921SHakan Sandell                $level--;
489434f5921SHakan Sandell                $open--;
490f3f0262cSandi            }
4919c8632b4SSatoshi Sahara        } elseif ($html !== '') {
49287671313SHakan Sandell            //close previous item
4939c8632b4SSatoshi Sahara            $html .= '</li>' . "\n";
494f3f0262cSandi        }
495f3f0262cSandi
496f3f0262cSandi        //print item
4979c8632b4SSatoshi Sahara        $html .= call_user_func($lifunc, $item);
4989c8632b4SSatoshi Sahara        $html .= '<div class="li">';
49934dbe711Schris
5009c8632b4SSatoshi Sahara        $html .= call_user_func($func, $item);
5019c8632b4SSatoshi Sahara        $html .= '</div>';
502f3f0262cSandi    }
503f3f0262cSandi
504f3f0262cSandi    //close remaining items and lists
5059c8632b4SSatoshi Sahara    $html .= '</li>' . "\n";
506434f5921SHakan Sandell    while ($open-- > 0) {
5079c8632b4SSatoshi Sahara        $html .= '</ul></li>' . "\n";
508434f5921SHakan Sandell    }
509434f5921SHakan Sandell
510434f5921SHakan Sandell    if ($forcewrapper || $start_level < 2) {
511434f5921SHakan Sandell        // Trigger building a wrapper ul if the first level is
512434f5921SHakan Sandell        // 0 (we have a root object) or 1 (just the root content)
5139c8632b4SSatoshi Sahara        $html = "\n" . '<ul class="' . $class . '">' . "\n" . $html . '</ul>' . "\n";
514f3f0262cSandi    }
515f3f0262cSandi
5169c8632b4SSatoshi Sahara    return $html;
517f3f0262cSandi}
518f3f0262cSandi
51915fae107Sandi/**
52015fae107Sandi * display backlinks
52115fae107Sandi *
52215fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
52311df47ecSMichael Klier * @author Michael Klier <chi@chimeric.de>
524bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18
52515fae107Sandi */
526d868eb89SAndreas Gohrfunction html_backlinks()
527d868eb89SAndreas Gohr{
52879a2d784SGerrit Uitslag    dbg_deprecated(Backlinks::class . '::show()');
52973022918SAndreas Gohr    (new Backlinks())->show();
53095b451bcSAdrian Lang}
53195b451bcSAdrian Lang
53215fae107Sandi/**
533a215faf2SSatoshi Sahara * Get header of diff HTML
534a215faf2SSatoshi Sahara *
535a215faf2SSatoshi Sahara * @param string $l_rev   Left revisions
536a215faf2SSatoshi Sahara * @param string $r_rev   Right revision
537a215faf2SSatoshi Sahara * @param string $id      Page id, if null $ID is used
538a215faf2SSatoshi Sahara * @param bool   $media   If it is for media files
539a215faf2SSatoshi Sahara * @param bool   $inline  Return the header on a single line
540a215faf2SSatoshi Sahara * @return string[] HTML snippets for diff header
541a215faf2SSatoshi Sahara * @deprecated 2020-07-18
542a215faf2SSatoshi Sahara */
543d868eb89SAndreas Gohrfunction html_diff_head($l_rev, $r_rev, $id = null, $media = false, $inline = false)
544d868eb89SAndreas Gohr{
54579a2d784SGerrit Uitslag    dbg_deprecated('see ' . PageDiff::class . '::buildDiffHead()');
54679a2d784SGerrit Uitslag    return ['', '', '', ''];
547a215faf2SSatoshi Sahara}
548a215faf2SSatoshi Sahara
549a215faf2SSatoshi Sahara/**
55004e99fe1SGerrit Uitslag * Show diff
551baf0c3e5SGerrit Uitslag * between current page version and provided $text
552baf0c3e5SGerrit Uitslag * or between the revisions provided via GET or POST
55315fae107Sandi *
55415fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
555baf0c3e5SGerrit Uitslag * @param  string $text  when non-empty: compare with this text with most current version
55604e99fe1SGerrit Uitslag * @param  bool   $intro display the intro text
5578d5e837eSMichael Hamann * @param  string $type  type of the diff (inline or sidebyside)
558bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18
55915fae107Sandi */
560d868eb89SAndreas Gohrfunction html_diff($text = '', $intro = true, $type = null)
561d868eb89SAndreas Gohr{
56279a2d784SGerrit Uitslag    dbg_deprecated(PageDiff::class . '::show()');
563edb50e6aSSatoshi Sahara    global $INFO;
56424870174SAndreas Gohr    (new PageDiff($INFO['id']))->compareWith($text)->preference([
565edb50e6aSSatoshi Sahara        'showIntro' => $intro,
566edb50e6aSSatoshi Sahara        'difftype'  => $type,
567edb50e6aSSatoshi Sahara    ])->show();
568fcfecb69SChristopher Smith}
569fcfecb69SChristopher Smith
57015fae107Sandi/**
571a215faf2SSatoshi Sahara * Create html for revision navigation
572a215faf2SSatoshi Sahara *
573a215faf2SSatoshi Sahara * @param PageChangeLog $pagelog changelog object of current page
574a215faf2SSatoshi Sahara * @param string        $type    inline vs sidebyside
575a215faf2SSatoshi Sahara * @param int           $l_rev   left revision timestamp
576a215faf2SSatoshi Sahara * @param int           $r_rev   right revision timestamp
577a215faf2SSatoshi Sahara * @return string[] html of left and right navigation elements
578a215faf2SSatoshi Sahara * @deprecated 2020-07-18
579a215faf2SSatoshi Sahara */
580d868eb89SAndreas Gohrfunction html_diff_navigation($pagelog, $type, $l_rev, $r_rev)
581d868eb89SAndreas Gohr{
58279a2d784SGerrit Uitslag    dbg_deprecated('see ' . PageDiff::class . '::buildRevisionsNavigation()');
58379a2d784SGerrit Uitslag    return ['', ''];
584a215faf2SSatoshi Sahara}
585a215faf2SSatoshi Sahara
586a215faf2SSatoshi Sahara/**
587a215faf2SSatoshi Sahara * Create html link to a diff defined by two revisions
588a215faf2SSatoshi Sahara *
589a215faf2SSatoshi Sahara * @param string $difftype display type
590a215faf2SSatoshi Sahara * @param string $linktype
591a215faf2SSatoshi Sahara * @param int $lrev oldest revision
592a215faf2SSatoshi Sahara * @param int $rrev newest revision or null for diff with current revision
593a215faf2SSatoshi Sahara * @return string html of link to a diff
594a215faf2SSatoshi Sahara * @deprecated 2020-07-18
595a215faf2SSatoshi Sahara */
596d868eb89SAndreas Gohrfunction html_diff_navigationlink($difftype, $linktype, $lrev, $rrev = null)
597d868eb89SAndreas Gohr{
59879a2d784SGerrit Uitslag    dbg_deprecated('see ' . PageDiff::class . '::diffViewlink()');
59979a2d784SGerrit Uitslag    return '';
600a215faf2SSatoshi Sahara}
601a215faf2SSatoshi Sahara
602a215faf2SSatoshi Sahara/**
603a215faf2SSatoshi Sahara * Insert soft breaks in diff html
604a215faf2SSatoshi Sahara *
605a215faf2SSatoshi Sahara * @param string $diffhtml
606a215faf2SSatoshi Sahara * @return string
607a215faf2SSatoshi Sahara * @deprecated 2020-07-18
608a215faf2SSatoshi Sahara */
609d868eb89SAndreas Gohrfunction html_insert_softbreaks($diffhtml)
610d868eb89SAndreas Gohr{
61179a2d784SGerrit Uitslag    dbg_deprecated(PageDiff::class . '::insertSoftbreaks()');
61273022918SAndreas Gohr    return (new PageDiff())->insertSoftbreaks($diffhtml);
613a215faf2SSatoshi Sahara}
614a215faf2SSatoshi Sahara
615a215faf2SSatoshi Sahara/**
61615fae107Sandi * show warning on conflict detection
61715fae107Sandi *
61815fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
61942ea7f44SGerrit Uitslag *
62042ea7f44SGerrit Uitslag * @param string $text
62142ea7f44SGerrit Uitslag * @param string $summary
622bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18
62315fae107Sandi */
624d868eb89SAndreas Gohrfunction html_conflict($text, $summary)
625d868eb89SAndreas Gohr{
62679a2d784SGerrit Uitslag    dbg_deprecated(PageConflict::class . '::show()');
62724870174SAndreas Gohr    (new PageConflict($text, $summary))->show();
628f3f0262cSandi}
629f3f0262cSandi
630f3f0262cSandi/**
63115fae107Sandi * Prints the global message array
63215fae107Sandi *
63315fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
634f3f0262cSandi */
635d868eb89SAndreas Gohrfunction html_msgarea()
636d868eb89SAndreas Gohr{
637cc58224cSMichael Hamann    global $MSG, $MSG_shown;
6388d5e837eSMichael Hamann    /** @var array $MSG */
639cc58224cSMichael Hamann    // store if the global $MSG has already been shown and thus HTML output has been started
640cc58224cSMichael Hamann    $MSG_shown = true;
641cc58224cSMichael Hamann
642f3f0262cSandi    if (!isset($MSG)) return;
643f3f0262cSandi
64424870174SAndreas Gohr    $shown = [];
645f3f0262cSandi    foreach ($MSG as $msg) {
6464af9f0d4SAndreas Gohr        $hash = md5($msg['msg']);
6474af9f0d4SAndreas Gohr        if (isset($shown[$hash])) continue; // skip double messages
648f755f9abSChristopher Smith        if (info_msg_allowed($msg)) {
64926dfc232SAndreas Gohr            echo '<div class="' . $msg['lvl'] . '">';
65026dfc232SAndreas Gohr            echo $msg['msg'];
65126dfc232SAndreas Gohr            echo '</div>';
652d3bae478SChristopher Smith        }
6534af9f0d4SAndreas Gohr        $shown[$hash] = 1;
654f3f0262cSandi    }
655cc58224cSMichael Hamann
656cc58224cSMichael Hamann    unset($GLOBALS['MSG']);
657f3f0262cSandi}
658f3f0262cSandi
659f3f0262cSandi/**
660f3f0262cSandi * Prints the registration form
66115fae107Sandi *
66215fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
663bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18
664f3f0262cSandi */
665d868eb89SAndreas Gohrfunction html_register()
666d868eb89SAndreas Gohr{
66779a2d784SGerrit Uitslag    dbg_deprecated(UserRegister::class . '::show()');
66873022918SAndreas Gohr    (new UserRegister())->show();
669f3f0262cSandi}
670f3f0262cSandi
671f3f0262cSandi/**
6728b06d178Schris * Print the update profile form
6738b06d178Schris *
6748b06d178Schris * @author Christopher Smith <chris@jalakai.co.uk>
6758b06d178Schris * @author Andreas Gohr <andi@splitbrain.org>
676bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18
6778b06d178Schris */
678d868eb89SAndreas Gohrfunction html_updateprofile()
679d868eb89SAndreas Gohr{
68079a2d784SGerrit Uitslag    dbg_deprecated(UserProfile::class . '::show()');
68173022918SAndreas Gohr    (new UserProfile())->show();
6828b06d178Schris}
6838b06d178Schris
6848b06d178Schris/**
6857c4635c4SAdrian Lang * Preprocess edit form data
68615fae107Sandi *
68715fae107Sandi * @author   Andreas Gohr <andi@splitbrain.org>
6882ffea8f2SAdrian Lang *
689bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18
690f3f0262cSandi */
691d868eb89SAndreas Gohrfunction html_edit()
692d868eb89SAndreas Gohr{
69379a2d784SGerrit Uitslag    dbg_deprecated(Editor::class . '::show()');
69473022918SAndreas Gohr    (new Editor())->show();
695b6912aeaSAndreas Gohr}
696b6912aeaSAndreas Gohr
697b6912aeaSAndreas Gohr/**
698bf69f8cbSSatoshi Sahara * Display the default edit form
699bf69f8cbSSatoshi Sahara *
700bf69f8cbSSatoshi Sahara * Is the default action for HTML_EDIT_FORMSELECTION.
701bf69f8cbSSatoshi Sahara *
70279a2d784SGerrit Uitslag * @param array $param
703bf69f8cbSSatoshi Sahara * @deprecated 2020-07-18
704bf69f8cbSSatoshi Sahara */
705d868eb89SAndreas Gohrfunction html_edit_form($param)
706d868eb89SAndreas Gohr{
70779a2d784SGerrit Uitslag    dbg_deprecated(Editor::class . '::addTextarea()');
70873022918SAndreas Gohr    (new Editor())->addTextarea($param);
709bf69f8cbSSatoshi Sahara}
710bf69f8cbSSatoshi Sahara
711bf69f8cbSSatoshi Sahara/**
712f3f0262cSandi * prints some debug info
71315fae107Sandi *
71415fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
715f3f0262cSandi */
716d868eb89SAndreas Gohrfunction html_debug()
717d868eb89SAndreas Gohr{
718f3f0262cSandi    global $conf;
719d16a4edaSandi    global $lang;
720e1d9dcc8SAndreas Gohr    /** @var AuthPlugin $auth */
7215298a619SAndreas Gohr    global $auth;
722100a97e3SAndreas Gohr    global $INFO;
723100a97e3SAndreas Gohr
72428fb55ffSandi    //remove sensitive data
72528fb55ffSandi    $cnf = $conf;
72624297a69SAndreas Gohr    debug_guard($cnf);
727100a97e3SAndreas Gohr    $nfo = $INFO;
72824297a69SAndreas Gohr    debug_guard($nfo);
729100a97e3SAndreas Gohr    $ses = $_SESSION;
73024297a69SAndreas Gohr    debug_guard($ses);
731f3f0262cSandi
73226dfc232SAndreas Gohr    echo '<html><body>';
733f3f0262cSandi
73426dfc232SAndreas Gohr    echo '<p>When reporting bugs please send all the following ';
73526dfc232SAndreas Gohr    echo 'output as a mail to andi@splitbrain.org ';
73626dfc232SAndreas Gohr    echo 'The best way to do this is to save this page in your browser</p>';
737f3f0262cSandi
73826dfc232SAndreas Gohr    echo '<b>$INFO:</b><pre>';
739100a97e3SAndreas Gohr    print_r($nfo);
74026dfc232SAndreas Gohr    echo '</pre>';
741100a97e3SAndreas Gohr
74226dfc232SAndreas Gohr    echo '<b>$_SERVER:</b><pre>';
743f3f0262cSandi    print_r($_SERVER);
74426dfc232SAndreas Gohr    echo '</pre>';
745f3f0262cSandi
74626dfc232SAndreas Gohr    echo '<b>$conf:</b><pre>';
74728fb55ffSandi    print_r($cnf);
74826dfc232SAndreas Gohr    echo '</pre>';
749f3f0262cSandi
75026dfc232SAndreas Gohr    echo '<b>DOKU_BASE:</b><pre>';
75126dfc232SAndreas Gohr    echo DOKU_BASE;
75226dfc232SAndreas Gohr    echo '</pre>';
753f3f0262cSandi
75426dfc232SAndreas Gohr    echo '<b>abs DOKU_BASE:</b><pre>';
75526dfc232SAndreas Gohr    echo DOKU_URL;
75626dfc232SAndreas Gohr    echo '</pre>';
757ed7b5f09Sandi
75826dfc232SAndreas Gohr    echo '<b>rel DOKU_BASE:</b><pre>';
75926dfc232SAndreas Gohr    echo dirname($_SERVER['PHP_SELF']) . '/';
76026dfc232SAndreas Gohr    echo '</pre>';
761f3f0262cSandi
76226dfc232SAndreas Gohr    echo '<b>PHP Version:</b><pre>';
76326dfc232SAndreas Gohr    echo phpversion();
76426dfc232SAndreas Gohr    echo '</pre>';
765f3f0262cSandi
76626dfc232SAndreas Gohr    echo '<b>locale:</b><pre>';
76726dfc232SAndreas Gohr    echo setlocale(LC_ALL, 0);
76826dfc232SAndreas Gohr    echo '</pre>';
769f3f0262cSandi
77026dfc232SAndreas Gohr    echo '<b>encoding:</b><pre>';
77126dfc232SAndreas Gohr    echo $lang['encoding'];
77226dfc232SAndreas Gohr    echo '</pre>';
773d16a4edaSandi
7745298a619SAndreas Gohr    if ($auth) {
77526dfc232SAndreas Gohr        echo '<b>Auth backend capabilities:</b><pre>';
7762f46ade0SChristopher Smith        foreach ($auth->getCapabilities() as $cando) {
77726dfc232SAndreas Gohr            echo '   ' . str_pad($cando, 16) . ' => ' . (int)$auth->canDo($cando) . DOKU_LF;
7782f46ade0SChristopher Smith        }
77926dfc232SAndreas Gohr        echo '</pre>';
7805298a619SAndreas Gohr    }
7815298a619SAndreas Gohr
78226dfc232SAndreas Gohr    echo '<b>$_SESSION:</b><pre>';
783100a97e3SAndreas Gohr    print_r($ses);
78426dfc232SAndreas Gohr    echo '</pre>';
7853aa54d7cSAndreas Gohr
78626dfc232SAndreas Gohr    echo '<b>Environment:</b><pre>';
787f3f0262cSandi    print_r($_ENV);
78826dfc232SAndreas Gohr    echo '</pre>';
789f3f0262cSandi
79026dfc232SAndreas Gohr    echo '<b>PHP settings:</b><pre>';
791f3f0262cSandi    $inis = ini_get_all();
792f3f0262cSandi    print_r($inis);
79326dfc232SAndreas Gohr    echo '</pre>';
794f3f0262cSandi
795e89b7c1eSChristopher Smith    if (function_exists('apache_get_version')) {
79624870174SAndreas Gohr        $apache = [];
797e89b7c1eSChristopher Smith        $apache['version'] = apache_get_version();
798e89b7c1eSChristopher Smith
799e89b7c1eSChristopher Smith        if (function_exists('apache_get_modules')) {
800e89b7c1eSChristopher Smith            $apache['modules'] = apache_get_modules();
801e89b7c1eSChristopher Smith        }
80226dfc232SAndreas Gohr        echo '<b>Apache</b><pre>';
803e89b7c1eSChristopher Smith        print_r($apache);
80426dfc232SAndreas Gohr        echo '</pre>';
805e89b7c1eSChristopher Smith    }
806e89b7c1eSChristopher Smith
80726dfc232SAndreas Gohr    echo '</body></html>';
808f3f0262cSandi}
809f3f0262cSandi
81010271ce4SAndreas Gohr/**
8118b06d178Schris * Form to request a new password for an existing account
8128b06d178Schris *
8138b06d178Schris * @author Benoit Chesneau <benoit@bchesneau.info>
814cc204bbdSAndreas Gohr * @author Andreas Gohr <gohr@cosmocode.de>
815bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18
81611e2ce22Schris */
817d868eb89SAndreas Gohrfunction html_resendpwd()
818d868eb89SAndreas Gohr{
81979a2d784SGerrit Uitslag    dbg_deprecated(UserResendPwd::class . '::show()');
82073022918SAndreas Gohr    (new UserResendPwd())->show();
821cc204bbdSAndreas Gohr}
822cc204bbdSAndreas Gohr
823fdb8d77bSTom N Harris/**
824b8595a66SAndreas Gohr * Return the TOC rendered to XHTML
825b8595a66SAndreas Gohr *
826b8595a66SAndreas Gohr * @author Andreas Gohr <andi@splitbrain.org>
82742ea7f44SGerrit Uitslag *
82842ea7f44SGerrit Uitslag * @param array $toc
82942ea7f44SGerrit Uitslag * @return string html
830b8595a66SAndreas Gohr */
831d868eb89SAndreas Gohrfunction html_TOC($toc)
832d868eb89SAndreas Gohr{
83324870174SAndreas Gohr    if ($toc === []) return '';
834b8595a66SAndreas Gohr    global $lang;
835b8595a66SAndreas Gohr    $out  = '<!-- TOC START -->' . DOKU_LF;
836158a5bffSDeathCamel57    $out .= '<div id="dw__toc" class="dw__toc">' . DOKU_LF;
83748722ac8SAnika Henke    $out .= '<h3 class="toggle">';
838b8595a66SAndreas Gohr    $out .= $lang['toc'];
839d5acc30dSAnika Henke    $out .= '</h3>' . DOKU_LF;
840d5acc30dSAnika Henke    $out .= '<div>' . DOKU_LF;
841bde560b4SSatoshi Sahara    $out .= html_buildlist($toc, 'toc', 'html_list_toc', null, true);
842b8595a66SAndreas Gohr    $out .= '</div>' . DOKU_LF . '</div>' . DOKU_LF;
843b8595a66SAndreas Gohr    $out .= '<!-- TOC END -->' . DOKU_LF;
844db959ae3SAndreas Gohr    return $out;
845db959ae3SAndreas Gohr}
846b8595a66SAndreas Gohr
847b8595a66SAndreas Gohr/**
848b8595a66SAndreas Gohr * Callback for html_buildlist
84942ea7f44SGerrit Uitslag *
85042ea7f44SGerrit Uitslag * @param array $item
85142ea7f44SGerrit Uitslag * @return string html
852b8595a66SAndreas Gohr */
853d868eb89SAndreas Gohrfunction html_list_toc($item)
854d868eb89SAndreas Gohr{
855c66972f2SAdrian Lang    if (isset($item['hid'])) {
8567d91652aSAndreas Gohr        $link = '#' . $item['hid'];
8577d91652aSAndreas Gohr    } else {
8587d91652aSAndreas Gohr        $link = $item['link'];
8597d91652aSAndreas Gohr    }
8607d91652aSAndreas Gohr
861d5acc30dSAnika Henke    return '<a href="' . $link . '">' . hsc($item['title']) . '</a>';
862b8595a66SAndreas Gohr}
863b8595a66SAndreas Gohr
864b8595a66SAndreas Gohr/**
865b8595a66SAndreas Gohr * Helper function to build TOC items
866b8595a66SAndreas Gohr *
867b8595a66SAndreas Gohr * Returns an array ready to be added to a TOC array
868b8595a66SAndreas Gohr *
869b8595a66SAndreas Gohr * @param string $link  - where to link (if $hash set to '#' it's a local anchor)
870b8595a66SAndreas Gohr * @param string $text  - what to display in the TOC
871b8595a66SAndreas Gohr * @param int    $level - nesting level
872b8595a66SAndreas Gohr * @param string $hash  - is prepended to the given $link, set blank if you want full links
8738d5e837eSMichael Hamann * @return array the toc item
874b8595a66SAndreas Gohr */
875d868eb89SAndreas Gohrfunction html_mktocitem($link, $text, $level, $hash = '#')
876d868eb89SAndreas Gohr{
87724870174SAndreas Gohr    return  [
878bde560b4SSatoshi Sahara        'link'  => $hash . $link,
879b8595a66SAndreas Gohr        'title' => $text,
880b8595a66SAndreas Gohr        'type'  => 'ul',
881bde560b4SSatoshi Sahara        'level' => $level
88224870174SAndreas Gohr    ];
883b8595a66SAndreas Gohr}
884b8595a66SAndreas Gohr
885b8595a66SAndreas Gohr/**
886fdb8d77bSTom N Harris * Output a Doku_Form object.
887fdb8d77bSTom N Harris * Triggers an event with the form name: HTML_{$name}FORM_OUTPUT
888fdb8d77bSTom N Harris *
889fdb8d77bSTom N Harris * @author Tom N Harris <tnharris@whoopdedo.org>
89042ea7f44SGerrit Uitslag *
8918d5e837eSMichael Hamann * @param string     $name The name of the form
8928d5e837eSMichael Hamann * @param Doku_Form  $form The form
8932162df3aSSatoshi Sahara * @return void
8942162df3aSSatoshi Sahara * @deprecated 2020-07-18
895fdb8d77bSTom N Harris */
896d868eb89SAndreas Gohrfunction html_form($name, $form)
897d868eb89SAndreas Gohr{
8988a5f08afSSatoshi Sahara    dbg_deprecated('use dokuwiki\Form\Form instead of Doku_Form');
899fdb8d77bSTom N Harris    // Safety check in case the caller forgets.
900fdb8d77bSTom N Harris    $form->endFieldset();
901cbb44eabSAndreas Gohr    Event::createAndTrigger('HTML_' . strtoupper($name) . 'FORM_OUTPUT', $form, 'html_form_output', false);
902fdb8d77bSTom N Harris}
903fdb8d77bSTom N Harris
904fdb8d77bSTom N Harris/**
905fdb8d77bSTom N Harris * Form print function.
906c29600d0SSatoshi Sahara * Just calls printForm() on the form object.
90742ea7f44SGerrit Uitslag *
908c29600d0SSatoshi Sahara * @param Doku_Form $form The form
9092162df3aSSatoshi Sahara * @return void
9102162df3aSSatoshi Sahara * @deprecated 2020-07-18
911fdb8d77bSTom N Harris */
912d868eb89SAndreas Gohrfunction html_form_output($form)
913d868eb89SAndreas Gohr{
91424870174SAndreas Gohr    dbg_deprecated('use ' . Form::class . '::toHTML()');
91525dd2a2fSSatoshi Sahara    $form->printForm();
91625dd2a2fSSatoshi Sahara}
917340756e4Sandi
91807bf32b2SAndreas Gohr/**
91907bf32b2SAndreas Gohr * Embed a flash object in HTML
92007bf32b2SAndreas Gohr *
92107bf32b2SAndreas Gohr * This will create the needed HTML to embed a flash movie in a cross browser
92207bf32b2SAndreas Gohr * compatble way using valid XHTML
92307bf32b2SAndreas Gohr *
92407bf32b2SAndreas Gohr * The parameters $params, $flashvars and $atts need to be associative arrays.
92507bf32b2SAndreas Gohr * No escaping needs to be done for them. The alternative content *has* to be
92607bf32b2SAndreas Gohr * escaped because it is used as is. If no alternative content is given
92707bf32b2SAndreas Gohr * $lang['noflash'] is used.
92807bf32b2SAndreas Gohr *
92907bf32b2SAndreas Gohr * @author Andreas Gohr <andi@splitbrain.org>
93007bf32b2SAndreas Gohr * @link   http://latrine.dgx.cz/how-to-correctly-insert-a-flash-into-xhtml
93107bf32b2SAndreas Gohr *
93207bf32b2SAndreas Gohr * @param string $swf      - the SWF movie to embed
93307bf32b2SAndreas Gohr * @param int $width       - width of the flash movie in pixels
93407bf32b2SAndreas Gohr * @param int $height      - height of the flash movie in pixels
93507bf32b2SAndreas Gohr * @param array $params    - additional parameters (<param>)
93607bf32b2SAndreas Gohr * @param array $flashvars - parameters to be passed in the flashvar parameter
93707bf32b2SAndreas Gohr * @param array $atts      - additional attributes for the <object> tag
93807bf32b2SAndreas Gohr * @param string $alt      - alternative content (is NOT automatically escaped!)
939b3d1090eSMichael Hamann * @return string         - the XHTML markup
94007bf32b2SAndreas Gohr */
941d868eb89SAndreas Gohrfunction html_flashobject($swf, $width, $height, $params = null, $flashvars = null, $atts = null, $alt = '')
942d868eb89SAndreas Gohr{
94307bf32b2SAndreas Gohr    global $lang;
94407bf32b2SAndreas Gohr
94507bf32b2SAndreas Gohr    $out = '';
94607bf32b2SAndreas Gohr
94707bf32b2SAndreas Gohr    // prepare the object attributes
94824870174SAndreas Gohr    if (is_null($atts)) $atts = [];
94907bf32b2SAndreas Gohr    $atts['width']  = (int) $width;
950d4c61e61SAndreas Gohr    $atts['height'] = (int) $height;
95107bf32b2SAndreas Gohr    if (!$atts['width'])  $atts['width']  = 425;
95207bf32b2SAndreas Gohr    if (!$atts['height']) $atts['height'] = 350;
95307bf32b2SAndreas Gohr
95407bf32b2SAndreas Gohr    // add object attributes for standard compliant browsers
95507bf32b2SAndreas Gohr    $std = $atts;
95607bf32b2SAndreas Gohr    $std['type'] = 'application/x-shockwave-flash';
95707bf32b2SAndreas Gohr    $std['data'] = $swf;
95807bf32b2SAndreas Gohr
95907bf32b2SAndreas Gohr    // add object attributes for IE
96007bf32b2SAndreas Gohr    $ie  = $atts;
96107bf32b2SAndreas Gohr    $ie['classid'] = 'clsid:D27CDB6E-AE6D-11cf-96B8-444553540000';
96207bf32b2SAndreas Gohr
96307bf32b2SAndreas Gohr    // open object (with conditional comments)
96407bf32b2SAndreas Gohr    $out .= '<!--[if !IE]> -->' . NL;
96507bf32b2SAndreas Gohr    $out .= '<object ' . buildAttributes($std) . '>' . NL;
96607bf32b2SAndreas Gohr    $out .= '<!-- <![endif]-->' . NL;
96707bf32b2SAndreas Gohr    $out .= '<!--[if IE]>' . NL;
96807bf32b2SAndreas Gohr    $out .= '<object ' . buildAttributes($ie) . '>' . NL;
96907bf32b2SAndreas Gohr    $out .= '    <param name="movie" value="' . hsc($swf) . '" />' . NL;
9709ae41cdcSAndreas Gohr    $out .= '<!--><!-- -->' . NL;
97107bf32b2SAndreas Gohr
97207bf32b2SAndreas Gohr    // print params
97307bf32b2SAndreas Gohr    if (is_array($params)) foreach ($params as $key => $val) {
97407bf32b2SAndreas Gohr        $out .= '  <param name="' . hsc($key) . '" value="' . hsc($val) . '" />' . NL;
97507bf32b2SAndreas Gohr    }
97607bf32b2SAndreas Gohr
97707bf32b2SAndreas Gohr    // add flashvars
97807bf32b2SAndreas Gohr    if (is_array($flashvars)) {
979d4c61e61SAndreas Gohr        $out .= '  <param name="FlashVars" value="' . buildURLparams($flashvars) . '" />' . NL;
98007bf32b2SAndreas Gohr    }
98107bf32b2SAndreas Gohr
98207bf32b2SAndreas Gohr    // alternative content
98307bf32b2SAndreas Gohr    if ($alt) {
98407bf32b2SAndreas Gohr        $out .= $alt . NL;
98507bf32b2SAndreas Gohr    } else {
98607bf32b2SAndreas Gohr        $out .= $lang['noflash'] . NL;
98707bf32b2SAndreas Gohr    }
98807bf32b2SAndreas Gohr
98907bf32b2SAndreas Gohr    // finish
99007bf32b2SAndreas Gohr    $out .= '</object>' . NL;
99107bf32b2SAndreas Gohr    $out .= '<!-- <![endif]-->' . NL;
99207bf32b2SAndreas Gohr
99307bf32b2SAndreas Gohr    return $out;
99407bf32b2SAndreas Gohr}
99507bf32b2SAndreas Gohr
9968d5e837eSMichael Hamann/**
9978d5e837eSMichael Hamann * Prints HTML code for the given tab structure
9988d5e837eSMichael Hamann *
9998d5e837eSMichael Hamann * @param array  $tabs        tab structure
10008d5e837eSMichael Hamann * @param string $current_tab the current tab id
10012162df3aSSatoshi Sahara * @return void
10028d5e837eSMichael Hamann */
1003d868eb89SAndreas Gohrfunction html_tabs($tabs, $current_tab = null)
1004d868eb89SAndreas Gohr{
100594add303SAnika Henke    echo '<ul class="tabs">' . NL;
100695b451bcSAdrian Lang
100795b451bcSAdrian Lang    foreach ($tabs as $id => $tab) {
100895b451bcSAdrian Lang        html_tab($tab['href'], $tab['caption'], $id === $current_tab);
100995b451bcSAdrian Lang    }
101095b451bcSAdrian Lang
101194add303SAnika Henke    echo '</ul>' . NL;
101295b451bcSAdrian Lang}
1013cd2a4cfdSAnika Henke
101495b451bcSAdrian Lang/**
101595b451bcSAdrian Lang * Prints a single tab
101695b451bcSAdrian Lang *
101795b451bcSAdrian Lang * @author Kate Arzamastseva <pshns@ukr.net>
101895b451bcSAdrian Lang * @author Adrian Lang <mail@adrianlang.de>
101995b451bcSAdrian Lang *
102095b451bcSAdrian Lang * @param string $href - tab href
102195b451bcSAdrian Lang * @param string $caption - tab caption
102295b451bcSAdrian Lang * @param boolean $selected - is tab selected
10232162df3aSSatoshi Sahara * @return void
102495b451bcSAdrian Lang */
102595b451bcSAdrian Lang
1026d868eb89SAndreas Gohrfunction html_tab($href, $caption, $selected = false)
1027d868eb89SAndreas Gohr{
102895b451bcSAdrian Lang    $tab = '<li>';
102995b451bcSAdrian Lang    if ($selected) {
103095b451bcSAdrian Lang        $tab .= '<strong>';
103195b451bcSAdrian Lang    } else {
103295b451bcSAdrian Lang        $tab .= '<a href="' . hsc($href) . '">';
103395b451bcSAdrian Lang    }
103495b451bcSAdrian Lang    $tab .= hsc($caption)
103595b451bcSAdrian Lang         .  '</' . ($selected ? 'strong' : 'a') . '>'
103694add303SAnika Henke         .  '</li>' . NL;
103795b451bcSAdrian Lang    echo $tab;
103895b451bcSAdrian Lang}
103995b451bcSAdrian Lang
1040cd2a4cfdSAnika Henke/**
1041cd2a4cfdSAnika Henke * Display size change
1042cd2a4cfdSAnika Henke *
1043cd2a4cfdSAnika Henke * @param int $sizechange - size of change in Bytes
1044e34d6962SSatoshi Sahara * @param Doku_Form $form - (optional) form to add elements to
1045e34d6962SSatoshi Sahara * @return void|string
1046cd2a4cfdSAnika Henke */
1047d868eb89SAndreas Gohrfunction html_sizechange($sizechange, $form = null)
1048d868eb89SAndreas Gohr{
1049cd2a4cfdSAnika Henke    if (isset($sizechange)) {
1050cd2a4cfdSAnika Henke        $class = 'sizechange';
1051cd2a4cfdSAnika Henke        $value = filesize_h(abs($sizechange));
1052cd2a4cfdSAnika Henke        if ($sizechange > 0) {
1053cd2a4cfdSAnika Henke            $class .= ' positive';
1054cd2a4cfdSAnika Henke            $value = '+' . $value;
1055cd2a4cfdSAnika Henke        } elseif ($sizechange < 0) {
1056cd2a4cfdSAnika Henke            $class .= ' negative';
1057cd2a4cfdSAnika Henke            $value = '-' . $value;
10580b78a6edSAnika Henke        } else {
10590b78a6edSAnika Henke            $value = '±' . $value;
1060cd2a4cfdSAnika Henke        }
1061e34d6962SSatoshi Sahara        if (!isset($form)) {
1062e34d6962SSatoshi Sahara            return '<span class="' . $class . '">' . $value . '</span>';
1063b0f23f4eSSatoshi Sahara        } else { // Doku_Form
106424870174SAndreas Gohr            $form->addElement(form_makeOpenTag('span', ['class' => $class]));
1065cd2a4cfdSAnika Henke            $form->addElement($value);
1066cd2a4cfdSAnika Henke            $form->addElement(form_makeCloseTag('span'));
1067cd2a4cfdSAnika Henke        }
1068cd2a4cfdSAnika Henke    }
1069b0f23f4eSSatoshi Sahara}
1070